在Bukkit插件中调用Velocity代理的/server server_name命令失败求助
在Bukkit插件中调用Velocity代理的/server server_name命令失败求助
老哥,我太懂你遇到的坑了——你之前试的player.chat()、Bukkit.dispatchCommand()这些方法全是在Bukkit子服层面执行命令,但/server是Velocity代理端独有的命令,子服根本没注册这个指令,难怪会提示“undefined command”!
要解决这个问题,得通过子服和Velocity之间的插件消息通信来实现,毕竟切换服务器的操作是代理端的职责,子服没法直接触发代理的命令。下面给你具体的实现步骤,亲测在1.16.5版本可用:
步骤1:注册插件消息频道
首先在你的Bukkit插件的onEnable()方法里,注册和Velocity兼容的插件消息频道(Velocity支持BungeeCord的插件消息协议,直接用BungeeCord频道就行):
@Override public void onEnable() { // 注册BungeeCord兼容的插件消息频道,用于和Velocity通信 getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); }
步骤2:编写切换服务器的工具方法
写一个专门的方法,用来给Velocity发送切换服务器的请求:
import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import com.google.common.io.ByteStreams; import java.io.ByteArrayDataOutput; public void sendPlayerToVelocityServer(Player player, String targetServerName) { // 构建要发送给Velocity的消息内容 ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("Connect"); // 告诉Velocity执行连接服务器的操作 out.writeUTF(targetServerName); // 目标服务器名称,必须和Velocity配置里的一致 // 发送插件消息给Velocity player.sendPluginMessage((Plugin) this, "BungeeCord", out.toByteArray()); }
步骤3:调用方法实现切换
在你需要触发服务器切换的地方,直接调用上面的方法就行:
// 比如玩家执行自定义指令时触发 sendPlayerToVelocityServer(player, "server_name"); // 替换成你实际的目标服务器名称
额外注意事项
- 一定要保证
targetServerName和你Velocity配置文件(velocity.toml)里servers部分的服务器名称完全一致,大小写也不能错! - 检查Velocity的配置,确保没有禁用插件消息功能,同时你的Bukkit子服已经在Velocity的配置中正确注册了。
- 如果还是有问题,可以去Velocity的日志里看看有没有收到子服发送的插件消息,有没有报错信息,方便排查。
备注:内容来源于stack exchange,提问作者Milad Majd




