public PacketLogEntry Read() { if (_disposed) { throw new ObjectDisposedException(GetType().FullName); } try { DateTime stamp; try { stamp = DateTimeOffset.FromUnixTimeMilliseconds( _reader.ReadInt64()).LocalDateTime; } catch (ArgumentOutOfRangeException) { throw new InvalidDataException(); } var id = _reader.ReadInt32(); if (!Servers.ContainsKey(id)) { throw new InvalidDataException(); } var direction = (Direction)_reader.ReadByte(); if (!Enum.IsDefined(typeof(Direction), direction)) { throw new InvalidDataException(); } var opCode = _reader.ReadUInt16(); if (!Messages.Game.OpCodeToName.ContainsKey(opCode)) { throw new InvalidDataException(); } var length = _reader.ReadUInt16(); var payload = _reader.ReadBytes(length); return(new PacketLogEntry(stamp, id, direction, opCode, payload)); } catch (EndOfStreamException) { return(null); } }
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; }
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); }