0

我有一个服务器包装器,它基本上从控制台获取输出并为我的世界提供额外的功能。

旁边有一个播放器列表,我希望列表显示连接的播放器。

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

您最好将玩家存储在字典(地图)中,然后您可以按名称添加和删除它们。

要捕获名称,您可以使用正则表达式,或者看起来您可以从名称位置开始获取子字符串,因为这看起来是一致的。

string name = outputString.Substring(27)

然后你可以分割一个空间并在位置 0 处获取结果。

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

于 2012-05-17T17:15:22.180 回答
0

有点hacky,但这应该可行:

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

更多的部分答案:

假设您只是解析控制台输出并相应地响应消息 - 您是否可以不只解析字符串以查看它是否包含某个短语,例如“登录”和“断开连接”?您可以使用正则表达式从字符串中获取所需的标记,以从消息中构建对象。我假设'name'是玩家的名字——在这种情况下你甚至可能不需要使用正则表达式——玩家可以在我的世界服务器上拥有重复的名字吗?

如果没有,那么您应该能够将此令牌用作字典的键,例如

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 回答