Example #1
0
 public static void HandleServerTrainerBuy(Packet packet)
 {
     packet.ReadGuid("GUID");
     if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_3_13329))
     {
         packet.ReadInt32("Unk");
     }
     packet.ReadInt32 <SpellId>("Spell ID");
     if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_TRAINER_BUY_FAILED, Direction.ServerToClient) ||
         packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_TRAINER_BUY_RESULT, Direction.ServerToClient))
     {
         packet.ReadUInt32("Reason");
     }
 }
Example #2
0
        public static void HandleTalentPreviewTalents(Packet packet)
        {
            if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_LEARN_PREVIEW_TALENTS_PET, Direction.ClientToServer))
            {
                packet.ReadGuid("GUID");
            }

            var count = packet.ReadUInt32("Talent Count");

            for (var i = 0; i < count; ++i)
            {
                packet.ReadUInt32("Talent ID", i);
                packet.ReadUInt32("Rank", i);
            }
        }
Example #3
0
        public static void HandleAuctionListBidderItems(Packet packet)
        {
            packet.ReadGuid("Auctioneer GUID");
            packet.ReadUInt32("List From");
            if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_AUCTION_LIST_OWNER_ITEMS))
            {
                return;
            }

            var count = packet.ReadUInt32("Outbidded Count");

            for (var i = 0; i < count; ++i)
            {
                packet.ReadUInt32("Auction Id", i);
            }
        }
        public static void HandleSoundMessages(Packet packet)
        {
            var sound = packet.ReadUInt32("Sound Id");

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_0_15005))
            {
                packet.ReadGuid("GUID");
            }

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_PLAY_OBJECT_SOUND))
            {
                packet.ReadGuid("GUID 2");
            }

            Storage.Sounds.Add(sound, packet.TimeSpan);
        }
Example #5
0
 public static void HandleQuestcompleteQuest(Packet packet)
 {
     packet.ReadGuid("GUID");
     packet.ReadEntryWithName <UInt32>(StoreNameType.Quest, "Quest ID");
     if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_0_15005))
     {
         if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_QUESTGIVER_REQUEST_REWARD))
         {
             packet.ReadUInt32("Unk UInt32 1");
         }
         else
         {
             packet.ReadByte("Unk UInt32 1");
         }
     }
 }
Example #6
0
        public static void HandleQuestgiverStatus(Packet packet)
        {
            uint count = 1;

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_QUESTGIVER_STATUS_MULTIPLE))
            {
                count = packet.ReadUInt32("Count");
            }

            var typeCode = ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_0_14333) ? TypeCode.Int32 : TypeCode.Byte;

            for (int i = 0; i < count; i++)
            {
                packet.ReadGuid("GUID", i);
                packet.ReadEnum <QuestGiverStatus>("Status", typeCode, i);
            }
        }
Example #7
0
        public static void HandleThreatlistUpdate(Packet packet)
        {
            packet.ReadPackedGuid("GUID");

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_HIGHEST_THREAT_UPDATE))
            {
                packet.ReadPackedGuid("New Highest");
            }

            var count = packet.ReadUInt32("Size");

            for (int i = 0; i < count; i++)
            {
                packet.ReadPackedGuid("Hostile", i);
                packet.ReadUInt32("Threat", i);
            }
        }
Example #8
0
        private void lv_windowLoadData(UInt16 i_address)
        {
            lv_dissassembly.Clear();

            lv_dissassembly.Columns.Add("Address", 70);
            lv_dissassembly.Columns.Add("Opcode", 70);
            lv_dissassembly.Columns.Add("Instruction", 200);

            UInt16 lo_val = (i_address < 0x00FF) ? (UInt16)(0) : (UInt16)(i_address - 0xFF);
            UInt16 hi_val = ((UInt32)(i_address + 0x00FF) > 0xFFFF) ? (UInt16)(0xFFFF) : (UInt16)(i_address + 0xFF);

            for (UInt16 i = lo_val; i < hi_val;)
            {
                Byte   opcode  = Program.emulator.GetMemory().ReadFromMemory(i);
                String address = String.Format("{0:X4}", i);
                String value   = String.Format("{0:X2}", opcode);

                ListViewItem item = new ListViewItem(address);
                item.SubItems.Add(value);

                if ((Opcodes.Opcode)opcode == Opcodes.Opcode.OPCODE_INTERNAL_CB)
                {
                    opcode = Program.emulator.GetMemory().ReadFromMemory(++i);
                    item.SubItems.Add(OpcodesCB.GetOpcodeCB((OpcodesCB.OpcodeCB)opcode, ref i));
                }
                else
                {
                    item.SubItems.Add(Opcodes.GetOpcode((Opcodes.Opcode)opcode, ref i));
                }

                lv_dissassembly.Items.Add(item);
            }

            if (lv_dissassembly.Items.Count == 0)
            {
                return;
            }

            int          index    = GetItemIndexWithAddress(String.Format("{0:X4}", i_address));
            ListViewItem sel_item = lv_dissassembly.Items[index];

            sel_item.Selected = true;
            sel_item.Focused  = true;
            lv_dissassembly.Select();
            lv_dissassembly.EnsureVisible(index);
        }
Example #9
0
        public static void HandleTalentPreviewTalents434(Packet packet)
        {
            if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_LEARN_PREVIEW_TALENTS_PET))
            {
                packet.ReadGuid("GUID");
            }
            else
            {
                packet.ReadUInt32("Tab Page");
            }

            var count = packet.ReadUInt32("Talent Count");

            for (var i = 0; i < count; ++i)
            {
                packet.ReadUInt32("Talent ID", i);
                packet.ReadUInt32("Rank", i);
            }
        }
        public static void HandleSpecialMoveAckMessages(Packet packet)
        {
            var guid = packet.ReadPackedGuid();

            packet.Writer.WriteLine("GUID: " + guid);

            var unk1 = packet.ReadInt32();

            packet.Writer.WriteLine("Unk Int32 1: " + unk1);

            ReadMovementInfo(ref packet, guid);

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_MOVE_KNOCK_BACK_ACK))
            {
                return;
            }

            var unk2 = packet.ReadInt32();

            packet.Writer.WriteLine("Unk Int32 2: " + unk2);
        }
        public static void HandleCollisionMovements(Packet packet)
        {
            var guid = packet.ReadPackedGuid();

            packet.Writer.WriteLine("GUID: " + guid);

            if (packet.Opcode != Opcodes.GetOpcode(Opcode.MSG_MOVE_SET_COLLISION_HGT))
            {
                var counter = packet.ReadInt32();
                packet.Writer.WriteLine("Movement Counter: " + counter);
            }

            if (packet.Opcode != Opcodes.GetOpcode(Opcode.SMSG_MOVE_SET_COLLISION_HGT))
            {
                ReadMovementInfo(ref packet, guid);
            }

            var unk = packet.ReadSingle();

            packet.Writer.WriteLine("Collision Height: " + unk);
        }
