mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/SmartAI: SMART_TARGET_INVOKER cleanup step 1. The core will now log errors on start-up if SMART_TARGET_INVOKER abuse is found, but will continue to load the scripts as deprecated for now.
Note that a lot of these scripts may either not currently work, not work reliably, or may be prone to breaking unexpectedly when core internals change. SMART_TARGET_INVOKER is undefined behavior on any event that doesn't directly specify its invoker.
(We are considering options for allowing INVOKER to make sense in timed action lists in a reliable fashion, so they are exempted at this time.)
(cherry picked from commit 482328bddf)
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
-- SMART_ACTION_FLEE_FOR_ASSIST (25) does not need a target
|
||||
UPDATE `smart_scripts` SET `target_type`=0 WHERE `action_type`=25;
|
||||
@@ -823,7 +823,8 @@ void SmartAI::StopFollow(bool complete)
|
||||
if (!complete)
|
||||
return;
|
||||
|
||||
if (Player * player = ObjectAccessor::GetPlayer(*me, mFollowGuid))
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, mFollowGuid);
|
||||
if (player)
|
||||
{
|
||||
if (!mFollowCreditType)
|
||||
player->RewardPlayerAndGroupAtEvent(mFollowCredit, me);
|
||||
@@ -833,7 +834,7 @@ void SmartAI::StopFollow(bool complete)
|
||||
|
||||
SetDespawnTime(5000);
|
||||
StartDespawn();
|
||||
GetScript()->ProcessEventsFor(SMART_EVENT_FOLLOW_COMPLETED);
|
||||
GetScript()->ProcessEventsFor(SMART_EVENT_FOLLOW_COMPLETED, player);
|
||||
}
|
||||
|
||||
void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
|
||||
|
||||
@@ -3038,7 +3038,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
|
||||
uint32 count = me->EnsureVictim()->GetAuraCount(e.event.aura.spell);
|
||||
if (count < e.event.aura.count)
|
||||
return;
|
||||
ProcessTimedAction(e, e.event.aura.repeatMin, e.event.aura.repeatMax);
|
||||
ProcessTimedAction(e, e.event.aura.repeatMin, e.event.aura.repeatMax, me->GetVictim());
|
||||
break;
|
||||
}
|
||||
case SMART_EVENT_CHARMED:
|
||||
|
||||
@@ -452,6 +452,63 @@ SmartScriptHolder& SmartAIMgr::FindLinkedEvent(SmartAIEventList& list, uint32 li
|
||||
return SmartScriptHolderDummy;
|
||||
}
|
||||
|
||||
/*static*/ bool SmartAIMgr::EventHasInvoker(SMART_EVENT event)
|
||||
{
|
||||
switch (event)
|
||||
{ // white list of events that actually have an invoker passed to them
|
||||
case SMART_EVENT_AGGRO:
|
||||
case SMART_EVENT_DEATH:
|
||||
case SMART_EVENT_KILL:
|
||||
case SMART_EVENT_SUMMONED_UNIT:
|
||||
case SMART_EVENT_SPELLHIT:
|
||||
case SMART_EVENT_SPELLHIT_TARGET:
|
||||
case SMART_EVENT_DAMAGED:
|
||||
case SMART_EVENT_RECEIVE_HEAL:
|
||||
case SMART_EVENT_RECEIVE_EMOTE:
|
||||
case SMART_EVENT_JUST_SUMMONED:
|
||||
case SMART_EVENT_DAMAGED_TARGET:
|
||||
case SMART_EVENT_SUMMON_DESPAWNED:
|
||||
case SMART_EVENT_PASSENGER_BOARDED:
|
||||
case SMART_EVENT_PASSENGER_REMOVED:
|
||||
case SMART_EVENT_GOSSIP_HELLO:
|
||||
case SMART_EVENT_GOSSIP_SELECT:
|
||||
case SMART_EVENT_ACCEPTED_QUEST:
|
||||
case SMART_EVENT_REWARD_QUEST:
|
||||
case SMART_EVENT_FOLLOW_COMPLETED:
|
||||
case SMART_EVENT_ON_SPELLCLICK:
|
||||
case SMART_EVENT_GO_LOOT_STATE_CHANGED:
|
||||
case SMART_EVENT_AREATRIGGER_ONTRIGGER:
|
||||
case SMART_EVENT_IC_LOS:
|
||||
case SMART_EVENT_OOC_LOS:
|
||||
case SMART_EVENT_DISTANCE_CREATURE:
|
||||
case SMART_EVENT_FRIENDLY_HEALTH:
|
||||
case SMART_EVENT_FRIENDLY_HEALTH_PCT:
|
||||
case SMART_EVENT_FRIENDLY_IS_CC:
|
||||
case SMART_EVENT_FRIENDLY_MISSING_BUFF:
|
||||
case SMART_EVENT_ACTION_DONE:
|
||||
case SMART_EVENT_TARGET_HEALTH_PCT:
|
||||
case SMART_EVENT_TARGET_MANA_PCT:
|
||||
case SMART_EVENT_RANGE:
|
||||
case SMART_EVENT_VICTIM_CASTING:
|
||||
case SMART_EVENT_TARGET_BUFFED:
|
||||
case SMART_EVENT_IS_BEHIND_TARGET:
|
||||
case SMART_EVENT_INSTANCE_PLAYER_ENTER:
|
||||
case SMART_EVENT_TRANSPORT_ADDCREATURE:
|
||||
case SMART_EVENT_QUEST_ACCEPTED:
|
||||
case SMART_EVENT_QUEST_OBJ_COPLETETION:
|
||||
case SMART_EVENT_QUEST_COMPLETION:
|
||||
case SMART_EVENT_QUEST_FAIL:
|
||||
case SMART_EVENT_QUEST_REWARDED:
|
||||
case SMART_EVENT_SCENE_START:
|
||||
case SMART_EVENT_SCENE_TRIGGER:
|
||||
case SMART_EVENT_SCENE_CANCEL:
|
||||
case SMART_EVENT_SCENE_COMPLETE:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
|
||||
{
|
||||
if (std::abs(e.target.o) > 2 * float(M_PI))
|
||||
@@ -505,6 +562,16 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SMART_TARGET_ACTION_INVOKER:
|
||||
case SMART_TARGET_ACTION_INVOKER_VEHICLE:
|
||||
case SMART_TARGET_INVOKER_PARTY:
|
||||
if (e.GetScriptType() != SMART_SCRIPT_TYPE_TIMED_ACTIONLIST && e.GetEventType() != SMART_EVENT_LINK && !EventHasInvoker(e.event.type))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u has invoker target, but action does not provide any invoker!", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
|
||||
// allow this to load for now
|
||||
// return false;
|
||||
}
|
||||
break;
|
||||
case SMART_TARGET_PLAYER_RANGE:
|
||||
case SMART_TARGET_SELF:
|
||||
case SMART_TARGET_VICTIM:
|
||||
@@ -512,11 +579,8 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
|
||||
case SMART_TARGET_HOSTILE_LAST_AGGRO:
|
||||
case SMART_TARGET_HOSTILE_RANDOM:
|
||||
case SMART_TARGET_HOSTILE_RANDOM_NOT_TOP:
|
||||
case SMART_TARGET_ACTION_INVOKER:
|
||||
case SMART_TARGET_INVOKER_PARTY:
|
||||
case SMART_TARGET_POSITION:
|
||||
case SMART_TARGET_NONE:
|
||||
case SMART_TARGET_ACTION_INVOKER_VEHICLE:
|
||||
case SMART_TARGET_OWNER_OR_SUMMONER:
|
||||
case SMART_TARGET_THREAT_LIST:
|
||||
case SMART_TARGET_CLOSEST_GAMEOBJECT:
|
||||
|
||||
@@ -1230,7 +1230,7 @@ enum SMARTAI_TEMPLATE
|
||||
|
||||
enum SMARTAI_TARGETS
|
||||
{
|
||||
SMART_TARGET_NONE = 0, // NONE, defaulting to invoket
|
||||
SMART_TARGET_NONE = 0, // NONE
|
||||
SMART_TARGET_SELF = 1, // Self cast
|
||||
SMART_TARGET_VICTIM = 2, // Our current target (ie: highest aggro)
|
||||
SMART_TARGET_HOSTILE_SECOND_AGGRO = 3, // Second highest aggro, maxdist, playerOnly, powerType + 1
|
||||
@@ -1660,6 +1660,8 @@ class TC_GAME_API SmartAIMgr
|
||||
//event stores
|
||||
SmartAIEventMap mEventMap[SMART_SCRIPT_TYPE_MAX];
|
||||
|
||||
static bool EventHasInvoker(SMART_EVENT event);
|
||||
|
||||
bool IsEventValid(SmartScriptHolder& e);
|
||||
bool IsTargetValid(SmartScriptHolder const& e);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user