aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp7
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h4
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
3 files changed, 12 insertions, 9 deletions
diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp
index 77226ff986d..d8c21a4799e 100644
--- a/src/server/game/Entities/Item/ItemTemplate.cpp
+++ b/src/server/game/Entities/Item/ItemTemplate.cpp
@@ -140,13 +140,14 @@ char const* ItemTemplate::GetDefaultLocaleName() const
return ExtendedData->Display[sWorld->GetDefaultDbcLocale()];
}
-float ItemTemplate::GetDPS(uint32 itemLevel) const
+float ItemTemplate::GetDPS() const
{
uint32 quality = ItemQualities(GetQuality()) != ITEM_QUALITY_HEIRLOOM ? ItemQualities(GetQuality()) : ITEM_QUALITY_RARE;
if (GetClass() != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT)
return 0.0f;
float dps = 0.0f;
+ uint32 itemLevel = GetItemLevel();
switch (GetInventoryType())
{
case INVTYPE_AMMO:
@@ -193,10 +194,10 @@ float ItemTemplate::GetDPS(uint32 itemLevel) const
return dps;
}
-void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamage) const
+void ItemTemplate::GetDamage(float& minDamage, float& maxDamage) const
{
minDamage = maxDamage = 0.0f;
- float dps = GetDPS(itemLevel);
+ float dps = GetDPS();
if (dps > 0.0f)
{
float avgDamage = dps * GetDelay() * 0.001f;
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index ccaf8b571b4..da72315e60a 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -879,8 +879,8 @@ struct TC_GAME_API ItemTemplate
inline bool HasFlag(ItemFlagsCustom customFlag) const { return (FlagsCu & customFlag) != 0; }
char const* GetDefaultLocaleName() const;
- float GetDPS(uint32 itemLevel) const;
- void GetDamage(uint32 itemLevel, float& minDamage, float& maxDamage) const;
+ float GetDPS() const;
+ void GetDamage(float& minDamage, float& maxDamage) const;
bool IsUsableByLootSpecialization(Player const* player, bool alwaysAllowBoundToAccount) const;
static std::size_t CalculateItemSpecBit(ChrSpecializationEntry const* spec);
};
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 87f23fa66ac..e88339b9d2f 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7746,7 +7746,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply, bool onlyForS
return;
ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(proto->GetScalingStatDistributionID());
- ScalingStatValuesEntry const* ssv = proto->GetScalingStatValue() != 0 ? sDB2Manager.GetScalingStatValuesForLevel(std::clamp<uint32>(GetLevel(), ssd->MinLevel, ssd->MaxLevel)) : nullptr;
+ ScalingStatValuesEntry const* ssv = (ssd && proto->GetScalingStatValue() != 0) ? sDB2Manager.GetScalingStatValuesForLevel(std::clamp<uint32>(GetLevel(), ssd->MinLevel, ssd->MaxLevel)) : nullptr;
if (onlyForScalingItems && (!ssd || !ssv))
return;
@@ -8008,11 +8008,12 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply, bool onlyForS
{
SpellSchools school = SpellSchools(i);
int16 resistance = proto->GetResistance(school);
+
if (school == SPELL_SCHOOL_NORMAL && ssv)
if (uint32 ssvarmor = ssv->getArmorMod(proto->GetScalingStatValue()))
resistance = ssvarmor;
- if (int16 resistance = proto->GetResistance(SpellSchools(i)))
+ if (resistance)
HandleStatFlatModifier(UnitMods(UNIT_MOD_ARMOR + i), BASE_VALUE, float(resistance), apply);
}
@@ -8032,10 +8033,11 @@ void Player::_ApplyWeaponDamage(uint8 slot, Item* item, bool apply)
if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
return;
+ static constexpr uint8 const MAX_ITEM_PROTO_DAMAGES = 5;
+
float damage = 0.0f;
- uint32 itemLevel = item->GetItemLevel(this);
float minDamage, maxDamage;
- proto->GetDamage(itemLevel, minDamage, maxDamage);
+ proto->GetDamage(minDamage, maxDamage);
if (minDamage > 0)
{