将具有相同IP的在线玩家聚集到一个列表中

Posted

技术标签:

【中文标题】将具有相同IP的在线玩家聚集到一个列表中【英文标题】:Gather online players with same IP to a list 【发布时间】:2022-01-06 14:49:21 【问题描述】:

我在我的服务器上运行了一堆 alt/bot 帐户,我正在尝试创建一个命令来获取所有(在线)玩家的 IP 地址,如果它与我的匹配,那么它将它们添加到玩家列表中以进行打印给执行命令的人。这是我目前所拥有的。

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) 
  if (label.equalsIgnoreCase("bots")) 
    if (!sender.hasPermission("lbp.bots")) 
      sender.sendMessage(ChatColor.RED + "You cannot run this command.");
      return true;
    
    if (args.length == 0) 
      //Player p = (Player) sender;
      List < Player > onlineBots = new ArrayList < Player > ();
      for (Player players: Bukkit.getOnlinePlayers()) 
        if (players.getAddress().getAddress().getHostAddress() == "redacted ip address") 
          onlineBots.add(players);
        
      
      sender.sendMessage(ChatColor.AQUA + "Luke's Bot List: " + ChatColor.BOLD + "" + onlineBots);
      return true;
    
  
  return false;

我已经将我的 IP 地址插入到“编辑的 IP 地址”,加入了我的端口转发本地服务器,所以我没有加入主机 IP(仔细检查了我的 IP 在 Essentials /whois 中正确注册)并且该命令返回一个空列表。控制台中没有错误。 [1]:https://i.stack.imgur.com/ykTAX.png 有什么想法吗?

【问题讨论】:

【参考方案1】:

您只需要检查您和其他人之间的播放器 IP。 Adress/Host 地址之间的值变化很大,特别是在 spigot/bungee 之间。

所以,我建议你使用这样的代码:

if (args.length == 0) 
   List<Player> onlineBots = new ArrayList<>();
   for (Player players : Bukkit.getOnlinePlayers()) 
      if (players.getAddress().getAddress().getHostAddress().equals(sender.getAddress().getAddress().getHostAddress())) 
          onlineBots.add(players);
      
   
   sender.sendMessage(ChatColor.AQUA + "Luke's Bot List: " + ChatColor.BOLD + "" + onlineBots);
   return true;

【讨论】:

谢谢,但我有超过 10 个帐户同时在与我的 IP 相同的 IP 下连接到我的服务器,因为它们是我的 alt 帐户。这就是为什么我想检查他们的 IP 是否等于我的 IP 然后添加到列表中,而不是只获取不是发件人的每个人。也许我只是误读了你的建议? 哦不,是我没有很好地理解您的要求。我只是编辑我的代码【参考方案2】:

使用此代码让它工作:

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) 
  if (label.equalsIgnoreCase("bots")) 
    if (!sender.hasPermission("lbp.bots")) 
      sender.sendMessage(ChatColor.RED + "You cannot run this command.");
      return true;
    
    if (args.length == 0) 
      List < String > onlineBots = new ArrayList < > ();
      for (Player players: Bukkit.getOnlinePlayers()) 
        if (players.getAddress().getAddress().getHostAddress().equals("insert IP here")) 
          onlineBots.add(players.getName());
        
      
      sender.sendMessage(ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Luke's Bot List: " + ChatColor.RESET + "" + ChatColor.AQUA + "" + onlineBots.toString());
      return true;
    
  
  return false;

由于List&lt;Player&gt;,列表以CraftPlayer 格式返回玩家,所以我将列表类型更改为List&lt;String&gt; 并使用onlineBots.add(players.getName());,这似乎成功了。

【讨论】:

以上是关于将具有相同IP的在线玩家聚集到一个列表中的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何将具有相同变量类型的多个列表合并到一个列表列表中?

创建 2 个具有相同键列但不同包含列的非聚集索引

具有相同名称属性的输入字段的多个表单?是好是坏?

熊猫将具有相同索引的一列值组合到列表中[重复]

将数组列表作为列附加到具有相同列索引的熊猫数据框中

如何有效地输出具有相同内容的文件列表?