2

我有一个 NodeJS / SocketIO 应用程序,它通过 RCON 协议连接到我的 Minecraft 服务器,它运行良好,保持连接打开并侦听检索到的任何类型的数据。

例如,如果我输入了一个不可用的命令,它会回复一条消息。

现在我正在尝试每当 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 协议得到任何回复。

4

1 回答 1

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 获取服务器日志,只需键入命令或创建您的客户端应用程序,以便它每秒左右执行此命令。

于 2016-01-25T10:09:57.340 回答