diff options
author | Meji <alvaro.megias@outlook.com> | 2023-01-31 19:38:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-31 19:38:34 +0100 |
commit | 7b14b9ef22d7869d3630c708c127683c4a59f210 (patch) | |
tree | bf8e315767f5c2bac871f08dcb3a75a9f2fb5901 /src | |
parent | 7395d75b5adfd89085b78b17feb726ad9266715f (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.cpp | 12 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 95 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 5 |
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; |