aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2023-01-31 19:38:34 +0100
committerGitHub <noreply@github.com>2023-01-31 19:38:34 +0100
commit7b14b9ef22d7869d3630c708c127683c4a59f210 (patch)
treebf8e315767f5c2bac871f08dcb3a75a9f2fb5901 /src
parent7395d75b5adfd89085b78b17feb726ad9266715f (diff)
Core/SAI: Set the trigger player as baseobject when the source type isn't a WorldObject (#28767)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp12
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp95
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h5
3 files changed, 61 insertions, 51 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index b7d94165672..56c6b98c208 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -1187,28 +1187,28 @@ public:
void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* sceneTemplate) override
{
SmartScript smartScript;
- smartScript.OnInitialize(nullptr, nullptr, sceneTemplate);
+ smartScript.OnInitialize(player, nullptr, sceneTemplate);
smartScript.ProcessEventsFor(SMART_EVENT_SCENE_START, player);
}
void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* sceneTemplate, std::string const& triggerName) override
{
SmartScript smartScript;
- smartScript.OnInitialize(nullptr, nullptr, sceneTemplate);
+ smartScript.OnInitialize(player, nullptr, sceneTemplate);
smartScript.ProcessEventsFor(SMART_EVENT_SCENE_TRIGGER, player, 0, 0, false, nullptr, nullptr, triggerName);
}
void OnSceneCancel(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* sceneTemplate) override
{
SmartScript smartScript;
- smartScript.OnInitialize(nullptr, nullptr, sceneTemplate);
+ smartScript.OnInitialize(player, nullptr, sceneTemplate);
smartScript.ProcessEventsFor(SMART_EVENT_SCENE_CANCEL, player);
}
void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* sceneTemplate) override
{
SmartScript smartScript;
- smartScript.OnInitialize(nullptr, nullptr, sceneTemplate);
+ smartScript.OnInitialize(player, nullptr, sceneTemplate);
smartScript.ProcessEventsFor(SMART_EVENT_SCENE_COMPLETE, player);
}
};
@@ -1222,7 +1222,7 @@ public:
void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
{
SmartScript smartScript;
- smartScript.OnInitialize(nullptr, nullptr, nullptr, quest);
+ smartScript.OnInitialize(player, nullptr, nullptr, quest);
switch (newStatus)
{
case QUEST_STATUS_INCOMPLETE:
@@ -1250,7 +1250,7 @@ public:
if (slot < MAX_QUEST_LOG_SIZE && player->IsQuestObjectiveComplete(slot, quest, objective))
{
SmartScript smartScript;
- smartScript.OnInitialize(nullptr, nullptr, nullptr, quest);
+ smartScript.OnInitialize(player, nullptr, nullptr, quest);
smartScript.ProcessEventsFor(SMART_EVENT_QUEST_OBJ_COMPLETION, player, objective.ID);
}
}
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index afae19fb634..5454b012212 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -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.");
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index d0d660b7a29..7a92199c7a8 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -56,8 +56,7 @@ class TC_GAME_API SmartScript
void SetPathId(uint32 id) { mPathId = id; }
uint32 GetPathId() const { return mPathId; }
WorldObject* GetBaseObject() const;
- WorldObject* GetBaseObjectOrUnit(Unit* unit);
- WorldObject* GetBaseObjectOrPlayerTrigger() const;
+ WorldObject* GetBaseObjectOrUnitInvoker(Unit* invoker);
bool HasAnyEventWithFlag(uint32 flag) const { return mAllEventFlags & flag; }
static bool IsUnit(WorldObject* obj);
static bool IsPlayer(WorldObject* obj);
@@ -118,7 +117,7 @@ class TC_GAME_API SmartScript
ObjectGuid meOrigGUID;
GameObject* go;
ObjectGuid goOrigGUID;
- Player* atPlayer;
+ Player* player;
AreaTriggerEntry const* trigger;
AreaTrigger* areaTrigger;
SceneTemplate const* sceneTemplate;