Example #12
0
        public static void ReadLfgRewardBlock(ref Packet packet)
        {
            packet.ReadBoolean("First Completion");

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_LFG_PLAYER_REWARD))
            {
                packet.ReadInt32("Strangers");
            }

            packet.ReadInt32("Base Money");
            packet.ReadInt32("Base XP");
            packet.ReadInt32("Variable Money");
            packet.ReadInt32("Variable XP");

            var numFields = packet.ReadByte("Reward Item Count");

            for (var i = 0; i < numFields; i++)
            {
                packet.ReadEntryWithName <Int32>(StoreNameType.Item, "Reward Item Id", i);
                packet.ReadInt32("Reward Item Display ID", i);
                packet.ReadInt32("Reward Item Stack Count", i);
            }
        }
        public static void HandleMovementMessages(Packet packet)
        {
            Guid guid;

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192) ||
                packet.Direction == Direction.ServerToClient)
            {
                guid = packet.ReadPackedGuid("GUID");
            }
            else
            {
                guid = new Guid();
            }

            ReadMovementInfo(ref packet, guid);
            if (packet.Opcode == Opcodes.GetOpcode(Opcode.MSG_MOVE_KNOCK_BACK))
            {
                packet.ReadSingle("Sin Angle");
                packet.ReadSingle("Cos Angle");
                packet.ReadSingle("Speed");
                packet.ReadSingle("Velocity");
            }
        }
Example #14
0
        public static void ReadQueryHeader(Packet packet)
        {
            var entry = packet.ReadInt32("Entry");
            var guid  = packet.ReadGuid("GUID");

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_QUERY_CREATURE, Direction.ClientToServer) || packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_QUERY_GAME_OBJECT, Direction.ClientToServer))
            {
                if (guid.HasEntry() && (entry != guid.GetEntry()))
                {
                    packet.AddValue("Error", "Entry does not match calculated GUID entry");
                }
            }
        }
        public static void ReadPlayerMovementInfo(ref Packet packet, params MovementStatusElements[] movementStatusElements)
        {
            var guid          = new byte[8];
            var transportGUID = new byte[8];

            var pos          = new Vector4();
            var transportPos = new Vector4();

            bool hasMovementFlags   = false;
            bool hasMovementFlags2  = false;
            bool hasTimestamp       = false;
            bool hasOrientation     = false;
            bool hasTransportData   = false;
            bool hasTransportTime2  = false;
            bool hasTransportTime3  = false;
            bool hasPitch           = false;
            bool hasFallData        = false;
            bool hasFallDirection   = false;
            bool hasSplineElevation = false;
            bool hasUnkTime         = false;
            bool hasUnkBitA         = false;

            uint count = 0;

            foreach (var movementInfo in movementStatusElements)
            {
                switch (movementInfo)
                {
                case MovementStatusElements.MSEHasGuidByte0:
                    guid[0] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte1:
                    guid[1] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte2:
                    guid[2] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte3:
                    guid[3] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte4:
                    guid[4] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte5:
                    guid[5] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte6:
                    guid[6] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasGuidByte7:
                    guid[7] = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte0:
                    if (hasTransportData)
                    {
                        transportGUID[0] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte1:
                    if (hasTransportData)
                    {
                        transportGUID[1] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte2:
                    if (hasTransportData)
                    {
                        transportGUID[2] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte3:
                    if (hasTransportData)
                    {
                        transportGUID[3] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte4:
                    if (hasTransportData)
                    {
                        transportGUID[4] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte5:
                    if (hasTransportData)
                    {
                        transportGUID[5] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte6:
                    if (hasTransportData)
                    {
                        transportGUID[6] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportGuidByte7:
                    if (hasTransportData)
                    {
                        transportGUID[7] = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEGuidByte0:
                    packet.ReadXORByte(guid, 0);
                    break;

                case MovementStatusElements.MSEGuidByte1:
                    packet.ReadXORByte(guid, 1);
                    break;

                case MovementStatusElements.MSEGuidByte2:
                    packet.ReadXORByte(guid, 2);
                    break;

                case MovementStatusElements.MSEGuidByte3:
                    packet.ReadXORByte(guid, 3);
                    break;

                case MovementStatusElements.MSEGuidByte4:
                    packet.ReadXORByte(guid, 4);
                    break;

                case MovementStatusElements.MSEGuidByte5:
                    packet.ReadXORByte(guid, 5);
                    break;

                case MovementStatusElements.MSEGuidByte6:
                    packet.ReadXORByte(guid, 6);
                    break;

                case MovementStatusElements.MSEGuidByte7:
                    packet.ReadXORByte(guid, 7);
                    break;

                case MovementStatusElements.MSETransportGuidByte0:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 0);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte1:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 1);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte2:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 2);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte3:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 3);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte4:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 4);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte5:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 5);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte6:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 6);
                    }
                    break;

                case MovementStatusElements.MSETransportGuidByte7:
                    if (hasTransportData)
                    {
                        packet.ReadXORByte(transportGUID, 7);
                    }
                    break;

                case MovementStatusElements.MSEHasMovementFlags:
                    hasMovementFlags = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasMovementFlags2:
                    hasMovementFlags2 = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasTimestamp:
                    hasTimestamp = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasOrientation:
                    hasOrientation = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasTransportData:
                    hasTransportData = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasTransportTime2:
                    if (hasTransportData)
                    {
                        hasTransportTime2 = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasTransportTime3:
                    if (hasTransportData)
                    {
                        hasTransportTime3 = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasPitch:
                    hasPitch = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasFallData:
                    hasFallData = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasFallDirection:
                    if (hasFallData)
                    {
                        hasFallDirection = packet.ReadBit();
                    }
                    break;

                case MovementStatusElements.MSEHasSplineElevation:
                    hasSplineElevation = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasSpline:
                    packet.ReadBit("hasSpline");
                    break;

                case MovementStatusElements.MSECounterCount:
                    count = packet.ReadBits(22);
                    break;

                case MovementStatusElements.MSECount:
                    packet.ReadInt32("Counter");
                    break;

                case MovementStatusElements.MSECounter:
                    for (var i = 0; i < count; i++)
                    {
                        packet.ReadInt32("Unk Int", i);
                    }
                    break;

                case MovementStatusElements.MSEMovementFlags:
                    if (hasMovementFlags)
                    {
                        packet.ReadEnum <MovementFlag>("Movement Flags", 30);
                    }
                    break;

                case MovementStatusElements.MSEMovementFlags2:
                    if (hasMovementFlags2)
                    {
                        packet.ReadEnum <MovementFlagExtra>("Extra Movement Flags", 13);
                    }
                    break;

                case MovementStatusElements.MSETimestamp:
                    if (hasTimestamp)
                    {
                        packet.ReadInt32("Timestamp");
                    }
                    break;

                case MovementStatusElements.MSEPositionX:
                    pos.X = packet.ReadSingle();
                    break;

                case MovementStatusElements.MSEPositionY:
                    pos.Y = packet.ReadSingle();
                    break;

                case MovementStatusElements.MSEPositionZ:
                    pos.Z = packet.ReadSingle();
                    break;

                case MovementStatusElements.MSEOrientation:
                    if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_MOVE_TELEPORT))
                    {
                        pos.O = packet.ReadSingle();
                    }
                    else
                    {
                        if (hasOrientation)
                        {
                            pos.O = packet.ReadSingle();
                        }
                    }
                    break;

                case MovementStatusElements.MSETransportPositionX:
                    if (hasTransportData)
                    {
                        transportPos.X = packet.ReadSingle();
                    }
                    break;

                case MovementStatusElements.MSETransportPositionY:
                    if (hasTransportData)
                    {
                        transportPos.Y = packet.ReadSingle();
                    }
                    break;

                case MovementStatusElements.MSETransportPositionZ:
                    if (hasTransportData)
                    {
                        transportPos.Z = packet.ReadSingle();
                    }
                    break;

                case MovementStatusElements.MSETransportOrientation:
                    if (hasTransportData)
                    {
                        transportPos.O = packet.ReadSingle();
                    }
                    break;

                case MovementStatusElements.MSETransportSeat:
                    if (hasTransportData)
                    {
                        packet.ReadByte("Seat");
                    }
                    break;

                case MovementStatusElements.MSETransportTime:
                    if (hasTransportData)
                    {
                        packet.ReadInt32("Transport Time");
                    }
                    break;

                case MovementStatusElements.MSETransportTime2:
                    if (hasTransportData && hasTransportTime2)
                    {
                        packet.ReadInt32("Transport Time 2");
                    }
                    break;

                case MovementStatusElements.MSETransportTime3:
                    if (hasTransportData && hasTransportTime3)
                    {
                        packet.ReadInt32("Transport Time 3");
                    }
                    break;

                case MovementStatusElements.MSEPitch:
                    if (hasPitch)
                    {
                        packet.ReadSingle("Pitch");
                    }
                    break;

                case MovementStatusElements.MSEFallTime:
                    if (hasFallData)
                    {
                        packet.ReadInt32("Fall time");
                    }
                    break;

                case MovementStatusElements.MSEFallVerticalSpeed:
                    if (hasFallData)
                    {
                        packet.ReadSingle("Vertical Speed");
                    }
                    break;

                case MovementStatusElements.MSEFallCosAngle:
                    if (hasFallData && hasFallDirection)
                    {
                        packet.ReadSingle("Fall Angle");
                    }
                    break;

                case MovementStatusElements.MSEFallSinAngle:
                    if (hasFallData && hasFallDirection)
                    {
                        packet.ReadSingle("Fall Sin");
                    }
                    break;

                case MovementStatusElements.MSEFallHorizontalSpeed:
                    if (hasFallData && hasFallDirection)
                    {
                        packet.ReadSingle("Horizontal Speed");
                    }
                    break;

                case MovementStatusElements.MSESplineElevation:
                    if (hasSplineElevation)
                    {
                        packet.ReadSingle("Spline elevation");
                    }
                    break;

                case MovementStatusElements.MSEHasUnkTime:
                    hasUnkTime = !packet.ReadBit();
                    break;

                case MovementStatusElements.MSEUnkTime:
                    if (hasUnkTime)
                    {
                        packet.ReadInt32("Unk Time");
                    }
                    break;

                case MovementStatusElements.MSEZeroBit:
                case MovementStatusElements.MSEOneBit:
                    packet.ReadBit();
                    break;

                case MovementStatusElements.MSEHasUnkBitA:
                    hasUnkBitA = packet.ReadBit();
                    break;

                case MovementStatusElements.MSEUnkBitABit:
                    if (hasUnkBitA)
                    {
                        packet.ReadBit("UnkBitABit");
                    }
                    break;

                case MovementStatusElements.MSEUnkBitAByte:
                    if (hasUnkBitA)
                    {
                        packet.ReadByte("MSEUnkBitAByte");
                    }
                    break;
                }
            }

            if (hasTransportData)
            {
                packet.WriteGuid("Transport Guid", transportGUID);
                packet.AddValue("Transport Position", transportPos);
            }

            if (pos.X != 0 && pos.Y != 0 && pos.Z != 0)
            {
                packet.AddValue("Position", pos);
            }

            packet.WriteGuid("Guid", guid);
        }
