Пример #1
0
            /// <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);
                }
            }
Пример #2
0
 private ClientPacket(UODemo.ISocket socket, byte PacketID, uint PacketSize, bool IsPacketDynamicSized) : base(socket.Data, PacketSize)
 {
     Socket    = socket;
     Id        = PacketID;
     m_Dynamic = IsPacketDynamicSized;
 }
Пример #3
0
        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.
        }