我有一个服务器包装器,它基本上从控制台获取输出并为我的世界提供额外的功能。
旁边有一个玩家列表,我希望列表显示已连接的玩家。
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
如何在加入时将播放器添加到列表中,并在退出时删除?
任何帮助都会很棒,谢谢。
答案 0 :(得分: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;
答案 1 :(得分:0)
更多的部分答案:
假设您只是解析控制台输出并相应地响应消息 - 您是否可以解析字符串以查看它是否包含某个短语,例如“登录”和“断开连接”?您可以使用正则表达式从字符串中获取所需的标记,以便从消息中构建对象。我假设'name'是玩家的名字 - 在这种情况下你可能甚至不需要使用正则表达式 - 玩家可以在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),例如绑定,并且根据所使用的技术,该方法可能略有不同
答案 2 :(得分:0)
您可能最好将您的播放器存储在字典(地图)中,然后您可以按名称添加和删除它们。
要捕获名称,您可以使用正则表达式,或者看起来您可能会从名称的位置开始使用子字符串,因为它看起来是一致的。
string name = outputString.Substring(27)
然后你可以拆分一个空格并将结果取在第0位。
name = name.Split(' ')[0];