Example #16
0
        public static void HandlePartyMemberStats(Packet packet)
        {
            /*
             * -- UNK PACKET
             * var count = packet.ReadBits("counter", 18);
             *
             * var unkGuid = new byte[count][];
             * var unkLen = new uint[count];
             * var unkLen2 = new uint[count];
             * var count2 = new uint[count];
             * var bit28 = new bool[count];
             * var bit16 = new bool[count];
             *
             * for (int i = 0; i < count; i++)
             * {
             *  unkGuid[i] = new byte[8];
             *
             *  count2[i] = packet.ReadBits("counter2", 17, i);
             *  bit16[i] = packet.ReadBit("bit16", i);
             *
             *  if (bit16[i])
             *      packet.StartBitStream(unkGuid[i], 3, 6, 4, 2, 5, 1, 0, 7);
             *
             *  bit28[i] = packet.ReadBit("bit28", i);
             *  unkLen[i] = packet.ReadBits("unkLen", 13, i);
             *  unkLen2[i] = packet.ReadBits("unkLen2", 8, i);
             *
             *  for (int j = 0; j < count2[i]; j++)
             *      packet.ReadBit("unkBit", i, j);
             * }
             *
             * for (int i = 0; i < count; i++)
             * {
             *  for (int j = 0; j < count2[i]; j++)
             *  {
             *      packet.ReadUInt32("unk UInt32", i, j);
             *      packet.ReadUInt32("unk UInt32", i, j);
             *
             *      for (int y = 0; y < 8; y++)
             *      {
             *          packet.ReadUInt32("unk UInt32", i, j, y);
             *          packet.ReadUInt32("unk UInt32", i, j, y);
             *          packet.ReadUInt32("unk UInt32", i, j, y);
             *      }
             *
             *      packet.ReadUInt32("unk UInt32", i, j);
             *      packet.ReadByte("unk Byte", i, j);
             *      packet.ReadUInt32("unk UInt32", i, j);
             *      packet.ReadUInt32("unk UInt32", i, j);
             *      packet.ReadUInt32("unk UInt32", i, j);
             *      packet.ReadUInt32("unk UInt32", i, j);
             *      var bytesCounter = packet.ReadUInt32("unk UInt32", i, j);
             *      if (bytesCounter > 0)
             *          packet.ReadBytes((int)bytesCounter);
             *      packet.ReadUInt32("unk UInt32", i, j);
             *  }
             *
             *  packet.ReadUInt32("unk UInt32", i);
             *
             *  if (bit16[i])
             *  {
             *      packet.ParseBitStream(unkGuid[i], 2, 0, 4, 5, 3, 6, 1, 7);
             *      packet.WriteGuid("Unk GUID", unkGuid[i], i);
             *  }
             *
             *  packet.ReadWoWString("unkString2", unkLen2[i], i);
             *  packet.ReadUInt32("unk UInt32", i);
             *  packet.ReadUInt32("unk UInt32", i);
             *  packet.ReadUInt64("unk UInt64", i);
             *  packet.ReadUInt32("unk UInt32", i);
             *  packet.ReadUInt64("unk UInt64", i);
             *  packet.ReadUInt32("unk UInt32", i);
             *  packet.ReadWoWString("unkString", unkLen[i], i);
             *
             *  if (bit28[i])
             *      packet.ReadUInt32("unk UInt32", i);
             *
             *  packet.ReadByte("unk Byte", i);
             *  packet.ReadUInt32("unk UInt32", i);
             * }
             *
             * packet.ReadUInt32("unk UInt32");*/

            if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) &&
                packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_PARTY_MEMBER_STATS_FULL))
            {
                packet.ReadBoolean("Add arena opponent");
            }

            packet.ReadPackedGuid("GUID");
            var updateFlags = packet.ReadEnum <GroupUpdateFlag>("Update Flags", TypeCode.UInt32);

            if (updateFlags.HasFlag(GroupUpdateFlag.Status))
            {
                packet.ReadEnum <GroupMemberStatusFlag>("Status", TypeCode.Int16);
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.CurrentHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Current Health");
                }
                else
                {
                    packet.ReadUInt16("Current Health");
                }
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.MaxHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Max Health");
                }
                else
                {
                    packet.ReadUInt16("Max Health");
                }
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PowerType))
            {
                packet.ReadEnum <PowerType>("Power type", TypeCode.Byte);
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.CurrentPower))
            {
                packet.ReadInt16("Current Power");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.MaxPower))
            {
                packet.ReadInt16("Max Power");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.Level))
            {
                packet.ReadInt16("Level");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.Zone))
            {
                packet.ReadEntryWithName <Int16>(StoreNameType.Zone, "Zone Id");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.Position))
            {
                packet.ReadInt16("Position X");
                packet.ReadInt16("Position Y");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.Auras))
            {
                var auraMask = packet.ReadUInt64("Aura Mask");

                var maxAura = ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) ? 64 : 56;
                for (var i = 0; i < maxAura; ++i)
                {
                    if ((auraMask & (1ul << i)) == 0)
                    {
                        continue;
                    }

                    if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                    {
                        packet.ReadEntryWithName <UInt32>(StoreNameType.Spell, "Spell Id", i);
                    }
                    else
                    {
                        packet.ReadEntryWithName <UInt16>(StoreNameType.Spell, "Spell Id", i);
                    }

                    packet.ReadEnum <AuraFlag>("Aura Flags", TypeCode.Byte, i);
                }
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetGuid))
            {
                packet.ReadGuid("Pet GUID");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetName))
            {
                packet.ReadCString("Pet Name");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetModelId))
            {
                packet.ReadInt16("Pet Modelid");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetCurrentHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Pet Current Health");
                }
                else
                {
                    packet.ReadUInt16("Pet Current Health");
                }
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetMaxHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Pet Max Health");
                }
                else
                {
                    packet.ReadUInt16("Pet Max Health");
                }
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetPowerType))
            {
                packet.ReadEnum <PowerType>("Pet Power type", TypeCode.Byte);
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetCurrentPower))
            {
                packet.ReadInt16("Pet Current Power");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetMaxPower))
            {
                packet.ReadInt16("Pet Max Power");
            }

            if (updateFlags.HasFlag(GroupUpdateFlag.PetAuras))
            {
                var auraMask = packet.ReadUInt64("Pet Auramask");

                var maxAura = ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) ? 64 : 56;
                for (var i = 0; i < maxAura; ++i)
                {
                    if ((auraMask & (1ul << i)) == 0)
                    {
                        continue;
                    }

                    if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                    {
                        packet.ReadEntryWithName <UInt32>(StoreNameType.Spell, "Spell Id", i);
                    }
                    else
                    {
                        packet.ReadEntryWithName <UInt16>(StoreNameType.Spell, "Spell Id", i);
                    }

                    packet.ReadEnum <AuraFlag>("Aura Flags", TypeCode.Byte, i);
                }
            }

            if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) && // no idea when this was added exactly, doesn't exist in 2.4.1
                updateFlags.HasFlag(GroupUpdateFlag.VehicleSeat))
            {
                packet.ReadInt32("Vehicle Seat");
            }
        }
