Skip to content

Commit

Permalink
Spell/Paladin: Add attacker to OnDamageCalculate hook and reimplement…
Browse files Browse the repository at this point in the history
… Blessing of Light
  • Loading branch information
killerwife committed Sep 16, 2023
1 parent 3e9df30 commit 020b7fa
Show file tree
Hide file tree
Showing 10 changed files with 45 additions and 43 deletions.
4 changes: 4 additions & 0 deletions sql/scriptdev2/spell.sql
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,10 @@ INSERT INTO spell_scripts(Id, ScriptName) VALUES
(20307,'spell_seal_of_the_crusader'),
(20308,'spell_seal_of_the_crusader'),
(27158,'spell_seal_of_the_crusader'),
(19977,'spell_blessing_of_light'),
(19978,'spell_blessing_of_light'),
(19979,'spell_blessing_of_light'),
(27144,'spell_blessing_of_light'),
(20271,'spell_judgement'),
(40470,'spell_paladin_tier_6_trinket'),
(31789,'spell_righteous_defense'),
Expand Down
2 changes: 1 addition & 1 deletion src/game/AI/ScriptDevAI/scripts/world/spell_scripts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -771,7 +771,7 @@ struct IncreasedHealingDoneDummy : public AuraScript
aura->GetTarget()->RegisterScriptedLocationAura(aura, SCRIPT_LOCATION_SPELL_HEALING_DONE, apply);
}

void OnDamageCalculate(Aura* aura, Unit* /*victim*/, int32& advertisedBenefit, float& /*totalMod*/) const override
void OnDamageCalculate(Aura* aura, Unit* /*attacker*/, Unit* /*victim*/, int32& advertisedBenefit, float& /*totalMod*/) const override
{
advertisedBenefit += aura->GetModifier()->m_amount;
}
Expand Down
41 changes: 8 additions & 33 deletions src/game/Entities/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7400,7 +7400,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellSchoolMask schoolMask, Spel
{
if (!i->isAffectedOnSpell(spellInfo))
continue;
i->OnDamageCalculate(victim, DoneAdvertisedBenefit, DoneTotalMod);
i->OnDamageCalculate(this, victim, DoneAdvertisedBenefit, DoneTotalMod);
}

AuraList const& mOverrideClassScript = owner->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
Expand Down Expand Up @@ -7522,7 +7522,7 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellSchoolMask schoolMask, Spe
{
if (!i->isAffectedOnSpell(spellInfo))
continue;
i->OnDamageCalculate(this, TakenAdvertisedBenefit, TakenTotalMod);
i->OnDamageCalculate(caster, this, TakenAdvertisedBenefit, TakenTotalMod);
}

// apply benefit affected by spell power implicit coeffs and spell level penalties
Expand Down Expand Up @@ -7660,7 +7660,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellEntry const* spellInfo, in
{
if (!i->isAffectedOnSpell(spellInfo))
continue;
i->OnDamageCalculate(victim, DoneAdvertisedBenefit, DoneTotalMod);
i->OnDamageCalculate(this, victim, DoneAdvertisedBenefit, DoneTotalMod);
}

