Exemplo n.º 1
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry");

            CreatureTemplate creature = new CreatureTemplate
            {
                Entry = (uint)entry.Key
            };

            Bit hasData = packet.ReadBit();

            if (!hasData)
            {
                return; // nothing to do
            }
            packet.ResetBitReader();
            uint titleLen      = packet.ReadBits(11);
            uint titleAltLen   = packet.ReadBits(11);
            uint cursorNameLen = packet.ReadBits(6);

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

            var stringLens = new int[4][];

            for (int 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)
                {
                    string name = packet.ReadCString("Name");
                    if (i == 0)
                    {
                        creature.Name = name;
                    }
                }
                if (stringLens[i][1] > 1)
                {
                    string nameAlt = packet.ReadCString("NameAlt");
                    if (i == 0)
                    {
                        creature.FemaleName = nameAlt;
                    }
                }
            }

            creature.TypeFlags  = packet.ReadUInt32E <CreatureTypeFlag>("Flags");
            creature.TypeFlags2 = packet.ReadUInt32("Flags2");

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

            creature.KillCredits = new uint?[2];
            for (int i = 0; i < 2; ++i)
            {
                creature.KillCredits[i] = (uint)packet.ReadInt32("ProxyCreatureID", i);
            }

            var displayIdCount = packet.ReadUInt32("DisplayIdCount");

            packet.ReadSingle("TotalProbability");

            for (var i = 0; i < displayIdCount; ++i)
            {
                CreatureTemplateModel model = new CreatureTemplateModel
                {
                    CreatureID = (uint)entry.Key,
                    Idx        = (uint)i
                };

                model.CreatureDisplayID = (uint)packet.ReadInt32("CreatureDisplayID", i);
                model.DisplayScale      = packet.ReadSingle("DisplayScale", i);
                model.Probability       = packet.ReadSingle("Probability", i);

                Storage.CreatureTemplateModels.Add(model, packet.TimeSpan);
            }

            creature.HealthModifier = packet.ReadSingle("HpMulti");
            creature.ManaModifier   = packet.ReadSingle("EnergyMulti");

            uint questItems = packet.ReadUInt32("QuestItems");

            creature.MovementID             = (uint)packet.ReadInt32("CreatureMovementInfoID");
            creature.HealthScalingExpansion = packet.ReadInt32E <ClientType>("HealthScalingExpansion");
            creature.RequiredExpansion      = packet.ReadInt32E <ClientType>("RequiredExpansion");
            creature.VignetteID             = (uint)packet.ReadInt32("VignetteID");
            creature.UnitClass = (uint)packet.ReadInt32E <Class>("UnitClass");
            packet.ReadInt32("CreatureDifficultyID");
            creature.WidgetSetID = packet.ReadInt32("WidgetSetID");
            creature.WidgetSetUnitConditionID = packet.ReadInt32("WidgetSetUnitConditionID");

            if (titleLen > 1)
            {
                creature.SubName = packet.ReadCString("Title");
            }

            if (titleAltLen > 1)
            {
                creature.TitleAlt = packet.ReadCString("TitleAlt");
            }

            if (cursorNameLen > 1)
            {
                creature.IconName = packet.ReadCString("CursorName");
            }

            for (uint i = 0; i < questItems; ++i)
            {
                CreatureTemplateQuestItem questItem = new CreatureTemplateQuestItem
                {
                    CreatureEntry = (uint)entry.Key,
                    Idx           = i,
                    ItemId        = (uint)packet.ReadInt32 <ItemId>("QuestItem", i)
                };

                Storage.CreatureTemplateQuestItems.Add(questItem, packet.TimeSpan);
            }

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

            Storage.CreatureTemplates.Add(creature.Entry.Value, creature, packet.TimeSpan);

            if (ClientLocale.PacketLocale != LocaleConstant.enUS)
            {
                CreatureTemplateLocale localesCreature = new CreatureTemplateLocale
                {
                    ID       = (uint)entry.Key,
                    Name     = creature.Name,
                    NameAlt  = creature.FemaleName,
                    Title    = creature.SubName,
                    TitleAlt = creature.TitleAlt
                };

                Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan);
            }

            ObjectName objectName = new ObjectName
            {
                ObjectType = StoreNameType.Unit,
                ID         = entry.Key,
                Name       = creature.Name
            };

            Storage.ObjectNames.Add(objectName, packet.TimeSpan);
        }
