/// <summary> /// Called when the server receives a packet that it cannot handle. /// </summary> /// <param name="pSocket">The servers socket which received the packet.</param> unsafe static bool OnHandleOutsideRangePacket(byte *pSocket) { //ClientSocket sock = new ClientSocket(pSocket); byte PacketID = *(pSocket + 0x28); uint PacketSize = 0; bool IsPacketDynamicSized = false; ClientVersionStruct ver = *(ClientVersionStruct *)(pSocket + 0x1003C); ClientVersion version; if (PacketID == 0xBB && ver < ClientVersion.v1_26_0) // detect client 1.26.0 { UODemo.ISocket socket = UODemo.Socket.Acquire(Server.Core, (struct_ServerSocket *)pSocket); //ClientSocket(pSocket); version = ClientVersion.v1_26_0; socket.SetClientVersion(version.Version); } else { version = ClientVersion.Instantiate(ver); } PacketVersionEntry packetinfo = PacketVersions.GetPacketInfo(PacketID, version); if (packetinfo == null) { ConsoleUtils.PushColor(ConsoleColor.Red); Console.WriteLine("WARNING: Ignored Invalid Packet {0:X2}.", PacketID); ConsoleUtils.PopColor(); return(false); } else { //case 0xB6: PacketSize = 9; IsPacketDynamicSized = false; break; //case 0xB8: PacketSize = 0; IsPacketDynamicSized = true; break; //case 0xBB: PacketSize = 9; IsPacketDynamicSized = false; break; //case 0xBD: PacketSize = 0; IsPacketDynamicSized = true; break; //default: PacketSize = packetinfo.Length; IsPacketDynamicSized = packetinfo.Dynamic; if (MyServerConfig.PacketDebug) { Console.WriteLine("Handling Invalid Packet {0:X2} from client version {1}", PacketID, version); } OnPacketReceived(pSocket, PacketID, PacketSize, IsPacketDynamicSized ? -1 : 0); return(true); } }
private ClientPacket(UODemo.ISocket socket, byte PacketID, uint PacketSize, bool IsPacketDynamicSized) : base(socket.Data, PacketSize) { Socket = socket; Id = PacketID; m_Dynamic = IsPacketDynamicSized; }
public static ClientPacketSafe Instantiate(byte *pSocket, byte PacketID, uint PacketSize, bool IsPacketDynamicSized) { UODemo.ISocket socket = UODemo.Socket.Acquire(Server.Core, (struct_ServerSocket *)pSocket); //ClientSocket(pSocket); // Check for god mode on each packet. if (socket.PlayerObject != null && (socket.IsGod || socket.IsEditing) && !socket.VerifyGod) { socket.IsGod = false; socket.IsEditing = false; ConsoleUtils.PushColor(ConsoleColor.Red); Console.WriteLine("God/Edit Mode Disabled! Unauthorized."); ConsoleUtils.PopColor(); } ConsoleUtils.PushColor(ConsoleColor.Yellow); if (MyServerConfig.PacketDebug) { Console.WriteLine("Player Flags: {0}", socket.PlayerFlags); } ConsoleUtils.PopColor(); if (IsPacketDynamicSized && (PacketSize == 0x8000 || PacketSize == 0)) { PacketSize = ((uint)socket.Data[1] << 8) + socket.Data[2]; } if (PacketSize >= (IsPacketDynamicSized ? 3 : 1)) { // TODO: These objects should be pooled. ClientPacket packet = new ClientPacket(socket, PacketID, PacketSize, IsPacketDynamicSized); if (Network.GodPackets.IsRestrictedGodPacket(PacketID)) { ConsoleUtils.PushColor(ConsoleColor.Red); Console.Write("Received God Packet {0:X2}: ", PacketID); try { if (!socket.IsGod) { Console.WriteLine("Removed: Unauthorized"); return(new InvalidPacket(packet)); } Console.WriteLine("OK."); } finally { ConsoleUtils.PopColor(); } } switch (PacketID) { // Invalid Packets : These packets are unknown by the demo, therefore remove it from the buffer case 0xB6: return(new InvalidPacket(packet)); case 0xBB: return(new PacketBB_UltimaMessenger(packet)); // Access Check Packets case 0x12: return(new Packet12_TextCommand(packet)); // this packet may contain god commands // Handled packets : We handle these packets, they do not reach the server case 0xB8: return(new PacketB8_ProfileReq(packet)); case 0xBD: return(new PacketBD_ClientVersion(packet)); case 0x3A: return(new Packet3A_SetSkillLock(packet)); // Transformed Packets : These packets are translated case 0x00: return(new Packet00_CreateChar(packet)); case 0x02: return(new Packet02_MoveRequest(packet)); case 0x80: return(new Packet80_LoginRequest(packet)); case 0xA0: return(new PacketA0_SelectServer(packet)); case 0x91: return(new Packet91_PlayServer(packet)); case 0x93: return(new Packet93_BookHeaderChange(packet)); //case 0xAD: return new PacketAD_UnicodeSpeech(packet); // Unfinished, for now UODemoDLL handles this // Information: We don't change these packets default: if (PacketID >= 0xB6) { return(new InvalidPacket(packet)); } return(null); } } else { UODemo.Socket.Free(socket); } return(null); // Bad packet, length is too short. }