2017-09-05 68 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的消息都會將播放器連接到指定的服務器。我希望這是有道理的。