aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-01-30 12:36:29 +0100
committerShauren <shauren.trinity@gmail.com>2022-01-30 12:36:29 +0100
commit2cc652b305f31ebcc71680f314792d0d09c43bfe (patch)
tree3861b57a18d947cc5fff1b9d57ea02feed1a9d16
parentea8245493292ccf6b5041a43637b717e55293a5f (diff)
Core/Scripts: Expose IsCrit to hit hooks for spell scripts
-rw-r--r--src/server/game/Spells/SpellScript.cpp19
-rw-r--r--src/server/game/Spells/SpellScript.h2
2 files changed, 21 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 8a02fd2d974..e82d1111465 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -686,6 +686,25 @@ void SpellScript::SetHitHeal(int32 heal)
m_spell->m_healing = heal;
}
+bool SpellScript::IsHitCrit() const
+{
+ if (!IsInTargetHook())
+ {
+ TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::IsHitCrit was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId);
+ return false;
+ }
+ if (Unit* hitUnit = GetHitUnit())
+ {
+ auto itr = std::find_if(m_spell->m_UniqueTargetInfo.begin(), m_spell->m_UniqueTargetInfo.end(), [hitUnit](Spell::TargetInfo const& targetInfo)
+ {
+ return targetInfo.TargetGUID == hitUnit->GetGUID();
+ });
+ ASSERT(itr != m_spell->m_UniqueTargetInfo.end());
+ return itr->IsCrit;
+ }
+ return false;
+}
+
Aura* SpellScript::GetHitAura(bool dynObjAura /*= false*/) const
{
if (!IsInTargetHook())
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index aa206611c20..ebb5addd9c0 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -514,6 +514,8 @@ class TC_GAME_API SpellScript : public _SpellScript
int32 GetHitHeal() const;
void SetHitHeal(int32 heal);
void PreventHitHeal() { SetHitHeal(0); }
+ // returns: true if spell critically hits current HitUnit
+ bool IsHitCrit() const;
Spell* GetSpell() const { return m_spell; }
// returns current spell hit target aura
Aura* GetHitAura(bool dynObjAura = false) const;