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.cpp33
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
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;