Example #17
0
        private static void LoadHandlersInto(Dictionary <KeyValuePair <ClientVersionBuild, Opcode>, Action <Packet> > handlers, Assembly asm, ClientVersionBuild build)
        {
            var types = asm.GetTypes();

            foreach (var type in types)
            {
                //if (type.Namespace != "WowPacketParser.Parsing.Parsers")
                //    continue;

                if (!type.IsAbstract)
                {
                    continue;
                }

                if (!type.IsPublic)
                {
                    continue;
                }

                var methods = type.GetMethods();

                foreach (var method in methods)
                {
                    if (!method.IsPublic)
                    {
                        continue;
                    }

                    var attrs = (ParserAttribute[])method.GetCustomAttributes(typeof(ParserAttribute), false);

                    if (attrs.Length <= 0)
                    {
                        continue;
                    }

                    var parms = method.GetParameters();

                    if (parms.Length <= 0)
                    {
                        continue;
                    }

                    if (parms[0].ParameterType != typeof(Packet))
                    {
                        continue;
                    }

                    foreach (var attr in attrs)
                    {
                        var opc = attr.Opcode;
                        if (opc == Opcode.NULL_OPCODE)
                        {
                            continue;
                        }

                        var key = new KeyValuePair <ClientVersionBuild, Opcode>(build, opc);

                        var del = (Action <Packet>)Delegate.CreateDelegate(typeof(Action <Packet>), method);

                        if (handlers.ContainsKey(key))
                        {
                            Trace.WriteLine(string.Format("Error: (Build: {0}) tried to overwrite delegate for opcode {1} ({2}); new handler: {3}; old handler: {4}",
                                                          ClientVersion.Build, Opcodes.GetOpcode(attr.Opcode), attr.Opcode, del.Method, handlers[key].Method));
                            continue;
                        }

                        handlers[key] = del;
                    }
                }
            }
        }
Example #18
0
        public static void Parse(Packet packet, bool isMultiple = false)
        {
            ParsedStatus status;

            var opcode = Opcodes.GetOpcode(packet.Opcode, packet.Direction);

            if (opcode == Opcode.NULL_OPCODE)
            {
                opcode = Opcodes.GetOpcode(packet.Opcode);
            }

            packet.WriteLine(packet.GetHeader(isMultiple));

            if (packet.Opcode == 0)
            {
                return;
            }

            var key = new KeyValuePair <ClientVersionBuild, Opcode>(ClientVersion.VersionDefiningBuild, opcode);

            Action <Packet> handler;
            var             hasHandler = VersionHandlers.TryGetValue(key, out handler);

            if (!hasHandler)
            {
                key        = new KeyValuePair <ClientVersionBuild, Opcode>(ClientVersionBuild.Zero, opcode);
                hasHandler = VersionHandlers.TryGetValue(key, out handler);
            }

            if (hasHandler && Settings.DumpFormat != DumpFormatType.HexOnly)
            {
                if (Settings.DumpFormat == DumpFormatType.SniffDataOnly)
                {
                    var attrs = handler.Method.GetCustomAttributes(typeof(HasSniffDataAttribute), false);

                    packet.AddSniffData(StoreNameType.Opcode, packet.Opcode, Opcodes.GetOpcodeName(packet.Opcode));

                    if (attrs.Length == 0)
                    {
                        packet.Status = ParsedStatus.NotParsed;
                        return; // skip parsing "useless" packets when in SniffData-only-mode
                    }
                }

                try
                {
                    handler(packet);

                    if (packet.Position == packet.Length)
                    {
                        status = ParsedStatus.Success;
                    }
                    else
                    {
                        var pos = packet.Position;
                        var len = packet.Length;
                        packet.WriteLine("Packet not fully read! Current position is {0}, length is {1}, and diff is {2}.",
                                         pos, len, len - pos);

                        if (len < 300) // If the packet isn't "too big" and it is not full read, print its hex table
                        {
                            packet.AsHex();
                        }

                        status = ParsedStatus.WithErrors;
                    }
                }
                catch (Exception ex)
                {
                    packet.WriteLine(ex.GetType().ToString());
                    packet.WriteLine(ex.Message);
                    packet.WriteLine(ex.StackTrace);

                    status = ParsedStatus.WithErrors;
                }
            }
            else
            {
                packet.AsHex();
                status = ParsedStatus.NotParsed;
            }

            if (!isMultiple)
            {
                packet.Status = status;

                if (Settings.DumpFormat != DumpFormatType.SniffDataOnly)
                {
                    // added before for this type
                    var data = status == ParsedStatus.Success ? Opcodes.GetOpcodeName(packet.Opcode) : status.ToString();
                    packet.AddSniffData(StoreNameType.Opcode, packet.Opcode, data);
                }
            }
        }
        public static void HandleMonsterMove(Packet packet)
        {
            packet.ReadPackedGuid("GUID");

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_MONSTER_MOVE_TRANSPORT))
            {
                packet.ReadPackedGuid("Transport GUID");

                if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767)) // no idea when this was added exactly
                {
                    packet.ReadByte("Transport Seat");
                }
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767)) // no idea when this was added exactly
            {
                packet.ReadBoolean("Unk Boolean");                            // Something to do with IsVehicleExitVoluntary ?
            }
            var pos = packet.ReadVector3("Position");

            packet.ReadInt32("Move Ticks");

            var type = packet.ReadEnum <SplineType>("Spline Type", TypeCode.Byte);

            switch (type)
            {
            case SplineType.FacingSpot:
            {
                packet.ReadVector3("Facing Spot");
                break;
            }

            case SplineType.FacingTarget:
            {
                packet.ReadGuid("Facing GUID");
                break;
            }

            case SplineType.FacingAngle:
            {
                packet.ReadSingle("Facing Angle");
                break;
            }

            case SplineType.Stop:
                return;
            }

            var flags = packet.ReadEnum <SplineFlag>("Spline Flags", TypeCode.Int32);

            if (flags.HasAnyFlag(SplineFlag.AnimationTier))
            {
                packet.ReadEnum <MovementAnimationState>("Animation State", TypeCode.Byte);
                packet.ReadInt32("Asynctime in ms"); // Async-time in ms
            }

            // Cannot find anything similar to this in 4.2.2 client
            if (ClientVersion.RemovedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                if (flags.HasAnyFlag(SplineFlag.Falling)) // Could be SplineFlag.UsePathSmoothing
                {
                    packet.ReadInt32("Unknown");
                    packet.ReadInt16("Unknown");
                    packet.ReadInt16("Unknown");
                }
            }

            packet.ReadInt32("Move Time");

            if (flags.HasAnyFlag(SplineFlag.Trajectory))
            {
                packet.ReadSingle("Vertical Speed");
                packet.ReadInt32("Unk Int32 2");
            }

            var waypoints = packet.ReadInt32("Waypoints");

            if (flags.HasAnyFlag(SplineFlag.Flying | SplineFlag.CatmullRom))
            {
                packet.ReadVector3("Waypoint", 0);

                for (var i = 1; i < waypoints; i++)
                {
                    packet.ReadVector3("Waypoint", i);
                }
            }
            else
            {
                var newpos = packet.ReadVector3("Waypoint Endpoint");

                var mid = new Vector3();
                mid.X = (pos.X + newpos.X) * 0.5f;
                mid.Y = (pos.Y + newpos.Y) * 0.5f;
                mid.Z = (pos.Z + newpos.Z) * 0.5f;

                for (var i = 1; i < waypoints; i++)
                {
                    var vec = packet.ReadPackedVector3();
                    vec.X += mid.X;
                    vec.Y += mid.Y;
                    vec.Z += mid.Z;

                    packet.Writer.WriteLine("[" + i + "]" + " Waypoint: " + vec);
                }
            }
        }
