Esempio n. 1
0
        public void HandlePacket(PacketIn packet)
        {
            PacketHandle handle = Handles.Find(s => s.packetId == packet.PacketId);
            if (handle != null)
            {

                System.Object[] obj = new System.Object[1];
                obj[0] = packet;

                try
                {
                    if (packet.PacketId.Service == ServiceType.Logon)
                    {
                        Log.WriteLine(LogType.Network, "Handling packet: {0}", handle.packetId);
                        handle.MethodInfo.Invoke(tClient, obj);
                    }
                    else if (packet.PacketId.Service == ServiceType.World)
                    {
                        Log.WriteLine(LogType.Network, "Handling packet: {0}", handle.packetId);
                        handle.MethodInfo.Invoke(wClient, obj);

                    }
                    //Log.WriteLine(LogType.Packet, packet.ToHex());
                }
                catch (Exception ex)
                {
                }

            }
            else
            {
                 //Log.WriteLine(LogType.Normal, "Unhandled packet: {0}", packet.PacketId.ToString());
            }
        }
 void HandleAccountDataUpdate(PacketIn inpacket)
 {
     PacketOut packet = new PacketOut(WorldServerOpCode.CMSG_UPDATE_ACCOUNT_DATA);
     packet.Write(0x00000002);
     packet.Write((UInt32)0);
     Send(packet);
 }
        public void HandleMonsterMove(PacketIn packet)
        {
            byte mask = packet.ReadByte();

            WoWGuid guid = new WoWGuid(mask, packet.ReadBytes(WoWGuid.BitCount8(mask)));

            Object obj = objectMgr.getObject(guid);
            if (obj != null)
            {
                    obj.Position = new Coordinate(packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat());
            }
        }
 void HandlePong(PacketIn packet)
 {
     UInt32 Server_Seq = packet.ReadUInt32();
     if (Server_Seq == Ping_Seq)
     {
         Ping_Res_Time = MM_GetTime();
         Latency = Ping_Res_Time - Ping_Req_Time;
         Ping_Seq += 1;
         Log.WriteLine(LogType.Debug, "Got nice pong. We love server;)");
     }
     else
         Log.WriteLine(LogType.Error, "Server pong'd bad sequence! Ours: {0} Theirs: {1}", Ping_Seq, Server_Seq);
 }
Esempio n. 5
0
 public void HandleChannelNotify(PacketIn packet)
 {
     Log.WriteLine(LogType.Success, "Dostalem takie gowno: {0}", packet.ReadByte());
 }
 void GotWarden(PacketIn packet)
 {
     Console.WriteLine(packet.ToHex());
 }
Esempio n. 7
0
 public void HandleAuthChallange(PacketIn packet)
 {
     packet.ReadUInt32();
     ServerSeed = packet.ReadUInt32();
     ClientSeed = (UInt32)0;
     DoAuthSession();
 }
Esempio n. 8
0
        public void Handle_NameQuery(PacketIn packet)
        {
            WoWGuid guid = new WoWGuid(packet.ReadUInt64());
                string name = packet.ReadString();
                packet.ReadByte();
                Race Race = (Race)packet.ReadUInt32();
                Gender Gender = (Gender)packet.ReadUInt32();
                Classname Class = (Classname)packet.ReadUInt32();

                if (objectMgr.objectExists(guid))    // Update existing Object
                {
                    Object obj = objectMgr.getObject(guid);
                    obj.Name = name;
                    objectMgr.updateObject(obj);
                }
                else                // Create new Object        -- FIXME: Add to new 'names only' list?
                {
                    Object obj = new Object(guid);
                    obj.Name = name;
                    objectMgr.addObject(obj);

                    /* Process chat message if we looked them up now */
                    for (int i = 0; i < ChatQueued.Count; i++)
                    {
                        ChatQueue message = (ChatQueue)ChatQueued[i];
                        if (message.GUID.GetOldGuid() == guid.GetOldGuid())
                        {
                            Log.WriteLine(LogType.Chat, "[{1}] {0}", message.Message, name);
                            ChatQueued.Remove(message);
                        }
                    }

                }
        }
Esempio n. 9
0
 public void HandlePacket(PacketIn packet)
 {
     //Log.WriteLine(LogType.Packet, "{0}", packet.ToHex());
     pHandler.HandlePacket(packet);
 }