Exemplo n.º 2
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            PacketQueryCreatureResponse response = packet.Holder.QueryCreatureResponse = new PacketQueryCreatureResponse();
            var entry = packet.ReadEntry("Entry");

            CreatureTemplateClassic creature = new CreatureTemplateClassic
            {
                Entry = (uint)entry.Key
            };

            response.Entry = (uint)entry.Key;

            Bit hasData = packet.ReadBit();

            response.HasData = hasData;
            if (!hasData)
            {
                return; // nothing to do
            }
            packet.ResetBitReader();
            uint titleLen      = packet.ReadBits(11);
            uint titleAltLen   = packet.ReadBits(11);
            uint cursorNameLen = packet.ReadBits(6);

            creature.Civilian     = packet.ReadBit("Civilian");
            creature.RacialLeader = response.Leader = packet.ReadBit("Leader");

            var stringLens = new int[4][];

            for (int 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)
                {
                    string name = packet.ReadDynamicString("Name", stringLens[i][0], i);
                    if (i == 0)
                    {
                        creature.Name = response.Name = name;
                    }
                }
                if (stringLens[i][1] > 1)
                {
                    string nameAlt = packet.ReadDynamicString("NameAlt", stringLens[i][1], i);
                    if (i == 0)
                    {
                        creature.FemaleName = response.NameAlt = nameAlt;
                    }
                }
            }
            creature.TypeFlags  = packet.ReadUInt32E <CreatureTypeFlag>("Type Flags");
            response.TypeFlags  = (uint?)creature.TypeFlags ?? 0;
            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.PetSpellDataID = packet.ReadUInt32("PetSpellDataId");
            response.Type           = (int?)creature.Type ?? 0;
            response.Family         = (int?)creature.Family ?? 0;
            response.Rank           = (int?)creature.Rank ?? 0;

            creature.KillCredits = new uint?[2];
            for (int i = 0; i < 2; ++i)
            {
                creature.KillCredits[i] = (uint)packet.ReadInt32("ProxyCreatureID", i);
                response.KillCredits.Add(creature.KillCredits[i] ?? 0);
            }

            uint displayIdCount = packet.ReadUInt32("DisplayIdCount");

            packet.ReadSingle("TotalProbability");

            uint?[] displayIds = new uint?[displayIdCount];
            for (uint i = 0; i < displayIdCount; ++i)
            {
                displayIds[i] = (uint)packet.ReadInt32("DisplayId", i);
                response.Models.Add(creature.DisplayId[i] ?? 0);
                packet.ReadSingle("DisplayScale", i);
                packet.ReadSingle("DisplayProbability", i);
            }

            creature.DisplayId = displayIds.Concat(new uint?[] { 0, 0, 0, 0 }).Take(4).ToArray();

            creature.HealthModifier = response.HpMod = packet.ReadSingle("HpMulti");
            creature.ManaModifier   = response.ManaMod = packet.ReadSingle("EnergyMulti");
            uint questItems = packet.ReadUInt32("QuestItems");

            creature.MovementID             = response.MovementId = (uint)packet.ReadInt32("CreatureMovementInfoID");
            creature.HealthScalingExpansion = packet.ReadInt32E <ClientType>("HealthScalingExpansion");
            response.HpScalingExp           = (uint?)creature.HealthScalingExpansion ?? 0;
            creature.RequiredExpansion      = packet.ReadInt32E <ClientType>("RequiredExpansion");
            response.Expansion  = (uint?)creature.RequiredExpansion ?? 0;
            creature.VignetteID = (uint)packet.ReadInt32("VignetteID");
            creature.UnitClass  = (uint)packet.ReadInt32E <Class>("UnitClass");

            if (titleLen > 1)
            {
                creature.SubName = response.Title = packet.ReadCString("Title");
            }

            if (titleAltLen > 1)
            {
                creature.TitleAlt = response.TitleAlt = packet.ReadCString("TitleAlt");
            }

            if (cursorNameLen > 1)
            {
                creature.IconName = response.IconName = packet.ReadCString("CursorName");
            }

            for (uint i = 0; i < questItems; ++i)
            {
                CreatureTemplateQuestItem questItem = new CreatureTemplateQuestItem
                {
                    CreatureEntry = (uint)entry.Key,
                    Idx           = i,
                    ItemId        = (uint)packet.ReadInt32 <ItemId>("QuestItem", i)
                };

                Storage.CreatureTemplateQuestItems.Add(questItem, packet.TimeSpan);
                response.QuestItems.Add(questItem.ItemId ?? 0);
            }

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

            Storage.CreatureTemplatesClassic.Add(creature, packet.TimeSpan);

            if (ClientLocale.PacketLocale != LocaleConstant.enUS)
            {
                CreatureTemplateLocale localesCreature = new CreatureTemplateLocale
                {
                    ID       = (uint)entry.Key,
                    Name     = creature.Name,
                    NameAlt  = creature.FemaleName,
                    Title    = creature.SubName,
                    TitleAlt = creature.TitleAlt
                };
                Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan);
            }

            ObjectName objectName = new ObjectName
            {
                ObjectType = StoreNameType.Unit,
                ID         = entry.Key,
                Name       = creature.Name
            };

            Storage.ObjectNames.Add(objectName, packet.TimeSpan);
        }
