diff options
author | Rothend <67004168+Rothend@users.noreply.github.com> | 2020-06-17 22:06:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-17 22:06:56 +0200 |
commit | e7a714f66c371cdeb6585846ddedb1bc445e695f (patch) | |
tree | 9402ce35d40158b73eccaf411b6da6fef5ce51eb | |
parent | ff043b0861b61437e2ac1d8dfb707f49e482546d (diff) |
Core/SmartAI: allow AreaTrigger SAI scripts to use the player triggering it as base object for actions and targeting (#24817)
* Core/SmartAI: allow AreaTrigger SAI scripts to use the player triggering it as base object for actions and targeting.
Closes #23669
Closes #24791
Closes #24792
Closes #24793
* Apply suggested changes.
* Initialize atPlayer in the constructor
Co-authored-by: Giacomo Pozzoni <giacomopoz@gmail.com>
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 33 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 |
3 files changed, 26 insertions, 11 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 7a766468a76..81567937ac4 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -1118,7 +1118,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 2456ecdede8..c3372e1c208 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -47,6 +47,7 @@ SmartScript::SmartScript() go = nullptr; me = nullptr; trigger = nullptr; + atPlayer = nullptr; mEventPhase = 0; mPathId = 0; mTextTimer = 0; @@ -1221,7 +1222,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } case SMART_ACTION_SUMMON_CREATURE: { - if (!GetBaseObject()) + WorldObject* baseObj = GetBaseObjectOrPlayerTrigger(); + if (!baseObj) break; float x, y, z, o; @@ -1232,7 +1234,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u y += e.target.y; z += e.target.z; o += e.target.o; - if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) + if (Creature* summon = baseObj->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) if (e.action.summonCreature.attackInvoker) summon->AI()->AttackStart(target->ToUnit()); } @@ -1240,7 +1242,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (e.GetTargetType() != SMART_TARGET_POSITION) break; - if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) + if (Creature* summon = baseObj->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) if (unit && e.action.summonCreature.attackInvoker) summon->AI()->AttackStart(unit); break; @@ -2483,7 +2485,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: @@ -2838,7 +2840,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; @@ -3586,6 +3588,11 @@ WorldObject* SmartScript::GetBaseObject() const return obj; } +WorldObject* SmartScript::GetBaseObjectOrPlayerTrigger() const +{ + return trigger ? atPlayer : GetBaseObject(); +} + bool SmartScript::IsUnit(WorldObject* obj) { return obj && (obj->GetTypeId() == TYPEID_UNIT || obj->GetTypeId() == TYPEID_PLAYER); @@ -3750,15 +3757,21 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at) 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; default: TC_LOG_ERROR("misc", "SmartScript::OnInitialize: Unhandled TypeID !WARNING!"); 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 { diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index fe8db54a8a5..abf2033a1f9 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -55,6 +55,7 @@ class TC_GAME_API SmartScript void SetPathId(uint32 id) { mPathId = id; } uint32 GetPathId() const { return mPathId; } WorldObject* GetBaseObject() const; + WorldObject* GetBaseObjectOrPlayerTrigger() const; static bool IsUnit(WorldObject* obj); static bool IsPlayer(WorldObject* obj); static bool IsCreature(WorldObject* obj); @@ -108,6 +109,7 @@ class TC_GAME_API SmartScript ObjectGuid meOrigGUID; GameObject* go; ObjectGuid goOrigGUID; + Player* atPlayer; AreaTriggerEntry const* trigger; SmartScriptType mScriptType; uint32 mEventPhase; |