// apply ap bonus and benefit affected by spell power implicit coeffs and spell level penalties
Expand All @@ -7679,7 +7679,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellEntry const* spellInfo, in
* Calculates target part of healing spell bonuses,
* will be called on each tick for periodic damage over time auras
*/
uint32 Unit::SpellHealingBonusTaken(Unit* pCaster, SpellEntry const* spellInfo, int32 healamount, DamageEffectType damagetype, uint32 stack)
uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellEntry const* spellInfo, int32 healamount, DamageEffectType damagetype, uint32 stack)
{
float TakenTotalMod = 1.0f;

Expand All @@ -7706,40 +7706,15 @@ uint32 Unit::SpellHealingBonusTaken(Unit* pCaster, SpellEntry const* spellInfo,
// Taken fixed damage bonus auras
int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(GetSpellSchoolMask(spellInfo));

// Blessing of Light dummy affects healing taken from Holy Light and Flash of Light
if (spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && (spellInfo->SpellFamilyFlags & uint64(0x00000000C0000000)))
{
AuraList const& auraDummy = GetAurasByType(SPELL_AURA_DUMMY);
for (auto i : auraDummy)
{
if (i->GetSpellProto()->SpellVisual == 9180)
{
if (((spellInfo->SpellFamilyFlags & uint64(0x0000000040000000)) && i->GetEffIndex() == EFFECT_INDEX_1) || // Flash of Light
((spellInfo->SpellFamilyFlags & uint64(0x0000000080000000)) && i->GetEffIndex() == EFFECT_INDEX_0)) // Holy Light
{
TakenAdvertisedBenefit += (i->GetModifier()->m_amount); // BoL is penalized since 2.3.0
// Note: This forces the caster to keep libram equipped, but works regardless if the BOL is his or not
if (Aura* aura = pCaster->GetAura(38320, EFFECT_INDEX_0)) // improved Blessing of light
{
if (i->GetEffIndex() == EFFECT_INDEX_0)
TakenAdvertisedBenefit += aura->GetModifier()->m_amount; // holy light gets full amount
else
TakenAdvertisedBenefit += (aura->GetModifier()->m_amount / 2); // flash of light gets half
}
}
}
}
}

for (auto i : GetScriptedLocationAuras(SCRIPT_LOCATION_SPELL_HEALING_TAKEN))
{
if (!i->isAffectedOnSpell(spellInfo))
continue;
i->OnDamageCalculate(this, TakenAdvertisedBenefit, TakenTotalMod);
i->OnDamageCalculate(caster, this, TakenAdvertisedBenefit, TakenTotalMod);
}

// apply benefit affected by spell power implicit coeffs and spell level penalties
TakenTotal = pCaster->SpellBonusWithCoeffs(spellInfo, TakenTotal, TakenAdvertisedBenefit, 0, damagetype, false);
TakenTotal = caster->SpellBonusWithCoeffs(spellInfo, TakenTotal, TakenAdvertisedBenefit, 0, damagetype, false);

// use float as more appropriate for negative values and percent applying
float heal = (healamount + TakenTotal * int32(stack)) * TakenTotalMod;
Expand Down Expand Up @@ -8014,7 +7989,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType
{
if (!i->isAffectedOnSpell(spellInfo))
continue;
i->OnDamageCalculate(victim, DoneFlat, DoneTotalMod);
i->OnDamageCalculate(this, victim, DoneFlat, DoneTotalMod);
}

// final calculation
Expand Down Expand Up @@ -8120,7 +8095,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* caster, uint32 pdamage, WeaponAttackTyp
{
if (!i->isAffectedOnSpell(spellInfo))
continue;
i->OnDamageCalculate(this, TakenAdvertisedBenefit, TakenTotalMod);
i->OnDamageCalculate(caster, this, TakenAdvertisedBenefit, TakenTotalMod);
}

// final calculation
Expand Down
2 changes: 1 addition & 1 deletion src/game/Spells/Scripts/Scripting/ClassScripts/Druid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ struct MangleDruidTBC : public AuraScript
}
}

void OnDamageCalculate(Aura* aura, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& totalMod) const override
void OnDamageCalculate(Aura* aura, Unit* /*attacker*/, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& totalMod) const override
{
totalMod *= (100.0f + aura->GetModifier()->m_amount) / 100.0f;
}
Expand Down
25 changes: 24 additions & 1 deletion src/game/Spells/Scripts/Scripting/ClassScripts/Paladin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ struct IncreasedHolyLightHealing : public AuraScript
aura->GetTarget()->RegisterScriptedLocationAura(aura, SCRIPT_LOCATION_SPELL_HEALING_DONE, apply);
}

void OnDamageCalculate(Aura* aura, Unit* /*victim*/, int32& advertisedBenefit, float& /*totalMod*/) const override
void OnDamageCalculate(Aura* aura, Unit* /*attacker*/, Unit* /*victim*/, int32& advertisedBenefit, float& /*totalMod*/) const override
{
advertisedBenefit += aura->GetModifier()->m_amount;
}
Expand Down Expand Up @@ -192,6 +192,28 @@ struct SealOfBloodSelfDamage : public SpellScript
}
};

// 19977 - Blessing of Light
struct BlessingOfLight : public AuraScript
{
void OnApply(Aura* aura, bool apply) const override
{
aura->GetTarget()->RegisterScriptedLocationAura(aura, SCRIPT_LOCATION_SPELL_HEALING_TAKEN, apply);
}

void OnDamageCalculate(Aura* aura, Unit* attacker, Unit* /*victim*/, int32& advertisedBenefit, float& totalMod) const override
{
advertisedBenefit += (aura->GetModifier()->m_amount); // BoL is penalized since 2.3.0
// Note: This forces the caster to keep libram equipped, but works regardless if the BOL is his or not
if (Aura* improved = attacker->GetAura(38320, EFFECT_INDEX_0)) // improved Blessing of light
{
if (aura->GetEffIndex() == EFFECT_INDEX_0)
advertisedBenefit += improved->GetModifier()->m_amount; // holy light gets full amount
else
advertisedBenefit += (improved->GetModifier()->m_amount / 2); // flash of light gets half
}
}
};

