mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user