diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index fe23caa47..4bb01a44a 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -638,7 +638,7 @@ namespace Game.Entities else { // Environmental trap: Any player - var check = new AnyPlayerInObjectRangeCheck(this, radius); + var check = new AnyUnitInObjectRangeCheck(this, radius); var searcher = new PlayerSearcher(this, check); Cell.VisitWorldObjects(this, searcher, radius); target = searcher.GetTarget(); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 3d160d438..d17045d35 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -3025,7 +3025,7 @@ namespace Game.Entities public List GetPlayerListInGrid(float maxSearchRange, bool alive = true) { List playerList = new(); - var checker = new AnyPlayerInObjectRangeCheck(this, maxSearchRange, alive); + var checker = new AnyUnitInObjectRangeCheck(this, maxSearchRange, alive); var searcher = new PlayerListSearcher(this, playerList, checker); Cell.VisitWorldObjects(this, searcher, maxSearchRange); @@ -3116,26 +3116,24 @@ namespace Game.Entities if (!IsInWorld) return; - List targets = new(); - var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false); - var searcher = new PlayerListSearcher(this, targets, check); - - Cell.VisitWorldObjects(this, searcher, GetVisibilityRange()); - foreach (Player player in targets) + void destroyer(Player player) { if (player == this) - continue; + return; if (!player.HaveAtClient(this)) - continue; + return; Unit unit = ToUnit(); if (unit != null && unit.GetCharmerGUID() == player.GetGUID())// @todo this is for puppet - continue; + return; DestroyForPlayer(player); player.m_clientGUIDs.Remove(GetGUID()); } + + PlayerDistWorker worker = new(this, GetVisibilityRange(), destroyer); + Cell.VisitWorldObjects(this, worker, GetVisibilityRange()); } public virtual void UpdateObjectVisibility(bool force = true) diff --git a/Source/Game/Maps/GridNotifiers.cs b/Source/Game/Maps/GridNotifiers.cs index 059a46efa..deab53471 100644 --- a/Source/Game/Maps/GridNotifiers.cs +++ b/Source/Game/Maps/GridNotifiers.cs @@ -920,13 +920,20 @@ namespace Game.Maps { WorldObject i_searcher; float i_dist; - IDoWork _do; + Action _do; public PlayerDistWorker(WorldObject searcher, float _dist, IDoWork @do) { i_searcher = searcher; i_dist = _dist; - _do = @do; + _do = @do.Invoke; + } + + public PlayerDistWorker(WorldObject searcher, float _dist, Action destroyer) + { + i_searcher = searcher; + i_dist = _dist; + _do = destroyer; } public override void Visit(IList objs) @@ -2604,31 +2611,6 @@ namespace Game.Maps } } - public class AnyPlayerInObjectRangeCheck : ICheck - { - public AnyPlayerInObjectRangeCheck(WorldObject obj, float range, bool reqAlive = true) - { - _obj = obj; - _range = range; - _reqAlive = reqAlive; - } - - public bool Invoke(Player pl) - { - if (_reqAlive && !pl.IsAlive()) - return false; - - if (!_obj.IsWithinDist(pl, _range)) - return false; - - return true; - } - - WorldObject _obj; - float _range; - bool _reqAlive; - } - class AnyPlayerInPositionRangeCheck : ICheck { public AnyPlayerInPositionRangeCheck(Position pos, float range, bool reqAlive = true) diff --git a/Source/Scripts/Events/LoveIsInTheAir.cs b/Source/Scripts/Events/LoveIsInTheAir.cs index 18d5a3a01..8628c3961 100644 --- a/Source/Scripts/Events/LoveIsInTheAir.cs +++ b/Source/Scripts/Events/LoveIsInTheAir.cs @@ -51,21 +51,15 @@ 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(); - AnyPlayerInObjectRangeCheck checker = new(target, SharedConst.InteractionDistance * 2); - PlayerListSearcher searcher = new(target, playerList, checker); - Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2); - foreach (var playerFound in playerList) + List playerList = target.GetPlayerListInGrid(SharedConst.InteractionDistance * 2); + foreach (Player playerFound in playerList) { - if (playerFound != null) + if (target != playerFound && playerFound.HasAura(GetId())) { - if (target != playerFound && playerFound.HasAura(GetId())) - { - playerFound.CastSpell(playerFound, SpellRomanticPicnicAchiev, true); - target.CastSpell(target, SpellRomanticPicnicAchiev, true); - foundSomeone = true; - break; - } + playerFound.CastSpell(playerFound, SpellRomanticPicnicAchiev, true); + target.CastSpell(target, SpellRomanticPicnicAchiev, true); + foundSomeone = true; + break; } } diff --git a/Source/Scripts/Spells/Quest.cs b/Source/Scripts/Spells/Quest.cs index a892104cc..ba30682b9 100644 --- a/Source/Scripts/Spells/Quest.cs +++ b/Source/Scripts/Spells/Quest.cs @@ -648,16 +648,16 @@ namespace Scripts.Spells.Azerite { Unit caster = GetCaster(); // Check for player that is in 65 y range - List playerList = new(); - AnyPlayerInObjectRangeCheck checker = new(caster, 65.0f); - PlayerListSearcher searcher = new(caster, playerList, checker); - Cell.VisitWorldObjects(caster, searcher, 65.0f); - + List playerList = caster.GetPlayerListInGrid(65.0f); foreach (var player in playerList) + { // Check if found player target is on fly mount or using flying form if (player.HasAuraType(AuraType.Fly) || player.HasAuraType(AuraType.ModIncreaseMountedFlightSpeed)) + { // Summom Fel Cannon (bunny version) at found player caster.SummonCreature(NpcFelCannon2, player.GetPositionX(), player.GetPositionY(), player.GetPositionZ()); + } + } } public override void Register()