Esempio n. 10
0
        public void HandleUpdateObjectFieldBlock(PacketIn packet, Object newObject)
        {
            uint lenght = packet.ReadByte();

            UpdateMask UpdateMask = new UpdateMask();
            UpdateMask.SetCount((ushort)(lenght));
            UpdateMask.SetMask(packet.ReadBytes((int)lenght * 4), (ushort)lenght);
            UInt32[] Fields = new UInt32[UpdateMask.GetCount()];

            for (int i = 0; i < UpdateMask.GetCount(); i++)
            {
                if (!UpdateMask.GetBit((ushort)i))
                {
                    UInt32 val = packet.ReadUInt32();
                    newObject.SetField(i, val);
                    Log.WriteLine(LogType.Normal, "Update Field: {0} = {1}", (UpdateFields)i, val);
                }
            }
        }
Esempio n. 11
0
        public void Handle_CreatureQuery(PacketIn packet)
        {
            Entry entry = new Entry();
                entry.entry = packet.ReadUInt32();
                entry.name = packet.ReadString();
                entry.blarg = packet.ReadBytes(3);
                entry.subname = packet.ReadString();
                entry.flags = packet.ReadUInt32();
                entry.subtype = packet.ReadUInt32();
                entry.family = packet.ReadUInt32();
                entry.rank = packet.ReadUInt32();

                foreach (Object obj in objectMgr.getObjectArray())
                {
                    if (obj.Fields != null)
                    {
                        if (obj.Fields[(int)UpdateFields.OBJECT_FIELD_ENTRY] == entry.entry)
                        {
                            obj.Name = entry.name;
                            objectMgr.updateObject(obj);
                        }
                    }
                }
        }
Esempio n. 12
0
        void Loop()
        {
            if (ServiceStatus == ServiceType.Logon)
             {
                 Connected = tClient.Connected;
             }

             else if (ServiceStatus == ServiceType.World)
             {
                 Connected = wClient.Connected;
             }

             while (Connected)
             {

                if (ServiceStatus == ServiceType.Logon)
                 {
                     if (!tSocket.Connected)
                     {
                         tClient.Connected = false;
                         Log.WriteLine(LogType.Error, "Disconnected from Logon Server");
                         return;
                     }
                     while  (tSocket.Available > 0)
                     {
                         try
                         {
                             data = OnReceive(tSocket.Available);
                             tClient.HandlePacket(new PacketIn(data, true));
                         }
                         catch (Exception ex)    // Server dc'd us most likely ;P
                         {
                         }
                     }
                 }
                 else if (ServiceStatus == ServiceType.World)
                 {
                     if (!tSocket.Connected)
                     {
                         wClient.Connected = false;
                         Log.WriteLine(LogType.Error, "Disconnected from World Server");
                         return;
                     }
                     try
                     {
                         byte[] sizeBytes = OnReceive(2);
                         dataSize = parseSize(sizeBytes);
                         data = OnReceive(dataSize);
                         decryptData(data);
                         PacketIn packet = new PacketIn(data);
                         //Log.WriteLine(LogType.Network, packet.ToHex());
                         wClient.HandlePacket(packet);
                     }
                     catch (Exception ex)    // Server dc'd us most likely ;P
                     {
                     }
                 }
             }
        }
