diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2020-04-09 09:59:10 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-09 11:59:10 +0200 |
commit | 90b00288c24dfefccb338bd33b025cf85e82076d (patch) | |
tree | dd5d5f0f8c77abeac0de4939801233f48f960c35 | |
parent | 64246306678c12024f401c2c1934a8b452057452 (diff) |
Core/SAI: Allow SMART_TARGET_ACTION_INVOKER to target GameObjects (#24416)
* Core/SAI: Allow SMART_TARGET_ACTION_INVOKER to target GameObjects
* Include new Coalesce(..) template by @Shauren
-rw-r--r-- | src/common/Utilities/Util.h | 12 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 12 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 |
3 files changed, 19 insertions, 7 deletions
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 4915df56477..866e01e7bf6 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -519,4 +519,16 @@ constexpr typename std::underlying_type<E>::type AsUnderlyingType(E enumValue) return static_cast<typename std::underlying_type<E>::type>(enumValue); } +template<typename Ret, typename Only> +Ret* Coalesce(Only* arg) +{ + return arg; +} + +template<typename Ret, typename T1, typename... T> +Ret* Coalesce(T1* first, T*... rest) +{ + return static_cast<Ret*>(first ? static_cast<Ret*>(first) : Coalesce<Ret>(rest...)); +} + #endif diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index a12095a3ec0..dcd3f7124a3 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -243,7 +243,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: Invoker: %s %s", tempInvoker->GetName().c_str(), tempInvoker->GetGUID().ToString().c_str()); ObjectVector targets; - GetTargets(targets, e, unit); + GetTargets(targets, e, Coalesce<WorldObject>(unit, gob)); switch (e.GetActionType()) { @@ -2468,9 +2468,9 @@ SmartScriptHolder SmartScript::CreateSmartEvent(SMART_EVENT e, uint32 event_flag return script; } -void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, Unit* invoker /*= nullptr*/) const +void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, WorldObject* invoker /*= nullptr*/) const { - Unit* scriptTrigger = nullptr; + WorldObject* scriptTrigger = nullptr; if (invoker) scriptTrigger = invoker; else if (Unit* tempLastInvoker = GetLastInvoker()) @@ -2548,8 +2548,8 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, targets.push_back(scriptTrigger); break; case SMART_TARGET_ACTION_INVOKER_VEHICLE: - if (scriptTrigger && scriptTrigger->GetVehicle() && scriptTrigger->GetVehicle()->GetBase()) - targets.push_back(scriptTrigger->GetVehicle()->GetBase()); + if (scriptTrigger && scriptTrigger->ToUnit() && scriptTrigger->ToUnit()->GetVehicle() && scriptTrigger->ToUnit()->GetVehicle()->GetBase()) + targets.push_back(scriptTrigger->ToUnit()->GetVehicle()->GetBase()); break; case SMART_TARGET_INVOKER_PARTY: if (scriptTrigger) @@ -3086,7 +3086,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui (!e.event.spellHit.school || (spell->SchoolMask & e.event.spellHit.school))) { RecalcTimer(e, e.event.spellHit.cooldownMin, e.event.spellHit.cooldownMax); - ProcessAction(e, unit, 0, 0, bvar, spell); + ProcessAction(e, unit, 0, 0, bvar, spell, gob); } break; } diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 7b01f3ee26e..fe8db54a8a5 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -47,7 +47,7 @@ class TC_GAME_API SmartScript static void InitTimer(SmartScriptHolder& e); void ProcessAction(SmartScriptHolder& e, Unit* unit = nullptr, uint32 var0 = 0, uint32 var1 = 0, bool bvar = false, SpellInfo const* spell = nullptr, GameObject* gob = nullptr); void ProcessTimedAction(SmartScriptHolder& e, uint32 const& min, uint32 const& max, Unit* unit = nullptr, uint32 var0 = 0, uint32 var1 = 0, bool bvar = false, SpellInfo const* spell = nullptr, GameObject* gob = nullptr); - void GetTargets(ObjectVector& targets, SmartScriptHolder const& e, Unit* invoker = nullptr) const; + void GetTargets(ObjectVector& targets, SmartScriptHolder const& e, WorldObject* invoker = nullptr) const; void GetWorldObjectsInDist(ObjectVector& objects, float dist) const; void InstallTemplate(SmartScriptHolder const& e); static SmartScriptHolder CreateSmartEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask); |