Example #1
0
        public MessageTables(Region region, uint version)
        {
            region.CheckValidity(nameof(region));

            Region = region;
            Game   = new GameMessageTable(version);
            System = new SystemMessageTable(version);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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;
        }