aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp382
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()