From 5a9714a375daeaafd98557818e4ca9b3cf45ac5a Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 5 Aug 2024 17:23:37 -0400 Subject: [PATCH] Core/SAI: Added support for StringIds to creature and gameobject targets Port From (https://github.com/TrinityCore/TrinityCore/commit/2ce40684595a0e49a7b2355012c2806952698ce4) --- Source/Framework/Constants/SharedConst.cs | 2 +- Source/Framework/Constants/SmartAIConst.cs | 14 +- .../Database/Databases/WorldDatabase.cs | 2 +- Source/Game/AI/SmartScripts/SmartAIManager.cs | 80 +++++++++-- Source/Game/AI/SmartScripts/SmartScript.cs | 125 +++++++----------- Source/Game/Chat/Commands/NPCCommands.cs | 2 +- .../Game/Entities/AreaTrigger/AreaTrigger.cs | 4 +- Source/Game/Entities/Creature/Creature.cs | 1 - Source/Game/Entities/GameObject/GameObject.cs | 9 +- Source/Game/Entities/Object/WorldObject.cs | 12 +- Source/Game/Maps/GridNotifiers.cs | 6 +- Source/Scripts/Events/LoveIsInTheAir.cs | 2 +- Source/Scripts/Spells/Quest.cs | 2 +- Source/Scripts/World/GameObject.cs | 4 +- Source/Scripts/World/NpcsSpecial.cs | 2 +- 15 files changed, 149 insertions(+), 118 deletions(-) diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index feb2f0daf..47aeabaff 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -103,7 +103,7 @@ namespace Framework.Constants /// /// Smart AI Const /// - public const int SmartEventParamCount = 4; + public const int SmartEventParamCount = 5; public const int SmartActionParamCount = 7; public const uint SmartSummonCounter = 0xFFFFFF; public const uint SmartEscortTargets = 0xFFFFFF; diff --git a/Source/Framework/Constants/SmartAIConst.cs b/Source/Framework/Constants/SmartAIConst.cs index efc2af10e..4d2fbae29 100644 --- a/Source/Framework/Constants/SmartAIConst.cs +++ b/Source/Framework/Constants/SmartAIConst.cs @@ -321,7 +321,7 @@ namespace Framework.Constants RemoveNpcFlag = 83, // Flags SimpleTalk = 84, // Groupid, Can Be Used To Make Players Say Groupid, TextOver Event Is Not Triggered, Whisper Can Not Be Used (Target Units Will Say The Text) SelfCast = 85, // Spellid, Castflags - CrossCast = 86, // Spellid, Castflags, Castertargettype, Castertarget Param1, Castertarget Param2, Castertarget Param3, ( + The Origonal Target Fields As Destination Target), Castertargets Will Cast Spellid On All Targets (Use With Caution If Targeting Multiple * Multiple Units) + CrossCast = 86, // spellID, castFlags, CasterTargetType, CasterTarget param1, CasterTarget param2, CasterTarget param3, CasterTarget param4, CasterTarget ParamString ( + the original target fields as Destination target), CasterTargets will cast spellID on all Targets (use with caution if targeting multiple * multiple units) CallRandomTimedActionlist = 87, // Script9 Ids 1-9 CallRandomRangeTimedActionlist = 88, // Script9 Id Min, Max RandomMove = 89, // Maxdist @@ -401,18 +401,18 @@ namespace Framework.Constants HostileRandomNotTop = 6, // Any random target except top threat, maxdist, playerOnly, powerType + 1 ActionInvoker = 7, // Unit Who Caused This Event To Occur Position = 8, // Use Xyz From Event Params - CreatureRange = 9, // Creatureentry(0any), Mindist, Maxdist + CreatureRange = 9, // Creatureentry(0any), Mindist, Maxdist, maxSize, StringId CreatureGuid = 10, // Guid, Entry - CreatureDistance = 11, // Creatureentry(0any), Maxdist + CreatureDistance = 11, // Creatureentry(0any), Maxdist, maxSize, StringId Stored = 12, // Id, Uses Pre-Stored Target(List) - GameobjectRange = 13, // Entry(0any), Min, Max + GameobjectRange = 13, // Entry(0any), minDist, maxDist, StringId GameobjectGuid = 14, // Guid, Entry - GameobjectDistance = 15, // Entry(0any), Maxdist + GameobjectDistance = 15, // Entry(0any), Maxdist, StringId InvokerParty = 16, // Invoker'S Party Members PlayerRange = 17, // Min, Max PlayerDistance = 18, // Maxdist - ClosestCreature = 19, // Creatureentry(0any), Maxdist, Dead? - ClosestGameobject = 20, // Entry(0any), Maxdist + ClosestCreature = 19, // Creatureentry(0any), Maxdist, Dead?, StringId + ClosestGameobject = 20, // Entry(0any), Maxdist, StringId ClosestPlayer = 21, // Maxdist ActionInvokerVehicle = 22, // Unit'S Vehicle Who Caused This Event To Occur OwnerOrSummoner = 23, // Unit's owner or summoner, Use Owner/Charmer of this unit diff --git a/Source/Framework/Database/Databases/WorldDatabase.cs b/Source/Framework/Database/Databases/WorldDatabase.cs index 8bec34689..0c67b1640 100644 --- a/Source/Framework/Database/Databases/WorldDatabase.cs +++ b/Source/Framework/Database/Databases/WorldDatabase.cs @@ -11,7 +11,7 @@ namespace Framework.Database PrepareStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER, "DELETE FROM linked_respawn WHERE linkedGuid = ? AND linkType = ?"); PrepareStatement(WorldStatements.REP_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid, linkType) VALUES (?, ?, ?)"); PrepareStatement(WorldStatements.SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, SoundPlayType, BroadcastTextId, TextRange FROM creature_text"); - PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, Difficulties, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, action_param7, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link"); + PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, Difficulties, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, action_param7, action_param_string, target_type, target_param1, target_param2, target_param3, target_param4, target_param_string, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link"); PrepareStatement(WorldStatements.DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?"); PrepareStatement(WorldStatements.INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone) VALUES (?, ?)"); diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index 406bc453b..17734ea0c 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -244,16 +244,18 @@ namespace Game.AI temp.Action.raw.param5 = result.Read(20); temp.Action.raw.param6 = result.Read(21); temp.Action.raw.param7 = result.Read(22); + temp.Action.param_string = result.Read(23); - temp.Target.type = (SmartTargets)result.Read(23); - temp.Target.raw.param1 = result.Read(24); - temp.Target.raw.param2 = result.Read(25); - temp.Target.raw.param3 = result.Read(26); - temp.Target.raw.param4 = result.Read(27); - temp.Target.x = result.Read(28); - temp.Target.y = result.Read(29); - temp.Target.z = result.Read(30); - temp.Target.o = result.Read(31); + temp.Target.type = (SmartTargets)result.Read(24); + temp.Target.raw.param1 = result.Read(25); + temp.Target.raw.param2 = result.Read(26); + temp.Target.raw.param3 = result.Read(27); + temp.Target.raw.param4 = result.Read(28); + temp.Target.param_string = result.Read(29); + temp.Target.x = result.Read(30); + temp.Target.y = result.Read(31); + temp.Target.z = result.Read(32); + temp.Target.o = result.Read(33); //check target if (!IsTargetValid(temp)) @@ -657,6 +659,22 @@ namespace Game.AI Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused event_param{index + 1} with value {value}, it should be 0."); } + bool eventUsesStringParam() + { + switch (e.GetEventType()) + { + case SmartEvents.SceneTrigger: + return true; + default: + break; + } + + return false; + } + + if (!eventUsesStringParam() && !e.Event.param_string.IsEmpty()) + Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused event_param_string with value {e.Event.param_string}, it should be NULL."); + return true; } @@ -834,6 +852,22 @@ namespace Game.AI Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused action_param{index + 1} with value {value}, it should be 0."); } + bool actionUsesStringParam() + { + switch (e.GetActionType()) + { + case SmartActions.CrossCast: + return true; + default: + break; + } + + return false; + }; + + if (!actionUsesStringParam() && !e.Action.param_string.IsEmpty()) + Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused action_param_string with value {e.Action.param_string}, it should be NULL."); + return true; } @@ -901,6 +935,27 @@ namespace Game.AI Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused target_param{index + 1} with value {value}, it must be 0, skipped."); } + bool targetUsesStringParam() + { + switch (e.GetTargetType()) + { + case SmartTargets.CreatureRange: + case SmartTargets.CreatureDistance: + case SmartTargets.GameobjectRange: + case SmartTargets.GameobjectDistance: + case SmartTargets.ClosestCreature: + case SmartTargets.ClosestGameobject: + return true; + default: + break; + } + + return false; + } + + if (!targetUsesStringParam() && !e.Target.param_string.IsEmpty()) + Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused target_param_string with value {e.Target.param_string}, it should be NULL."); + return true; } @@ -3172,6 +3227,9 @@ namespace Game.AI [FieldOffset(4)] public Raw raw; + [FieldOffset(32)] + public string param_string; + #region Stucts public struct Talk { @@ -3241,6 +3299,7 @@ namespace Game.AI public uint targetParam1; public uint targetParam2; public uint targetParam3; + public uint targetParam4; } public struct SummonCreature { @@ -3807,6 +3866,9 @@ namespace Game.AI [FieldOffset(20)] public Raw raw; + [FieldOffset(36)] + public string param_string; + #region Structs public struct HostilRandom { diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index ede992c9e..2143a9e19 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -1575,7 +1575,7 @@ namespace Game.AI if (targets.Empty()) break; - List casters = GetTargets(CreateSmartEvent(SmartEvents.UpdateIc, 0, 0, 0, 0, 0, 0, SmartActions.None, 0, 0, 0, 0, 0, 0, 0, (SmartTargets)e.Action.crossCast.targetType, e.Action.crossCast.targetParam1, e.Action.crossCast.targetParam2, e.Action.crossCast.targetParam3, 0, 0), unit); + List casters = GetTargets(CreateSmartEvent(SmartEvents.UpdateIc, 0, 0, 0, 0, 0, 0, SmartActions.None, 0, 0, 0, 0, 0, 0, 0, (SmartTargets)e.Action.crossCast.targetType, e.Action.crossCast.targetParam1, e.Action.crossCast.targetParam2, e.Action.crossCast.targetParam3, e.Action.crossCast.targetParam4, e.Action.param_string, 0), unit); CastSpellExtraArgs args = new(); if (e.Action.crossCast.castFlags.HasAnyFlag((uint)SmartCastFlags.Triggered)) @@ -2515,7 +2515,7 @@ namespace Game.AI SmartScriptHolder CreateSmartEvent(SmartEvents e, SmartEventFlags event_flags, uint event_param1, uint event_param2, uint event_param3, uint event_param4, uint event_param5, SmartActions action, uint action_param1, uint action_param2, uint action_param3, uint action_param4, uint action_param5, uint action_param6, uint action_param7, - SmartTargets t, uint target_param1, uint target_param2, uint target_param3, uint target_param4, uint phaseMask) + SmartTargets t, uint target_param1, uint target_param2, uint target_param3, uint target_param4, string targetParamString, uint phaseMask) { SmartScriptHolder script = new(); script.Event.type = e; @@ -2542,6 +2542,7 @@ namespace Game.AI script.Target.raw.param2 = target_param2; script.Target.raw.param3 = target_param3; script.Target.raw.param4 = target_param4; + script.Target.param_string = targetParamString; script.SourceType = SmartScriptType.Creature; InitTimer(script); @@ -2694,18 +2695,9 @@ namespace Game.AI break; } - List units = GetWorldObjectsInDist(e.Target.unitRange.maxDist); - foreach (var obj in units) - { - if (!IsCreature(obj)) - continue; - - if (_me != null && _me == obj) - continue; - - if ((e.Target.unitRange.creature == 0 || obj.ToCreature().GetEntry() == e.Target.unitRange.creature) && refObj.IsInRange(obj, e.Target.unitRange.minDist, e.Target.unitRange.maxDist)) - targets.Add(obj); - } + List creatures = refObj.GetCreatureListWithOptionsInGrid(e.Target.unitRange.maxDist, + new FindCreatureOptions() { CreatureId = e.Target.unitRange.creature != 0 ? e.Target.unitRange.creature : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null, }); + targets.AddRange(creatures.Where(target => !refObj.IsWithinDist(target, e.Target.unitRange.minDist))); if (e.Target.unitRange.maxSize != 0) targets.RandomResize(e.Target.unitRange.maxSize); @@ -2713,42 +2705,19 @@ namespace Game.AI } case SmartTargets.CreatureDistance: { - List units = GetWorldObjectsInDist(e.Target.unitDistance.dist); - foreach (var obj in units) - { - if (!IsCreature(obj)) - continue; + if (baseObject == null) + break; - if (_me != null && _me == obj) - continue; + List creatures = baseObject.GetCreatureListWithOptionsInGrid(e.Target.unitDistance.dist, + new FindCreatureOptions() { CreatureId = e.Target.unitDistance.creature != 0 ? e.Target.unitDistance.creature : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null }); - if (e.Target.unitDistance.creature == 0 || obj.ToCreature().GetEntry() == e.Target.unitDistance.creature) - targets.Add(obj); - } + targets.Clear(); + targets.AddRange(creatures); if (e.Target.unitDistance.maxSize != 0) targets.RandomResize(e.Target.unitDistance.maxSize); break; } - case SmartTargets.GameobjectDistance: - { - List units = GetWorldObjectsInDist(e.Target.goDistance.dist); - foreach (var obj in units) - { - if (!IsGameObject(obj)) - continue; - - if (_go != null && _go == obj) - continue; - - if (e.Target.goDistance.entry == 0 || obj.ToGameObject().GetEntry() == e.Target.goDistance.entry) - targets.Add(obj); - } - - if (e.Target.goDistance.maxSize != 0) - targets.RandomResize(e.Target.goDistance.maxSize); - break; - } case SmartTargets.GameobjectRange: { WorldObject refObj = baseObject; @@ -2761,23 +2730,29 @@ namespace Game.AI break; } - List units = GetWorldObjectsInDist(e.Target.goRange.maxDist); - foreach (var obj in units) - { - if (!IsGameObject(obj)) - continue; - - if (_go != null && _go == obj) - continue; - - if ((e.Target.goRange.entry == 0 || obj.ToGameObject().GetEntry() == e.Target.goRange.entry) && refObj.IsInRange(obj, e.Target.goRange.minDist, e.Target.goRange.maxDist)) - targets.Add(obj); - } + List gameObjects = refObj.GetGameObjectListWithOptionsInGrid(e.Target.goRange.maxDist, + new FindGameObjectOptions() { GameObjectId = e.Target.goRange.entry != 0 ? e.Target.goRange.entry : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null }); + targets.AddRange(gameObjects.Where(target => !refObj.IsWithinDist(target, e.Target.goRange.minDist))); if (e.Target.goRange.maxSize != 0) targets.RandomResize(e.Target.goRange.maxSize); break; } + case SmartTargets.GameobjectDistance: + { + if (baseObject == null) + break; + + List gameObjects = baseObject.GetGameObjectListWithOptionsInGrid(e.Target.goDistance.dist, + new FindGameObjectOptions() { GameObjectId = e.Target.goDistance.entry != 0 ? e.Target.goDistance.entry : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null }); + + targets.Clear(); + targets.AddRange(gameObjects); + + if (e.Target.goDistance.maxSize != 0) + targets.RandomResize(e.Target.goDistance.maxSize); + break; + } case SmartTargets.CreatureGuid: { if (scriptTrigger == null && baseObject == null) @@ -2808,20 +2783,21 @@ namespace Game.AI } case SmartTargets.PlayerRange: { - List units = GetWorldObjectsInDist(e.Target.playerRange.maxDist); - if (!units.Empty() && baseObject != null) - foreach (var obj in units) - if (IsPlayer(obj) && baseObject.IsInRange(obj, e.Target.playerRange.minDist, e.Target.playerRange.maxDist)) - targets.Add(obj); + if (baseObject == null) + break; + + List players = baseObject.GetPlayerListInGrid(e.Target.playerRange.maxDist); + targets.AddRange(players.Where(target => !baseObject.IsWithinDist(target, e.Target.playerRange.minDist))); break; } case SmartTargets.PlayerDistance: { - List units = GetWorldObjectsInDist(e.Target.playerDistance.dist); - foreach (var obj in units) - if (IsPlayer(obj)) - targets.Add(obj); + if (baseObject == null) + break; + + List players = baseObject.GetPlayerListInGrid(e.Target.playerDistance.dist); + targets.AddRange(players); break; } case SmartTargets.Stored: @@ -2854,7 +2830,9 @@ namespace Game.AI break; } - Creature target = refObj.FindNearestCreature(e.Target.unitClosest.entry, e.Target.unitClosest.dist != 0 ? e.Target.unitClosest.dist : 100, e.Target.unitClosest.dead == 0); + Creature target = refObj.FindNearestCreatureWithOptions(e.Target.unitClosest.dist != 0 ? e.Target.unitClosest.dist : 100, + new FindCreatureOptions() { CreatureId = e.Target.unitClosest.entry, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null, IsAlive = e.Target.unitClosest.dead == 0 }); + if (target != null) targets.Add(target); break; @@ -2871,7 +2849,9 @@ namespace Game.AI break; } - GameObject target = refObj.FindNearestGameObject(e.Target.goClosest.entry, e.Target.goClosest.dist != 0 ? e.Target.goClosest.dist : 100); + GameObject target = refObj.FindNearestGameObjectWithOptions(e.Target.goClosest.dist != 0 ? e.Target.goClosest.dist : 100, + new FindGameObjectOptions() { GameObjectId = e.Target.goClosest.entry, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null }); + if (target != null) targets.Add(target); break; @@ -3010,19 +2990,6 @@ namespace Game.AI return targets; } - List GetWorldObjectsInDist(float dist) - { - List targets = new(); - WorldObject obj = GetBaseObject(); - if (obj == null) - return targets; - - var u_check = new AllWorldObjectsInRange(obj, dist); - var searcher = new WorldObjectListSearcher(obj, targets, u_check); - Cell.VisitAllObjects(obj, searcher, dist); - return targets; - } - void ProcessEvent(SmartScriptHolder e, Unit unit = null, uint var0 = 0, uint var1 = 0, bool bvar = false, SpellInfo spell = null, GameObject gob = null, string varString = "") { if (!e.Active && e.GetEventType() != SmartEvents.Link) diff --git a/Source/Game/Chat/Commands/NPCCommands.cs b/Source/Game/Chat/Commands/NPCCommands.cs index fff4b61a8..df3fc6da8 100644 --- a/Source/Game/Chat/Commands/NPCCommands.cs +++ b/Source/Game/Chat/Commands/NPCCommands.cs @@ -141,7 +141,7 @@ namespace Game.Chat handler.SendSysMessage(CypherStrings.NpcinfoArmor, target.GetArmor()); handler.SendSysMessage(CypherStrings.NpcinfoPosition, target.GetPositionX(), target.GetPositionY(), target.GetPositionZ()); handler.SendSysMessage(CypherStrings.ObjectinfoAiInfo, target.GetAIName(), target.GetScriptName()); - handler.SendSysMessage(CypherStrings.ObjectinfoStringIds, target.GetStringIds()[0], target.GetStringIds()[1], target.GetStringIds()[2]); + handler.SendSysMessage(CypherStrings.ObjectinfoStringIds, target.GetStringId(StringIdType.Template), target.GetStringId(StringIdType.Spawn), target.GetStringId(StringIdType.Script)); handler.SendSysMessage(CypherStrings.NpcinfoReactstate, target.GetReactState()); var ai = target.GetAI(); if (ai != null) diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 82ede0625..dd77e2902 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -609,8 +609,10 @@ namespace Game.Entities var check = new AnyUnitInObjectRangeCheck(this, radius, check3D); if (IsStaticSpawn()) { - var searcher = new PlayerListSearcher(this, targetList, check); + List temp = new List(); + var searcher = new PlayerListSearcher(this, temp, check); Cell.VisitWorldObjects(this, searcher, GetMaxSearchRadius()); + targetList.AddRange(temp); } else { diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 1036ace80..46c305ea9 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -2943,7 +2943,6 @@ namespace Game.Entities } } - public string[] GetStringIds() { return m_stringIds; } public string GetStringId(StringIdType type) { return m_stringIds[(int)type]; } public VendorItemData GetVendorItems() diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 43c6ed931..93855d18f 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -2693,7 +2693,6 @@ namespace Game.Entities } } - public string[] GetStringIds() { return m_stringIds; } public string GetStringId(StringIdType type) { return m_stringIds[(int)type]; } public override string GetName(Locale locale = Locale.enUS) @@ -4592,7 +4591,7 @@ namespace Game.Entities void HandleHeartbeat() { // update player list inside control zone - List targetList = new(); + List targetList = new(); SearchTargets(targetList); int oldControllingTeam = GetControllingTeam(); @@ -4641,7 +4640,7 @@ namespace Game.Entities player.SendUpdateWorldState(_owner.GetGoInfo().ControlZone.worldstate2, (uint)roundedValue); } - void SearchTargets(List targetList) + void SearchTargets(List targetList) { AnyUnitInObjectRangeCheck check = new(_owner, _owner.GetGoInfo().ControlZone.radius, true); PlayerListSearcher searcher = new(_owner, targetList, check); @@ -4649,7 +4648,7 @@ namespace Game.Entities HandleUnitEnterExit(targetList); } - float CalculatePointsPerSecond(List targetList) + float CalculatePointsPerSecond(List targetList) { int delta = 0; @@ -4683,7 +4682,7 @@ namespace Game.Entities return percentageIncrease; } - void HandleUnitEnterExit(List newTargetList) + void HandleUnitEnterExit(List newTargetList) { List exitPlayers = new(_insidePlayers); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 5e90cf3f0..3976891d9 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -2887,15 +2887,17 @@ namespace Game.Entities return gameobjectList; } - void GetGameObjectListWithOptionsInGrid(List gameObjectContainer, float maxSearchRange, FindGameObjectOptions options) + public List GetGameObjectListWithOptionsInGrid(float maxSearchRange, FindGameObjectOptions options) { + List gameobjectList = new(); InRangeCheckCustomizer checkCustomizer = new(this, maxSearchRange); GameObjectWithOptionsInObjectRangeCheck check = new(this, checkCustomizer, options); - GameObjectListSearcher searcher = new(this, gameObjectContainer, check); + GameObjectListSearcher searcher = new(this, gameobjectList, check); if (options.IgnorePhases) searcher.i_phaseShift = PhasingHandler.GetAlwaysVisiblePhaseShift(); Cell.VisitGridObjects(this, searcher, maxSearchRange); + return gameobjectList; } public List GetCreatureListWithEntryInGrid(uint entry = 0, float maxSearchRange = 250.0f) @@ -2921,9 +2923,9 @@ namespace Game.Entities return creatureList; } - public List GetPlayerListInGrid(float maxSearchRange, bool alive = true) + public List GetPlayerListInGrid(float maxSearchRange, bool alive = true) { - List playerList = new(); + List playerList = new(); var checker = new AnyPlayerInObjectRangeCheck(this, maxSearchRange, alive); var searcher = new PlayerListSearcher(this, playerList, checker); @@ -3015,7 +3017,7 @@ namespace Game.Entities if (!IsInWorld) return; - List targets = new(); + List targets = new(); var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false); var searcher = new PlayerListSearcher(this, targets, check); diff --git a/Source/Game/Maps/GridNotifiers.cs b/Source/Game/Maps/GridNotifiers.cs index 5dba841b2..bb5d2c406 100644 --- a/Source/Game/Maps/GridNotifiers.cs +++ b/Source/Game/Maps/GridNotifiers.cs @@ -1830,16 +1830,16 @@ namespace Game.Maps public class PlayerListSearcher : Notifier { PhaseShift i_phaseShift; - List i_objects; + List i_objects; ICheck i_check; - public PlayerListSearcher(WorldObject searcher, List objects, ICheck check) + public PlayerListSearcher(WorldObject searcher, List objects, ICheck check) { i_phaseShift = searcher.GetPhaseShift(); i_objects = objects; i_check = check; } - public PlayerListSearcher(PhaseShift phaseShift, List objects, ICheck check) + public PlayerListSearcher(PhaseShift phaseShift, List objects, ICheck check) { i_phaseShift = phaseShift; i_objects = objects; diff --git a/Source/Scripts/Events/LoveIsInTheAir.cs b/Source/Scripts/Events/LoveIsInTheAir.cs index ad5309acd..18d5a3a01 100644 --- a/Source/Scripts/Events/LoveIsInTheAir.cs +++ b/Source/Scripts/Events/LoveIsInTheAir.cs @@ -51,7 +51,7 @@ namespace Scripts.Events.LoveIsInTheAir bool foundSomeone = false; // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) // required by achievement and "hearts" visual - List playerList = new(); + List playerList = new(); AnyPlayerInObjectRangeCheck checker = new(target, SharedConst.InteractionDistance * 2); PlayerListSearcher searcher = new(target, playerList, checker); Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2); diff --git a/Source/Scripts/Spells/Quest.cs b/Source/Scripts/Spells/Quest.cs index 063a6f62e..a892104cc 100644 --- a/Source/Scripts/Spells/Quest.cs +++ b/Source/Scripts/Spells/Quest.cs @@ -648,7 +648,7 @@ namespace Scripts.Spells.Azerite { Unit caster = GetCaster(); // Check for player that is in 65 y range - List playerList = new(); + List playerList = new(); AnyPlayerInObjectRangeCheck checker = new(caster, 65.0f); PlayerListSearcher searcher = new(caster, playerList, checker); Cell.VisitWorldObjects(caster, searcher, 65.0f); diff --git a/Source/Scripts/World/GameObject.cs b/Source/Scripts/World/GameObject.cs index 0262be388..1b42076c3 100644 --- a/Source/Scripts/World/GameObject.cs +++ b/Source/Scripts/World/GameObject.cs @@ -451,7 +451,7 @@ namespace Scripts.World.GameObjects break; // Neurtal case BrewfestMusicAreasIds.Shattrath: - List playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange()); + List playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange()); foreach (Player player in playersNearby) { if (player.GetTeam() == Team.Horde) @@ -517,7 +517,7 @@ namespace Scripts.World.GameObjects if (!GameEventMgr.IsHolidayActive(HolidayIds.MidsummerFireFestival)) return; - List playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange()); + List playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange()); foreach (Player player in playersNearby) { if (player.GetTeam() == Team.Horde) diff --git a/Source/Scripts/World/NpcsSpecial.cs b/Source/Scripts/World/NpcsSpecial.cs index b32857e68..9c94bae5c 100644 --- a/Source/Scripts/World/NpcsSpecial.cs +++ b/Source/Scripts/World/NpcsSpecial.cs @@ -393,7 +393,7 @@ namespace Scripts.World.NpcsSpecial bool checkNearbyPlayers() { // Returns true if no nearby player has aura "Test Ribbon Pole Channel". - List players = new(); + List players = new(); UnitAuraCheck check = new(true, SpellRibbonDanceCosmetic); PlayerListSearcher searcher = new(me, players, check); Cell.VisitWorldObjects(me, searcher, 10.0f);