Core/SAI: Set the trigger player as baseobject when the source type isn't a WorldObject (#28767)

This commit is contained in:
Meji
2023-01-31 19:38:34 +01:00
committed by GitHub
parent 7395d75b5a
commit 7b14b9ef22
3 changed files with 61 additions and 51 deletions
+53 -42
View File
@@ -48,8 +48,8 @@ SmartScript::SmartScript()
{
go = nullptr;
me = nullptr;
player = nullptr;
trigger = nullptr;
atPlayer = nullptr;
areaTrigger = nullptr;
sceneTemplate = nullptr;
quest = nullptr;
@@ -1232,7 +1232,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
EnumFlag<SmartActionSummonCreatureFlags> flags(static_cast<SmartActionSummonCreatureFlags>(e.action.summonCreature.flags));
bool preferUnit = flags.HasFlag(SmartActionSummonCreatureFlags::PreferUnit);
WorldObject* summoner = preferUnit ? unit : Coalesce<WorldObject>(GetBaseObjectOrPlayerTrigger(), unit);
WorldObject* summoner = preferUnit ? unit : GetBaseObjectOrUnitInvoker(unit);
if (!summoner)
break;
@@ -1270,7 +1270,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_SUMMON_GO:
{
WorldObject* summoner = GetBaseObjectOrUnit(unit);
WorldObject* summoner = GetBaseObjectOrUnitInvoker(unit);
if (!summoner)
break;
@@ -2499,7 +2499,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_TRIGGER_GAME_EVENT:
{
WorldObject* sourceObject = GetBaseObjectOrUnit(unit);
WorldObject* sourceObject = GetBaseObjectOrUnitInvoker(unit);
for (WorldObject* target : targets)
{
if (e.action.triggerGameEvent.useSaiTargetAsGameEventSource)
@@ -2596,7 +2596,7 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e,
else if (Unit* tempLastInvoker = GetLastInvoker())
scriptTrigger = tempLastInvoker;
WorldObject* baseObject = GetBaseObjectOrPlayerTrigger();
WorldObject* baseObject = GetBaseObject();
switch (e.GetTargetType())
{
case SMART_TARGET_SELF:
@@ -3003,7 +3003,7 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e,
void SmartScript::GetWorldObjectsInDist(ObjectVector& targets, float dist) const
{
WorldObject* obj = GetBaseObjectOrPlayerTrigger();
WorldObject* obj = GetBaseObject();
if (!obj)
return;
@@ -3750,22 +3750,14 @@ WorldObject* SmartScript::GetBaseObject() const
obj = go;
else if (areaTrigger)
obj = areaTrigger;
else if (player)
obj = player;
return obj;
}
WorldObject* SmartScript::GetBaseObjectOrUnit(Unit* unit)
WorldObject* SmartScript::GetBaseObjectOrUnitInvoker(Unit* invoker)
{
WorldObject* summoner = GetBaseObject();
if (!summoner && unit)
return unit;
return summoner;
}
WorldObject* SmartScript::GetBaseObjectOrPlayerTrigger() const
{
return trigger ? atPlayer : GetBaseObject();
return Coalesce<WorldObject>(GetBaseObject(), invoker);
}
bool SmartScript::IsUnit(WorldObject* obj)
@@ -4018,7 +4010,49 @@ void SmartScript::GetScript()
void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* qst)
{
if (obj)//handle object based scripts
if (at)
{
mScriptType = SMART_SCRIPT_TYPE_AREATRIGGER;
trigger = at;
player = obj->ToPlayer();
if (!player)
{
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: source is AreaTrigger with id {}, missing trigger player", trigger->ID);
return;
}
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is AreaTrigger with id {}, triggered by player {}", trigger->ID, player->GetGUID().ToString());
}
else if (scene)
{
mScriptType = SMART_SCRIPT_TYPE_SCENE;
sceneTemplate = scene;
player = obj->ToPlayer();
if (!player)
{
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: source is Scene with id {}, missing trigger player", scene->SceneId);
return;
}
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is Scene with id {}, triggered by player {}", scene->SceneId, player->GetGUID().ToString());
}
else if (qst)
{
mScriptType = SMART_SCRIPT_TYPE_QUEST;
quest = qst;
player = obj->ToPlayer();
if (!player)
{
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: source is Quest with id {}, missing trigger player", qst->GetQuestId());
return;
}
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is Quest with id {}, triggered by player {}", qst->GetQuestId(), player->GetGUID().ToString());
}
else if (obj) // Handle object based scripts
{
switch (obj->GetTypeId())
{
@@ -4032,17 +4066,6 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce
go = obj->ToGameObject();
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is GameObject {}", go->GetEntry());
break;
case TYPEID_PLAYER:
if (at)
{
mScriptType = SMART_SCRIPT_TYPE_AREATRIGGER;
trigger = at;
atPlayer = obj->ToPlayer();
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is AreaTrigger {}, triggered by player {}", trigger->ID, atPlayer->GetGUID().ToString());
}
else
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: !WARNING! Player TypeID is only allowed for AreaTriggers");
break;
case TYPEID_AREATRIGGER:
areaTrigger = obj->ToAreaTrigger();
mScriptType = areaTrigger->IsServerSide() ? SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE : SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY;
@@ -4053,18 +4076,6 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce
return;
}
}
else if (scene)
{
mScriptType = SMART_SCRIPT_TYPE_SCENE;
sceneTemplate = scene;
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is Scene with id {}", scene->SceneId);
}
else if (qst)
{
mScriptType = SMART_SCRIPT_TYPE_QUEST;
quest = qst;
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is Quest with id {}", qst->GetQuestId());
}
else
{
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: !WARNING! Initialized objects are NULL.");