Esempio n. 13
0
        /*
        [PacketHandlerAtribute(WorldServerOpCode.SMSG_COMPRESSED_UPDATE_OBJECT)]
        public void HandleCompressedObjectUpdate(PacketIn packet)
        {
            try
            {
                Int32 size = packet.ReadInt32();
                byte[] decomped = mClient.Shared.Compression.Decompress(size, packet.ReadRemaining());
                packet = new PacketIn(decomped, 1);
                HandleObjectUpdate(packet);
            }
            catch(Exception ex)
            {
                Log.WriteLine(LogType.Error, "{1} \n {0}", ex.StackTrace, ex.Message);
            }
        }

        [PacketHandlerAtribute(WorldServerOpCode.SMSG_UPDATE_OBJECT)]
        public void HandleObjectUpdate(PacketIn packet)
        {
                UInt32 UpdateBlocks = packet.ReadUInt32();

                for(int allBlocks = 0; allBlocks < UpdateBlocks; allBlocks++)
                {
                    UpdateType type = (UpdateType)packet.ReadByte();

                    WoWGuid updateGuid;
                    uint updateId;
                    uint fCount;

                    switch(type)
                    {
                        case UpdateType.Values:
                            Object getObject;
                            updateGuid = new WoWGuid(packet.ReadUInt64());
                            if (objectMgr.objectExists(updateGuid))
                            {
                                getObject = objectMgr.getObject(updateGuid);
                            }
                            else
                            {
                                getObject = new Object(updateGuid);
                                objectMgr.addObject(getObject);
                            }
                            Log.WriteLine(LogType.Normal, "Handling Fields Update for object: {0}", getObject.Guid.ToString());
                            HandleUpdateObjectFieldBlock(packet, getObject);
                            objectMgr.updateObject(getObject);
                            break;

                        case UpdateType.Create:
                        case UpdateType.CreateSelf:
                            updateGuid = new WoWGuid(packet.ReadUInt64());
                            updateId = packet.ReadByte();
                            fCount = GeUpdateFieldsCount(updateId);

                            if (objectMgr.objectExists(updateGuid))
                                objectMgr.delObject(updateGuid);

                            Object newObject = new Object(updateGuid);
                            newObject.Fields = new UInt32[2000];
                            objectMgr.addObject(newObject);
                            HandleUpdateMovementBlock(packet, newObject);
                            HandleUpdateObjectFieldBlock(packet, newObject);
                            objectMgr.updateObject(newObject);
                            Log.WriteLine(LogType.Normal, "Handling Creation of object: {0}", newObject.Guid.ToString());
                            break;

                        case UpdateType.OutOfRange:
                            fCount = packet.ReadByte();
                            for (int j = 0; j < fCount; j++)
                            {
                                WoWGuid guid = new WoWGuid(packet.ReadUInt64());
                                Log.WriteLine(LogType.Normal, "Handling delete for object: {0}", guid.ToString());
                                if (objectMgr.objectExists(guid))
                                    objectMgr.delObject(guid);
                            }
                            break;
                    }
                }

        }
        */
        public void HandleUpdateMovementBlock(PacketIn packet, Object newObject)
        {
            UInt16 flags = packet.ReadUInt16();

            if((flags & 0x20) >= 1)
            {
                UInt32 flags2 = packet.ReadUInt32();
                UInt16 unk1 = packet.ReadUInt16();
                UInt32 unk2 = packet.ReadUInt32();
                newObject.Position = new Coordinate(packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat());

                if ((flags2 & 0x200) >= 1)
                {
                    packet.ReadBytes(21); //transporter
                }

                if (((flags2 & 0x2200000) >= 1) || ((unk1 & 0x20) >= 1))
                {
                    packet.ReadBytes(4); // pitch
                }

                packet.ReadBytes(4); //lastfalltime

                if ((flags2 & 0x1000) >= 1)
                {
                    packet.ReadBytes(16); // skip 4 floats
                }

                if ((flags2 & 0x4000000) >= 1)
                {
                    packet.ReadBytes(4); // skip 1 float
                }

                packet.ReadBytes(32); // all of speeds

                if ((flags2 & 0x8000000) >= 1) //spline ;/
                {
                    UInt32 splineFlags = packet.ReadUInt32();

                    if ((splineFlags & 0x00020000) >= 1)
                    {
                        packet.ReadBytes(4); // skip 1 float
                    }
                    else
                    {
                        if ((splineFlags & 0x00010000) >= 1)
                        {
                            packet.ReadBytes(4); // skip 1 float
                        }
                        else if ((splineFlags & 0x00008000) >= 1)
                        {
                            packet.ReadBytes(12); // skip 3 float
                        }
                    }

                    packet.ReadBytes(28); // skip 8 float

                    UInt32 splineCount = packet.ReadUInt32();

                    for (UInt32 j = 0; j < splineCount; j++)
                    {
                        packet.ReadBytes(12); // skip 3 float
                    }

                    packet.ReadBytes(13);

                }
            }

            else if ((flags & 0x100) >= 1)
            {
                packet.ReadBytes(40);
            }
            else if ((flags & 0x40) >= 1)
            {
                newObject.Position = new Coordinate(packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat());
            }

            if ((flags & 0x8) >= 1)
            {
                packet.ReadBytes(4);
            }

            if ((flags & 0x10) >= 1)
            {
                packet.ReadBytes(4);
            }

            if ((flags & 0x04) >= 1)
            {
                packet.ReadBytes(8);
            }

            if ((flags & 0x2) >= 1)
            {
                packet.ReadBytes(4);
            }

            if ((flags & 0x80) >= 1)
            {
                packet.ReadBytes(8);
            }

            if ((flags & 0x200) >= 1)
            {
                packet.ReadBytes(8);
            }
        }
