Solved Efficient way to check all duplicate IPs

Discussion in 'Plugin Development' started by Paul122, Mar 31, 2021.

  1. Offline



    I'm trying to make a method that returns a list of all players with more than 'x' alts on a given server (an alt being an account on the same IP as another). Currently, I have:

    public static List<String> checkAlts(int limit) {
            Map<String, Integer> alts = new HashMap<>();
            for (Player p : Bukkit.getOnlinePlayers()) {
                if (!alts.containsKey(p.getAddress().getHostName())) {
                    alts.put(p.getAddress().getHostName(), 1);
                    } else {
                        alts.replace(p.getAddress().getHostName(), alts.get(p.getAddress().getHostName()) + 1);
            alts.values().removeIf(entries -> entries < limit);
            List<String> names = new ArrayList<>();
            for (Player p : Bukkit.getOnlinePlayers()) {
                if (alts.containsKey(p.getAddress().getHostName())) {
            return names;
    This method causes extreme lag and has caused my server to nearly crash twice. Is there a better way to go about doing this that I'm overlooking?
  2. Offline


    Maybe I don't understand exactly what you want to do, but if the idea is just to find who has the same IP, an alternative would be to do:
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
      Map<String, List<String>> connections = new HashMap<>();
      for (Player p : getServer().getOnlinePlayers()) {
        String ip = p.getAddress().getHostName();
        List<String> people = connections.containsKey(ip)?connections.get(ip):new ArrayList<>();
        connections.put(ip, people);
      for (Map.Entry<String, List<String>> data : connections.entrySet()) {
        if (data.getValue().size() == 1) continue;
        sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7[&a" + data.getValue().size() + "&7][&a" + data.getKey() + "&7]: &6" + String.join("&7,&6 ", data.getValue())));
      return true;

Share This Page