diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 12 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 3 |
4 files changed, 37 insertions, 6 deletions
diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index 33aa9e68c7f..90c488992f2 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -17,6 +17,9 @@ #include "ItemTemplate.h" +#include "SpellInfo.h" +#include "SpellMgr.h" + bool ItemTemplate::CanChangeEquipStateInCombat() const { switch (InventoryType) @@ -122,3 +125,21 @@ uint32 ItemTemplate::GetSkill() const return 0; } } + +void ItemTemplate::_LoadTotalAP() +{ + int32 totalAP = 0; + for (uint32 i = 0; i < StatsCount; ++i) + if (ItemStat[i].ItemStatType == ITEM_MOD_ATTACK_POWER) + totalAP += ItemStat[i].ItemStatValue; + + // some items can have equip spells with +AP + for (uint32 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) + if (Spells[i].SpellId > 0 && Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_EQUIP) + if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(Spells[i].SpellId)) + for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) + if (spellInfo->Effects[j].IsAura(SPELL_AURA_MOD_ATTACK_POWER)) + totalAP += spellInfo->Effects[j].CalcValue(); + + _totalAP = totalAP; +} diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index d49e1193860..79b2147b1be 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -22,6 +22,8 @@ #include "Common.h" #include "SharedDefines.h" +class ObjectMgr; + enum ItemModType { ITEM_MOD_MANA = 0, @@ -606,6 +608,8 @@ struct _Socket struct ItemTemplate { + friend class ObjectMgr; + uint32 ItemId; uint32 Class; // id from ItemClass.dbc uint32 SubClass; // id from ItemSubClass.dbc @@ -695,6 +699,7 @@ struct ItemTemplate float getDPS() const; int32 getFeralBonus(int32 extraDPS = 0) const; + int32 GetTotalAPBonus() const { return _totalAP; } float GetItemLevelIncludingQuality() const; @@ -704,6 +709,13 @@ struct ItemTemplate bool IsWeaponVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_WEAPON_ENCHANTMENT; } bool IsArmorVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_ARMOR_ENCHANTMENT; } bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAG_CONJURED); } + +private: + // Cached info + int32 _totalAP; + + // Loading Helpers + void _LoadTotalAP(); }; // Benchmarked: Faster than std::map (insert/find) diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index d6278045b93..b18c9fefb90 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -410,12 +410,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) if (AuraEffect const* weaponMod = GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, 1563, EFFECT_1)) { ItemTemplate const* itemTemplate = weapon->GetTemplate(); - int32 bonusAP = 0; - for (uint32 i = 0; i < itemTemplate->StatsCount; ++i) - if (itemTemplate->ItemStat[i].ItemStatType == ITEM_MOD_ATTACK_POWER) - bonusAP += itemTemplate->ItemStat[i].ItemStatValue; - - bonusAP += m_baseFeralAP; + int32 bonusAP = itemTemplate->GetTotalAPBonus() + m_baseFeralAP; weaponBonus = CalculatePct(static_cast<float>(bonusAP), weaponMod->GetAmount()); } } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 334ee97ed22..62df5d7e63d 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2825,6 +2825,9 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FlagsCu &= ~ITEM_FLAGS_CU_DURATION_REAL_TIME; } + // Load cached data + itemTemplate._LoadTotalAP(); + ++count; } while (result->NextRow()); |