diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 |
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) { |