コード例 #1
0
ファイル: IPCChannel.cs プロジェクト: baburukiri/AOSharp
        private void ProcessIPCMessage(byte[] msgBytes)
        {
            try
            {
                using (MemoryStream stream = new MemoryStream(msgBytes))
                {
                    StreamReader reader = new StreamReader(stream)
                    {
                        Position = 0
                    };

                    if (reader.ReadUInt16() != 0xFFFF)
                    {
                        return;
                    }

                    ushort len = reader.ReadUInt16();

                    if (len != msgBytes.Length)
                    {
                        return;
                    }

                    byte channelId = reader.ReadByte();

                    if (channelId != _channelId)
                    {
                        return;
                    }

                    int charId = reader.ReadInt32();

                    if (charId == Game.ClientInst)
                    {
                        return;
                    }

                    reader.Position = 2;
                    TypeInfo subTypeInfo = _packetInspector.FindSubType(reader, out int opCode);

                    if (subTypeInfo == null)
                    {
                        return;
                    }

                    var serializer = _serializerResolver.GetSerializer(subTypeInfo.Type);
                    if (serializer == null)
                    {
                        return;
                    }

                    reader.Position = 11;
                    SerializationContext serializationContext = new SerializationContext(_serializerResolver);

                    IPCMessage message = (IPCMessage)serializer.Deserialize(reader, serializationContext);

                    if (_callbacks.ContainsKey(opCode))
                    {
                        _callbacks[opCode]?.Invoke(charId, message);
                    }
                }
            }
            catch (Exception e)
            {
                //If you get this message and it concerns you please create an issue or contact me on Discord!
                Chat.WriteLine($"Failed to process IPC message {e.Message}");
            }
        }