protected virtual T?Process(PacketBase basePacket, PacketQueryCreatureResponse packet) => default;
protected override bool Process(PacketBase basePacket, PacketQueryCreatureResponse packet) { return(false); }
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); }
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); }
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; }
public static void HandleCreatureQueryResponse(Packet packet) { PacketQueryCreatureResponse response = packet.Holder.QueryCreatureResponse = new PacketQueryCreatureResponse(); var entry = packet.ReadEntry("Entry"); response.Entry = (uint)entry.Key; var hasData = packet.ReadBit(); response.HasData = hasData; if (!hasData) { return; // nothing to do } var creature = new CreatureTemplate { Entry = (uint)entry.Key }; var lenS3 = packet.ReadBits(11); 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 lenS4 = packet.ReadBits(6); var lenS5 = packet.ReadBits(11); var qItemCount = packet.ReadBits(22); packet.ResetBitReader(); var name = new string[8]; for (var i = 0; i < 4; ++i) { if (stringLens[i][0] > 1) { packet.ReadCString("Female Name", i); } if (stringLens[i][1] > 1) { name[i] = packet.ReadCString("Name", i); } } creature.Name = name[0]; creature.HealthModifier = packet.ReadSingle("HealthModifier"); if (lenS3 > 1) { creature.SubName = packet.ReadCString("Sub Name"); } creature.Rank = packet.ReadInt32E <CreatureRank>("Rank"); //TODO: move to creature_questitems //creature.QuestItems = new uint[qItemCount]; for (var i = 0; i < qItemCount; ++i) { /*creature.QuestItems[i] = (uint)*/ response.QuestItems.Add((uint)packet.ReadInt32 <ItemId>("Quest Item", i)); } creature.Type = packet.ReadInt32E <CreatureType>("Type"); creature.KillCredits = new uint?[2]; for (var i = 0; i < 2; ++i) { creature.KillCredits[i] = packet.ReadUInt32("Kill Credit", i); response.KillCredits.Add(creature.KillCredits[i] ?? 0); } creature.Family = packet.ReadInt32E <CreatureFamily>("Family"); if (lenS4 > 1) { creature.IconName = packet.ReadCString("Icon Name"); } creature.ModelIDs = new uint?[4]; creature.ModelIDs[1] = packet.ReadUInt32("CreatureDisplayID", 1); creature.ModelIDs[0] = packet.ReadUInt32("CreatureDisplayID", 0); creature.MovementID = packet.ReadUInt32("MovementID"); creature.ModelIDs[3] = packet.ReadUInt32("CreatureDisplayID", 3); creature.TypeFlags = packet.ReadUInt32E <CreatureTypeFlag>("Type Flags"); creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum if (lenS5 > 1) { packet.ReadCString("string5"); } creature.ModelIDs[2] = packet.ReadUInt32("CreatureDisplayID", 2); creature.ManaModifier = packet.ReadSingle("ManaModifier"); creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("Expansion"); packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE"); Storage.CreatureTemplates.Add(creature.Entry.Value, creature, packet.TimeSpan); var objectName = new ObjectName { ObjectType = StoreNameType.Unit, ID = entry.Key, Name = creature.Name }; Storage.ObjectNames.Add(objectName, packet.TimeSpan); for (int i = 0; i < 4; ++i) { response.Models.Add(creature.ModelIDs[i] ?? 0); } 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; }