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);