diff options
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 57 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 |
2 files changed, 39 insertions, 22 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e70f8d626cc..7fc57c2f305 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7562,7 +7562,6 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply if (CanUseAttackType(attType)) _ApplyWeaponDamage(slot, proto, ssv, apply); - // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue) if (getClass() == CLASS_DRUID) { @@ -7583,7 +7582,6 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv, bool apply) { WeaponAttackType attType = BASE_ATTACK; - float damage = 0.0f; if (slot == EQUIPMENT_SLOT_RANGED && ( proto->InventoryType == INVTYPE_RANGED || proto->InventoryType == INVTYPE_THROWN || @@ -7596,31 +7594,40 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt attType = OFF_ATTACK; } - float minDamage = proto->Damage[0].DamageMin; - float maxDamage = proto->Damage[0].DamageMax; - - // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage - if (ssv) + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - int32 extraDPS = ssv->getDPSMod(proto->ScalingStatValue); - if (extraDPS) + float minDamage = proto->Damage[i].DamageMin; + float maxDamage = proto->Damage[i].DamageMax; + + // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage + if (ssv && i == 0) // scaling stats only for first damage { - float average = extraDPS * proto->Delay / 1000.0f; - minDamage = 0.7f * average; - maxDamage = 1.3f * average; + int32 extraDPS = ssv->getDPSMod(proto->ScalingStatValue); + if (extraDPS) + { + float average = extraDPS * proto->Delay / 1000.0f; + minDamage = 0.7f * average; + maxDamage = 1.3f * average; + } } - } - if (minDamage > 0) - { - damage = apply ? minDamage : BASE_MINDAMAGE; - SetBaseWeaponDamage(attType, MINDAMAGE, damage); + if (apply) + { + if (minDamage > 0.f) + SetBaseWeaponDamage(attType, MINDAMAGE, minDamage, i); + + if (maxDamage > 0.f) + SetBaseWeaponDamage(attType, MAXDAMAGE, maxDamage, i); + } } - if (maxDamage > 0) + if (!apply) { - damage = apply ? maxDamage : BASE_MAXDAMAGE; - SetBaseWeaponDamage(attType, MAXDAMAGE, damage); + SetBaseWeaponDamage(attType, MINDAMAGE, BASE_MINDAMAGE, 0); + SetBaseWeaponDamage(attType, MAXDAMAGE, BASE_MAXDAMAGE, 0); + + SetBaseWeaponDamage(attType, MINDAMAGE, 0.f, 1); + SetBaseWeaponDamage(attType, MAXDAMAGE, 0.f, 1); } if (proto->Delay && !IsInFeralForm()) @@ -7637,10 +7644,18 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt if (IsInFeralForm()) return; - if (CanModifyStats() && (damage || proto->Delay)) + if (CanModifyStats() && (GetWeaponDamageRange(attType, MAXDAMAGE) || proto->Delay)) UpdateDamagePhysical(attType); } +SpellSchoolMask Player::GetMeleeDamageSchoolMask(WeaponAttackType attackType /*=BASE_ATTACK*/, uint8 damageIndex /*= 0*/) const +{ + if (Item const* weapon = GetWeaponForAttack(attackType, true)) + return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType); + + return SPELL_SCHOOL_MASK_NORMAL; +} + void Player::CastAllObtainSpells() { for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 271cd465709..fd9c4230ca9 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1579,7 +1579,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void UpdateRating(CombatRating cr); void UpdateAllRatings(); - void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) const override; + void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex) const override; void UpdateDefenseBonusesMod(); void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} @@ -1810,6 +1810,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void ResetAllPowers(); + SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType = BASE_ATTACK, uint8 damageIndex = 0) const override; + void CastAllObtainSpells(); void ApplyItemObtainSpells(Item* item, bool apply); |
