要实现 Spigot 1.20 与 BungeeCord 核心通信,并允许玩家输入指令后传送到其他子服务器,你可以按照以下步骤进行操作:

  1. 在 Spigot 插件的主类中,添加以下代码以注册一个指令:
public class MyPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        // 注册指令
        getCommand('transfer').setExecutor(new TransferCommand());
    }
}
  1. 创建一个 TransferCommand 类来处理传送指令:
public class TransferCommand implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        // 检查指令发送者是否为玩家
        if (!(sender instanceof Player)) {
            sender.sendMessage('该指令只能由玩家执行!');
            return true;
        }

        Player player = (Player) sender;

        // 检查指令参数是否正确
        if (args.length != 1) {
            player.sendMessage('用法: /transfer <服务器名称>');
            return true;
        }

        String serverName = args[0];

        // 发送玩家传送请求到 BungeeCord 核心
        ByteArrayDataOutput out = ByteStreams.newDataOutput();
        out.writeUTF('ConnectOther');
        out.writeUTF(player.getName());
        out.writeUTF(serverName);

        player.sendPluginMessage(YourPlugin.getInstance(), 'BungeeCord', out.toByteArray());
        return true;
    }
}
  1. 在 Spigot 插件的主类的 onEnable 方法中,注册插件消息监听器:
public class MyPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        // 注册插件消息监听器
        getServer().getMessenger().registerIncomingPluginChannel(this, 'BungeeCord', new PluginMessageListener());
    }
}
  1. 创建一个 PluginMessageListener 类来处理来自 BungeeCord 核心的插件消息:
public class PluginMessageListener implements PluginMessageListener {

    @Override
    public void onPluginMessageReceived(String channel, Player player, byte[] message) {
        if (!channel.equals('BungeeCord')) {
            return;
        }

        ByteArrayDataInput in = ByteStreams.newDataInput(message);
        String subChannel = in.readUTF();

        if (subChannel.equals('ConnectOther')) {
            String targetPlayer = in.readUTF();
            String targetServer = in.readUTF();

            // 检查目标服务器是否在线
            if (Bukkit.getServer().getServer(targetServer) == null) {
                player.sendMessage('目标服务器不在线!');
                return;
            }

            // 检查目标玩家是否在线
            Player target = Bukkit.getServer().getPlayer(targetPlayer);
            if (target == null) {
                player.sendMessage('目标玩家不在线!');
                return;
            }

            // 发送玩家传送请求
            target.sendMessage('你被传送到了 ' + targetServer + ' 服务器!');
            target.getServer().getMessenger().registerOutgoingPluginChannel(YourPlugin.getInstance(), 'BungeeCord');
            ByteArrayDataOutput out = ByteStreams.newDataOutput();
            out.writeUTF('Connect');
            out.writeUTF(targetServer);
            target.sendPluginMessage(YourPlugin.getInstance(), 'BungeeCord', out.toByteArray());
        }
    }
}

请注意,上述代码中的 YourPlugin.getInstance() 需要替换为你自己的插件实例。此外,确保在 BungeeCord 核心 中也有相应的插件来处理传送请求。

Spigot 1.20 与 BungeeCord 核心通信实现玩家跨服务器传送

原文地址: https://www.cveoy.top/t/topic/fPI5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录