mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user