aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-09-19 00:35:14 +0200
committerShauren <shauren.trinity@gmail.com>2025-09-19 00:35:14 +0200
commit4c66c09e38ab327019f63f3c7beadb72f4647123 (patch)
treea77cbf4fbdd7e2d3e15b19f9cbaa2bc3092c638f
parent7f43815c988688a6ab8d9035b044389b20f4ac14 (diff)
Core/Spells: Allow spell scripts to access other scripts attached to a spell
-rw-r--r--src/server/game/Spells/Spell.cpp8
-rw-r--r--src/server/game/Spells/Spell.h4
2 files changed, 12 insertions, 0 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 5b29ed92bb8..cd4299d8bf6 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -9167,6 +9167,14 @@ bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToC
return true;
}
+SpellScript* Spell::GetScriptByType(std::type_info const& type) const
+{
+ auto itr = std::ranges::find(m_loadedScripts, type, [](SpellScript* script) -> std::type_info const& { return typeid(*script); });
+ if (itr != m_loadedScripts.end())
+ return *itr;
+ return nullptr;
+}
+
bool Spell::CanExecuteTriggersOnHit(Unit* unit, SpellInfo const* triggeredByAura /*= nullptr*/) const
{
bool onlyOnTarget = (triggeredByAura && (triggeredByAura->HasAttribute(SPELL_ATTR4_CLASS_TRIGGER_ONLY_ON_TARGET)));
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 8555151235b..ec80aaae3f0 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -31,6 +31,7 @@
#include "Types.h"
#include "UniqueTrackablePtr.h"
#include <memory>
+#include <typeinfo>
namespace WorldPackets::Spells
{
@@ -920,6 +921,8 @@ class TC_GAME_API Spell
void CallScriptCalcCritChanceHandlers(Unit const* victim, float& chance);
void CallScriptCalcDamageHandlers(SpellEffectInfo const& spellEffectInfo, Unit* victim, int32& damage, int32& flatMod, float& pctMod);
void CallScriptCalcHealingHandlers(SpellEffectInfo const& spellEffectInfo, Unit* victim, int32& healing, int32& flatMod, float& pctMod);
+ template <class Script>
+ Script* GetScript() const { return static_cast<Script*>(GetScriptByType(typeid(Script))); }
protected:
void CallScriptObjectAreaTargetSelectHandlers(std::list<WorldObject*>& targets, SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType);
void CallScriptObjectTargetSelectHandlers(WorldObject*& target, SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType);
@@ -927,6 +930,7 @@ class TC_GAME_API Spell
void CallScriptEmpowerStageCompletedHandlers(int32 completedStagesCount);
void CallScriptEmpowerCompletedHandlers(int32 completedStagesCount);
bool CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToCheck);
+ SpellScript* GetScriptByType(std::type_info const& type) const;
std::vector<SpellScript*> m_loadedScripts;
struct HitTriggerSpell