public static void HandleItemQueryResponse(Packet packet) { var item = new ItemTemplate(); var entry = packet.ReadEntry("Entry"); if (entry.Value) return; item.Class = packet.ReadEnum<ItemClass>("Class", TypeCode.Int32); item.SubClass = packet.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = packet.ReadInt32("Sound Override Subclass"); var name = new string[4]; for (var i = 0; i < 4; i++) name[i] = packet.ReadCString("Name", i); item.Name = name[0]; item.DisplayId = packet.ReadUInt32("Display ID"); item.Quality = packet.ReadEnum<ItemQuality>("Quality", TypeCode.Int32); item.Flags = packet.ReadEnum<ItemProtoFlags>("Flags", TypeCode.UInt32); if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192)) item.ExtraFlags = packet.ReadEnum<ItemFlagExtra>("Extra Flags", TypeCode.Int32); item.BuyPrice = packet.ReadUInt32("Buy Price"); item.SellPrice = packet.ReadUInt32("Sell Price"); item.InventoryType = packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.Int32); item.AllowedClasses = packet.ReadEnum<ClassMask>("Allowed Classes", TypeCode.Int32); item.AllowedRaces = packet.ReadEnum<RaceMask>("Allowed Races", TypeCode.Int32); item.ItemLevel = packet.ReadUInt32("Item Level"); item.RequiredLevel = packet.ReadUInt32("Required Level"); item.RequiredSkillId = packet.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = packet.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Required Spell"); item.RequiredHonorRank = packet.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = packet.ReadUInt32("Required City Rank"); item.RequiredRepFaction = packet.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = packet.ReadUInt32("Required Rep Value"); item.MaxCount = packet.ReadInt32("Max Count"); item.MaxStackSize = packet.ReadInt32("Max Stack Size"); item.ContainerSlots = packet.ReadUInt32("Container Slots"); item.StatsCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056) ? packet.ReadUInt32("Stats Count") : 10; item.StatTypes = new ItemModType[item.StatsCount]; item.StatValues = new int[item.StatsCount]; for (var i = 0; i < item.StatsCount; i++) { var type = packet.ReadEnum<ItemModType>("Stat Type", TypeCode.Int32, i); item.StatTypes[i] = type == ItemModType.None ? ItemModType.Mana : type; // TDB item.StatValues[i] = packet.ReadInt32("Stat Value", i); } if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056)) { item.ScalingStatDistribution = packet.ReadInt32("SSD ID"); item.ScalingStatValue = packet.ReadUInt32("SSD Value"); } var dmgCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767) ? 2 : 5; item.DamageMins = new float[dmgCount]; item.DamageMaxs = new float[dmgCount]; item.DamageTypes = new DamageType[dmgCount]; for (var i = 0; i < dmgCount; i++) { item.DamageMins[i] = packet.ReadSingle("Damage Min", i); item.DamageMaxs[i] = packet.ReadSingle("Damage Max", i); item.DamageTypes[i] = packet.ReadEnum<DamageType>("Damage Type", TypeCode.Int32, i); } item.Resistances = new DamageType[7]; for (var i = 0; i < 7; i++) item.Resistances[i] = packet.ReadEnum<DamageType>("Resistance", TypeCode.UInt32); item.Delay = packet.ReadUInt32("Delay"); item.AmmoType = packet.ReadEnum<AmmoType>("Ammo Type", TypeCode.Int32); item.RangedMod = packet.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int[5]; item.TriggeredSpellTypes = new ItemSpellTriggerType[5]; item.TriggeredSpellCharges = new int[5]; item.TriggeredSpellCooldowns = new int[5]; item.TriggeredSpellCategories = new uint[5]; item.TriggeredSpellCategoryCooldowns = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellIds[i] = packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Triggered Spell ID", i); item.TriggeredSpellTypes[i] = packet.ReadEnum<ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i); item.TriggeredSpellCharges[i] = packet.ReadInt32("Triggered Spell Charges", i); item.TriggeredSpellCooldowns[i] = packet.ReadInt32("Triggered Spell Cooldown", i); item.TriggeredSpellCategories[i] = packet.ReadUInt32("Triggered Spell Category", i); item.TriggeredSpellCategoryCooldowns[i] = packet.ReadInt32("Triggered Spell Category Cooldown", i); } item.Bonding = packet.ReadEnum<ItemBonding>("Bonding", TypeCode.Int32); item.Description = packet.ReadCString(); item.PageText = packet.ReadUInt32("Page Text"); item.Language = packet.ReadEnum<Language>("Language", TypeCode.Int32); item.PageMaterial = packet.ReadEnum<PageMaterial>("Page Material", TypeCode.Int32); item.StartQuestId = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Quest, "Start Quest"); item.LockId = packet.ReadUInt32("Lock ID"); item.Material = packet.ReadEnum<Material>("Material", TypeCode.Int32); item.SheathType = packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); item.RandomPropery = packet.ReadInt32("Random Property"); item.RandomSuffix = packet.ReadUInt32("Random Suffix"); item.Block = packet.ReadUInt32("Block"); item.ItemSet = packet.ReadUInt32("Item Set"); item.MaxDurability = packet.ReadUInt32("Max Durability"); item.AreaId = (uint) packet.ReadEntryWithName<UInt32>(StoreNameType.Area, "Area"); // In this single (?) case, map 0 means no map item.MapId = packet.ReadEntryWithName<UInt32>(StoreNameType.Map, "Map"); item.BagFamily = packet.ReadEnum<BagFamilyMask>("Bag Family", TypeCode.Int32); item.TotemCategory = packet.ReadEnum<TotemCategory>("Totem Category", TypeCode.Int32); item.ItemSocketColors = new ItemSocketColor[3]; item.SocketContent = new uint[3]; for (var i = 0; i < 3; i++) { item.ItemSocketColors[i] = packet.ReadEnum<ItemSocketColor>("Socket Color", TypeCode.Int32, i); item.SocketContent[i] = packet.ReadUInt32("Socket Item", i); } item.SocketBonus = packet.ReadInt32("Socket Bonus"); item.GemProperties = packet.ReadInt32("Gem Properties"); item.RequiredDisenchantSkill = packet.ReadInt32("Required Disenchant Skill"); item.ArmorDamageModifier = packet.ReadSingle("Armor Damage Modifier"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V2_4_2_8209)) item.Duration = packet.ReadUInt32("Duration"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056)) item.ItemLimitCategory = packet.ReadInt32("Limit Category"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767)) item.HolidayId = packet.ReadEnum<Holiday>("Holiday", TypeCode.Int32); packet.AddSniffData(StoreNameType.Item, entry.Key, "QUERY_RESPONSE"); Storage.ItemTemplates.Add((uint) entry.Key, item, packet.TimeSpan); }
public static void HandleDBReply434(Packet packet) { var itemId = (uint)packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); var type = packet.ReadUInt32("Type"); packet.ReadTime("Hotfix date"); var size = packet.ReadUInt32("Size"); if (size == 0) return; switch (type) { case 0x50238EC2: // Item { var item = new ItemTemplate(); packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); item.Class = packet.ReadEnum<ItemClass>("Class", TypeCode.Int32); item.SubClass = packet.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = packet.ReadInt32("Sound Override Subclass"); item.Material = packet.ReadEnum<Material>("Material", TypeCode.Int32); item.DisplayId = packet.ReadUInt32("Display ID"); item.InventoryType = packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.UInt32); item.SheathType = packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); Storage.ItemTemplates.Add(itemId, item, packet.TimeSpan); break; } case 0x919BE54E: // Item-sparse { var item = Storage.ItemTemplates.ContainsKey(itemId) ? Storage.ItemTemplates[itemId].Item1 : new ItemTemplate(); packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); item.Quality = packet.ReadEnum<ItemQuality>("Quality", TypeCode.Int32); item.Flags = packet.ReadEnum<ItemFlag>("Flags", TypeCode.Int32); item.ExtraFlags = packet.ReadEnum<ItemFlagExtra>("Extra Flags", TypeCode.Int32); item.Unk430_1 = packet.ReadSingle("Unk430_1"); item.Unk430_2 = packet.ReadSingle("Unk430_2"); item.BuyCount = packet.ReadUInt32("Buy count"); item.BuyPrice = packet.ReadUInt32("Buy Price"); item.SellPrice = packet.ReadUInt32("Sell Price"); item.InventoryType = packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.Int32); item.AllowedClasses = packet.ReadEnum<ClassMask>("Allowed Classes", TypeCode.Int32); item.AllowedRaces = packet.ReadEnum<RaceMask>("Allowed Races", TypeCode.Int32); item.ItemLevel = packet.ReadUInt32("Item Level"); item.RequiredLevel = packet.ReadUInt32("Required Level"); item.RequiredSkillId = packet.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = packet.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Required Spell"); item.RequiredHonorRank = packet.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = packet.ReadUInt32("Required City Rank"); item.RequiredRepFaction = packet.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = packet.ReadUInt32("Required Rep Value"); item.MaxCount = packet.ReadInt32("Max Count"); item.MaxStackSize = packet.ReadInt32("Max Stack Size"); item.ContainerSlots = packet.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType[10]; for (var i = 0; i < 10; i++) { var statType = packet.ReadEnum<ItemModType>("Stat Type", TypeCode.Int32, i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int[10]; for (var i = 0; i < 10; i++) item.StatValues[i] = packet.ReadInt32("Stat Value", i); item.StatUnk1 = new int[10]; for (var i = 0; i < 10; i++) item.StatUnk1[i] = packet.ReadInt32("Unk UInt32 1", i); item.StatUnk2 = new int[10]; for (var i = 0; i < 10; i++) item.StatUnk2[i] = packet.ReadInt32("Unk UInt32 2", i); item.ScalingStatDistribution = packet.ReadInt32("Scaling Stat Distribution"); item.DamageType = packet.ReadEnum<DamageType>("Damage Type", TypeCode.Int32); item.Delay = packet.ReadUInt32("Delay"); item.RangedMod = packet.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellIds[i] = packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Triggered Spell ID", i); item.TriggeredSpellTypes = new ItemSpellTriggerType[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellTypes[i] = packet.ReadEnum<ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i); item.TriggeredSpellCharges = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCharges[i] = packet.ReadInt32("Triggered Spell Charges", i); item.TriggeredSpellCooldowns = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCooldowns[i] = packet.ReadInt32("Triggered Spell Cooldown", i); item.TriggeredSpellCategories = new uint[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCategories[i] = packet.ReadUInt32("Triggered Spell Category", i); item.TriggeredSpellCategoryCooldowns = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCategoryCooldowns[i] = packet.ReadInt32("Triggered Spell Category Cooldown", i); item.Bonding = packet.ReadEnum<ItemBonding>("Bonding", TypeCode.Int32); if (packet.ReadUInt16() > 0) item.Name = packet.ReadCString("Name", 0); for (var i = 1; i < 4; ++i) if (packet.ReadUInt16() > 0) packet.ReadCString("Name", i); if (packet.ReadUInt16() > 0) item.Description = packet.ReadCString("Description"); item.PageText = packet.ReadUInt32("Page Text"); item.Language = packet.ReadEnum<Language>("Language", TypeCode.Int32); item.PageMaterial = packet.ReadEnum<PageMaterial>("Page Material", TypeCode.Int32); item.StartQuestId = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Quest, "Start Quest"); item.LockId = packet.ReadUInt32("Lock ID"); item.Material = packet.ReadEnum<Material>("Material", TypeCode.Int32); item.SheathType = packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); item.RandomPropery = packet.ReadInt32("Random Property"); item.RandomSuffix = packet.ReadUInt32("Random Suffix"); item.ItemSet = packet.ReadUInt32("Item Set"); item.AreaId = (uint)packet.ReadEntryWithName<UInt32>(StoreNameType.Area, "Area"); // In this single (?) case, map 0 means no map var map = packet.ReadInt32(); item.MapId = map; packet.WriteLine("Map ID: " + (map != 0 ? StoreGetters.GetName(StoreNameType.Map, map) : map + " (No map)")); item.BagFamily = packet.ReadEnum<BagFamilyMask>("Bag Family", TypeCode.Int32); item.TotemCategory = packet.ReadEnum<TotemCategory>("Totem Category", TypeCode.Int32); item.ItemSocketColors = new ItemSocketColor[3]; for (var i = 0; i < 3; i++) item.ItemSocketColors[i] = packet.ReadEnum<ItemSocketColor>("Socket Color", TypeCode.Int32, i); item.SocketContent = new uint[3]; for (var i = 0; i < 3; i++) item.SocketContent[i] = packet.ReadUInt32("Socket Item", i); item.SocketBonus = packet.ReadInt32("Socket Bonus"); item.GemProperties = packet.ReadInt32("Gem Properties"); item.ArmorDamageModifier = packet.ReadSingle("Armor Damage Modifier"); item.Duration = packet.ReadUInt32("Duration"); item.ItemLimitCategory = packet.ReadInt32("Limit Category"); item.HolidayId = packet.ReadEnum<Holiday>("Holiday", TypeCode.Int32); item.StatScalingFactor = packet.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionId = packet.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = packet.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(itemId, new ObjectName { ObjectType = ObjectType.Item, Name = item.Name }, packet.TimeSpan); break; } case 0x6D8A2694: // KeyChain { packet.ReadUInt32("Key Chain Id"); packet.ReadCString("Unk String"); //not sure what this is break; } } packet.AddSniffData(StoreNameType.Item, (int)itemId, "DB_REPLY"); }
public static void HandleDBReply(Packet packet) { packet.ReadTime("Hotfix date"); var type = packet.ReadUInt32E<DB2Hash>("DB2 File"); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); var entry = (uint)packet.ReadInt32("Entry"); if ((int)entry < 0) { packet.WriteLine("Row {0} has been removed.", -(int)entry); return; } switch (type) { case DB2Hash.BroadcastText: { BroadcastText broadcastText = new BroadcastText(); var id = db2File.ReadEntry("Id"); broadcastText.ID = (uint)id.Key; broadcastText.Language = db2File.ReadInt32("Language"); if (db2File.ReadUInt16() > 0) broadcastText.MaleText = db2File.ReadCString("Male Text"); if (db2File.ReadUInt16() > 0) broadcastText.FemaleText = db2File.ReadCString("Female Text"); broadcastText.EmoteID = new uint?[3]; broadcastText.EmoteDelay = new uint?[3]; for (int i = 0; i < 3; ++i) broadcastText.EmoteID[i] = (uint) db2File.ReadInt32("Emote ID", i); for (int i = 0; i < 3; ++i) broadcastText.EmoteDelay[i] = (uint) db2File.ReadInt32("Emote Delay", i); broadcastText.SoundId = db2File.ReadUInt32("Sound Id"); broadcastText.UnkEmoteId = db2File.ReadUInt32("Unk MoP 1"); // unk emote broadcastText.Type = db2File.ReadUInt32("Unk MoP 2"); // kind of type? Storage.BroadcastTexts.Add(broadcastText, packet.TimeSpan); packet.AddSniffData(StoreNameType.None, id.Key, "BROADCAST_TEXT"); break; } case DB2Hash.Creature: // New structure - 5.4.0 { db2File.ReadUInt32("Creature Id"); db2File.ReadUInt32("Item Id 1"); db2File.ReadUInt32("Item Id 2"); db2File.ReadUInt32("Item Id 3"); db2File.ReadUInt32("Mount"); for (int i = 0; i < 4; ++i) db2File.ReadInt32("Display Id", i); for (int i = 0; i < 4; ++i) db2File.ReadSingle("Display Id Probability", i); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Name"); if (db2File.ReadUInt16() > 0) db2File.ReadCString("SubName"); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Female SubName"); db2File.ReadUInt32("Rank"); db2File.ReadUInt32("Inhabit Type"); break; } case DB2Hash.CreatureDifficulty: { CreatureDifficulty creatureDifficulty = new CreatureDifficulty(); creatureDifficulty.ID = (uint)db2File.ReadEntry("Id").Key; creatureDifficulty.CreatureID = db2File.ReadUInt32("Creature Id"); creatureDifficulty.FactionID = db2File.ReadUInt32("Faction Template Id"); creatureDifficulty.Expansion = db2File.ReadInt32("Expansion"); creatureDifficulty.MinLevel = db2File.ReadInt32("Min Level"); creatureDifficulty.MaxLevel = db2File.ReadInt32("Max Level"); creatureDifficulty.Flags = new uint?[5]; for (int i = 0; i < 5; ++i) creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i); Storage.CreatureDifficulties.Add(creatureDifficulty, packet.TimeSpan); break; } case DB2Hash.GameObjects: { db2File.ReadEntry("GameObject Id"); db2File.ReadUInt32("Map"); db2File.ReadUInt32("Display Id"); db2File.ReadSingle("Position X"); db2File.ReadSingle("Position Y"); db2File.ReadSingle("Position Z"); db2File.ReadSingle("Rotation X"); db2File.ReadSingle("Rotation Y"); db2File.ReadSingle("Rotation Z"); db2File.ReadSingle("Rotation W"); db2File.ReadSingle("Size"); db2File.ReadInt32E<GameObjectType>("Type"); for (int i = 0; i < 4; i++) db2File.ReadInt32("Data", i); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Name"); break; } case DB2Hash.Item: { ItemTemplate key = new ItemTemplate {Entry = entry}; ItemTemplate item = Storage.ItemTemplates.ContainsKey(key) ? Storage.ItemTemplates[key].Item1 : new ItemTemplate(); db2File.ReadUInt32<ItemId>("Item Entry"); item.Class = db2File.ReadInt32E<ItemClass>("Class"); item.SubClass = db2File.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass"); item.Material = db2File.ReadInt32E<Material>("Material"); item.DisplayID = db2File.ReadUInt32("Display ID"); item.InventoryType = db2File.ReadUInt32E<InventoryType>("Inventory Type"); item.SheathType = db2File.ReadInt32E<SheathType>("Sheath Type"); Storage.ItemTemplates.Add(item, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int) entry, "DB_REPLY"); break; } case DB2Hash.ItemExtendedCost: { db2File.ReadUInt32("Item Extended Cost Entry"); db2File.ReadUInt32("Required Honor Points"); db2File.ReadUInt32("Required Arena Points"); db2File.ReadUInt32("Required Arena Slot"); for (var i = 0; i < 5; ++i) db2File.ReadUInt32("Required Item", i); for (var i = 0; i < 5; ++i) db2File.ReadUInt32("Required Item Count", i); db2File.ReadUInt32("Required Personal Arena Rating"); db2File.ReadUInt32("Item Purchase Group"); for (var i = 0; i < 5; ++i) db2File.ReadUInt32("Required Currency", i); for (var i = 0; i < 5; ++i) db2File.ReadUInt32("Required Currency Count", i); db2File.ReadUInt32("Required Faction Id"); db2File.ReadUInt32("Required Faction Standing"); db2File.ReadUInt32("Requirement Flags"); db2File.ReadUInt32("Required Guild Level"); db2File.ReadInt32<AchievementId>("Required Achievement"); break; } case DB2Hash.Item_sparse: { ItemTemplate key = new ItemTemplate {Entry = entry}; ItemTemplate item = Storage.ItemTemplates.ContainsKey(key) ? Storage.ItemTemplates[key].Item1 : new ItemTemplate(); db2File.ReadUInt32<ItemId>("Item Sparse Entry"); item.Quality = db2File.ReadInt32E<ItemQuality>("Quality"); item.Flags = db2File.ReadUInt32E<ItemProtoFlags>("Flags 1"); item.FlagsExtra = db2File.ReadInt32E<ItemFlagExtra>("Flags 2"); db2File.ReadUInt32("Flags 3"); item.Unk430_1 = db2File.ReadSingle("Unk430_1"); item.Unk430_2 = db2File.ReadSingle("Unk430_2"); item.BuyCount = db2File.ReadUInt32("Buy count"); item.BuyPrice = db2File.ReadUInt32("Buy Price"); item.SellPrice = db2File.ReadUInt32("Sell Price"); item.InventoryType = db2File.ReadInt32E<InventoryType>("Inventory Type"); item.AllowedClasses = db2File.ReadInt32E<ClassMask>("Allowed Classes"); item.AllowedRaces = db2File.ReadInt32E<RaceMask>("Allowed Races"); item.ItemLevel = db2File.ReadUInt32("Item Level"); item.RequiredLevel = db2File.ReadUInt32("Required Level"); item.RequiredSkillId = db2File.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint) db2File.ReadInt32<SpellId>("Required Spell"); item.RequiredHonorRank = db2File.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = db2File.ReadUInt32("Required City Rank"); item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = db2File.ReadUInt32("Required Rep Value"); item.MaxCount = db2File.ReadInt32("Max Count"); item.MaxStackSize = db2File.ReadInt32("Max Stack Size"); item.ContainerSlots = db2File.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType?[10]; for (int i = 0; i < 10; i++) { ItemModType statType = db2File.ReadInt32E<ItemModType>("Stat Type", i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int?[10]; for (int i = 0; i < 10; i++) item.StatValues[i] = db2File.ReadInt32("Stat Value", i); item.ScalingValue = new int?[10]; for (int i = 0; i < 10; i++) item.ScalingValue[i] = db2File.ReadInt32("Scaling Value", i); item.SocketCostRate = new int?[10]; for (int i = 0; i < 10; i++) item.SocketCostRate[i] = db2File.ReadInt32("Socket Cost Rate", i); item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution"); item.DamageType = db2File.ReadInt32E<DamageType>("Damage Type"); item.Delay = db2File.ReadUInt32("Delay"); item.RangedMod = db2File.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellIds[i] = db2File.ReadInt32<SpellId>("Triggered Spell ID", i); item.TriggeredSpellTypes = new ItemSpellTriggerType?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellTypes[i] = db2File.ReadInt32E<ItemSpellTriggerType>("Trigger Spell Type", i); item.TriggeredSpellCharges = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCharges[i] = db2File.ReadInt32("Triggered Spell Charges", i); item.TriggeredSpellCooldowns = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCooldowns[i] = db2File.ReadInt32("Triggered Spell Cooldown", i); item.TriggeredSpellCategories = new uint?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCategories[i] = db2File.ReadUInt32("Triggered Spell Category", i); item.TriggeredSpellCategoryCooldowns = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCategoryCooldowns[i] = db2File.ReadInt32( "Triggered Spell Category Cooldown", i); item.Bonding = db2File.ReadInt32E<ItemBonding>("Bonding"); if (db2File.ReadUInt16() > 0) item.Name = db2File.ReadCString("Name", 0); for (int i = 1; i < 4; ++i) if (db2File.ReadUInt16() > 0) db2File.ReadCString("Name", i); if (db2File.ReadUInt16() > 0) item.Description = db2File.ReadCString("Description"); item.PageText = db2File.ReadUInt32("Page Text"); item.Language = db2File.ReadInt32E<Language>("Language"); item.PageMaterial = db2File.ReadInt32E<PageMaterial>("Page Material"); item.StartQuestId = (uint) db2File.ReadInt32<QuestId>("Start Quest"); item.LockId = db2File.ReadUInt32("Lock ID"); item.Material = db2File.ReadInt32E<Material>("Material"); item.SheathType = db2File.ReadInt32E<SheathType>("Sheath Type"); item.RandomPropery = db2File.ReadInt32("Random Property"); item.RandomSuffix = db2File.ReadUInt32("Random Suffix"); item.ItemSet = db2File.ReadUInt32("Item Set"); item.AreaID = db2File.ReadUInt32<AreaId>("Area"); item.MapID = db2File.ReadInt32<MapId>("Map ID"); item.TotemCategory = db2File.ReadInt32E<TotemCategory>("Totem Category"); item.ItemSocketColors = new ItemSocketColor?[3]; for (int i = 0; i < 3; i++) item.ItemSocketColors[i] = db2File.ReadInt32E<ItemSocketColor>("Socket Color", i); item.SocketContent = new uint?[3]; for (int i = 0; i < 3; i++) item.SocketContent[i] = db2File.ReadUInt32("Socket Item", i); item.SocketBonus = db2File.ReadInt32("Socket Bonus"); item.GemProperties = db2File.ReadInt32("Gem Properties"); item.ArmorDamageModifier = db2File.ReadSingle("Armor Damage Modifier"); item.Duration = db2File.ReadUInt32("Duration"); item.ItemLimitCategory = db2File.ReadInt32("Limit Category"); item.HolidayID = db2File.ReadInt32E<Holiday>("Holiday"); item.StatScalingFactor = db2File.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionID = db2File.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(new ObjectName {ObjectType = ObjectType.Item, ID = (int)entry, Name = item.Name}, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int) entry, "DB_REPLY"); break; } case DB2Hash.KeyChain: { db2File.ReadUInt32("Key Chain Id"); db2File.ReadBytes("Key", 32); break; } case DB2Hash.SceneScript: // lua ftw! { db2File.ReadUInt32("Scene Script Id"); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Name"); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Script"); db2File.ReadUInt32("Previous Scene Script Part"); db2File.ReadUInt32("Next Scene Script Part"); break; } case DB2Hash.Vignette: { db2File.ReadUInt32("Vignette Entry"); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Name"); db2File.ReadUInt32("Icon"); db2File.ReadUInt32("Flag"); // not 100% sure (8 & 32 as values only) - todo verify with more data db2File.ReadSingle("Unk Float 1"); db2File.ReadSingle("Unk Float 2"); break; } case DB2Hash.WbAccessControlList: { db2File.ReadUInt32("Id"); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Address"); db2File.ReadUInt32("Unk MoP 1"); db2File.ReadUInt32("Unk MoP 2"); db2File.ReadUInt32("Unk MoP 3"); db2File.ReadUInt32("Unk MoP 4"); // flags? break; } default: { db2File.AddValue("Unknown DB2 file type", string.Format("{0} (0x{0:x})", type)); for (var i = 0;; ++i) { if (db2File.Length - 4 >= db2File.Position) { var blockVal = db2File.ReadUpdateField(); string key = "Block Value " + i; string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue(key, value); } else { var left = db2File.Length - db2File.Position; for (var j = 0; j < left; ++j) { string key = "Byte Value " + i; var value = db2File.ReadByte(); packet.AddValue(key, value); } break; } } break; } } db2File.ClosePacket(false); }
public static void HandleDBReply434(Packet packet) { var id = packet.ReadInt32("Entry"); var type = packet.ReadUInt32E<DB2Hash>("Hotfix DB2 File"); packet.ReadTime("Hotfix date"); var size = packet.ReadUInt32("Size"); if (size == 0) return; if (id < 0) return; var itemId = (uint)id; switch (type) { case DB2Hash.Item: { ItemTemplate key = new ItemTemplate {Entry = itemId}; ItemTemplate item = Storage.ItemTemplates.ContainsKey(key) ? Storage.ItemTemplates[key].Item1 : new ItemTemplate(); packet.ReadUInt32<ItemId>("Entry"); item.Class = packet.ReadInt32E<ItemClass>("Class"); item.SubClass = packet.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = packet.ReadInt32("Sound Override Subclass"); item.Material = packet.ReadInt32E<Material>("Material"); item.DisplayID = packet.ReadUInt32("Display ID"); item.InventoryType = packet.ReadUInt32E<InventoryType>("Inventory Type"); item.SheathType = packet.ReadInt32E<SheathType>("Sheath Type"); Storage.ItemTemplates.Add(item, packet.TimeSpan); break; } case DB2Hash.ItemSparse: { ItemTemplate key = new ItemTemplate { Entry = itemId }; ItemTemplate item = Storage.ItemTemplates.ContainsKey(key) ? Storage.ItemTemplates[key].Item1 : new ItemTemplate(); packet.ReadUInt32<ItemId>("Entry"); item.Quality = packet.ReadInt32E<ItemQuality>("Quality"); item.Flags = packet.ReadUInt32E<ItemProtoFlags>("Flags 1"); item.FlagsExtra = packet.ReadInt32E<ItemFlagExtra>("Flags 2"); item.Unk430_1 = packet.ReadSingle("Unk430_1"); item.Unk430_2 = packet.ReadSingle("Unk430_2"); item.BuyCount = packet.ReadUInt32("Buy count"); item.BuyPrice = packet.ReadUInt32("Buy Price"); item.SellPrice = packet.ReadUInt32("Sell Price"); item.InventoryType = packet.ReadInt32E<InventoryType>("Inventory Type"); item.AllowedClasses = packet.ReadInt32E<ClassMask>("Allowed Classes"); item.AllowedRaces = packet.ReadInt32E<RaceMask>("Allowed Races"); item.ItemLevel = packet.ReadUInt32("Item Level"); item.RequiredLevel = packet.ReadUInt32("Required Level"); item.RequiredSkillId = packet.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = packet.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)packet.ReadInt32<SpellId>("Required Spell"); item.RequiredHonorRank = packet.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = packet.ReadUInt32("Required City Rank"); item.RequiredRepFaction = packet.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = packet.ReadUInt32("Required Rep Value"); item.MaxCount = packet.ReadInt32("Max Count"); item.MaxStackSize = packet.ReadInt32("Max Stack Size"); item.ContainerSlots = packet.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType?[10]; for (int i = 0; i < 10; i++) { ItemModType statType = packet.ReadInt32E<ItemModType>("Stat Type", i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int?[10]; for (int i = 0; i < 10; i++) item.StatValues[i] = packet.ReadInt32("Stat Value", i); item.ScalingValue = new int?[10]; for (int i = 0; i < 10; i++) item.ScalingValue[i] = packet.ReadInt32("Scaling Value", i); item.SocketCostRate = new int?[10]; for (int i = 0; i < 10; i++) item.SocketCostRate[i] = packet.ReadInt32("Socket Cost Rate", i); item.ScalingStatDistribution = packet.ReadInt32("Scaling Stat Distribution"); item.DamageType = packet.ReadInt32E<DamageType>("Damage Type"); item.Delay = packet.ReadUInt32("Delay"); item.RangedMod = packet.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellIds[i] = packet.ReadInt32<SpellId>("Triggered Spell ID", i); item.TriggeredSpellTypes = new ItemSpellTriggerType?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellTypes[i] = packet.ReadInt32E<ItemSpellTriggerType>("Trigger Spell Type", i); item.TriggeredSpellCharges = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCharges[i] = packet.ReadInt32("Triggered Spell Charges", i); item.TriggeredSpellCooldowns = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCooldowns[i] = packet.ReadInt32("Triggered Spell Cooldown", i); item.TriggeredSpellCategories = new uint?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCategories[i] = packet.ReadUInt32("Triggered Spell Category", i); item.TriggeredSpellCategoryCooldowns = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCategoryCooldowns[i] = packet.ReadInt32("Triggered Spell Category Cooldown", i); item.Bonding = packet.ReadInt32E<ItemBonding>("Bonding"); if (packet.ReadUInt16() > 0) item.Name = packet.ReadCString("Name", 0); for (int i = 1; i < 4; ++i) if (packet.ReadUInt16() > 0) packet.ReadCString("Name", i); if (packet.ReadUInt16() > 0) item.Description = packet.ReadCString("Description"); item.PageText = packet.ReadUInt32("Page Text"); item.Language = packet.ReadInt32E<Language>("Language"); item.PageMaterial = packet.ReadInt32E<PageMaterial>("Page Material"); item.StartQuestId = (uint)packet.ReadInt32<QuestId>("Start Quest"); item.LockId = packet.ReadUInt32("Lock ID"); item.Material = packet.ReadInt32E<Material>("Material"); item.SheathType = packet.ReadInt32E<SheathType>("Sheath Type"); item.RandomPropery = packet.ReadInt32("Random Property"); item.RandomSuffix = packet.ReadUInt32("Random Suffix"); item.ItemSet = packet.ReadUInt32("Item Set"); item.AreaID = packet.ReadUInt32<AreaId>("Area"); item.MapID = packet.ReadInt32("Map ID"); item.BagFamily = packet.ReadInt32E<BagFamilyMask>("Bag Family"); item.TotemCategory = packet.ReadInt32E<TotemCategory>("Totem Category"); item.ItemSocketColors = new ItemSocketColor?[3]; for (int i = 0; i < 3; i++) item.ItemSocketColors[i] = packet.ReadInt32E<ItemSocketColor>("Socket Color", i); item.SocketContent = new uint?[3]; for (int i = 0; i < 3; i++) item.SocketContent[i] = packet.ReadUInt32("Socket Item", i); item.SocketBonus = packet.ReadInt32("Socket Bonus"); item.GemProperties = packet.ReadInt32("Gem Properties"); item.ArmorDamageModifier = packet.ReadSingle("Armor Damage Modifier"); item.Duration = packet.ReadUInt32("Duration"); item.ItemLimitCategory = packet.ReadInt32("Limit Category"); item.HolidayID = packet.ReadInt32E<Holiday>("Holiday"); item.StatScalingFactor = packet.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionID = packet.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = packet.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(new ObjectName { ObjectType = ObjectType.Item, ID = (int)itemId, Name = item.Name }, packet.TimeSpan); break; } case DB2Hash.KeyChain: { packet.ReadUInt32("Key Chain Id"); packet.ReadBytes("Key", 32); break; } } packet.AddSniffData(StoreNameType.Item, (int)itemId, "DB_REPLY"); }