コード例 #1
0
        public PacketLogReader(string fileName)
        {
            Stream stream = File.OpenRead(fileName);

            var magic = new byte[PacketLogEntry.Magic.Count];

            if (stream.Read(magic, 0, magic.Length) != magic.Length)
            {
                throw new EndOfStreamException();
            }

            if (!magic.SequenceEqual(PacketLogEntry.Magic))
            {
                throw new InvalidDataException();
            }

            Compressed = stream.ReadByte() != 0;

            if (Compressed)
            {
                stream = new DeflateStream(stream, CompressionMode.Decompress);
            }

            _reader = new TeraBinaryReader(stream);
            Version = _reader.ReadUInt32();

            if (Version != PacketLogEntry.Version)
            {
                throw new InvalidDataException();
            }

            var region = (Region)_reader.ReadByte();

            if (!Enum.IsDefined(typeof(Region), region))
            {
                throw new InvalidDataException();
            }

            var clientVersion = _reader.ReadUInt32();

            if (!OpCodeTable.Versions.Values.Contains(clientVersion))
            {
                throw new InvalidDataException();
            }

            Messages = new MessageTables(region, clientVersion);

            var serverCount = (int)_reader.ReadUInt32();

            if (serverCount < 0)
            {
                throw new InvalidDataException();
            }

            var servers = new Dictionary <int, ServerInfo>(serverCount);

            for (var i = 0; i < serverCount; i++)
            {
                var id = _reader.ReadInt32();

                if (servers.ContainsKey(id))
                {
                    throw new InvalidDataException();
                }

                var name         = _reader.ReadString();
                var size         = _reader.ReadBoolean() ? 16 : 4;
                var realIPBytes  = _reader.ReadBytes(size);
                var realPort     = _reader.ReadUInt16();
                var proxyIPBytes = _reader.ReadBytes(size);
                var proxyPort    = _reader.ReadUInt16();

                IPEndPoint realEP;
                IPEndPoint proxyEP;

                try
                {
                    realEP  = new IPEndPoint(new IPAddress(realIPBytes), realPort);
                    proxyEP = new IPEndPoint(new IPAddress(proxyIPBytes), proxyPort);
                }
                catch (ArgumentException)
                {
                    throw new InvalidDataException();
                }

                servers.Add(id, new ServerInfo(id, name, realEP, proxyEP));
            }

            Servers = servers;
        }
コード例 #2
0
        static object DeserializePrimitive(TeraBinaryReader reader, Type type)
        {
            object value;

            if (type == typeof(bool))
            {
                value = reader.ReadBoolean();
            }
            else if (type == typeof(byte))
            {
                value = reader.ReadByte();
            }
            else if (type == typeof(sbyte))
            {
                value = reader.ReadSByte();
            }
            else if (type == typeof(ushort))
            {
                value = reader.ReadUInt16();
            }
            else if (type == typeof(short))
            {
                value = reader.ReadInt16();
            }
            else if (type == typeof(uint))
            {
                value = reader.ReadUInt32();
            }
            else if (type == typeof(int))
            {
                value = reader.ReadInt32();
            }
            else if (type == typeof(ulong))
            {
                value = reader.ReadUInt64();
            }
            else if (type == typeof(long))
            {
                value = reader.ReadInt64();
            }
            else if (type == typeof(float))
            {
                value = reader.ReadSingle();
            }
            else if (type == typeof(Vector3))
            {
                value = reader.ReadVector3();
            }
            else if (type == typeof(EntityId))
            {
                value = reader.ReadEntityId();
            }
            else if (type == typeof(SkillId))
            {
                value = reader.ReadSkillId();
            }
            else if (type == typeof(Angle))
            {
                value = reader.ReadAngle();
            }
            else
            {
                throw Assert.Unreachable();
            }

            return(value);
        }