aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
2 files changed, 8 insertions, 16 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index ea78cfd468d..d520268d9b5 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2352,20 +2352,12 @@ uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool add
return urand(uint32(minDamage), uint32(maxDamage));
}
-float Unit::CalculateLevelPenalty(SpellInfo const* spellProto) const
+float Unit::CalculateSpellpowerCoefficientLevelPenalty(SpellInfo const* spellProto) const
{
- if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
+ if (getLevel() < spellProto->MaxLevel)
return 1.0f;
- float LvlPenalty = 0.0f;
-
- if (spellProto->SpellLevel < 20)
- LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
- float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(getLevel());
- if (LvlFactor > 1.0f)
- LvlFactor = 1.0f;
-
- return AddPct(LvlFactor, -LvlPenalty);
+ return std::max(0.0f, std::min(1.0f, (22.0f + spellProto->MaxLevel - getLevel()) / 20.0f));
}
void Unit::SendMeleeAttackStart(Unit* victim)
@@ -6921,7 +6913,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
// Default calculation
if (coeff && DoneAdvertisedBenefit)
{
- float factorMod = CalculateLevelPenalty(spellProto) * stack;
+ float factorMod = CalculateSpellpowerCoefficientLevelPenalty(spellProto) * stack;
if (Player* modOwner = GetSpellModOwner())
{
coeff *= 100.0f;
@@ -7324,7 +7316,7 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui
}
// level penalty still applied on Taken bonus - is it blizzlike?
- float factorMod = CalculateLevelPenalty(spellProto) * stack;
+ float factorMod = CalculateSpellpowerCoefficientLevelPenalty(spellProto) * stack;
TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
}
}
@@ -7788,7 +7780,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
// Default calculation
if (coeff && DoneAdvertisedBenefit)
{
- float factorMod = CalculateLevelPenalty(spellProto) * stack;
+ float factorMod = CalculateSpellpowerCoefficientLevelPenalty(spellProto) * stack;
if (Player* modOwner = GetSpellModOwner())
{
coeff *= 100.0f;
@@ -7970,7 +7962,7 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u
}
// level penalty still applied on Taken bonus - is it blizzlike?
- float factorMod = CalculateLevelPenalty(spellProto) * int32(stack);
+ float factorMod = CalculateSpellpowerCoefficientLevelPenalty(spellProto) * int32(stack);
TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 59ee716729b..c05c84dc6d0 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1570,7 +1570,7 @@ class TC_GAME_API Unit : public WorldObject
int32 ModSpellDuration(SpellInfo const* spellProto, Unit const* target, int32 duration, bool positive, uint32 effectMask);
void ModSpellCastTime(SpellInfo const* spellProto, int32& castTime, Spell* spell = nullptr);
void ModSpellDurationTime(SpellInfo const* spellProto, int32& castTime, Spell* spell = nullptr);
- float CalculateLevelPenalty(SpellInfo const* spellProto) const;
+ float CalculateSpellpowerCoefficientLevelPenalty(SpellInfo const* spellProto) const;
void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); }
void removeFollower(FollowerReference* /*pRef*/) { /* nothing to do yet */ }