Example #20
0
        public static void HandleCombatLogMultiple(Packet packet)
        {
            var count = packet.ReadInt32("Count");
            var unk1  = packet.ReadInt32();

            for (var i = 0; i < count; i++)
            {
                var unk2 = packet.ReadInt32();
                packet.AddValue("Unknown", unk1 - unk2, i);

                var opcode = Opcodes.GetOpcode(packet.ReadInt32(), Direction.ServerToClient);
                packet.AddValue("Opcode", opcode);
                switch (opcode)
                {
                case Opcode.SMSG_SPELL_HEAL_LOG:
                {
                    ReadSpellHealLog(packet, i);
                    break;
                }

                case Opcode.SMSG_SPELL_ENERGIZE_LOG:
                {
                    ReadSpellEnergizeLog(packet, i);
                    break;
                }

                case Opcode.SMSG_SPELL_PERIODIC_AURA_LOG:
                {
                    ReadPeriodicAuraLog(packet, i);     // sub_5EEE10
                    break;
                }

                case Opcode.SMSG_SPELL_EXECUTE_LOG:
                {
                    ReadSpellLogExecute(packet, i);
                    break;
                }

                case Opcode.SMSG_SPELL_NON_MELEE_DAMAGE_LOG:
                {
                    ReadSpellNonMeleeDamageLog(packet, i);
                    break;
                }

                case Opcode.SMSG_SPELL_MISS_LOG:
                {
                    ReadSpellMissLog(packet, i);
                    break;
                }

                case Opcode.SMSG_SPELL_STEAL_LOG:
                case Opcode.SMSG_SPELL_DISPELL_LOG:
                case Opcode.SMSG_SPELL_BREAK_LOG:
                {
                    ReadSpellRemoveLog(packet, i);
                    break;
                }

                default:
                    throw new InvalidDataException("Unknown Spell Log Type/Opcode: " + opcode);
                }
            }
        }
Example #21
0
        private static void LoadHandlersInto(Dictionary <KeyValuePair <ClientVersionBuild, Opcode>, Action <Packet> > handlers, Assembly asm, ClientVersionBuild build)
        {
            var types = asm.GetTypes();

            foreach (Type type in types)
            {
                if (!type.IsAbstract || !type.IsPublic)
                {
                    continue;
                }

                var methods = type.GetMethods();

                foreach (MethodInfo method in methods)
                {
                    if (!method.IsPublic)
                    {
                        continue;
                    }

                    var attrs = (ParserAttribute[])method.GetCustomAttributes(typeof(ParserAttribute), false);

                    if (attrs.Length <= 0)
                    {
                        continue;
                    }

                    var parms = method.GetParameters();

                    if (parms.Length <= 0)
                    {
                        continue;
                    }

                    if (parms[0].ParameterType != typeof(Packet))
                    {
                        continue;
                    }

                    foreach (ParserAttribute attr in attrs)
                    {
                        Opcode opc = attr.Opcode;
                        if (opc == Opcode.NULL_OPCODE)
                        {
                            continue;
                        }

                        var key = new KeyValuePair <ClientVersionBuild, Opcode>(build, opc);

                        var del = (Action <Packet>)Delegate.CreateDelegate(typeof(Action <Packet>), method);

                        if (handlers.ContainsKey(key))
                        {
                            // @TODO This is a hack to keep things easy regarding declaration of opcodes.
                            // Ideally, we would split the opcodes into three different enums:
                            // ClientOpcodes, ServerOpcodes, BidirectionalOpcodes
                            // The first two are obvious as to what they would contain.
                            // The last one would be MSG_, UMSG_, TEST_, etc... opcodes
                            // However that's just too much pain to do considering the mess Blizzard does
                            // by naming their opcodes sometimes without following their own rules.
                            Direction direction = attr.Opcode.ToString()[0] == 'S' ? Direction.ServerToClient : Direction.ClientToServer;
                            // ReSharper disable once UseStringInterpolation
                            Trace.WriteLine(string.Format("Error: (Build: {0}) tried to overwrite delegate for opcode {1} ({2}); new handler: {3}; old handler: {4}",
                                                          ClientVersion.Build, Opcodes.GetOpcode(attr.Opcode, direction), attr.Opcode, del.Method, handlers[key].Method));
                            continue;
                        }

                        handlers[key] = del;
                    }
                }
            }
        }
