2017-09-05 69 views
0
发送播放机到另一台服务器

所以我试图派球员,当他们键入大厅服务器“/大堂”通过使用此代码:通过蹦极

Bukkit.getServer().dispatchCommand((Player) player, "server lobby"); 

但在比赛中,则返回“未知命令。输入“/ help”寻求帮助。“ 我也看到了尝试这种代码,但我不知道要放什么东西来代替“A”,“B”和“C”

ByteArrayDataOutput out = ByteStreams.newDataOutput(); 
out.writeUTF("a"); 
out.writeUTF("b");  
//applies to the player you send it to. aka Kick To Server. 
Player player = Bukkit.getPlayerExact("c"); 
player.sendPluginMessage(this, "BungeeCord", out.toByteArray()); 

所以我的问题是,为什么不第一方法不起作用?另外,你如何使第二个解决方案的工作?我需要在蹦极服务器上放置代码吗?

回答

2

ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("Connect"); out.writeUTF("ServerName"); player.sendPluginMessage(PluginObject, "BungeeCord", out.toByteArray());

这是你在找什么。要回答你的问题,“a”总是“连接”。 “b”是你想要连接的服务器的名称(在你的情况下,这是“大厅”),“c”是玩家的名字(这是因为在你提供的例子中你得到了玩家的名字,但如果你已经有玩家对象,这是不需要的)。

只是为了让你明白为什么dispatchCommand不起作用,这是因为当你在客户端上执行/ server时,它会向Bungeecord发送一个数据包,因为这就是你的客户端连接的数据包,并且它会拦截那个命令包阅读它并看到它是一个服务器命令。然后它会继续将您连接到正确的服务器。如果您在Bukkit服务器上使用dispatchCommand,它将执行该命令,就好像它刚刚收到一个命令包一样,这意味着它永远不会向bungeecord或客户端发送任何消息来让它执行命令。 dispatchCommand方法只能在bukkit服务器上运行。

第二个解决方案工作的原因是因为在Minecraft协议中有一个叫做插件消息通道的东西,用于客户端和服务器之间的自定义消息。再一次,因为Bungeecord位于客户端和服务器中间,它会监听某些消息,并且任何标有Connect的消息都会将播放器连接到指定的服务器。我希望这是有道理的。