Bukkit 1.20.1 插件:跨服务器传送玩家 (TPA) - BungeeCord 与 Spigot 联动
下面是一个示例代码,演示了如何使用Java编写一个Bukkit插件,适配BungeeCord和Spigot,实现在不同服务器之间传送玩家的功能。\n\njava\nimport org.bukkit.Bukkit;\nimport org.bukkit.command.Command;\nimport org.bukkit.command.CommandSender;\nimport org.bukkit.entity.Player;\nimport org.bukkit.plugin.java.JavaPlugin;\nimport org.bukkit.plugin.messaging.PluginMessageListener;\nimport org.bukkit.plugin.messaging.PluginMessageRecipient;\nimport org.bukkit.plugin.messaging.PluginMessageSender;\n\npublic class MyPlugin extends JavaPlugin implements PluginMessageListener {\n \n private PluginMessageSender bungeeSender;\n \n @Override\n public void onEnable() {\n // 注册插件消息监听器\n Bukkit.getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);\n Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");\n \n // 获取BungeeCord插件消息发送器\n this.bungeeSender = Bukkit.getMessenger().getOutgoingPluginChannel(this, "BungeeCord");\n }\n \n @Override\n public void onDisable() {\n // 取消注册插件消息监听器\n Bukkit.getMessenger().unregisterIncomingPluginChannel(this, "BungeeCord", this);\n Bukkit.getMessenger().unregisterOutgoingPluginChannel(this, "BungeeCord");\n }\n \n @Override\n public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {\n if (cmd.getName().equalsIgnoreCase("tpa")) {\n if (sender instanceof Player) {\n Player player = (Player) sender;\n \n if (args.length == 1) {\n String targetServer = args[0];\n \n // 构建插件消息数据\n byte[] data = ("ConnectOther;"+player.getName()+";"+targetServer).getBytes();\n \n // 发送插件消息\n ((PluginMessageSender) player).sendPluginMessage(this, "BungeeCord", data);\n \n player.sendMessage("正在传送到服务器: " + targetServer);\n } else {\n player.sendMessage("用法: /tpa <服务器名称>");\n }\n } else {\n sender.sendMessage("该命令只能由玩家执行");\n }\n return true;\n }\n return false;\n }\n \n @Override\n public void onPluginMessageReceived(String channel, Player player, byte[] message) {\n if (channel.equalsIgnoreCase("BungeeCord")) {\n // 解析插件消息数据\n String[] parts = new String(message).split(";");\n if (parts[0].equals("TeleportOther")) {\n String targetPlayer = parts[1];\n String targetServer = parts[2];\n \n // 发送BungeeCord插件消息,传送玩家到目标服务器\n byte[] data = ("Connect;"+targetServer).getBytes();\n this.bungeeSender.sendPluginMessage(this, "BungeeCord", data);\n \n player.sendMessage("正在传送玩家 " + targetPlayer + " 到服务器: " + targetServer);\n }\n }\n }\n}\n\n\n这个插件注册了一个/tpa命令,允许玩家传送到其他服务器。当玩家使用/tpa <服务器名称>命令时,插件将发送一个BungeeCord插件消息给BungeeCord代理服务器,请求将玩家传送到目标服务器。\n\n在BungeeCord代理服务器上,需要使用插件或自定义BungeeCord插件来接收这个消息,并将玩家传送到目标服务器。在BungeeCord代理服务器上,你可以使用类似以下的代码来接收并处理这个消息:\n\njava\npublic class MyBungeePlugin extends Plugin implements PluginMessageListener {\n\n @Override\n public void onEnable() {\n getProxy().registerChannel("BungeeCord");\n getProxy().getPluginManager().registerListener(this, this);\n }\n\n @Override\n public void onDisable() {\n getProxy().unregisterChannel("BungeeCord");\n }\n\n @Override\n public void onPluginMessageReceived(String channel, ProxiedPlayer player, byte[] message) {\n if (channel.equals("BungeeCord")) {\n String[] parts = new String(message).split(";");\n if (parts[0].equals("ConnectOther")) {\n String targetPlayerName = parts[1];\n String targetServerName = parts[2];\n\n ProxiedPlayer targetPlayer = getProxy().getPlayer(targetPlayerName);\n ServerInfo targetServer = getProxy().getServerInfo(targetServerName);\n\n if (targetPlayer != null && targetServer != null) {\n targetPlayer.connect(targetServer);\n \n // 发送插件消息,告知Spigot服务器玩家已成功传送\n byte[] data = ("TeleportOther;"+targetPlayerName+";"+targetServerName).getBytes();\n player.getServer().sendData("BungeeCord", data);\n }\n }\n }\n }\n}\n\n\n这个BungeeCord插件注册了一个BungeeCord插件通道,并监听插件消息。当接收到ConnectOther消息时,插件将根据消息中的玩家名称和目标服务器名称,将玩家传送到目标服务器。然后,插件会发送一个包含TeleportOther信息的插件消息给Spigot服务器,告知玩家已成功传送到目标服务器。\n\n需要注意的是,为了使这两个插件能够相互通信,你需要在Bukkit插件和BungeeCord插件的plugin.yml文件中添加适当的插件消息声明。在Bukkit插件的plugin.yml文件中添加以下内容:\n\nyaml\nchannels:\n - BungeeCord\n\n\n在BungeeCord插件的config.yml文件中添加以下内容:\n\nyaml\nlisteners:\n- query_port: 25577\n motd: '&1Just Another BungeeCord Server'\n priorities:\n - lobby\n - survival\n - creative\n - skyblock\n bind_local_address: true\n tab_list: GLOBAL_PING\n forced_hosts:\n pvp.md-5.net: pvp\n server_connect_timeout: 5000\n server_throttle: 400\n ip_forward: true\n log_commands: false\n remote_ping_cache: 0\n remote_ping_timeout: 5000\n connection_throttle: 4000\n servers:\n lobby:\n motd: '&1Just Another Lobby Server'\n address: localhost:25565\n restricted: false\n survival:\n motd: '&1Just Another Survival Server'\n address: localhost:25566\n restricted: false\n creative:\n motd: '&1Just Another Creative Server'\n address: localhost:25567\n restricted: false\n skyblock:\n motd: '&1Just Another Skyblock Server'\n address: localhost:25568\n restricted: false\n\n\n这个配置文件中定义了四个服务器,分别是lobby、survival、creative和skyblock。你可以根据需要进行调整。\n\n请注意,这只是一个示例代码,你可能需要根据你的实际需求进行修改和适配。希望能对你有所帮助!\n
原文地址: https://www.cveoy.top/t/topic/p7ps 著作权归作者所有。请勿转载和采集!