Esempio n. 14
0
        public void RequestRealmlist()
        {
            PacketOut packet = new PacketOut(LogonServerOpCode.REALM_LIST);
            packet.Write(0x00);
            Send(packet);

            // Most tricky code ever. It's so because retail server sends a lot of data in this packet...
            byte[] temp = pLoop.OnReceive(3);
            PacketIn p1 = new PacketIn(temp, true);
            byte[] temp2 = pLoop.OnReceive(p1.ReadUInt16());
            byte[] temp3 = new byte[temp.Length + temp2.Length];
            temp.CopyTo(temp3, 0);
            temp2.CopyTo(temp3, temp.Length);

            p1 = new PacketIn(temp3, false);
            HandlePacket(p1);
        }
Esempio n. 15
0
        public void HandleChat(PacketIn packet)
        {
            try
            {

                string channel = null;
                UInt64 guid = 0;
                WoWGuid fguid = null, fguid2 = null;
                string username = null;

                byte Type = packet.ReadByte();
                UInt32 Language = packet.ReadUInt32();

                guid = packet.ReadUInt64();
                fguid = new WoWGuid(guid);
                packet.ReadInt32();

                if ((ChatMsg)Type == ChatMsg.Channel)
                {
                    channel = packet.ReadString();
                }

                if (Type == 47)
                    return;
                fguid2 = new WoWGuid(packet.ReadUInt64());

                UInt32 Length = packet.ReadUInt32();
                string Message = Encoding.Default.GetString(packet.ReadBytes((int)Length));

                //Message = Regex.Replace(Message, @"\|H[a-zA-z0-9:].|h", ""); // Why do i should need spells and quest linked? ;>
                Message = Regex.Replace(Message, @"\|[rc]{1}[a-zA-z0-9]{0,8}", ""); // Colorfull chat message also isn't the most important thing.

                byte afk = 0;

                if (fguid.GetOldGuid() == 0)
                {
                    username = "******";
                }
                else
                {
                    if (objectMgr.objectExists(fguid))
                        username = objectMgr.getObject(fguid).Name;
                }

                if (username == null)
                {

                    ChatQueue que = new ChatQueue();
                    que.GUID = fguid;
                    que.Type = Type;
                    que.Language = Language;
                    if ((ChatMsg)Type == ChatMsg.Channel)
                        que.Channel = channel;
                    que.Length = Length;
                    que.Message = Message;
                    que.AFK = afk;
                    ChatQueued.Add(que);
                    QueryName(guid);
                    return;
                }

                object[] param = new object[] { (ChatMsg)Type, channel, username, Message };
                mCore.Event(new Event(EventType.EVENT_CHAT_MSG, "0", param));
                //Log.WriteLine(LogType.Chat, "[{1}] {0}", Message, username);
            }
            catch (Exception ex)
            {
                Log.WriteLine(LogType.Error, "Exception Occured");
                Log.WriteLine(LogType.Error, "Message: {0}", ex.Message);
                Log.WriteLine(LogType.Error, "Stacktrace: {0}", ex.StackTrace);
            }
        }
Esempio n. 16
0
        public void HandleRealmlist(PacketIn packetIn)
        {
            //packetIn.ReadByte();
            UInt16 Length = packetIn.ReadUInt16();
            UInt32 Request = packetIn.ReadUInt32();
            int realmscount = packetIn.ReadInt16();

            //Console.Write(packetIn.ToHex());

            Log.WriteLine(LogType.Success, "Got information about {0} realms.", realmscount);
            Realm[] realms = new Realm[realmscount];
            try
            {
                for (int i = 0; i < realmscount; i++)
                {
                    realms[i].Type = packetIn.ReadByte();
                    realms[i].Color = packetIn.ReadByte();
                    packetIn.ReadByte(); // unk
                    realms[i].Name = packetIn.ReadString();
                    realms[i].Address = packetIn.ReadString();
                    realms[i].Population = packetIn.ReadFloat();
                    realms[i].NumChars = packetIn.ReadByte();
                    realms[i].Language = packetIn.ReadByte();
                    packetIn.ReadByte();
               }

                Realmlist = realms;
                mCore.Event(new Event(EventType.EVENT_REALMLIST, "", new object[] { Realmlist }));

            }
            catch (Exception ex)
            {
                Log.WriteLine(LogType.Error, "Exception Occured");
                Log.WriteLine(LogType.Error, "Message: {0}", ex.Message);
                Log.WriteLine(LogType.Error, "Stacktrace: {0}", ex.StackTrace);
                Disconnect();
            }
        }
