diff options
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 29 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 |
3 files changed, 23 insertions, 10 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 40cf810295e..25067e6c0f1 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -1120,7 +1120,7 @@ class SmartTrigger : public AreaTriggerScript TC_LOG_DEBUG("scripts.ai", "AreaTrigger %u is using SmartTrigger script", trigger->ID); SmartScript script; - script.OnInitialize(nullptr, trigger); + script.OnInitialize(player, trigger); script.ProcessEventsFor(SMART_EVENT_AREATRIGGER_ONTRIGGER, player, trigger->ID); return true; } diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index d01ab7ab8c8..768d055a6fd 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -48,6 +48,7 @@ SmartScript::SmartScript() go = nullptr; me = nullptr; trigger = nullptr; + atPlayer = nullptr; areaTrigger = nullptr; sceneTemplate = nullptr; quest = nullptr; @@ -1268,7 +1269,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 : GetBaseObjectOrUnit(unit); + WorldObject* summoner = preferUnit ? unit : Coalesce<WorldObject>(GetBaseObjectOrPlayerTrigger(), unit); if (!summoner) break; @@ -2669,7 +2670,7 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, else if (Unit* tempLastInvoker = GetLastInvoker()) scriptTrigger = tempLastInvoker; - WorldObject* baseObject = GetBaseObject(); + WorldObject* baseObject = GetBaseObjectOrPlayerTrigger(); switch (e.GetTargetType()) { case SMART_TARGET_SELF: @@ -3086,7 +3087,7 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, void SmartScript::GetWorldObjectsInDist(ObjectVector& targets, float dist) const { - WorldObject* obj = GetBaseObject(); + WorldObject* obj = GetBaseObjectOrPlayerTrigger(); if (!obj) return; @@ -3870,6 +3871,11 @@ WorldObject* SmartScript::GetBaseObjectOrUnit(Unit* unit) return summoner; } +WorldObject* SmartScript::GetBaseObjectOrPlayerTrigger() const +{ + return trigger ? atPlayer : GetBaseObject(); +} + bool SmartScript::IsUnit(WorldObject* obj) { return obj && (obj->GetTypeId() == TYPEID_UNIT || obj->GetTypeId() == TYPEID_PLAYER); @@ -4077,6 +4083,17 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce go = obj->ToGameObject(); TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is GameObject %u", 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 %u, triggered by player %s", trigger->ID, atPlayer->GetGUID().ToString().c_str()); + } + 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; @@ -4087,12 +4104,6 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce return; } } - else if (at) - { - mScriptType = SMART_SCRIPT_TYPE_AREATRIGGER; - trigger = at; - TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is AreaTrigger %u", trigger->ID); - } else if (scene) { mScriptType = SMART_SCRIPT_TYPE_SCENE; diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 1040381f453..e75d2bb48a3 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -59,6 +59,7 @@ class TC_GAME_API SmartScript uint32 GetPathId() const { return mPathId; } WorldObject* GetBaseObject() const; WorldObject* GetBaseObjectOrUnit(Unit* unit); + WorldObject* GetBaseObjectOrPlayerTrigger() const; static bool IsUnit(WorldObject* obj); static bool IsPlayer(WorldObject* obj); static bool IsCreature(WorldObject* obj); @@ -113,6 +114,7 @@ class TC_GAME_API SmartScript ObjectGuid meOrigGUID; GameObject* go; ObjectGuid goOrigGUID; + Player* atPlayer; AreaTriggerEntry const* trigger; AreaTrigger* areaTrigger; SceneTemplate const* sceneTemplate; |