public ServerInfo Parse(byte[] data) { var server = new ServerInfo(); var reader = new PacketReader(data); var header = reader.ReadByte(); var headerChar = Convert.ToChar(header); var protocol = reader.ReadByte(); var name = reader.ReadUTFString(); var map = reader.ReadUTFString(); var folder = reader.ReadUTFString(); var game = reader.ReadUTFString(); var appId = reader.ReadShort(); var players = reader.ReadByte(); var maxPlayers = reader.ReadByte(); var bots = reader.ReadByte(); var type = reader.ReadByte(); var environment = reader.ReadByte(); var visibility = reader.ReadByte(); var isSecured = reader.ReadByte(); var version = reader.ReadUTFString(); server.Name = name; server.Map = map; server.Players = players; server.MaxPlayers = maxPlayers; server.Bots = bots; server.Game = game; server.AppId = appId; server.Folder = folder; server.Protocol = protocol; var typeChar = Convert.ToChar(type); switch (typeChar) { case 'd': server.Type = ServerType.Dedicated; break; case 'l': server.Type = ServerType.NonDedicated; break; case 'p': server.Type = ServerType.Proxy; break; }; var envirommentChar = Convert.ToChar(environment); switch (envirommentChar) { case 'l': server.Environment = ServerEnvironment.Linux; break; case 'w': server.Environment = ServerEnvironment.Windows; break; case 'm': case 'o': server.Environment = ServerEnvironment.Mac; break; } server.Visibility = (visibility == 0) ? ServerVisibility.Public : ServerVisibility.Private; server.IsSecured = (isSecured == 1); server.Version = version; if (!reader.IsEnd) { var extraDataFlag = reader.ReadByte(); if ((extraDataFlag & 0x80) > 0) { server.Port = reader.ReadShort(); } if ((extraDataFlag & 0x10) > 0) { server.SteamId = reader.ReadLongLong(); } if ((extraDataFlag & 0x40) > 0) { server.SourceTVPort = reader.ReadShort(); server.SourceTVName = reader.ReadUTFString(); } if ((extraDataFlag & 0x20) > 0) { server.Tags = reader.ReadUTFString(); } if ((extraDataFlag & 0x01) > 0) { server.GameId = reader.ReadLongLong(); } } return server; }