Exemplo n.º 3
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            PacketQueryCreatureResponse response = packet.Holder.QueryCreatureResponse = new PacketQueryCreatureResponse();
            var entry = packet.ReadEntry("Entry"); // +5

            CreatureTemplate creature = new CreatureTemplate
            {
                Entry = (uint)entry.Key
            };

            response.Entry = (uint)entry.Key;

            Bit hasData = packet.ReadBit(); //+16

            response.HasData = hasData;
            if (!hasData)
            {
                return; // nothing to do
            }
            creature.ModelIDs    = new uint?[4];
            creature.KillCredits = new uint?[2];

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

            var stringLens = new int[4][];

            for (int 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
            uint bits2C = packet.ReadBits(6);                        //+136

            if (bits1C > 1)
            {
                creature.TitleAlt = packet.ReadCString("TitleAlt");
            }

            creature.KillCredits[0]    = packet.ReadUInt32();                          //+27
            creature.ModelIDs[3]       = packet.ReadUInt32();                          //+32
            creature.ModelIDs[2]       = packet.ReadUInt32();                          //+31
            creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("Expansion"); //+24
            creature.Type           = packet.ReadInt32E <CreatureType>("Type");        //+12
            creature.HealthModifier = packet.ReadSingle("Modifier 1");                 //+15

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

            creature.Rank       = packet.ReadInt32E <CreatureRank>("Rank");   //+14
            creature.MovementID = packet.ReadUInt32("Movement ID");           //+23

            var name       = new string[4];
            var femaleName = new string[4];

            for (int 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.ModelIDs[0] = packet.ReadUInt32(); //+29
            creature.ModelIDs[1] = packet.ReadUInt32(); //+30

            if (bits2C > 1)
            {
                creature.IconName = packet.ReadCString("Icon Name"); //+100
            }
            //creature.QuestItems = new uint[qItemCount];
            for (int i = 0; i < qItemCount; ++i)
            {
                response.QuestItems.Add((uint)packet.ReadInt32 <ItemId>("Quest Item", i)); //+72
            }
            creature.KillCredits[1] = packet.ReadUInt32();                                 //+28
            creature.ManaModifier   = packet.ReadSingle("Modifier 2");                     //+16
            creature.Family         = packet.ReadInt32E <CreatureFamily>("Family");        //+13

            for (int i = 0; i < 4; ++i)
            {
                response.Models.Add(packet.AddValue("Display ID", creature.ModelIDs[i], i) ?? 0);
            }
            for (int i = 0; i < 2; ++i)
            {
                response.KillCredits.Add(packet.AddValue("Kill Credit", creature.KillCredits[i], i) ?? 0);
            }

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

            Storage.CreatureTemplates.Add(creature.Entry.Value, creature, packet.TimeSpan);

            if (ClientLocale.PacketLocale != LocaleConstant.enUS)
            {
                CreatureTemplateLocale localesCreature = new CreatureTemplateLocale
                {
                    ID       = (uint)entry.Key,
                    Name     = creature.Name,
                    NameAlt  = creature.FemaleName,
                    Title    = creature.SubName,
                    TitleAlt = creature.TitleAlt
                };

                Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan);
            }

            ObjectName objectName = new ObjectName
            {
                ObjectType = StoreNameType.Unit,
                ID         = entry.Key,
                Name       = creature.Name
            };

            Storage.ObjectNames.Add(objectName, packet.TimeSpan);

            response.Name       = creature.Name;
            response.NameAlt    = creature.FemaleName;
            response.Title      = creature.SubName;
            response.TitleAlt   = creature.TitleAlt;
            response.IconName   = creature.IconName;
            response.TypeFlags  = (uint?)creature.TypeFlags ?? 0;
            response.TypeFlags2 = creature.TypeFlags2 ?? 0;
            response.Type       = (int?)creature.Type ?? 0;
            response.Family     = (int?)creature.Family ?? 0;
            response.Rank       = (int?)creature.Rank ?? 0;
            response.HpMod      = creature.HealthModifier ?? 1.0f;
            response.ManaMod    = creature.ManaModifier ?? 1.0f;
            response.Leader     = creature.RacialLeader ?? false;
            response.Expansion  = (uint?)creature.RequiredExpansion ?? 0;
            response.MovementId = creature.MovementID ?? 0;
        }