Example #22
0
        public static void HandlePartyMemberStats(Packet packet)
        {
            if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) &&
                packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_PARTY_MEMBER_STATS_FULL))
            {
                packet.ReadBoolean("Add arena opponent");
            }

            packet.ReadPackedGuid("GUID");
            var updateFlags = packet.ReadEnum <GroupUpdateFlag>("Update Flags", TypeCode.Int32);

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Status))
            {
                packet.ReadEnum <GroupMemberStatusFlag>("Status", TypeCode.Int16);
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.CurrentHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Current Health");
                }
                else
                {
                    packet.ReadUInt16("Current Health");
                }
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.MaxHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Max Health");
                }
                else
                {
                    packet.ReadUInt16("Max Health");
                }
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PowerType))
            {
                packet.ReadEnum <PowerType>("Power type", TypeCode.Byte);
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.CurrentPower))
            {
                packet.ReadInt16("Current Power");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.MaxPower))
            {
                packet.ReadInt16("Max Power");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Level))
            {
                packet.ReadInt16("Level");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Zone))
            {
                packet.ReadInt16("Zone ID");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Position))
            {
                packet.ReadInt16("Position X");
                packet.ReadInt16("Position Y");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Auras))
            {
                var auraMask = packet.ReadUInt64("Auramask");

                int maxAura = ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) ? 64 : 56;
                for (var i = 0; i < maxAura; ++i)
                {
                    if ((auraMask & ((ulong)1 << i)) != 0)
                    {
                        int aura;
                        if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                        {
                            aura = packet.ReadInt32();
                        }
                        else
                        {
                            aura = packet.ReadUInt16();
                        }

                        packet.Writer.WriteLine("Slot: [" + i + "] Spell ID: " + StoreGetters.GetName(StoreNameType.Spell, aura));
                        packet.ReadEnum <AuraFlag>("Slot: [" + i + "] Aura flag", TypeCode.Byte);
                    }
                }
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetGuid))
            {
                packet.ReadGuid("Pet GUID");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetName))
            {
                packet.ReadCString("Pet Name");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetModelId))
            {
                packet.ReadInt16("Pet Modelid");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetCurrentHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Pet Current Health");
                }
                else
                {
                    packet.ReadUInt16("Pet Current Health");
                }
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetMaxHealth))
            {
                if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Pet Max Health");
                }
                else
                {
                    packet.ReadUInt16("Pet Max Health");
                }
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetPowerType))
            {
                packet.ReadEnum <PowerType>("Pet Power type", TypeCode.Byte);
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetCurrentPower))
            {
                packet.ReadInt16("Pet Current Power");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetMaxPower))
            {
                packet.ReadInt16("Pet Max Power");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.PetAuras))
            {
                var auraMask = packet.ReadUInt64("Pet Auramask");

                int maxAura = ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) ? 64 : 56;
                for (var i = 0; i < maxAura; ++i)
                {
                    if ((auraMask & ((ulong)1 << i)) != 0)
                    {
                        int aura;
                        if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing))
                        {
                            aura = packet.ReadInt32();
                        }
                        else
                        {
                            aura = packet.ReadUInt16();
                        }

                        packet.Writer.WriteLine("Slot: [" + i + "] Spell ID: " + StoreGetters.GetName(StoreNameType.Spell, aura));
                        packet.ReadEnum <AuraFlag>("Slot: [" + i + "] Aura flag", TypeCode.Byte);
                    }
                }
            }

            if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing) && // no idea when this was added exactly, doesn't exist in 2.4.1
                updateFlags.HasAnyFlag(GroupUpdateFlag.VehicleSeat))
            {
                packet.ReadInt32("Vehicle Seat");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Unknown1))
            {
                packet.ReadInt32("Unk int32");
            }

            if (updateFlags.HasAnyFlag(GroupUpdateFlag.Unknown2))
            {
                packet.ReadInt32("Unk int32");
                packet.ReadInt32("Unk int32");
                packet.ReadCString("Unk string");
            }
        }
Example #23
0
        public static void ReadLfgRewardBlock(ref Packet packet)
        {
            packet.ReadBoolean("First Completion");

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_LFG_PLAYER_REWARD))
            {
                packet.ReadInt32("Strangers");
            }

            packet.ReadInt32("Base Money");
            packet.ReadInt32("Base XP");
            packet.ReadInt32("Variable Money");
            packet.ReadInt32("Variable XP");

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                packet.ReadInt32("Unk 1");
                packet.ReadInt32("Unk 2");
                packet.ReadInt32("Unk 3");
                packet.ReadInt32("Unk 4");
                packet.ReadInt32("Unk 5");
                packet.ReadInt32("Unk 6");
                packet.ReadInt32("Unk 7");
                packet.ReadInt32("Unk 8");

                if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_4_15595)) // perhaps earlier, confirmed for 434
                {
                    packet.ReadInt32("Unk 8.1");
                }

                packet.ReadByte("Unk 9");

                // LFG_SLOT_INFO_LOOT related
                for (var i = 0; i < 3; ++i)
                {
                    var unk1 = packet.ReadInt32("Unk 1", i);
                    if (unk1 != 0)
                    {
                        packet.ReadInt32("Unk 2", i);
                        packet.ReadInt32("Unk 3", i);
                        var unk4 = packet.ReadByte("Unk 4", i);
                        for (var j = 0; j < unk4; ++j)
                        {
                            packet.ReadInt32("Unk 5", j);
                            packet.ReadInt32("Unk 6", j);
                            packet.ReadInt32("Unk 7", j);
                            packet.ReadByte("Unk 8", j);
                        }
                    }
                }

                packet.ReadInt32("Unk 10");
                packet.ReadInt32("Unk 11");
            }

            var numFields = packet.ReadByte("Reward Item Count");

            for (var i = 0; i < numFields; i++)
            {
                packet.ReadEntryWithName <Int32>(StoreNameType.Item, "Reward Item Or Currency Id", i);
                packet.ReadInt32("Reward Item Display ID", i);
                packet.ReadInt32("Reward Item Stack Count", i);
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_6a_13623))
                {
                    packet.ReadBoolean("Is Currency", i);
                }
            }
        }
