public MessageTables(Region region, uint version) { region.CheckValidity(nameof(region)); Region = region; Game = new GameMessageTable(version); System = new SystemMessageTable(version); }
public PacketLogWriter(Region region, GameMessageTable gameMessages, SystemMessageTable systemMessages, ServerInfo[] servers, string directory, string fileNameFormat, bool compress) { if (servers == null) { throw new ArgumentNullException(nameof(servers)); } if (servers.Any(x => x == null)) { throw new ArgumentException("A null server was given.", nameof(servers)); } if (fileNameFormat == null) { throw new ArgumentNullException(nameof(fileNameFormat)); } IsCompressed = compress; Region = region.CheckValidity(nameof(region)); GameMessages = gameMessages ?? throw new ArgumentNullException(nameof(gameMessages)); SystemMessages = systemMessages ?? throw new ArgumentNullException(nameof(systemMessages)); Servers = servers.ToDictionary(x => x.Id); Directory.CreateDirectory(directory); Stream stream = File.Open( Path.Combine(directory, DateTime.Now.ToString(fileNameFormat) + ".pkt"), FileMode.Create, FileAccess.Write); var magic = PacketLogEntry.Magic.ToArray(); stream.Write(magic, 0, magic.Length); stream.WriteByte((byte)(compress ? 6 : 0)); if (compress) { stream = new DeflateStream(stream, CompressionLevel.Optimal); } _writer = new GameBinaryWriter(stream); _writer.WriteUInt32(Version); _writer.WriteByte((byte)Region); _writer.WriteUInt32(GameMessages.Version); _writer.WriteUInt32((uint)servers.Length); foreach (var server in servers) { _writer.WriteInt32(server.Id); _writer.WriteString(server.Name); _writer.WriteBoolean(server.RealEndPoint.AddressFamily == AddressFamily.InterNetworkV6); _writer.WriteBytes(server.RealEndPoint.Address.GetAddressBytes()); _writer.WriteUInt16((ushort)server.RealEndPoint.Port); _writer.WriteBytes(server.ProxyEndPoint.Address.GetAddressBytes()); _writer.WriteUInt16((ushort)server.ProxyEndPoint.Port); } }
protected PacketSerializer(Region region, GameMessageTable gameMessages, SystemMessageTable systemMessages) { Region = region.CheckValidity(nameof(region)); GameMessages = gameMessages ?? throw new ArgumentNullException(nameof(gameMessages)); SystemMessages = systemMessages ?? throw new ArgumentNullException(nameof(systemMessages)); var byType = new Dictionary <Type, PacketInfo>(); var byName = new Dictionary <string, PacketInfo>(); var byCode = new Dictionary <ushort, PacketInfo>(); void RegisterType(Type type, PacketAttribute attribute, ushort?code) { var info = new PacketInfo(type, attribute, (from prop in type.GetProperties() let opts = prop.GetCustomAttribute <PacketFieldOptionsAttribute>() where opts == null || (!opts.Skip && (opts.Regions.Length == 0 || opts.Regions.Contains(region))) orderby prop.MetadataToken select CreateFieldInfo(prop, opts)).ToArray()); byType.Add(type, info); if (code is ushort c) { byName.Add(attribute.Name, info); byCode.Add(c, info); } foreach (var field in info.Fields.Where(x => x.IsArray)) { RegisterType(field.Property.PropertyType.GetGenericArguments()[0], null, null); } } foreach (var type in Assembly.GetExecutingAssembly().DefinedTypes) { var attr = type.GetCustomAttribute <PacketAttribute>(); if (attr == null) { continue; } if (!gameMessages.NameToCode.TryGetValue(attr.Name, out var code)) { _log.Warning("Game message {0} not mapped to a code; ignoring definition", attr.Name); continue; } RegisterType(type, attr, code); } _byType = byType; _byName = byName; _byCode = byCode; }
public CompilerPacketSerializer(Region region, GameMessageTable gameMessages, SystemMessageTable systemMessages) : base(region, gameMessages, systemMessages) { foreach (var code in gameMessages.CodeToName.Keys) { var info = GetPacketInfo(code); if (info == null) { continue; } _creators.Add(info, CompileCreator(info)); _serializers.Add(info, CompileSerializer(info)); _deserializers.Add(info, CompileDeserializer(info)); } _log.Basic("Compiled {0} packet serializers", _serializers.Count); }
public PacketLogReader(string fileName) { Stream stream = File.OpenRead(fileName); using var reader = new GameBinaryReader(stream, true); if (!reader.ReadBytes(PacketLogEntry.Magic.Count).SequenceEqual(PacketLogEntry.Magic)) { throw new InvalidDataException("Invalid magic number."); } Version = reader.ReadUInt32(); if (Version != PacketLogEntry.Version) { throw new InvalidDataException($"Unknown format version {Version}."); } Region = (Region)reader.ReadByte(); if (!Enum.IsDefined(typeof(Region), Region)) { throw new InvalidDataException($"Unknown region value {Region}."); } var clientVersion = reader.ReadUInt32(); if (!DataCenter.ClientVersions.Values.Contains(clientVersion)) { throw new InvalidDataException($"Unknown client version {clientVersion}."); } GameMessages = new GameMessageTable(clientVersion); SystemMessages = new SystemMessageTable(clientVersion); var serverCount = (int)reader.ReadUInt32(); 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($"Duplicate server ID {id}."); } 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; try { realEP = new IPEndPoint(new IPAddress(realIPBytes), realPort); } catch (ArgumentOutOfRangeException) { throw new InvalidDataException($"Invalid real port {realPort}."); } catch (ArgumentException) { throw new InvalidDataException("Invalid real IP address."); } IPEndPoint proxyEP; try { proxyEP = new IPEndPoint(new IPAddress(proxyIPBytes), proxyPort); } catch (ArgumentOutOfRangeException) { throw new InvalidDataException($"Invalid proxy port {proxyPort}."); } catch (ArgumentException) { throw new InvalidDataException("Invalid proxy IP address."); } servers.Add(id, new ServerInfo(id, name, realEP, proxyEP)); } Servers = servers; CompressionLevel = reader.ReadByte(); _reader = new GameBinaryReader(CompressionLevel != 0 ? new FastDeflateStream(stream, CompressionMode.Decompress) : stream); }
public ReflectionPacketSerializer(Region region, GameMessageTable gameMessages, SystemMessageTable systemMessages) : base(region, gameMessages, systemMessages) { }
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(); } var level = stream.ReadByte(); if (level == -1) { throw new EndOfStreamException(); } if ((CompressionLevel = (byte)level) != 0) { stream = new DeflateStream(stream, CompressionMode.Decompress); } _reader = new GameBinaryReader(stream); Version = _reader.ReadUInt32(); if (Version != PacketLogEntry.Version) { throw new InvalidDataException(); } Region = (Region)_reader.ReadByte(); if (!Enum.IsDefined(typeof(Region), Region)) { throw new InvalidDataException(); } var clientVersion = _reader.ReadUInt32(); if (!DataCenter.Versions.Values.Contains(clientVersion)) { throw new InvalidDataException(); } GameMessages = new GameMessageTable(clientVersion); SystemMessages = new SystemMessageTable(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; }