aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp57
-rw-r--r--src/server/game/Entities/Player/Player.h4
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);