2

RCONプロトコルを介してMinecraftサーバーに接続するNodeJS / SocketIOアプリがあり、完全に機能し、接続を開いたままにして、取得されるあらゆる種類のデータをリッスンします。

たとえば、使用できないコマンドを入力すると、メッセージが返されます。

現在、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);
    }
}

これにより、コマンドを入力するか、クライアント アプリケーションを作成して、このコマンドを約 1 秒ごとに実行するだけで、rcon からサーバー ログを取得できます。

于 2016-01-25T10:09:57.340 に答える