0

私はサーバーラッパーを持っています。これは基本的にコンソールからの出力を受け取り、Minecraft に追加機能を提供します。

横にプレイヤーリストがありますが、リストに接続中のプレイヤーを表示したいです。

Here is the output for a player Joining:
2012-05-17 17:56:32 [INFO] name [/192.168.0.16:50719] logged in with entity id 1873 at ([world] -34.8881557254211, 63.0, 271.69999998807907)

Output for player leaving:
2012-05-17 17:58:03 [INFO] name lost connection: disconnect.quitting

参加時にプレーヤーをリストに追加し、終了時に削除するにはどうすればよいですか?

どんな助けでも素晴らしいでしょう、ありがとう。

4

3 に答える 3

0

少しハッキーですが、これはうまくいくはずです:

var input = "2012-05-17 17:56:32 [INFO] name [/192.168.0.16:50719] logged in with entity id 1873 at ([world] -34.8881557254211, 63.0, 271.69999998807907)";

var name = Regex.Matches(input, @"\]\s(.+?)\s")[0].Groups[1].Value;
于 2012-05-17T17:08:07.137 に答える
0

プレーヤーをディクショナリ (マップ) に保存してから、名前で追加および削除することをお勧めします。

名前をキャプチャするには、正規表現を使用できます。または、一貫しているように見えるため、名前の位置から始まる部分文字列を取得できるようです。

string name = outputString.Substring(27)

次に、スペースで分割し、位置 0 で結果を取得できます。

name = name.Split(' ')[0];

于 2012-05-17T17:15:22.180 に答える
0

部分的な答えの詳細:

コンソール出力を解析し、それに応じてメッセージに応答していると仮定すると、文字列を解析して、「ログイン」や「切断」などの特定のフレーズが含まれているかどうかを確認できませんか? 正規表現を使用して文字列から必要なトークンを取得し、メッセージからオブジェクトを構築できます。「名前」はプレイヤーの名前だと思います - この場合、正規表現を使用する必要さえないかもしれません - プレイヤーはMinecraftサーバーで重複した名前を持つことができますか?

そうでない場合は、このトークンを辞書のキーとして使用できるはずです。

Dictionary<string, playerObject>

そうすれば、メッセージをリスト内のオブジェクトに関連付けることができます。

擬似コード:

private void OnNewMessage(string message) 
{
   if(message.Contains("logged in")) 
   {
      // Build player object
      // some code here ... to parse the string

      // Add to player dictionary
      PlayerDict.Add(playerName, newPlayerObject);
   }
   else if(message.Contains("disconnect")) 
   {
      // Find the player object by parsing the string
      PlayerDict.Remove(playerName);
   }
}

これまでに得たものと、これを書いている技術についてもう少し情報を提供できますか? バインディングなど、さらにいくつかの考慮事項があります(タグにリストボックスがあるため、winformsであると想定しています)。使用する技術によっては、方法がわずかに異なる場合があります

于 2012-05-17T17:10:05.783 に答える