Exemplo n.º 4
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            PacketQueryCreatureResponse response = packet.Holder.QueryCreatureResponse = new PacketQueryCreatureResponse();
            var entry = packet.ReadEntry("Entry");

            if (entry.Value)
            {
                return;
            }

            CreatureTemplate creature = new CreatureTemplate
            {
                Entry = (uint)entry.Key
            };

            response.Entry   = (uint)entry.Key;
            response.HasData = true;

            var name = new string[4];

            for (int i = 0; i < name.Length; i++)
            {
                name[i] = packet.ReadCString("Name", i);
            }
            creature.Name = response.Name = name[0];

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914))
            {
                var femaleName = new string[4];
                for (int i = 0; i < femaleName.Length; i++)
                {
                    femaleName[i] = packet.ReadCString("Female Name", i);
                }
                creature.FemaleName = response.NameAlt = femaleName[0];
            }

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

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V5_0_5_16048))
            {
                creature.TitleAlt = response.TitleAlt = packet.ReadCString("TitleAlt");
            }

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

            creature.TypeFlags = packet.ReadUInt32E <CreatureTypeFlag>("Type Flags");
            response.TypeFlags = (uint?)creature.TypeFlags ?? 0;

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914))                          // Might be earlier or later
            {
                creature.TypeFlags2 = response.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum
            }
            creature.Type   = packet.ReadInt32E <CreatureType>("Type");
            creature.Family = packet.ReadInt32E <CreatureFamily>("Family");
            creature.Rank   = packet.ReadInt32E <CreatureRank>("Rank");

            response.Type   = (int?)creature.Type ?? 0;
            response.Family = (int?)creature.Family ?? 0;
            response.Rank   = (int?)creature.Rank ?? 0;

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
            {
                creature.KillCredits = new uint?[2];
                for (int i = 0; i < 2; ++i)
                {
                    creature.KillCredits[i] = packet.ReadUInt32("Kill Credit", i);
                    response.KillCredits.Add(creature.KillCredits[i] ?? 0);
                }
            }
            else // Did they stop sending pet spell data after 3.1?
            {
                if (ClientVersion.RemovedInVersion(ClientType.WrathOfTheLichKing))
                {
                    packet.ReadInt32("Unk Int");
                }
                creature.PetSpellDataID = packet.ReadUInt32("Pet Spell Data Id");
            }

            creature.ModelIDs = new uint?[4];
            for (int i = 0; i < 4; i++)
            {
                creature.ModelIDs[i] = packet.ReadUInt32("Model ID", i);
                response.Models.Add(creature.ModelIDs[i] ?? 0);
            }

            creature.HealthModifier = response.HpMod = packet.ReadSingle("Modifier 1");
            creature.ManaModifier   = response.ManaMod = packet.ReadSingle("Modifier 2");

            creature.RacialLeader = response.Leader = packet.ReadBool("Racial Leader");

            int qItemCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192) ? 6 : 4;

            //TODO: Move to creature_questitem
            //creature.QuestItems = new uint[qItemCount];

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
            {
                for (int i = 0; i < qItemCount; i++)
                {
                    response.QuestItems.Add((uint)packet.ReadInt32 <ItemId>("Quest Item", i));
                }

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

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_1_13164))
            {
                creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("Expansion");
            }
            response.Expansion = (uint?)creature.RequiredExpansion ?? 0;

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

            Storage.CreatureTemplates.Add(creature.Entry.Value, creature, packet.TimeSpan);

            if (ClientLocale.PacketLocale != LocaleConstant.enUS)
            {
                CreatureTemplateLocale localesCreature = new CreatureTemplateLocale
                {
                    ID       = (uint)entry.Key,
                    Name     = creature.Name,
                    NameAlt  = creature.FemaleName,
                    Title    = creature.SubName,
                    TitleAlt = creature.TitleAlt
                };

                Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan);
            }

            ObjectName objectName = new ObjectName
            {
                ObjectType = StoreNameType.Unit,
                ID         = entry.Key,
                Name       = creature.Name
            };

            Storage.ObjectNames.Add(objectName, packet.TimeSpan);
        }
