aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp21
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h12
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp7
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp3
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());