public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry"); // +5

            var creature = new UnitTemplate();
            var hasData = packet.ReadBit(); //+16
            if (!hasData)
                return; // nothing to do

            creature.DisplayIds = new uint[4];
            creature.KillCredits = new uint[2];

            var bits24 = packet.ReadBits(11); //+7
            var qItemCount = packet.ReadBits(22); //+72
            var bits1C = (int)packet.ReadBits(11); //+9

            var stringLens = new int[4][];
            for (var i = 0; i < 4; i++)
            {
                stringLens[i] = new int[2];
                stringLens[i][0] = (int)packet.ReadBits(11);
                stringLens[i][1] = (int)packet.ReadBits(11);
            }

            creature.RacialLeader = packet.ReadBit("Racial Leader"); //+68
            var bits2C = packet.ReadBits(6); //+136

            if (bits1C > 1)
                packet.ReadCString("String1C");

            creature.KillCredits[0] = packet.ReadUInt32(); //+27
            creature.DisplayIds[3] = packet.ReadUInt32(); //+32
            creature.DisplayIds[2] = packet.ReadUInt32(); //+31
            creature.Expansion = packet.ReadEnum<ClientType>("Expansion", TypeCode.UInt32); //+24
            creature.Type = packet.ReadEnum<CreatureType>("Type", TypeCode.Int32); //+12
            creature.Modifier1 = packet.ReadSingle("Modifier 1"); //+15

            //for (var i = 0; i < 2; ++i)
            //{
                creature.TypeFlags = packet.ReadEnum<CreatureTypeFlag>("Type Flags", TypeCode.UInt32);
                creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum
            //}

            creature.Rank = packet.ReadEnum<CreatureRank>("Rank", TypeCode.Int32); //+14
            creature.MovementId = packet.ReadUInt32("Movement ID"); //+23

            var name = new string[4];
            var femaleName = new string[4];
            for (var i = 0; i < 4; ++i)
            {
                if (stringLens[i][1] > 1)
                    femaleName[i] = packet.ReadCString("Female Name", i);
                if (stringLens[i][0] > 1)
                    name[i] = packet.ReadCString("Name", i);
            }
            creature.Name = name[0];
            creature.femaleName = femaleName[0];

            if (bits24 > 1)
                creature.SubName = packet.ReadCString("Sub Name");

            creature.DisplayIds[0] = packet.ReadUInt32(); //+29
            creature.DisplayIds[1] = packet.ReadUInt32(); //+30

            if (bits2C > 1)
                creature.IconName = packet.ReadCString("Icon Name"); //+100

            creature.QuestItems = new uint[qItemCount];
            for (var i = 0; i < qItemCount; ++i)
                creature.QuestItems[i] = (uint)packet.ReadEntry<Int32>(StoreNameType.Item, "Quest Item", i); //+72

            creature.KillCredits[1] = packet.ReadUInt32(); //+28
            creature.Modifier2 = packet.ReadSingle("Modifier 2"); //+16
            creature.Family = packet.ReadEnum<CreatureFamily>("Family", TypeCode.Int32); //+13

            for (var i = 0; i < 4; ++i)
                packet.AddValue("Display ID", creature.DisplayIds[i], i);
            for (var i = 0; i < 2; ++i)
                packet.AddValue("Kill Credit", creature.KillCredits[i], i);

            packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE");

            Storage.UnitTemplates.Add((uint)entry.Key, creature, packet.TimeSpan);

            var objectName = new ObjectName
            {
                ObjectType = ObjectType.Unit,
                Name = creature.Name,
            };
            Storage.ObjectNames.Add((uint)entry.Key, objectName, packet.TimeSpan);
        }
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry");

            var hasData = packet.ReadBit("hasData");

            if (!hasData)
                return; // nothing to do

            var creature = new UnitTemplate();

            creature.RacialLeader = packet.ReadBit("Racial Leader");

            uint lengthIconName = packet.ReadBits(6) ^ 1;

            var lengthName = new int[4][];
            for (var i = 0; i < 4; i++)
            {
                lengthName[i] = new int[2];
                lengthName[i][0] = (int)packet.ReadBits("Name length female", 11);
                lengthName[i][1] = (int)packet.ReadBits("Name length male", 11);
            }

            uint qItemCount = packet.ReadBits("itemCount", 22);
            uint lengthSubname = packet.ReadBits("Subname length", 11);

            packet.ReadBits(11); // Unk String length. Needs reading somewhere?

            creature.Modifier1 = packet.ReadSingle("Modifier Mana");

            var name = new string[8];
            for (var i = 0; i < 4; ++i)
            {
                if (lengthName[i][1] > 1)
                    packet.ReadCString("Male Name", i);

                if (lengthName[i][0] > 1)
                    name[i] = packet.ReadCString("Female name", i);
            }
            creature.Name = name[0];

            creature.Modifier2 = packet.ReadSingle("Modifier Health");

            creature.KillCredits = new uint[2];
            creature.KillCredits[1] = packet.ReadUInt32("Kill Credit 2");

            creature.DisplayIds = new uint[4];
            creature.DisplayIds[1] = packet.ReadUInt32("Display Id 2");

            creature.QuestItems = new uint[qItemCount];
            for (var i = 0; i < qItemCount; ++i)
                creature.QuestItems[i] = (uint)packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Quest Item", i);

            creature.Type = packet.ReadEnum<CreatureType>("Type", TypeCode.Int32);

            if (lengthIconName > 1)
                creature.IconName = packet.ReadCString("Icon Name");

            creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2");

            creature.TypeFlags = packet.ReadEnum<CreatureTypeFlag>("Type Flags", TypeCode.UInt32);

            creature.KillCredits[0] = packet.ReadUInt32("Kill Credit 1");

            creature.Family = packet.ReadEnum<CreatureFamily>("Family", TypeCode.Int32);

            creature.MovementId = packet.ReadUInt32("Movement Id");

            creature.Expansion = packet.ReadEnum<ClientType>("Expansion", TypeCode.UInt32);

            creature.DisplayIds[0] = packet.ReadUInt32("Display Id 1");
            creature.DisplayIds[2] = packet.ReadUInt32("Display Id 3");

            creature.Rank = packet.ReadEnum<CreatureRank>("Rank", TypeCode.Int32);

            if (lengthSubname > 1)
                creature.SubName = packet.ReadCString("Sub Name");

            creature.DisplayIds[3] = packet.ReadUInt32("Display Id 4");

            packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE");

            Storage.UnitTemplates.Add((uint)entry.Key, creature, packet.TimeSpan);

            var objectName = new ObjectName
            {
                ObjectType = ObjectType.Unit,
                Name = creature.Name,
            };
            Storage.ObjectNames.Add((uint)entry.Key, objectName, packet.TimeSpan);
        }