Exemplo n.º 5
0
        public static void HandleCreatureQueryResponse(Packet packet)
        {
            var entry = packet.ReadEntry("Entry");

            CreatureTemplate creature = new CreatureTemplate
            {
                Entry = (uint)entry.Key
            };

            Bit hasData = packet.ReadBit();

            if (!hasData)
            {
                return; // nothing to do
            }
            creature.ModelIDs    = new uint?[4];
            creature.KillCredits = new uint?[2];

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

            uint bits2C = packet.ReadBits(6);

            var stringLens = new int[4][];

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

            uint qItemCount = packet.ReadBits(22);
            uint bits24     = packet.ReadBits(11);
            uint bits1C     = packet.ReadBits(11);

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

            var name       = new string[4];
            var femaleName = new string[4];

            for (int 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];

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

            creature.KillCredits[1] = packet.ReadUInt32();
            creature.ModelIDs[2]    = packet.ReadUInt32();

            //TODO: move to creature_questitems
            //creature.QuestItems = new uint[qItemCount];
            for (int i = 0; i < qItemCount; ++i)
            {
                /*creature.QuestItems[i] = (uint)*/ packet.ReadInt32 <ItemId>("Quest Item", i);
            }

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

            if (bits2C > 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.KillCredits[0]    = packet.ReadUInt32();
            creature.Family            = packet.ReadInt32E <CreatureFamily>("Family");
            creature.MovementID        = packet.ReadUInt32("Movement ID");
            creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("Expansion");

            creature.ModelIDs[0] = packet.ReadUInt32();
            creature.ModelIDs[1] = packet.ReadUInt32();

            if (bits1C > 1)
            {
                creature.TitleAlt = packet.ReadCString("TitleAlt");
            }

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

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

            creature.ModelIDs[3] = packet.ReadUInt32();

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

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

            Storage.CreatureTemplates.Add(creature, packet.TimeSpan);

            if (ClientLocale.PacketLocale != LocaleConstant.enUS)
            {
                CreatureTemplateLocale localesCreature = new CreatureTemplateLocale
                {
                    ID       = (uint)entry.Key,
                    Name     = creature.Name,
                    NameAlt  = creature.FemaleName,
                    Title    = creature.SubName,
                    TitleAlt = creature.TitleAlt
                };

                Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan);
            }

            ObjectName objectName = new ObjectName
            {
                ObjectType = ObjectType.Unit,
                ID         = entry.Key,
                Name       = creature.Name
            };

            Storage.ObjectNames.Add(objectName, packet.TimeSpan);
        }