mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-13 11:43:18 -04: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>
(cherry picked from commit e7a714f66c)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user