Example #24
0
        public static void HandleSpellStart(Packet packet)
        {
            bool isSpellGo = packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_SPELL_GO);

            packet.ReadPackedGuid("Caster GUID");
            packet.ReadPackedGuid("Caster Unit GUID");

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056))
            {
                packet.ReadByte("Cast Count");
            }

            packet.ReadEntryWithName <Int32>(StoreNameType.Spell, "Spell ID");

            if (ClientVersion.RemovedInVersion(ClientVersionBuild.V3_0_2_9056) && !isSpellGo)
            {
                packet.ReadByte("Cast Count");
            }

            var flagsTypeCode = ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056) ? TypeCode.Int32 : TypeCode.UInt16;
            var flags         = packet.ReadEnum <CastFlag>("Cast Flags", flagsTypeCode);

            packet.ReadInt32("Time");

            if (isSpellGo)
            {
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_0_15005))
                {
                    packet.ReadInt32("unk");
                }
                var hitCount = packet.ReadByte("Hit Count");
                for (var i = 0; i < hitCount; i++)
                {
                    packet.ReadGuid("Hit GUID", i);
                }

                var missCount = packet.ReadByte("Miss Count");
                for (var i = 0; i < missCount; i++)
                {
                    var missGuid = packet.ReadGuid("Miss GUID", i);
                    packet.Writer.WriteLine("Miss GUID " + i + ": " + missGuid);

                    var missType = packet.ReadEnum <SpellMissType>("Miss Type", TypeCode.Byte, i);
                    if (missType != SpellMissType.Reflect)
                    {
                        continue;
                    }

                    packet.ReadEnum <SpellMissType>("Miss Reflect", TypeCode.Byte, i);
                }
            }
            else
            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_0_15005))
            {
                packet.ReadInt32("unk");
            }

            var targetFlags = ReadSpellCastTargets(ref packet);

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056))
            {
                if (flags.HasAnyFlag(CastFlag.PredictedPower))
                {
                    packet.ReadInt32("Rune Cooldown");
                }

                if (flags.HasAnyFlag(CastFlag.RuneInfo))
                {
                    var spellRuneState  = packet.ReadByte("Spell Rune State");
                    var playerRuneState = packet.ReadByte("Player Rune State");

                    for (var i = 0; i < 6; i++)
                    {
                        var mask = 1 << i;
                        if ((mask & spellRuneState) == 0)
                        {
                            continue;
                        }

                        if ((mask & playerRuneState) != 0)
                        {
                            continue;
                        }

                        packet.ReadByte("Rune Cooldown Passed", i);
                    }
                }

                if (isSpellGo)
                {
                    if (flags.HasAnyFlag(CastFlag.AdjustMissile))
                    {
                        packet.ReadSingle("Unk Single");
                        packet.ReadInt32("Unk Int32 1");
                    }
                }
            }

            if (flags.HasAnyFlag(CastFlag.Projectile))
            {
                packet.ReadInt32("Ammo Display ID");
                packet.ReadEnum <InventoryType>("Ammo Inventory Type", TypeCode.Int32);
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056))
            {
                if (isSpellGo)
                {
                    if (flags.HasAnyFlag(CastFlag.VisualChain))
                    {
                        packet.ReadInt32("Unk Int32 2");
                        packet.ReadInt32("Unk Int32 3");
                    }

                    if (targetFlags.HasAnyFlag(TargetFlag.DestinationLocation))
                    {
                        packet.ReadByte("Unk Byte 2");
                    }

                    if (targetFlags.HasAnyFlag(TargetFlag.ExtraTargets))
                    {
                        var targetCount = packet.ReadInt32("Extra Targets Count");
                        for (var i = 0; i < targetCount; i++)
                        {
                            packet.ReadVector3("Extra Target Position", i);
                            packet.ReadGuid("Extra Target GUID", i);
                        }
                    }
                }
                else
                {
                    if (flags.HasAnyFlag(CastFlag.Immunity))
                    {
                        packet.ReadInt32("Unk Int32 4");
                        packet.ReadInt32("Unk Int32 5");
                    }
                }
            }
        }
 public ParserAttribute(int opcode)
 {
     Opcode = Opcodes.GetOpcode(opcode);
 }
Example #26
0
        public static void ReadQueryHeader(ref Packet packet)
        {
            var entry = packet.ReadInt32("Entry");
            var guid  = packet.ReadGuid("GUID");

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_CREATURE_QUERY) || packet.Opcode == Opcodes.GetOpcode(Opcode.CMSG_GAMEOBJECT_QUERY))
            {
                if (guid.HasEntry() && (entry != guid.GetEntry()))
                {
                    packet.WriteLine("Entry does not match calculated GUID entry");
                }
            }
        }
        public static void HandleCombatLogMultiple(Packet packet)
        {
            var count = packet.ReadInt32("Count");
            var unk1  = packet.ReadInt32();

            for (var i = 0; i < count; i++)
            {
                var unk2 = packet.ReadInt32();
                packet.WriteLine("[" + i + "] Unknown: {0}", unk1 - unk2);

                var opcode = Opcodes.GetOpcode(packet.ReadInt32());
                packet.WriteLine("Opcode: " + opcode);
                switch (opcode)
                {
                case Opcode.SMSG_SPELLHEALLOG:
                {
                    ReadSpellHealLog(ref packet, i);
                    break;
                }

                case Opcode.SMSG_SPELLENERGIZELOG:
                {
                    ReadSpellEnergizeLog(ref packet, i);
                    break;
                }

                case Opcode.SMSG_PERIODICAURALOG:
                {
                    ReadPeriodicAuraLog(ref packet, i);     // sub_5EEE10
                    break;
                }

                case Opcode.SMSG_SPELLLOGEXECUTE:
                {
                    ReadSpellLogExecute(ref packet, i);
                    break;
                }

                case Opcode.SMSG_SPELLNONMELEEDAMAGELOG:
                {
                    ReadSpellNonMeleeDamageLog(ref packet, i);
                    break;
                }

                case Opcode.SMSG_SPELLLOGMISS:
                {
                    ReadSpellMissLog(ref packet, i);
                    break;
                }

                case Opcode.SMSG_SPELLSTEALLOG:
                case Opcode.SMSG_SPELLDISPELLOG:
                case Opcode.SMSG_SPELLBREAKLOG:
                {
                    ReadSpellRemoveLog(ref packet, i);
                    break;
                }

                default:
                    throw new InvalidDataException("Unknown Spell Log Type/Opcode: " + opcode);
                }
            }
        }
Example #28
0
        public static void HandleServerChatMessage(Packet packet)
        {
            PacketChat chatPacket = packet.Holder.Chat = new PacketChat();
            var        text       = new CreatureText
            {
                Type       = packet.ReadByteE <ChatMessageType>("Type"),
                Language   = packet.ReadInt32E <Language>("Language"),
                SenderGUID = packet.ReadGuid("GUID")
            };

            packet.ReadInt32("Constant time");

            switch (text.Type)
            {
            case ChatMessageType.Achievement:
            case ChatMessageType.GuildAchievement:
            {
                packet.ReadGuid("Sender GUID");
                break;
            }

            case ChatMessageType.WhisperForeign:
            {
                packet.ReadInt32("Name Length");
                text.SenderName   = packet.ReadCString("Name");
                text.ReceiverGUID = packet.ReadGuid("Receiver GUID");
                break;
            }

            case ChatMessageType.BattlegroundNeutral:
            case ChatMessageType.BattlegroundAlliance:
            case ChatMessageType.BattlegroundHorde:
            {
                var target = packet.ReadGuid("Sender GUID");
                switch (target.GetHighType())
                {
                case HighGuidType.Creature:
                case HighGuidType.Vehicle:
                case HighGuidType.GameObject:
                case HighGuidType.Transport:
                case HighGuidType.Pet:
                    packet.ReadInt32("Sender Name Length");
                    packet.ReadCString("Sender Name");
                    break;
                }
                break;
            }

            case ChatMessageType.MonsterSay:
            case ChatMessageType.MonsterYell:
            case ChatMessageType.MonsterParty:
            case ChatMessageType.MonsterEmote:
            case ChatMessageType.MonsterWhisper:
            case ChatMessageType.RaidBossEmote:
            case ChatMessageType.RaidBossWhisper:
            case ChatMessageType.BattleNet:
            {
                packet.ReadInt32("Name Length");
                text.SenderName   = packet.ReadCString("Name");
                text.ReceiverGUID = packet.ReadGuid("Receiver GUID");
                switch (text.ReceiverGUID.GetHighType())
                {
                case HighGuidType.Creature:
                case HighGuidType.Vehicle:
                case HighGuidType.GameObject:
                case HighGuidType.Transport:
                    packet.ReadInt32("Receiver Name Length");
                    text.ReceiverName = packet.ReadCString("Receiver Name");
                    break;
                }
                break;
            }

            default:
            {
                if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_GM_MESSAGECHAT, Direction.ServerToClient))
                {
                    packet.ReadInt32("GMNameLength");
                    packet.ReadCString("GMSenderName");
                }

                if (text.Type == ChatMessageType.Channel)
                {
                    packet.ReadCString("Channel Name");
                }

                packet.ReadGuid("Sender GUID");
                break;
            }
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914) && text.Language == Language.Addon)
            {
                packet.ReadCString("Addon Message Prefix");
            }

            packet.ReadInt32("Text Length");
            text.Text = packet.ReadCString("Text");

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V5_1_0_16309))
            {
                packet.ReadInt16E <ChatTag>("Chat Tag");
            }
            else
            {
                packet.ReadByteE <ChatTag>("Chat Tag");
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_0_14333))
            {
                if (text.Type == ChatMessageType.RaidBossEmote || text.Type == ChatMessageType.RaidBossWhisper)
                {
                    packet.ReadSingle("Unk single");
                    packet.ReadByte("Unk byte");
                }
            }

            if (text.Type == ChatMessageType.Achievement || text.Type == ChatMessageType.GuildAchievement)
            {
                packet.ReadInt32 <AchievementId>("Achievement Id");
            }

            uint entry = 0;

            if (text.SenderGUID.GetObjectType() == ObjectType.Unit)
            {
                entry = text.SenderGUID.GetEntry();
            }
            else if (text.ReceiverGUID != null && text.ReceiverGUID.GetObjectType() == ObjectType.Unit)
            {
                entry = text.ReceiverGUID.GetEntry();
            }

            if (entry != 0)
            {
                Storage.CreatureTexts.Add(entry, text, packet.TimeSpan);
            }

            chatPacket.Text     = text.Text;
            chatPacket.Sender   = text.SenderGUID.ToUniversalGuid();
            chatPacket.Target   = text.ReceiverGUID?.ToUniversalGuid();
            chatPacket.Language = (int)text.Language;
            chatPacket.Type     = (int)text.Type;
        }
