2013-07-17 28 views
2

我有一個NodeJS/SocketIO應用程序,它通過RCON協議連接到我的Minecraft服務器,它完美地工作,保持連接打開並偵聽任何獲取的數據。Bukkit - 將數據發回給通過RCON連接的人

例如,如果我輸入一個不可用的命令,它將回復一條消息。

現在我試圖在任何Minecraft服務器上的任何播放器聊天時,我的Bukkit插件會將該消息發送到RCON上的任何連接。

這是我的Bukkit插件的一部分,它會在玩家聊天時觸發。

@EventHandler 
    public void onPlayerChat(AsyncPlayerChatEvent e) { 
     Bukkit.getLogger().info("Test 1"); 
     this.getLogger().info("Test 2"); 
     Bukkit.getServer().getConsoleSender().sendMessage("Test 3"); 
     this.getServer().getConsoleSender().sendMessage("Test 4"); 
    } 

消息記錄在服務器日誌中,儘管我沒有通過rcon協議回覆任何消息。

+0

如果你仍然需要這個問題的答案,這裏有一個提示:嘗試添加一些更有用的信息。就像實際上通過RCON發送消息的插件部分一樣。 –

+0

minecraft使用的RCON沒有一種機制在初始數據包後發回消息 – Ferrybig

回答

0

minecraft使用的RCON沒有在初始數據包之後發回消息的機制。如果你需要這樣的機制,你需要創建你自己的協議,或者創建一個命令返回上一個聊天記錄,如果它被執行的話。

爲了使這個命令,我們可以簡單地做一個Queue<String>我們把我們的消息(如聊天)放入。

final Queue<String> messages = new ArrayDeque<>(64); 
public void insertMessage(String message) { 
    synchronized (messages) { 
     messages.add(message); 
     if (messages.size() == 64) // full 
      messages.remove(); 
    } 
} 

然後,我們可以將此方法掛鉤到我們的聊天事件:

@EventHandler(priority=EventPriority.MONITOR,ignoreCancelled=true) 
public void onChat(AsyncPlayerChatEvent evt) { 
    insertMessage("[CHAT] " + evt.getPlayer() + " : " + evt.getMessage()); 
} 

那麼我們只需要作出命令,來讀取我們的郵件列表,這很容易使:

private String getMessage() { 
    synchronized (messages) { 
     return messages.poll(); 
    } 
} 

@Override 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    if(!cmd.testPermissions()) { 
     return true; 
    } 
    String message; 
    while((message = getMessage()) != null) { 
     sender.sendMessage(message); 
    } 
} 

這允許您通過輸入命令或使您的客戶端應用程序每秒鐘執行此命令來從rcon獲取服務器日誌。