Example #3
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry");
            if (entry.Value)
                return;

            var creature = new UnitTemplate();

            var nameCount = ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914) ? 8 : 4; // Might be earlier or later
            var name = new string[nameCount];
            for (var i = 0; i < name.Length; i++)
                name[i] = packet.ReadCString("Name", i);
            creature.Name = name[0];

            creature.SubName = packet.ReadCString("Sub Name");

            creature.IconName = packet.ReadCString("Icon Name");

            creature.TypeFlags = packet.ReadEnum<CreatureTypeFlag>("Type Flags", TypeCode.UInt32);

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914)) // Might be earlier or later
                creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum

            creature.Type = packet.ReadEnum<CreatureType>("Type", TypeCode.Int32);

            creature.Family = packet.ReadEnum<CreatureFamily>("Family", TypeCode.Int32);

            creature.Rank = packet.ReadEnum<CreatureRank>("Rank", TypeCode.Int32);

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
            {
                creature.KillCredit1 = packet.ReadUInt32("Kill Credit 1");
                creature.KillCredit2 = packet.ReadUInt32("Kill Credit 2");
            }
            else // Did they stop sending pet spell data after 3.1?
            {
                creature.UnkInt = packet.ReadInt32("Unk Int");
                creature.PetSpellData = packet.ReadUInt32("Pet Spell Data Id");
            }

            creature.DisplayIds = new uint[4];
            for (var i = 0; i < 4; i++)
                creature.DisplayIds[i] = packet.ReadUInt32("Display ID", i);

            creature.Modifier1 = packet.ReadSingle("Modifier 1");
            creature.Modifier2 = packet.ReadSingle("Modifier 2");

            creature.RacialLeader = packet.ReadBoolean("Racial Leader");

            var qItemCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192) ? 6 : 4;
            creature.QuestItems = new uint[qItemCount];

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
            {
                for (var i = 0; i < qItemCount; i++)
                    creature.QuestItems[i] = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Item, "Quest Item", i);

                creature.MovementId = packet.ReadUInt32("Movement ID");
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_1_13164))
                creature.Expansion = packet.ReadEnum<ClientType>("Expansion", TypeCode.UInt32);

            packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE");

            Storage.UnitTemplates.TryAdd((uint)entry.Key, creature);

            var objectName = new ObjectName
            {
                ObjectType = ObjectType.Unit,
                Name = creature.Name,
            };
            Storage.ObjectNames.TryAdd((uint)entry.Key, objectName);
        }