Esempio n. 17
0
        public void HandleLogonProof(PacketIn packetIn)
        {
            if (packetIn.ReadByte() == 0x00)
            {
                Log.WriteLine(LogType.Success, "Authenitcation successed. Requesting RealmList");

                //Retail server sends a loooooot of informations there!
                RequestRealmlist();
                pLoop.Stop();
            }
        }
Esempio n. 18
0
        public void AuthChallangeRequest(PacketIn packetIn)
        {
            packetIn.ReadByte();
            byte error = packetIn.ReadByte();
            if (error != 0x00)
            {
                Log.WriteLine(LogType.Error, "Authentication error: {0}", (AccountStatus)error);
                Disconnect();
                return;
            }

            B = new BigInteger(packetIn.ReadBytes(32));               // Varies
            byte glen = packetIn.ReadByte();                          // Length = 1
            g = packetIn.ReadBytes(glen);                             // g = 7
            byte Nlen = packetIn.ReadByte();                          // Length = 32
            N = packetIn.ReadBytes(Nlen);                             // N = B79B3E2A87823CAB8F5EBFBF8EB10108535006298B5BADBD5B53E1895E644B89
            Salt = new BigInteger(packetIn.ReadBytes(32));            // Salt = 3516482AC96291B3C84B4FC204E65B623EFC2563C8B4E42AA454D93FCD1B56BA
            crcsalt = packetIn.ReadBytes(16);                         // Varies

            BigInteger S;
            srp = new Srp6(new BigInteger(N), new BigInteger(g));

            do
            {
                a = BigInteger.Random(19 * 8);
                A = srp.GetA(a);

                I = Srp6.GetLogonHash(mUsername, mPassword);

                BigInteger x = Srp6.Getx(Salt, I);
                BigInteger u = Srp6.Getu(A, B);
                S = srp.ClientGetS(a, B, x, u);
            }
            while (S < 0);

            mKey = Srp6.ShaInterleave(S);
            M = srp.GetM(mUsername, Salt, A, B, new BigInteger(mKey));

            packetIn.ReadByte();

            Sha1Hash sha;
            byte[] files_crc;

            // Generate CRC/hashes of the Game Files
            if (Config.Retail)
                files_crc = GenerateCrc(crcsalt);
            else
                files_crc = new byte[20];

            // get crc_hash from files_crc
            sha = new Sha1Hash();
            sha.Update(A);
            sha.Update(files_crc);
            byte[] crc_hash = sha.Final();

            PacketOut packet = new PacketOut(LogonServerOpCode.AUTH_LOGON_PROOF);
            packet.Write(A); // 32 bytes
            packet.Write(M); // 20 bytes
            packet.Write(crc_hash); // 20 bytes
            packet.Write((byte)0); // number of keys
            packet.Write((byte)0); // unk (1.11.x)
            Send(packet);
        }
Esempio n. 19
0
        public void HandleAuthResponse(PacketIn packet)
        {
            LoginErrorCode error = (LoginErrorCode)packet.ReadByte();
            if (error == LoginErrorCode.AUTH_OK)
            {

                PacketOut outpacket = new PacketOut(WorldServerOpCode.CMSG_CHAR_ENUM);
                Send(outpacket);

            }
            else
            {
                Log.WriteLine(LogType.Error, "M values doesn't match, please try again.");
                Disconnect();
            }
        }
Esempio n. 20
0
        public void HandleCharEnum(PacketIn packet)
        {
            byte count = packet.ReadByte();

            Character[] characterList = new Character[count];
            for (int i = 0; i < count; i++)
            {

                characterList[i].GUID = packet.ReadUInt64();
                characterList[i].Name = packet.ReadString();
                characterList[i].Race = packet.ReadByte();
                characterList[i].Class = packet.ReadByte();
                packet.ReadByte();
                packet.ReadUInt32();
                packet.ReadByte();
                packet.ReadByte();
                packet.ReadUInt32();
                characterList[i].MapID = packet.ReadUInt32();
                packet.ReadFloat();
                packet.ReadFloat();
                packet.ReadFloat();
                packet.ReadUInt32();
                packet.ReadUInt32();
                packet.ReadByte();

                packet.ReadUInt32();
                packet.ReadUInt32();
                packet.ReadUInt32();
                packet.ReadBytes(9 * 20);
            }

            Log.WriteLine(LogType.Success, "Received info about {0} characters", count);

            Charlist = characterList;
            mCore.Event(new Event(EventType.EVENT_CHARLIST, "", new object[] { Charlist }));
            PingLoop();
        }