aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp29
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
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;