Example #4
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry");
            var hasData = packet.ReadBit();
            if (!hasData)
                return; // nothing to do

            var creature = new UnitTemplate();

            var lenS3 = (int)packet.ReadBits(11);
            var qItemCount = packet.ReadBits(22);
            var lenS4 = (int)packet.ReadBits(6);
            creature.RacialLeader = packet.ReadBit("Racial Leader");

            var stringLens = new int[4][];
            for (var i = 0; i < 4; i++)
            {
                stringLens[i] = new int[2];
                stringLens[i][0] = (int)packet.ReadBits(11);
                stringLens[i][1] = (int)packet.ReadBits(11);
            }

            var lenS5 = (int)packet.ReadBits(11);

            packet.ResetBitReader();

            creature.Family = packet.ReadInt32E<CreatureFamily>("Family");

            creature.Expansion = packet.ReadUInt32E<ClientType>("Expansion");

            //packet.ReadCString("string5");

            creature.Type = packet.ReadInt32E<CreatureType>("Type");

            if (lenS5 > 1)
                creature.SubName = packet.ReadCString("Sub Name");

            creature.DisplayIds = new uint[4];
            creature.DisplayIds[0] = packet.ReadUInt32("Display ID 0");
            creature.DisplayIds[3] = packet.ReadUInt32("Display ID 3");

            /*creature.QuestItems = new uint[qItemCount];
            for (var i = 0; i < qItemCount; ++i)
                creature.QuestItems[i] = (uint)packet.ReadInt32<ItemId>("Quest Item", i);
            */
            var name = new string[4];
            var femaleName = new string[4];
            for (var i = 0; i < 4; ++i)
            {
                if (stringLens[i][0] > 1)
                    name[i] = packet.ReadCString("Name", i);
                if (stringLens[i][1] > 1)
                    femaleName[i] = packet.ReadCString("Female Name", i);
            }
            creature.Name = name[0];
            creature.FemaleName = femaleName[0];

            if (lenS4 > 1)
                creature.IconName = packet.ReadCString("Icon Name");

            creature.TypeFlags = packet.ReadUInt32E<CreatureTypeFlag>("Type Flags");
            creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum

            creature.Modifier1 = packet.ReadSingle("Modifier 1");

            creature.Rank = packet.ReadInt32E<CreatureRank>("Rank");

            creature.KillCredits = new uint[2];
            for (var i = 0; i < 2; ++i)
                creature.KillCredits[i] = packet.ReadUInt32("Kill Credit", i);

            creature.Modifier2 = packet.ReadSingle("Modifier 2");

            creature.MovementId = packet.ReadUInt32("Movement ID");

            creature.DisplayIds[1] = packet.ReadUInt32("Display ID 1");
            creature.DisplayIds[2] = packet.ReadUInt32("Display ID 2");

            packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE");

            Storage.UnitTemplates.Add((uint)entry.Key, creature, packet.TimeSpan);

            var objectName = new ObjectName
            {
                ObjectType = ObjectType.Unit,
                Name = creature.Name
            };
            Storage.ObjectNames.Add((uint)entry.Key, objectName, packet.TimeSpan);
        }
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry");

            var creature = new UnitTemplate();
            var hasData = packet.ReadBit();
            if (!hasData)
                return; // nothing to do

            packet.ResetBitReader();
            var bits4 = packet.ReadBits(11);
            var bits16 = packet.ReadBits(11);
            var bits28 = packet.ReadBits(6);
            creature.RacialLeader = packet.ReadBit("Leader");

            var stringLens = new int[4][];
            for (var i = 0; i < 4; i++)
            {
                stringLens[i] = new int[2];
                stringLens[i][0] = (int)packet.ReadBits(11);
                stringLens[i][1] = (int)packet.ReadBits(11);
            }

            for (var i = 0; i < 4; ++i)
            {
                if (stringLens[i][0] > 1)
                    creature.Name = packet.ReadCString("Name");
                if (stringLens[i][1] > 1)
                    creature.FemaleName = packet.ReadCString("NameAlt");
            }

            //for (var i = 0; i < 2; ++i)
            //{
            creature.TypeFlags = packet.ReadUInt32E<CreatureTypeFlag>("Type Flags");
            creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2");
            //}

            creature.Type = packet.ReadInt32E<CreatureType>("CreatureType");
            creature.Family = packet.ReadInt32E<CreatureFamily>("CreatureFamily");
            creature.Rank = packet.ReadInt32E<CreatureRank>("Classification");

            creature.KillCredits = new uint[2];
            for (var i = 0; i < 2; ++i)
                creature.KillCredits[i] = packet.ReadUInt32("ProxyCreatureID", i);

            creature.DisplayIds = new uint[4];
            for (var i = 0; i < 4; ++i)
                creature.DisplayIds[i] = packet.ReadUInt32("CreatureDisplayID", i);

            creature.Modifier1 = packet.ReadSingle("HpMulti");
            creature.Modifier2 = packet.ReadSingle("EnergyMulti");

            creature.QuestItems = new uint[6];
            var questItems = packet.ReadInt32("QuestItems");
            creature.MovementId = packet.ReadUInt32("CreatureMovementInfoID");
            creature.Expansion = packet.ReadUInt32E<ClientType>("RequiredExpansion");
            packet.ReadInt32("FlagQuest");

            if (bits4 > 1)
                creature.SubName = packet.ReadCString("Title");

            if (bits16 > 1)
                packet.ReadCString("TitleAlt");

            if (bits28 > 1)
                creature.IconName = packet.ReadCString("CursorName");

            for (var i = 0; i < questItems; ++i)
                creature.QuestItems[i] = (uint)packet.ReadInt32<ItemId>("Quest Item", i);

            packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE");

            Storage.UnitTemplates.Add((uint)entry.Key, creature, packet.TimeSpan);

            var objectName = new ObjectName
            {
                ObjectType = ObjectType.Unit,
                Name = creature.Name
            };
            Storage.ObjectNames.Add((uint)entry.Key, objectName, packet.TimeSpan);
        }