2013-07-17 1 views
2

У меня есть приложение NodeJS/SocketIO, которое подключается к моему серверу Minecraft через протокол RCON, и оно отлично работает, держит соединение открытым и прослушивает любые данные, которые извлекаются.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

RCON, используемый minecraft, не имеет механизма для отправки сообщений после первоначальных пакетов – Ferrybig

ответ

0

RCON, используемый minecraft, не имеет механизма для отправки сообщений после первоначальных пакетов. Если вам нужен такой механизм, вам нужно придумать свой собственный протокол или сделать команду, которая возвращает последний журнал чата, если он будет выполнен.

Чтобы сделать эту команду, мы можем просто сделать 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, просто набрав команду или создав клиентское приложение, чтобы он выполнял эту команду каждую секунду или около того.

Смежные вопросы