Example #29
0
        public static void ReadLfgRewardBlock(Packet packet, object index)
        {
            packet.ReadBool("First Completion", index);

            if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_LFG_PLAYER_REWARD, Direction.ServerToClient))
            {
                packet.ReadInt32("Strangers", index);
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545))
            {
                packet.ReadInt32("currencyQuantity", index);
                packet.ReadInt32("Unk 2", index);
                packet.ReadInt32("currencyID", index);
                packet.ReadInt32("tier1Quantity", index);
                packet.ReadInt32("tier1Limit", index);
                packet.ReadInt32("overallQuantity", index);
                packet.ReadInt32("overallLimit", index);
                packet.ReadInt32("periodPurseQuantity", index);
                packet.ReadInt32("periodPurseLimit", index);
                packet.ReadInt32("purseQuantity", index);
                packet.ReadInt32("purseLimit", index);
                packet.ReadInt32("Unk 4", index);
                packet.ReadInt32("completedEncounters", index);

                packet.ReadByte("Call to Arms eligible", index);

                // LFG_SLOT_INFO_LOOT related
                for (var i = 0; i < 3; ++i)
                {
                    var unk1 = packet.ReadInt32E <LfgRoleFlag>("Call to Arms Role", index, i);
                    if (unk1 != 0)
                    {
                        packet.ReadInt32("Call to Arms Money", index, i);
                        packet.ReadInt32("Call to Arms XP", index, i);
                        var unk4 = packet.ReadByte("Call to Arms Item Count", index, i);
                        for (var j = 0; j < unk4; ++j)
                        {
                            packet.ReadInt32 <ItemId>("Call to Arms Item Or Currency Id", index, i, j);
                            packet.ReadInt32("Call to Arms Item Display ID", index, i, j);
                            packet.ReadInt32("Call to Arms Item Stack Count", index, i, j);
                            packet.ReadBool("Call to Arms Is Currency", index, i, j);
                        }
                    }
                }
            }

            packet.ReadInt32("Base Money", index);
            packet.ReadInt32("Base XP", index);

            if (ClientVersion.RemovedInVersion(ClientVersionBuild.V4_0_6a_13623))
            {
                packet.ReadInt32("Variable Money", index);
                packet.ReadInt32("Variable XP", index);
            }

            var numFields = packet.ReadByte("Reward Item Count", index);

            for (var i = 0; i < numFields; i++)
            {
                packet.ReadInt32 <ItemId>("Reward Item Or Currency Id", index, i);
                packet.ReadInt32("Reward Item Display ID", index, i);
                packet.ReadInt32("Reward Item Stack Count", index, i);
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_6a_13623))
                {
                    packet.ReadBool("Is Currency", index, i);
                }
            }
        }
Example #30
0
        public static void ReadSpellCastData(Packet packet, params object[] idx)
        {
            bool    isSpellGo  = packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_SPELL_GO, Direction.ServerToClient);
            WowGuid targetGUID = new WowGuid64();

            var casterGUID = packet.ReadPackedGuid("CasterGUID", idx);

            packet.ReadPackedGuid("CasterUnit", idx);
            packet.ReadByte("CastID", idx);
            var      spellId = packet.ReadInt32 <SpellId>("SpellID", idx);
            CastFlag flags   = packet.ReadInt32E <CastFlag>("CastFlags", idx);

            packet.ReadUInt32("CastFlagsEx", idx);
            packet.ReadUInt32("CastTime", idx);

            if (isSpellGo)
            {
                var hitTargetsCount = packet.ReadByte("HitTargetsCount", idx);
                for (var i = 0; i < hitTargetsCount; ++i)
                {
                    packet.ReadGuid("HitTarget", idx, i);
                }

                var missCount = packet.ReadByte("MissStatusCount", idx);
                for (var i = 0; i < missCount; ++i)
                {
                    ReadSpellMissStatus(packet, idx, "MissStatus", i);
                }
            }

            TargetFlag targetFlags = TargetFlag.Self;

            ReadSpellTargetData(packet, ref targetFlags, targetGUID, idx, "Target");

            if (flags.HasAnyFlag(CastFlag.PredictedPower))
            {
                packet.ReadUInt32("RemainingPower");
            }

            if (flags.HasAnyFlag(CastFlag.RuneInfo))
            {
                ReadRuneData(packet, idx, "RemainingRunes");
            }

            if (isSpellGo)
            {
                if (flags.HasAnyFlag(CastFlag.AdjustMissile))
                {
                    ReadMissileTrajectoryResult(packet, idx, "MissileTrajectory");
                }
            }

            if (flags.HasAnyFlag(CastFlag.Projectile))
            {
                ReadSpellAmmo(packet, idx, "Ammo");
            }

            if (isSpellGo)
            {
                if (flags.HasAnyFlag(CastFlag.VisualChain))
                {
                    ReadProjectileVisual(packet, idx, "ProjectileVisual");
                }

                if (targetFlags.HasAnyFlag(TargetFlag.DestinationLocation))
                {
                    packet.ReadByte("DestLocSpellCastIndex", idx);
                }

                if (targetFlags.HasAnyFlag(TargetFlag.ExtraTargets))
                {
                    var targetPointsCount = packet.ReadInt32("TargetPointsCount", idx);
                    for (var i = 0; i < targetPointsCount; ++i)
                    {
                        ReadTargetLocation(packet, idx, "TargetPoints", i);
                    }
                }
            }
            else
            {
                if (flags.HasAnyFlag(CastFlag.Immunity))
                {
                    ReadCreatureImmunities(packet, idx, "Immunities");
                }

                if (flags.HasAnyFlag(CastFlag.HealPrediction))
                {
                    ReadSpellHealPrediction(packet, idx, "Predict");
                }
            }

            if (flags.HasAnyFlag(CastFlag.Unknown21) && !isSpellGo)
            {
                NpcSpellClick spellClick = new NpcSpellClick
                {
                    SpellID    = (uint)spellId,
                    CasterGUID = casterGUID,
                    TargetGUID = targetGUID
                };

                Storage.SpellClicks.Add(spellClick, packet.TimeSpan);
            }

            if (isSpellGo)
            {
                packet.AddSniffData(StoreNameType.Spell, spellId, "SPELL_GO");
            }
        }