diff options
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 382 |
1 files changed, 19 insertions, 363 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 4da985c7bb6..bbd11c830c9 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2273,106 +2273,6 @@ void ObjectMgr::LoadItemLocales() TC_LOG_INFO("server.loading", ">> Loaded %u Item locale strings in %u ms", uint32(_itemLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } -void FillItemDamageFields(float* minDamage, float* maxDamage, float* dps, uint32 itemLevel, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32 delay, float statScalingFactor, uint32 inventoryType, uint32 flags2) -{ - *minDamage = *maxDamage = *dps = 0.0f; - if (itemClass != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT) - return; - - DBCStorage<ItemDamageEntry>* store = NULL; - // get the right store here - if (inventoryType > 0xD + 13) - return; - - switch (inventoryType) - { - case INVTYPE_AMMO: - store = &sItemDamageAmmoStore; - break; - case INVTYPE_2HWEAPON: - if (flags2 & ITEM_FLAGS_EXTRA_CASTER_WEAPON) - store = &sItemDamageTwoHandCasterStore; - else - store = &sItemDamageTwoHandStore; - break; - case INVTYPE_RANGED: - case INVTYPE_THROWN: - case INVTYPE_RANGEDRIGHT: - switch (itemSubClass) - { - case ITEM_SUBCLASS_WEAPON_WAND: - store = &sItemDamageWandStore; - break; - case ITEM_SUBCLASS_WEAPON_THROWN: - store = &sItemDamageThrownStore; - break; - case ITEM_SUBCLASS_WEAPON_BOW: - case ITEM_SUBCLASS_WEAPON_GUN: - case ITEM_SUBCLASS_WEAPON_CROSSBOW: - store = &sItemDamageRangedStore; - break; - default: - return; - } - break; - case INVTYPE_WEAPON: - case INVTYPE_WEAPONMAINHAND: - case INVTYPE_WEAPONOFFHAND: - if (flags2 & ITEM_FLAGS_EXTRA_CASTER_WEAPON) - store = &sItemDamageOneHandCasterStore; - else - store = &sItemDamageOneHandStore; - break; - default: - return; - } - - ASSERT(store); - - ItemDamageEntry const* damageInfo = store->LookupEntry(itemLevel); - if (!damageInfo) - return; - - *dps = damageInfo->DPS[quality]; - float avgDamage = *dps * delay * 0.001f; - *minDamage = (statScalingFactor * -0.5f + 1.0f) * avgDamage; - *maxDamage = floor(float(avgDamage* (statScalingFactor * 0.5f + 1.0f) + 0.5f)); -} - -uint32 FillItemArmor(uint32 itemlevel, uint32 itemClass, uint32 itemSubclass, uint32 quality, uint32 inventoryType) -{ - if (quality > ITEM_QUALITY_ARTIFACT) - return 0; - - // all items but shields - if (itemClass != ITEM_CLASS_ARMOR || itemSubclass != ITEM_SUBCLASS_ARMOR_SHIELD) - { - ItemArmorQualityEntry const* armorQuality = sItemArmorQualityStore.LookupEntry(itemlevel); - ItemArmorTotalEntry const* armorTotal = sItemArmorTotalStore.LookupEntry(itemlevel); - if (!armorQuality || !armorTotal) - return 0; - - if (inventoryType == INVTYPE_ROBE) - inventoryType = INVTYPE_CHEST; - - ArmorLocationEntry const* location = sArmorLocationStore.LookupEntry(inventoryType); - if (!location) - return 0; - - if (itemSubclass < ITEM_SUBCLASS_ARMOR_CLOTH || itemSubclass > ITEM_SUBCLASS_ARMOR_PLATE) - return 0; - - return uint32(armorQuality->QualityMod[quality] * armorTotal->Value[itemSubclass - 1] * location->Modifier[itemSubclass - 1] + 0.5f); - } - - // shields - ItemArmorShieldEntry const* shield = sItemArmorShieldStore.LookupEntry(itemlevel); - if (!shield) - return 0; - - return uint32(shield->Quality[quality] + 0.5f); -} - uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventoryType, uint32 quality, uint32 itemLevel) { if (itemClass != ITEM_CLASS_ARMOR && itemClass != ITEM_CLASS_WEAPON) @@ -2460,12 +2360,12 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, { *disenchantID = 0; *(int32*)requiredDisenchantSkill = -1; - if ((itemTemplate.Flags[0] & (ITEM_PROTO_FLAG_CONJURED | ITEM_PROTO_FLAG_UNK6)) || - itemTemplate.Bonding == BIND_QUEST_ITEM || itemTemplate.Area || itemTemplate.Map || - itemTemplate.Stackable > 1 || - itemTemplate.Quality < ITEM_QUALITY_UNCOMMON || itemTemplate.Quality > ITEM_QUALITY_EPIC || - !(itemTemplate.Class == ITEM_CLASS_ARMOR || itemTemplate.Class == ITEM_CLASS_WEAPON) || - !(Item::GetSpecialPrice(&itemTemplate) || sItemCurrencyCostStore.LookupEntry(itemTemplate.ItemId))) + if ((itemTemplate.GetFlags() & (ITEM_PROTO_FLAG_CONJURED | ITEM_PROTO_FLAG_UNK6)) || + itemTemplate.GetBonding() == BIND_QUEST_ITEM || itemTemplate.GetArea() || itemTemplate.GetMap() || + itemTemplate.GetMaxStackSize() > 1 || + itemTemplate.GetQuality() < ITEM_QUALITY_UNCOMMON || itemTemplate.GetQuality() > ITEM_QUALITY_EPIC || + !(itemTemplate.GetClass() == ITEM_CLASS_ARMOR || itemTemplate.GetClass() == ITEM_CLASS_WEAPON) || + !(Item::GetSpecialPrice(&itemTemplate) || sItemCurrencyCostStore.LookupEntry(itemTemplate.GetId()))) return; for (uint32 i = 0; i < sItemDisenchantLootStore.GetNumRows(); ++i) @@ -2474,19 +2374,19 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, if (!disenchant) continue; - if (disenchant->ItemClass == itemTemplate.Class && - disenchant->ItemQuality == itemTemplate.Quality && - disenchant->MinItemLevel <= itemTemplate.ItemLevel && - disenchant->MaxItemLevel >= itemTemplate.ItemLevel) + if (disenchant->ItemClass == itemTemplate.GetClass() && + disenchant->ItemQuality == itemTemplate.GetQuality() && + disenchant->MinItemLevel <= itemTemplate.GetBaseItemLevel() && + disenchant->MaxItemLevel >= itemTemplate.GetBaseItemLevel()) { if (disenchant->ID == 60 || disenchant->ID == 61) // epic item disenchant ilvl range 66-99 (classic) { - if (itemTemplate.RequiredLevel > 60 || itemTemplate.RequiredSkillRank > 300) + if (itemTemplate.GetRequiredLevel() > 60 || itemTemplate.GetRequiredSkillRank() > 300) continue; // skip to epic item disenchant ilvl range 90-199 (TBC) } else if (disenchant->ID == 66 || disenchant->ID == 67) // epic item disenchant ilvl range 90-199 (TBC) { - if (itemTemplate.RequiredLevel <= 60 || (itemTemplate.RequiredSkill && itemTemplate.RequiredSkillRank <= 300)) + if (itemTemplate.GetRequiredLevel() <= 60 || (itemTemplate.GetRequiredSkill() && itemTemplate.GetRequiredSkillRank() <= 300)) continue; } @@ -2501,7 +2401,6 @@ void ObjectMgr::LoadItemTemplates() { uint32 oldMSTime = getMSTime(); uint32 sparseCount = 0; - uint32 dbCount = 0; for (uint32 itemId = 0; itemId < sItemSparseStore.GetNumRows(); ++itemId) { @@ -2512,97 +2411,17 @@ void ObjectMgr::LoadItemTemplates() ItemTemplate& itemTemplate = _itemTemplateStore[itemId]; - itemTemplate.ItemId = itemId; - itemTemplate.Class = db2Data->Class; - itemTemplate.SubClass = db2Data->SubClass; - itemTemplate.SoundOverrideSubclass = db2Data->SoundOverrideSubclass; - itemTemplate.Name1 = sparse->Name->Str[sWorld->GetDefaultDbcLocale()]; - itemTemplate.DisplayInfoID = GetItemDisplayID(db2Data->FileDataID); - itemTemplate.FileDataID = db2Data->FileDataID; - itemTemplate.GroupSoundsID = db2Data->GroupSoundsID; - itemTemplate.Quality = sparse->Quality; - memcpy(itemTemplate.Flags, sparse->Flags, sizeof(itemTemplate.Flags)); - itemTemplate.Unk1 = sparse->Unk1; - itemTemplate.Unk2 = sparse->Unk2; - itemTemplate.BuyCount = std::max(sparse->BuyCount, 1u); - itemTemplate.BuyPrice = sparse->BuyPrice; - itemTemplate.SellPrice = sparse->SellPrice; - itemTemplate.InventoryType = db2Data->InventoryType; - itemTemplate.AllowableClass = sparse->AllowableClass; - itemTemplate.AllowableRace = sparse->AllowableRace; - itemTemplate.ItemLevel = sparse->ItemLevel; - itemTemplate.RequiredLevel = sparse->RequiredLevel; - itemTemplate.RequiredSkill = sparse->RequiredSkill; - itemTemplate.RequiredSkillRank = sparse->RequiredSkillRank; - itemTemplate.RequiredSpell = sparse->RequiredSpell; - itemTemplate.RequiredHonorRank = sparse->RequiredHonorRank; - itemTemplate.RequiredCityRank = sparse->RequiredCityRank; - itemTemplate.RequiredReputationFaction = sparse->RequiredReputationFaction; - itemTemplate.RequiredReputationRank = sparse->RequiredReputationRank; - itemTemplate.MaxCount = sparse->MaxCount; - itemTemplate.Stackable = sparse->Stackable; - itemTemplate.ContainerSlots = sparse->ContainerSlots; - for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - { - itemTemplate.ItemStat[i].ItemStatType = sparse->ItemStatType[i]; - itemTemplate.ItemStat[i].ItemStatValue = sparse->ItemStatValue[i]; - itemTemplate.ItemStat[i].ItemStatUnk1 = sparse->ItemStatUnk1[i]; - itemTemplate.ItemStat[i].ItemStatUnk2 = sparse->ItemStatUnk2[i]; - } - - itemTemplate.ScalingStatDistribution = sparse->ScalingStatDistribution; - - // cache item damage - FillItemDamageFields(&itemTemplate.DamageMin, &itemTemplate.DamageMax, &itemTemplate.DPS, sparse->ItemLevel, - db2Data->Class, db2Data->SubClass, sparse->Quality, sparse->Delay, sparse->StatScalingFactor, - sparse->InventoryType, sparse->Flags[1]); - - itemTemplate.DamageType = sparse->DamageType; - itemTemplate.Armor = FillItemArmor(sparse->ItemLevel, db2Data->Class, db2Data->SubClass, sparse->Quality, sparse->InventoryType); - itemTemplate.Delay = sparse->Delay; - itemTemplate.RangedModRange = sparse->RangedModRange; + itemTemplate.BasicData = db2Data; + itemTemplate.ExtendedData = sparse; - itemTemplate.SpellPPMRate = 0.0f; - itemTemplate.Bonding = sparse->Bonding; - itemTemplate.Description = sparse->Description->Str[sWorld->GetDefaultDbcLocale()]; - itemTemplate.PageText = sparse->PageText; - itemTemplate.LanguageID = sparse->LanguageID; - itemTemplate.PageMaterial = sparse->PageMaterial; - itemTemplate.StartQuest = sparse->StartQuest; - itemTemplate.LockID = sparse->LockID; - itemTemplate.Material = sparse->Material; - itemTemplate.Sheath = sparse->Sheath; - itemTemplate.RandomProperty = sparse->RandomProperty; - itemTemplate.RandomSuffix = sparse->RandomSuffix; - itemTemplate.ItemSet = sparse->ItemSet; itemTemplate.MaxDurability = FillMaxDurability(db2Data->Class, db2Data->SubClass, sparse->InventoryType, sparse->Quality, sparse->ItemLevel); - itemTemplate.Area = sparse->Area; - itemTemplate.Map = sparse->Map; - itemTemplate.BagFamily = sparse->BagFamily; - itemTemplate.TotemCategory = sparse->TotemCategory; - for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i) - { - itemTemplate.Socket[i].Color = sparse->SocketColor[i]; - // TODO: 6.x update/remove this - itemTemplate.Socket[i].Content = 0; - } - - itemTemplate.socketBonus = sparse->SocketBonus; - itemTemplate.GemProperties = sparse->GemProperties; - FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, itemTemplate); - - itemTemplate.ArmorDamageModifier = sparse->ArmorDamageModifier; - itemTemplate.Duration = sparse->Duration; - itemTemplate.ItemLimitCategory = sparse->ItemLimitCategory; - itemTemplate.HolidayId = sparse->HolidayID; - itemTemplate.StatScalingFactor = sparse->StatScalingFactor; - itemTemplate.CurrencySubstitutionId = sparse->CurrencySubstitutionID; - itemTemplate.CurrencySubstitutionCount = sparse->CurrencySubstitutionCount; - itemTemplate.ItemNameDescriptionID = sparse->ItemNameDescriptionID; itemTemplate.ScriptId = 0; + FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, itemTemplate); itemTemplate.FoodType = 0; itemTemplate.MinMoneyLoot = 0; itemTemplate.MaxMoneyLoot = 0; + itemTemplate.FlagsCu = 0; + itemTemplate.SpellPPMRate = 0.0f; ++sparseCount; } @@ -2617,8 +2436,6 @@ void ObjectMgr::LoadItemTemplates() if (itemItr == _itemTemplateStore.end()) continue; - ItemTemplate& itemTemplate = itemItr->second; - ItemEffect effect; effect.SpellID = effectEntry->SpellID; effect.Trigger = effectEntry->Trigger; @@ -2626,168 +2443,7 @@ void ObjectMgr::LoadItemTemplates() effect.Cooldown = effectEntry->Cooldown; effect.Category = effectEntry->Category; effect.CategoryCooldown = effectEntry->CategoryCooldown; - itemTemplate.Effects.push_back(effect); - } - - // Load missing items from item_template AND overwrite data from Item-sparse.db2 (item_template is supposed to contain Item-sparse.adb data) - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - QueryResult result = WorldDatabase.Query("SELECT entry, Class, SubClass, SoundOverrideSubclass, Name, DisplayId, Quality, Flags, FlagsExtra, Unk430_1, Unk430_2, BuyCount, BuyPrice, SellPrice, " - // 14 15 16 17 18 19 20 21 - "InventoryType, AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredSpell, " - // 22 23 24 25 26 27 28 - "RequiredHonorRank, RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, MaxCount, Stackable, ContainerSlots, " - // 29 30 31 32 33 34 35 36 - "stat_type1, stat_value1, stat_unk1_1, stat_unk2_1, stat_type2, stat_value2, stat_unk1_2, stat_unk2_2, " - // 37 38 39 40 41 42 43 44 - "stat_type3, stat_value3, stat_unk1_3, stat_unk2_3, stat_type4, stat_value4, stat_unk1_4, stat_unk2_4, " - // 45 46 47 48 49 50 51 52 - "stat_type5, stat_value5, stat_unk1_5, stat_unk2_5, stat_type6, stat_value6, stat_unk1_6, stat_unk2_6, " - // 53 54 55 56 57 58 59 60 - "stat_type7, stat_value7, stat_unk1_7, stat_unk2_7, stat_type8, stat_value8, stat_unk1_8, stat_unk2_8, " - // 61 62 63 64 65 66 67 68 - "stat_type9, stat_value9, stat_unk1_9, stat_unk2_9, stat_type10, stat_value10, stat_unk1_10, stat_unk2_10, " - // 69 70 71 72 - "ScalingStatDistribution, DamageType, Delay, RangedModRange, " - // 73 74 75 76 77 78 - "spellid_1, spelltrigger_1, spellcharges_1, spellcooldown_1, spellcategory_1, spellcategorycooldown_1, " - // 79 80 81 82 83 84 - "spellid_2, spelltrigger_2, spellcharges_2, spellcooldown_2, spellcategory_2, spellcategorycooldown_2, " - // 85 86 87 88 89 90 - "spellid_3, spelltrigger_3, spellcharges_3, spellcooldown_3, spellcategory_3, spellcategorycooldown_3, " - // 91 92 93 94 95 96 - "spellid_4, spelltrigger_4, spellcharges_4, spellcooldown_4, spellcategory_4, spellcategorycooldown_4, " - // 97 98 99 100 101 102 - "spellid_5, spelltrigger_5, spellcharges_5, spellcooldown_5, spellcategory_5, spellcategorycooldown_5, " - // 103 104 105 106 107 108 109 110 - "Bonding, Description, PageText, LanguageID, PageMaterial, StartQuest, LockID, Material, " - // 111 112 113 114 115 116 117 118 - "Sheath, RandomProperty, RandomSuffix, ItemSet, Area, Map, BagFamily, TotemCategory, " - // 119 120 121 122 123 124 125 - "SocketColor_1, SocketContent_1, SocketColor_2, SocketContent_2, SocketColor_3, SocketContent_3, SocketBonus, " - // 126 127 128 129 130 131 - "GemProperties, ArmorDamageModifier, Duration, ItemLimitCategory, HolidayId, StatScalingFactor, " - // 132 133 - "CurrencySubstitutionId, CurrencySubstitutionCount " - "FROM item_template"); - - if (result) - { - do - { - Field* fields = result->Fetch(); - uint32 itemId = fields[0].GetUInt32(); - if (_itemTemplateStore.find(itemId) != _itemTemplateStore.end()) - --sparseCount; - - ItemTemplate& itemTemplate = _itemTemplateStore[itemId]; - - itemTemplate.ItemId = itemId; - itemTemplate.Class = uint32(fields[1].GetUInt8()); - itemTemplate.SubClass = uint32(fields[2].GetUInt8()); - itemTemplate.SoundOverrideSubclass = fields[3].GetInt8(); - itemTemplate.Name1 = fields[4].GetString(); - itemTemplate.DisplayInfoID = fields[5].GetUInt32(); - itemTemplate.Quality = uint32(fields[6].GetUInt8()); - itemTemplate.Flags[0] = fields[7].GetUInt32(); - itemTemplate.Flags[1] = fields[8].GetUInt32(); - itemTemplate.Unk1 = fields[9].GetFloat(); - itemTemplate.Unk2 = fields[10].GetFloat(); - itemTemplate.BuyCount = uint32(fields[11].GetUInt8()); - itemTemplate.BuyPrice = int32(fields[12].GetInt64()); - itemTemplate.SellPrice = fields[13].GetUInt32(); - - itemTemplate.InventoryType = uint32(fields[14].GetUInt8()); - itemTemplate.AllowableClass = fields[15].GetInt32(); - itemTemplate.AllowableRace = fields[16].GetInt32(); - itemTemplate.ItemLevel = uint32(fields[17].GetUInt16()); - itemTemplate.RequiredLevel = uint32(fields[18].GetUInt8()); - itemTemplate.RequiredSkill = uint32(fields[19].GetUInt16()); - itemTemplate.RequiredSkillRank = uint32(fields[20].GetUInt16()); - itemTemplate.RequiredSpell = fields[21].GetUInt32(); - itemTemplate.RequiredHonorRank = fields[22].GetUInt32(); - itemTemplate.RequiredCityRank = fields[23].GetUInt32(); - itemTemplate.RequiredReputationFaction = uint32(fields[24].GetUInt16()); - itemTemplate.RequiredReputationRank = uint32(fields[25].GetUInt16()); - itemTemplate.MaxCount = fields[26].GetInt32(); - itemTemplate.Stackable = fields[27].GetInt32(); - itemTemplate.ContainerSlots = uint32(fields[28].GetUInt8()); - for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - { - itemTemplate.ItemStat[i].ItemStatType = uint32(fields[29 + i * 4 + 0].GetUInt8()); - itemTemplate.ItemStat[i].ItemStatValue = int32(fields[29 + i * 4 + 1].GetInt16()); - itemTemplate.ItemStat[i].ItemStatUnk1 = fields[29 + i * 4 + 2].GetInt32(); - itemTemplate.ItemStat[i].ItemStatUnk2 = fields[29 + i * 4 + 3].GetInt32(); - } - - itemTemplate.ScalingStatDistribution = uint32(fields[69].GetUInt16()); - - // cache item damage - FillItemDamageFields(&itemTemplate.DamageMin, &itemTemplate.DamageMax, &itemTemplate.DPS, itemTemplate.ItemLevel, - itemTemplate.Class, itemTemplate.SubClass, itemTemplate.Quality, fields[71].GetUInt16(), - fields[131].GetFloat(), itemTemplate.InventoryType, itemTemplate.Flags[1]); - - itemTemplate.DamageType = fields[70].GetUInt8(); - itemTemplate.Armor = FillItemArmor(itemTemplate.ItemLevel, itemTemplate.Class, - itemTemplate.SubClass, itemTemplate.Quality, - itemTemplate.InventoryType); - - itemTemplate.Delay = fields[71].GetUInt16(); - itemTemplate.RangedModRange = fields[72].GetFloat(); - // TODO: 6.x move this to new itemeffect table (probably itemeffect_dbc?) - itemTemplate.Effects.resize(3); - for (uint32 i = 0; i < 3; ++i) - { - itemTemplate.Effects[i].SpellID = fields[73 + 6 * i + 0].GetInt32(); - itemTemplate.Effects[i].Trigger = uint32(fields[73 + 6 * i + 1].GetUInt8()); - itemTemplate.Effects[i].Charges = int32(fields[73 + 6 * i + 2].GetInt16()); - itemTemplate.Effects[i].Cooldown = fields[73 + 6 * i + 3].GetInt32(); - itemTemplate.Effects[i].Category = uint32(fields[73 + 6 * i + 4].GetUInt16()); - itemTemplate.Effects[i].CategoryCooldown = fields[73 + 6 * i + 5].GetInt32(); - } - - itemTemplate.SpellPPMRate = 0.0f; - itemTemplate.Bonding = uint32(fields[103].GetUInt8()); - itemTemplate.Description = fields[104].GetString(); - itemTemplate.PageText = fields[105].GetUInt32(); - itemTemplate.LanguageID = uint32(fields[106].GetUInt8()); - itemTemplate.PageMaterial = uint32(fields[107].GetUInt8()); - itemTemplate.StartQuest = fields[108].GetUInt32(); - itemTemplate.LockID = fields[109].GetUInt32(); - itemTemplate.Material = int32(fields[110].GetInt8()); - itemTemplate.Sheath = uint32(fields[111].GetUInt8()); - itemTemplate.RandomProperty = fields[112].GetUInt32(); - itemTemplate.RandomSuffix = fields[113].GetInt32(); - itemTemplate.ItemSet = fields[114].GetUInt32(); - itemTemplate.MaxDurability = FillMaxDurability(itemTemplate.Class, itemTemplate.SubClass, - itemTemplate.InventoryType, itemTemplate.Quality, itemTemplate.ItemLevel); - - itemTemplate.Area = fields[115].GetUInt32(); - itemTemplate.Map = uint32(fields[116].GetUInt16()); - itemTemplate.BagFamily = fields[117].GetUInt32(); - itemTemplate.TotemCategory = fields[118].GetUInt32(); - for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i) - { - itemTemplate.Socket[i].Color = uint32(fields[119 + i*2].GetUInt8()); - itemTemplate.Socket[i].Content = fields[119 + i * 2 + 1].GetUInt32(); - } - - itemTemplate.socketBonus = fields[125].GetUInt32(); - itemTemplate.GemProperties = fields[126].GetUInt32(); - FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, itemTemplate); - - itemTemplate.ArmorDamageModifier = fields[127].GetFloat(); - itemTemplate.Duration = fields[128].GetUInt32(); - itemTemplate.ItemLimitCategory = uint32(fields[129].GetInt16()); - itemTemplate.HolidayId = fields[130].GetUInt32(); - itemTemplate.StatScalingFactor = fields[131].GetFloat(); - itemTemplate.CurrencySubstitutionId = fields[132].GetInt32(); - itemTemplate.CurrencySubstitutionCount = fields[133].GetInt32(); - itemTemplate.ScriptId = 0; - itemTemplate.FoodType = 0; - itemTemplate.MinMoneyLoot = 0; - itemTemplate.MaxMoneyLoot = 0; - ++dbCount; - } while (result->NextRow()); + itemItr->second.Effects.push_back(effect); } // Check if item templates for DBC referenced character start outfit are present @@ -2813,7 +2469,7 @@ void ObjectMgr::LoadItemTemplates() for (std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr) TC_LOG_ERROR("sql.sql", "Item (Entry: %u) does not exist in `item_template` but is referenced in `CharStartOutfit.dbc`", *itr); - TC_LOG_INFO("server.loading", ">> Loaded %u item templates from Item-sparse.db2 and %u from database in %u ms", sparseCount, dbCount, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u item templates in %u ms", sparseCount, GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadItemTemplateAddon() |