{"id":184,"date":"2025-08-29T11:49:12","date_gmt":"2025-08-29T03:49:12","guid":{"rendered":"http:\/\/154.9.252.233\/?p=184"},"modified":"2025-08-29T11:49:13","modified_gmt":"2025-08-29T03:49:13","slug":"%e6%88%91%e7%9a%84%e4%b8%96%e7%95%8cip%e6%9f%a5%e8%af%a2%e5%92%8c%e9%99%90%e5%88%b6","status":"publish","type":"post","link":"https:\/\/web.mcfrys.cn\/index.php\/2025\/08\/29\/%e6%88%91%e7%9a%84%e4%b8%96%e7%95%8cip%e6%9f%a5%e8%af%a2%e5%92%8c%e9%99%90%e5%88%b6\/","title":{"rendered":"\u6211\u7684\u4e16\u754cIP\u67e5\u8be2\u548c\u9650\u5236"},"content":{"rendered":"\n<p>package com.example.playermanager;<\/p>\n\n\n\n<p>import org.bukkit.Bukkit;<br>import org.bukkit.ChatColor;<br>import org.bukkit.command.Command;<br>import org.bukkit.command.CommandSender;<br>import org.bukkit.entity.Player;<br>import org.bukkit.event.EventHandler;<br>import org.bukkit.event.Listener;<br>import org.bukkit.event.player.PlayerLoginEvent;<br>import org.bukkit.plugin.java.JavaPlugin;<\/p>\n\n\n\n<p>import java.util.HashMap;<br>import java.util.Map;<br>import java.util.UUID;<\/p>\n\n\n\n<p>public class PlayerManagerPlugin extends JavaPlugin implements Listener {<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private Map&lt;String, Integer&gt; ipConnectionCount;\nprivate int maxConnectionsPerIP;\n\n@Override\npublic void onEnable() {\n    \/\/ \u4fdd\u5b58\u9ed8\u8ba4\u914d\u7f6e\n    saveDefaultConfig();\n\n    \/\/ \u4ece\u914d\u7f6e\u4e2d\u83b7\u53d6\u6700\u5927\u8fde\u63a5\u6570\n    maxConnectionsPerIP = getConfig().getInt(\"max-connections-per-ip\", 3);\n\n    \/\/ \u521d\u59cb\u5316IP\u8fde\u63a5\u8ba1\u6570\n    ipConnectionCount = new HashMap&lt;&gt;();\n\n    \/\/ \u6ce8\u518c\u4e8b\u4ef6\u76d1\u542c\u5668\n    getServer().getPluginManager().registerEvents(this, this);\n\n    \/\/ \u8bb0\u5f55\u542f\u7528\u65e5\u5fd7\n    getLogger().info(\"\u73a9\u5bb6\u7ba1\u7406\u63d2\u4ef6\u5df2\u542f\u7528! \u6bcf\u4e2aIP\u6700\u5927\u8fde\u63a5\u6570: \" + maxConnectionsPerIP);\n}\n\n@Override\npublic void onDisable() {\n    \/\/ \u6e05\u7406\u8d44\u6e90\n    ipConnectionCount.clear();\n    getLogger().info(\"\u73a9\u5bb6\u7ba1\u7406\u63d2\u4ef6\u5df2\u7981\u7528!\");\n}\n\n@EventHandler\npublic void onPlayerLogin(PlayerLoginEvent event) {\n    Player player = event.getPlayer();\n    String ipAddress = event.getAddress().getHostAddress();\n\n    \/\/ \u8df3\u8fc7\u672c\u5730\u8fde\u63a5\u6216\u672c\u5730\u4e3b\u673a\n    if (ipAddress.equals(\"127.0.0.1\") || ipAddress.equals(\"localhost\")) {\n        return;\n    }\n\n    \/\/ \u83b7\u53d6\u5f53\u524dIP\u7684\u8fde\u63a5\u6570\n    int currentConnections = ipConnectionCount.getOrDefault(ipAddress, 0);\n\n    \/\/ \u68c0\u67e5\u662f\u5426\u8d85\u8fc7\u9650\u5236\n    if (currentConnections &gt;= maxConnectionsPerIP) {\n        String kickMessage = getConfig().getString(\"kick-message\", \n                \"\u6bcf\u4e2aIP\u6700\u591a\u5141\u8bb8\" + maxConnectionsPerIP + \"\u4e2a\u8fde\u63a5\");\n        event.disallow(PlayerLoginEvent.Result.KICK_OTHER, kickMessage);\n        return;\n    }\n\n    \/\/ \u589e\u52a0\u8fde\u63a5\u8ba1\u6570\n    ipConnectionCount.put(ipAddress, currentConnections + 1);\n}\n\n@Override\npublic boolean onCommand(CommandSender sender, Command cmd, String label, String&#91;] args) {\n    if (cmd.getName().equalsIgnoreCase(\"queryplayer\")) {\n        if (args.length == 0) {\n            sender.sendMessage(ChatColor.RED + \"\u7528\u6cd5: \/queryplayer &lt;\u73a9\u5bb6\u540d&gt;\");\n            return true;\n        }\n\n        String playerName = args&#91;0];\n        Player target = Bukkit.getPlayer(playerName);\n\n        if (target == null) {\n            sender.sendMessage(ChatColor.RED + \"\u73a9\u5bb6 \" + playerName + \" \u4e0d\u5728\u7ebf\u6216\u4e0d\u5b58\u5728!\");\n            return true;\n        }\n\n        \/\/ \u83b7\u53d6\u73a9\u5bb6\u4fe1\u606f\n        String ipAddress = target.getAddress().getAddress().getHostAddress();\n        UUID uuid = target.getUniqueId();\n        String world = target.getWorld().getName();\n        int ping = getPing(target);\n\n        \/\/ \u53d1\u9001\u73a9\u5bb6\u4fe1\u606f\n        sender.sendMessage(ChatColor.GREEN + \"=== \u73a9\u5bb6\u4fe1\u606f ===\");\n        sender.sendMessage(ChatColor.YELLOW + \"\u540d\u79f0: \" + ChatColor.WHITE + target.getName());\n        sender.sendMessage(ChatColor.YELLOW + \"UUID: \" + ChatColor.WHITE + uuid);\n        sender.sendMessage(ChatColor.YELLOW + \"IP\u5730\u5740: \" + ChatColor.WHITE + ipAddress);\n        sender.sendMessage(ChatColor.YELLOW + \"\u6240\u5728\u4e16\u754c: \" + ChatColor.WHITE + world);\n        sender.sendMessage(ChatColor.YELLOW + \"\u6e38\u620f\u6a21\u5f0f: \" + ChatColor.WHITE + target.getGameMode());\n        sender.sendMessage(ChatColor.YELLOW + \"\u751f\u547d\u503c: \" + ChatColor.WHITE + target.getHealth() + \"\/\" + target.getMaxHealth());\n        sender.sendMessage(ChatColor.YELLOW + \"\u7b49\u7ea7: \" + ChatColor.WHITE + target.getLevel());\n        sender.sendMessage(ChatColor.YELLOW + \"Ping: \" + ChatColor.WHITE + ping + \"ms\");\n\n        return true;\n    } else if (cmd.getName().equalsIgnoreCase(\"ipstats\")) {\n        if (!sender.hasPermission(\"playermanager.ipstats\")) {\n            sender.sendMessage(ChatColor.RED + \"\u4f60\u6ca1\u6709\u6743\u9650\u4f7f\u7528\u6b64\u547d\u4ee4!\");\n            return true;\n        }\n\n        sender.sendMessage(ChatColor.GREEN + \"=== IP\u8fde\u63a5\u7edf\u8ba1 ===\");\n        for (Map.Entry&lt;String, Integer&gt; entry : ipConnectionCount.entrySet()) {\n            sender.sendMessage(ChatColor.YELLOW + entry.getKey() + \": \" + \n                              ChatColor.WHITE + entry.getValue() + \" \u4e2a\u8fde\u63a5\");\n        }\n        return true;\n    }\n\n    return false;\n}\n\n\/\/ \u83b7\u53d6\u73a9\u5bb6ping\u503c\nprivate int getPing(Player player) {\n    try {\n        Object entityPlayer = player.getClass().getMethod(\"getHandle\").invoke(player);\n        return (int) entityPlayer.getClass().getField(\"ping\").get(entityPlayer);\n    } catch (Exception e) {\n        return -1;\n    }\n}<\/code><\/pre>\n\n\n\n<p>}<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u6bcf\u4e2aIP\u5141\u8bb8\u7684\u6700\u5927\u8fde\u63a5\u6570\u91cf<\/h1>\n\n\n\n<p>max-connections-per-ip: 3<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u5f53\u73a9\u5bb6\u56e0IP\u9650\u5236\u88ab\u8e22\u51fa\u65f6\u663e\u793a\u7684\u6d88\u606f<\/h1>\n\n\n\n<p>kick-message: &#8220;\u6bcf\u4e2aIP\u6700\u591a\u5141\u8bb8{max}\u4e2a\u8fde\u63a5&#8221;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u547d\u4ee4\u6743\u9650\u8bbe\u7f6e<\/h1>\n\n\n\n<p>commands:<br>queryplayer:<br>permission: &#8220;playermanager.query&#8221;<br>default: op<br>ipstats:<br>permission: &#8220;playermanager.ipstats&#8221;<br>default: op<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>name: PlayerManager<br>version: 1.0.0<br>main: com.example.playermanager.PlayerManagerPlugin<br>api-version: 1.20<br>author: YourName<br>description: \u73a9\u5bb6\u67e5\u8be2\u548cIP\u8fde\u63a5\u9650\u5236\u63d2\u4ef6<\/p>\n\n\n\n<p>commands:<br>queryplayer:<br>description: \u67e5\u8be2\u5728\u7ebf\u73a9\u5bb6\u4fe1\u606f<br>usage: \/queryplayer &lt;\u73a9\u5bb6\u540d&gt;<br>permission: playermanager.query<br>permission-message: \u4f60\u6ca1\u6709\u6743\u9650\u4f7f\u7528\u6b64\u547d\u4ee4!<br>ipstats:<br>description: \u67e5\u770bIP\u8fde\u63a5\u7edf\u8ba1<br>usage: \/ipstats<br>permission: playermanager.ipstats<br>permission-message: \u4f60\u6ca1\u6709\u6743\u9650\u4f7f\u7528\u6b64\u547d\u4ee4!<\/p>\n\n\n\n<p>permissions:<br>playermanager.query:<br>description: \u5141\u8bb8\u4f7f\u7528\u67e5\u8be2\u73a9\u5bb6\u547d\u4ee4<br>default: op<br>playermanager.ipstats:<br>description: \u5141\u8bb8\u67e5\u770bIP\u7edf\u8ba1<br>default: op<\/p>\n\n\n\n<p><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u73a9\u5bb6\u67e5\u8be2\u529f\u80fd<\/strong>:\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u00a0<code>\/queryplayer &lt;\u73a9\u5bb6\u540d><\/code>\u00a0\u547d\u4ee4\u67e5\u8be2\u5728\u7ebf\u73a9\u5bb6\u7684\u8be6\u7ec6\u4fe1\u606f<\/li>\n\n\n\n<li>\u663e\u793a\u4fe1\u606f\u5305\u62ec: \u540d\u79f0\u3001UUID\u3001IP\u5730\u5740\u3001\u6240\u5728\u4e16\u754c\u3001\u6e38\u620f\u6a21\u5f0f\u3001\u751f\u547d\u503c\u3001\u7b49\u7ea7\u548cPing\u503c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>IP\u8fde\u63a5\u9650\u5236<\/strong>:\n<ul class=\"wp-block-list\">\n<li>\u6bcf\u4e2aIP\u5730\u5740\u6700\u591a\u5141\u8bb8\u6307\u5b9a\u6570\u91cf\u7684\u8fde\u63a5(\u9ed8\u8ba43\u4e2a)<\/li>\n\n\n\n<li>\u8d85\u8fc7\u9650\u5236\u7684\u65b0\u8fde\u63a5\u4f1a\u88ab\u62d2\u7edd\u5e76\u663e\u793a\u63d0\u793a\u6d88\u606f<\/li>\n\n\n\n<li>\u4f7f\u7528\u00a0<code>\/ipstats<\/code>\u00a0\u547d\u4ee4\u67e5\u770b\u5f53\u524dIP\u8fde\u63a5\u7edf\u8ba1<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6743\u9650\u7ba1\u7406<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>playermanager.query<\/code>\u00a0&#8211; \u4f7f\u7528\u67e5\u8be2\u73a9\u5bb6\u547d\u4ee4\u7684\u6743\u9650<\/li>\n\n\n\n<li><code>playermanager.ipstats<\/code>\u00a0&#8211; \u67e5\u770bIP\u7edf\u8ba1\u7684\u6743\u9650<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>package com.example.playermanager; import org.bukkit.Bu [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-184","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/comments?post=184"}],"version-history":[{"count":2,"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"predecessor-version":[{"id":186,"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/posts\/184\/revisions\/186"}],"wp:attachment":[{"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/web.mcfrys.cn\/index.php\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}