public static void HandlePacket(byte[] Data, byte Module, PacketType Type, UInt32 Unk01, TORGameClient Client) { // TODO: Check for packet drop IPacket iPacket = null; ClientState State = Client.State; switch (State) { case ClientState.CONNECTING: switch (Type) { case PacketType.ConnectionHandshake: iPacket = new ConnectionHandshake(); break; default: Log.Write(LogLevel.Warning, "Received Unknown Packet [{0:X}] on State '{1}'\n{2}", Type, State.ToString(), Data.ToHEX()); break; } break; case ClientState.CONNECTED: switch (Type) { case PacketType.ObjectReply: iPacket = new ObjectReply(); break; case PacketType.Ping: iPacket = new Ping(); break; default: Log.Write(LogLevel.Warning, "Received Unknown Packet [{0:X}] on State '{1}'\n{2}", Type, State.ToString(), Data.ToHEX()); break; } break; case ClientState.AUTHED: switch (Type) { case PacketType.CreateCharacterRequest: Log.Write(LogLevel.Warning, "\n{0}", Data.ToHEX()); iPacket = new CreateCharacterRequest(); break; case PacketType.ObjectReply: iPacket = new ObjectReply(); break; case PacketType.ServiceRequest: iPacket = new ServiceRequest(); break; case PacketType.RequestClose: iPacket = new RequestClose(); break; case PacketType.TimeRequesterRequest: iPacket = new TimeRequesterRequest(); break; case PacketType.HackNotifyData: iPacket = new HackNotifyData(); break; case PacketType.CMsgC26464A9: iPacket = new CMsgC26464A9(); break; case PacketType.CMsg7CB9A193: iPacket = new CMsg7CB9A193(); break; case PacketType.ModulesList: iPacket = new ModulesList(); break; case PacketType.AreaModulesList: iPacket = new AreaModulesList(); break; case PacketType.SetTrackingInfo: iPacket = new SetTrackingInfo(); break; case PacketType.CharacterListRequest: iPacket = new CharacterListRequest(); break; case PacketType.SelectCharacterRequest: iPacket = new SelectCharacterRequest(); break; case PacketType.Ping: iPacket = new Ping(); break; default: Log.Write(LogLevel.Warning, "Received Unknown Packet [{0:X}] on State '{1}'\n{2}", Type, State.ToString(), Data.ToHEX()); break; } break; case ClientState.IN_GAME: switch (Type) { case PacketType.RequestClose: iPacket = new RequestClose(); break; case PacketType.SetTrackingInfo: iPacket = new SetTrackingInfo(); break; case PacketType.Ping: iPacket = new Ping(); break; // TODO: Implement Game Packets default: Log.Write(LogLevel.Warning, "Received Unknown Packet [{0:X}] on State '{1}'\n{2}", Type, State.ToString(), Data.ToHEX()); break; } break; } if (iPacket != null) { iPacket.SetClient(Client); iPacket.SetBuffers(Data); //Log.Write(LogLevel.EDebug, "{0}", Data.ToHEX()); iPacket.Read(); iPacket.Run(); } }
public void SetClient(TORGameClient inClient) { _client = inClient; }
public static void InitPacket(byte[] inBuffer, TORGameClient Client) { if (Client.State == ClientState.CONNECTING) { //Log.Write(LogLevel.Debug, "Received an unencrypted packet"); // Packet is not encrypted byte Module = 0xFF; PacketType Type = (PacketType)inBuffer[0]; UInt32 Unk01 = 0xFF; Log.Write(LogLevel.Client, "Received a packet [{0}]", Type.ToString()); HandlePacket(inBuffer, Module, Type, Unk01, Client); } else { //Log.Write(LogLevel.Debug, "Received an encrypted packet"); // Packet is encrypted byte[] decData = new byte[inBuffer.Length]; Client.GetDecryptor().ProcessBytes(inBuffer, 0, inBuffer.Length, decData, 0); MemoryStream IStream = new MemoryStream(decData); EndianBinaryReader IReader = new EndianBinaryReader(MiscUtil.Conversion.BigEndianBitConverter.Little, IStream); int remLength = decData.Length; //Log.Write(LogLevel.Debug, "{0}", decData.ToHEX()); do { byte Module = IReader.ReadByte(); int pLength = IReader.ReadInt32(); int pChecksum = IReader.ReadByte(); if (VerifyChecksum(decData, pChecksum, (int)IReader.BaseStream.Position - 6)) { //Log.Write(LogLevel.Client, "Length: {0}", pLength); byte[] Data = Decompress(IReader.ReadBytes(pLength - 6), Client.GetInflateStream()); //Log.Write(LogLevel.Warning, "\n{0}", Data.ToHEX(Data.Length)); MemoryStream HStream = new MemoryStream(Data); EndianBinaryReader HReader = new EndianBinaryReader(MiscUtil.Conversion.EndianBitConverter.Little, HStream); PacketType Type; UInt32 Unk01; if (Module == 0x01) // Ping Packet { Type = PacketType.Ping; } else { Type = (PacketType)HReader.ReadUInt32(); } Log.Write(LogLevel.Client, "Received a packet [{0}]", Type.ToString()); Unk01 = HReader.ReadUInt32(); HReader.Dispose(); HStream.Dispose(); HandlePacket(Data, Module, Type, Unk01, Client); } remLength -= pLength; }while (remLength > 0); IReader.Close(); IStream.Close(); } }