mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Spells: Fixed downranking coefficient penalty formula
Closes #21318
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */ }
|
||||
|
||||
@@ -616,7 +616,7 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader
|
||||
float bonus = 0.8068f;
|
||||
|
||||
bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
|
||||
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
|
||||
bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
|
||||
|
||||
amount += int32(bonus);
|
||||
}
|
||||
@@ -935,7 +935,7 @@ class spell_mage_ice_barrier : public SpellScriptLoader
|
||||
// Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage
|
||||
bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
|
||||
|
||||
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
|
||||
bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
|
||||
|
||||
amount += int32(bonus);
|
||||
}
|
||||
@@ -1114,7 +1114,7 @@ class spell_mage_mana_shield : public SpellScriptLoader
|
||||
float bonus = 0.8053f;
|
||||
|
||||
bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
|
||||
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
|
||||
bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
|
||||
|
||||
amount += int32(bonus);
|
||||
}
|
||||
|
||||
@@ -1919,7 +1919,7 @@ class spell_pal_sacred_shield : public SpellScriptLoader
|
||||
|
||||
// Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
|
||||
bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
|
||||
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
|
||||
bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
|
||||
|
||||
amount += int32(bonus);
|
||||
|
||||
|
||||
@@ -1013,7 +1013,7 @@ class spell_pri_power_word_shield : public SpellScriptLoader
|
||||
// Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
|
||||
// Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
|
||||
bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
|
||||
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
|
||||
bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
|
||||
|
||||
amount += int32(bonus);
|
||||
|
||||
|
||||
@@ -1230,7 +1230,7 @@ class spell_warl_shadow_ward : public SpellScriptLoader
|
||||
float bonus = 0.8068f;
|
||||
|
||||
bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
|
||||
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
|
||||
bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
|
||||
|
||||
amount += int32(bonus);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user