void LoadPaladinScripts()
{
RegisterSpellScript<IncreasedHolyLightHealing>("spell_increased_holy_light_healing");
Expand All @@ -200,4 +222,5 @@ void LoadPaladinScripts()
RegisterSpellScript<SealOfTheCrusader>("spell_seal_of_the_crusader");
RegisterSpellScript<SealOfBloodSelfDamage>("spell_seal_of_blood_self_damage");
RegisterSpellScript<spell_paladin_tier_6_trinket>("spell_paladin_tier_6_trinket");
RegisterSpellScript<BlessingOfLight>("spell_blessing_of_light");
}
4 changes: 2 additions & 2 deletions src/game/Spells/Scripts/Scripting/ClassScripts/Rogue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ struct DirtyDeeds : public AuraScript
aura->GetTarget()->RegisterScriptedLocationAura(aura, SCRIPT_LOCATION_MELEE_DAMAGE_DONE, apply);
}

void OnDamageCalculate(Aura* aura, Unit* victim, int32& /*advertisedBenefit*/, float& totalMod) const override
void OnDamageCalculate(Aura* aura, Unit* /*attacker*/, Unit* victim, int32& /*advertisedBenefit*/, float& totalMod) const override
{
if (aura->GetEffIndex() == EFFECT_INDEX_0)
return;
Expand Down Expand Up @@ -203,7 +203,7 @@ struct CheatingDeath : public AuraScript
return false;
}

void OnDamageCalculate(Aura* aura, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& totalMod) const override
void OnDamageCalculate(Aura* aura, Unit* /*attacker*/, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& totalMod) const override
{
if (!aura->GetTarget()->IsPlayer())
return;
Expand Down
2 changes: 1 addition & 1 deletion src/game/Spells/Scripts/Scripting/ClassScripts/Shaman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ struct HealingWay : public AuraScript
aura->GetTarget()->RegisterScriptedLocationAura(aura, SCRIPT_LOCATION_SPELL_HEALING_TAKEN, apply);
}

void OnDamageCalculate(Aura* aura, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& totalMod) const override
void OnDamageCalculate(Aura* aura, Unit* /*attacker*/, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& totalMod) const override
{
totalMod *= (aura->GetModifier()->m_amount + 100.0f) / 100.0f;
}
Expand Down
2 changes: 1 addition & 1 deletion src/game/Spells/Scripts/SpellScript.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ struct AuraScript
// called during any event that calculates aura modifier amount - caster can be nullptr
virtual int32 OnAuraValueCalculate(AuraCalcData& /*data*/, int32 value) const { return value; }
// called during done/taken damage calculation
virtual void OnDamageCalculate(Aura* /*aura*/, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& /*totalMod*/) const {}
virtual void OnDamageCalculate(Aura* /*aura*/, Unit* /*attacker*/, Unit* /*victim*/, int32& /*advertisedBenefit*/, float& /*totalMod*/) const {}
// called during duration calculation - target can be nullptr for channel duration calculation
virtual int32 OnDurationCalculate(WorldObject const* /*caster*/, Unit const* /*target*/, int32 duration) const { return duration; }
virtual void OnCritChanceCalculate(Aura* /*aura*/, Unit const* /*target*/, float& /*chance*/) const {}
Expand Down
4 changes: 2 additions & 2 deletions src/game/Spells/SpellAuras.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8954,10 +8954,10 @@ int32 Aura::OnAuraValueCalculate(Unit* caster, int32 currentValue)
return currentValue;
}

void Aura::OnDamageCalculate(Unit* victim, int32& advertisedBenefit, float& totalMod)
void Aura::OnDamageCalculate(Unit* victim, Unit* attacker, int32& advertisedBenefit, float& totalMod)
{
if (AuraScript* script = GetAuraScript())
return script->OnDamageCalculate(this, victim, advertisedBenefit, totalMod);
return script->OnDamageCalculate(this, attacker, victim, advertisedBenefit, totalMod);
}

void Aura::OnCritChanceCalculate(Unit const* victim, float& chance)
Expand Down
2 changes: 1 addition & 1 deletion src/game/Spells/SpellAuras.h
Original file line number Diff line number Diff line change
Expand Up @@ -532,7 +532,7 @@ class Aura
// hooks
void OnAuraInit();
int32 OnAuraValueCalculate(Unit* caster, int32 currentValue);
void OnDamageCalculate(Unit* victim, int32& advertisedBenefit, float& totalMod);
void OnDamageCalculate(Unit* victim, Unit* attacker, int32& advertisedBenefit, float& totalMod);
void OnCritChanceCalculate(Unit const* victim, float& chance);
void OnApply(bool apply);
void OnAfterApply(bool apply);
Expand Down

0 comments on commit 020b7fa

Please sign in to comment.