我有一个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协议得到任何回复。
答案 0 :(得分: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获取服务器日志。