From fc49a98dab989dba9ef3048efe9047f8ce0719b6 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 23 Jun 2021 22:41:44 -0400 Subject: [PATCH] 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. Port From (https://github.com/TrinityCore/TrinityCore/commit/06b5b8d8b7ac3da65013ccc0f03599ee9dee2163) --- Source/Framework/Constants/SmartAIConst.cs | 2 +- Source/Game/AI/SmartScripts/SmartAI.cs | 2 +- Source/Game/AI/SmartScripts/SmartAIManager.cs | 70 ++++++++++++++++++- Source/Game/AI/SmartScripts/SmartScript.cs | 2 +- ...021_06_20_05_world_2018_02_13_04_world.sql | 2 + 5 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql diff --git a/Source/Framework/Constants/SmartAIConst.cs b/Source/Framework/Constants/SmartAIConst.cs index 76a089065..7eee59a11 100644 --- a/Source/Framework/Constants/SmartAIConst.cs +++ b/Source/Framework/Constants/SmartAIConst.cs @@ -397,7 +397,7 @@ namespace Framework.Constants public enum SmartTargets { - None = 0, // None, Defaulting To Invoket + None = 0, // None Self = 1, // Self Cast Victim = 2, // Our Current Target (Ie: Highest Aggro) HostileSecondAggro = 3, // Second highest aggro, maxdist, playerOnly, powerType + 1 diff --git a/Source/Game/AI/SmartScripts/SmartAI.cs b/Source/Game/AI/SmartScripts/SmartAI.cs index 3cdb82dde..8e64197df 100644 --- a/Source/Game/AI/SmartScripts/SmartAI.cs +++ b/Source/Game/AI/SmartScripts/SmartAI.cs @@ -888,7 +888,7 @@ namespace Game.AI SetDespawnTime(5000); StartDespawn(); - GetScript().ProcessEventsFor(SmartEvents.FollowCompleted); + GetScript().ProcessEventsFor(SmartEvents.FollowCompleted, player); } public void SetScript9(SmartScriptHolder e, uint entry, Unit invoker) diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index 41216e5a5..e7ddc418e 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -373,6 +373,63 @@ namespace Game.AI Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} SmartAI waypoint paths (total {total} waypoints) in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); } + static bool EventHasInvoker(SmartEvents smartEvent) + { + switch (smartEvent) + { // white list of events that actually have an invoker passed to them + case SmartEvents.Aggro: + case SmartEvents.Death: + case SmartEvents.Kill: + case SmartEvents.SummonedUnit: + case SmartEvents.SpellHit: + case SmartEvents.SpellHitTarget: + case SmartEvents.Damaged: + case SmartEvents.ReceiveHeal: + case SmartEvents.ReceiveEmote: + case SmartEvents.JustSummoned: + case SmartEvents.DamagedTarget: + case SmartEvents.SummonDespawned: + case SmartEvents.PassengerBoarded: + case SmartEvents.PassengerRemoved: + case SmartEvents.GossipHello: + case SmartEvents.GossipSelect: + case SmartEvents.AcceptedQuest: + case SmartEvents.RewardQuest: + case SmartEvents.FollowCompleted: + case SmartEvents.OnSpellclick: + case SmartEvents.GoLootStateChanged: + case SmartEvents.AreatriggerOntrigger: + case SmartEvents.IcLos: + case SmartEvents.OocLos: + case SmartEvents.DistanceCreature: + case SmartEvents.FriendlyHealth: + case SmartEvents.FriendlyHealthPCT: + case SmartEvents.FriendlyIsCc: + case SmartEvents.FriendlyMissingBuff: + case SmartEvents.ActionDone: + case SmartEvents.TargetHealthPct: + case SmartEvents.TargetManaPct: + case SmartEvents.Range: + case SmartEvents.VictimCasting: + case SmartEvents.TargetBuffed: + case SmartEvents.IsBehindTarget: + case SmartEvents.InstancePlayerEnter: + case SmartEvents.TransportAddcreature: + case SmartEvents.QuestAccepted: + case SmartEvents.QuestObjCompletion: + case SmartEvents.QuestCompletion: + case SmartEvents.QuestFail: + case SmartEvents.QuestRewarded: + case SmartEvents.SceneStart: + case SmartEvents.SceneTrigger: + case SmartEvents.SceneCancel: + case SmartEvents.SceneComplete: + return true; + default: + return false; + } + } + static bool IsTargetValid(SmartScriptHolder e) { if (Math.Abs(e.Target.o) > 2 * MathFunctions.PI) @@ -426,6 +483,16 @@ namespace Game.AI } break; } + case SmartTargets.ActionInvoker: + case SmartTargets.ActionInvokerVehicle: + case SmartTargets.InvokerParty: + if (e.GetScriptType() != SmartScriptType.TimedActionlist && e.GetEventType() != SmartEvents.Link && !EventHasInvoker(e.Event.type)) + { + Log.outError(LogFilter.Sql, "SmartAIMgr: Entry {e.entryOrGuid} SourceType {e.GetScriptType()} Event {e.GetEventType()} Action {}e.GetActionType() has invoker target, but action does not provide any invoker!"); + // allow this to load for now + // return false; + break; + } case SmartTargets.PlayerRange: case SmartTargets.Self: case SmartTargets.Victim: @@ -433,11 +500,8 @@ namespace Game.AI case SmartTargets.HostileLastAggro: case SmartTargets.HostileRandom: case SmartTargets.HostileRandomNotTop: - case SmartTargets.ActionInvoker: - case SmartTargets.InvokerParty: case SmartTargets.Position: case SmartTargets.None: - case SmartTargets.ActionInvokerVehicle: case SmartTargets.OwnerOrSummoner: case SmartTargets.ThreatList: case SmartTargets.ClosestGameobject: diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 6c65fe013..43b599a7f 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -3102,7 +3102,7 @@ namespace Game.AI uint count = _me.GetVictim().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 SmartEvents.Charmed: diff --git a/sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql b/sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql new file mode 100644 index 000000000..2a99ff63b --- /dev/null +++ b/sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql @@ -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;