1

C# で Minecraft CraftBukkit サーバーをホストするための GUI を作成しようとしています。CraftBukkit サーバーは、ソース コードである .jar でホストされています: https://github.com/Bukkit/CraftBukkit/

これまでのところ、私はそれから出力を受け取り、次のように入力することができます:

var serverProcInfo = new ProcessStartInfo("javaw",
                                                  "-jar -Xms" + Ram + "M -Xmx" + Ram + "M \"" +
                                                  JarFileLocation + "\" -nojline " + AdditionalParams)
            {
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false
            };

        serverProc = new Process {StartInfo = serverProcInfo };

        serverProc.OutputDataReceived += ServerOutputDataReceived;
        serverProc.ErrorDataReceived += ServerOutputDataReceived;

        serverProc.BeginOutputReadLine();
        serverProc.BeginErrorReadLine();
        serverProc.WaitForExit();

現在オンラインになっているすべてのプレイヤーのリストを作成したいと考えています。

プレイヤーが参加すると、このようなメッセージが出力されますplayer < playername > has joined the server。この文字列を分割してプレイヤー名を取得できることは知っていますが、誰かがチャットでそのようなことを言う可能性があり、私のプログラムはそれを誰かがサーバーに参加したかのように解釈する可能性があるため、あまり良くないと思います.

他のプログラムがこれを行うのを見ました (「BukkitGUI」) が、どうすればこれを行うことができるかわかりません。.jar ファイルはプレイヤー リストを出力しますか? 出力内容を確認するには、ソース コードで何を探す必要がありますか?

私は C# に比較的慣れておらず、Java を学んだことはありません。どんな助けでも大歓迎です。

EDIT1 : CraftBukkit.jar に次のようなクラスがあることがわかりました:

@SuppressWarnings("unchecked")
public Player[] getOnlinePlayers() {
    List<EntityPlayer> online = playerList.players;
    Player[] players = new Player[online.size()];

    for (int i = 0; i < players.length; i++) {
        players[i] = online.get(i).playerConnection.getPlayer();
    }
    return players;
}

このクラスを呼び出す方法はありますか?

4

2 に答える 2

1

残念ながら、Java と C# の間のクロスプロセス通信はそれほど単純ではありません。最善の策は、list コマンドをサーバーに送信して出力を解析することです。または、Java を記述したい場合は、ソケットを開いて情報をやり取りする minecraft サーバー用のプラグインを作成することもできます。

于 2013-05-07T12:48:49.480 に答える
0

私はこれに対する解決策を見つけます。実際には非常に簡単です。

まず、.jar ファイルを開始するプロセスを作成します。次に、次のことを行います。

Process.OutputDataReceived += ServerOutputHandler.ServerOutputReceived;
Process.ErrorDataReceived += ServerOutputHandler.ServerOutputReceived;

プロセスを開始した後 ( Process.Start):

Process.BeginOutputReadLine();
Process.BeginErrorReadLine();

.jar ファイルの処理について詳しく知りたい場合は、私のオープン ソース プロジェクト (少し前に断念しました) ServerCrafterを参照してください。上記のコードを実行するソース コードの部分については、ここを参照してください: Server Crafter source code: ServerCrafter\ServerCrafter.ClassLibrary\ClassLibrary\Server\Server.cs

于 2014-01-04T17:16:19.950 に答える