Esempio n. 1
0
        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;
        }