Core/AreaTriggers: Optimize target searching

Port From (https://github.com/TrinityCore/TrinityCore/commit/23144d0665504e2e24ee790e900bb8de0df4aa08)
This commit is contained in:
hondacrx
2021-02-04 12:12:54 -05:00
parent 0784e38a06
commit 0d1bfff206
9 changed files with 39 additions and 33 deletions
+2 -2
View File
@@ -1143,12 +1143,12 @@ namespace Game.BattleFields
}
}
List<Player> players = new List<Player>();
List<Unit> players = new List<Unit>();
var checker = new AnyPlayerInObjectRangeCheck(capturePoint, radius);
var searcher = new PlayerListSearcher(capturePoint, players, checker);
Cell.VisitWorldObjects(capturePoint, searcher, radius);
foreach (var player in players)
foreach (Player player in players)
{
if (player.IsOutdoorPvPActive())
{
+21 -16
View File
@@ -347,6 +347,21 @@ namespace Game.Entities
HandleUnitEnterExit(targetList);
}
void SearchUnits(List<Unit> targetList, float radius, bool check3D)
{
var check = new AnyUnitInObjectRangeCheck(this, radius, check3D);
if (IsServerSide())
{
var searcher = new PlayerListSearcher(this, targetList, check);
Cell.VisitWorldObjects(this, searcher, GetTemplate().MaxSearchRadius);
}
else
{
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
}
}
void SearchUnitInSphere(List<Unit> targetList)
{
float radius = GetTemplate().SphereDatas.Radius;
@@ -358,9 +373,7 @@ namespace Game.Entities
}
}
var check = new AnyUnitInObjectRangeCheck(this, radius);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
SearchUnits(targetList, radius, true);
}
void SearchUnitInBox(List<Unit> targetList)
@@ -374,9 +387,7 @@ namespace Game.Entities
extentsZ = GetTemplate().BoxDatas.Extents[2];
}
var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
SearchUnits(targetList, GetTemplate().MaxSearchRadius, false);
float halfExtentsX = extentsX / 2.0f;
float halfExtentsY = extentsY / 2.0f;
@@ -398,30 +409,24 @@ namespace Game.Entities
void SearchUnitInPolygon(List<Unit> targetList)
{
var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
SearchUnits(targetList, GetTemplate().MaxSearchRadius, false);
float height = GetTemplate().PolygonDatas.Height;
float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height;
targetList.RemoveAll(unit =>
!CheckIsInPolygon2D(unit) || unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
targetList.RemoveAll(unit => !CheckIsInPolygon2D(unit) || unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
}
void SearchUnitInCylinder(List<Unit> targetList)
{
var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
SearchUnits(targetList, GetTemplate().MaxSearchRadius, false);
float height = GetTemplate().CylinderDatas.Height;
float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height;
targetList.RemoveAll(unit => unit.GetPositionZ() < minZ
|| unit.GetPositionZ() > maxZ);
targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
}
void HandleUnitEnterExit(List<Unit> newTargetList)
+2 -2
View File
@@ -2899,8 +2899,8 @@ namespace Game.Entities
if (spellInfo.GetSpellVisual() != 0 && (focusSpell.GetCastTime() == 0 || // if the spell is instant cast
spellInfo.HasAttribute(SpellAttr5.DontTurnDuringCast))) // client gets confused if we attempt to turn at the regularly scheduled update packet
{
List<Player> playersNearby = GetPlayerListInGrid(GetVisibilityRange());
foreach (var player in playersNearby)
List<Unit> playersNearby = GetPlayerListInGrid(GetVisibilityRange());
foreach (Player player in playersNearby)
{
// only update players that are known to the client (have already been created)
if (player.HaveAtClient(this))
+5 -4
View File
@@ -1578,9 +1578,9 @@ namespace Game.Entities
Cell.VisitGridObjects(this, searcher, maxSearchRange);
}
public List<Player> GetPlayerListInGrid(float maxSearchRange)
public List<Unit> GetPlayerListInGrid(float maxSearchRange)
{
List<Player> playerList = new List<Player>();
List<Unit> playerList = new List<Unit>();
var checker = new AnyPlayerInObjectRangeCheck(this, maxSearchRange);
var searcher = new PlayerListSearcher(this, playerList, checker);
@@ -1633,12 +1633,13 @@ namespace Game.Entities
{
if (!IsInWorld)
return;
List<Player> targets = new List<Player>();
List<Unit> targets = new List<Unit>();
var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false);
var searcher = new PlayerListSearcher(this, targets, check);
Cell.VisitWorldObjects(this, searcher, GetVisibilityRange());
foreach (var player in targets)
foreach (Player player in targets)
{
if (player == this)
continue;
+2 -2
View File
@@ -1760,7 +1760,7 @@ namespace Game.Maps
}
public class PlayerListSearcher : Notifier
{
public PlayerListSearcher(WorldObject searcher, List<Player> objects, ICheck<Player> check)
public PlayerListSearcher(WorldObject searcher, List<Unit> objects, ICheck<Player> check)
{
_searcher = searcher;
i_objects = objects;
@@ -1779,7 +1779,7 @@ namespace Game.Maps
}
WorldObject _searcher;
List<Player> i_objects;
List<Unit> i_objects;
ICheck<Player> i_check;
}
+2 -2
View File
@@ -521,12 +521,12 @@ namespace Game.PvP
}
}
List<Player> players = new List<Player>();
List<Unit> players = new List<Unit>();
var checker = new AnyPlayerInObjectRangeCheck(m_capturePoint, radius);
var searcher = new PlayerListSearcher(m_capturePoint, players, checker);
Cell.VisitWorldObjects(m_capturePoint, searcher, radius);
foreach (var player in players)
foreach (Player player in players)
{
if (player.IsOutdoorPvPActive())
{
+2 -2
View File
@@ -189,11 +189,11 @@ namespace Scripts.Spells.Holiday
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<Player> playerList = new List<Player>();
List<Unit> playerList = new List<Unit>();
AnyPlayerInObjectRangeCheck checker = new AnyPlayerInObjectRangeCheck(target, SharedConst.InteractionDistance * 2);
var searcher = new PlayerListSearcher(target, playerList, checker);
Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2);
foreach (var player in playerList)
foreach (Player player in playerList)
{
if (player != target && player.HasAura(GetId())) // && player.GetStandState() == UNIT_STAND_STATE_SIT)
{
+2 -2
View File
@@ -1240,11 +1240,11 @@ namespace Scripts.Spells.Quest
{
Unit caster = GetCaster();
// Check for player that is in 65 y range
List<Player> playerList = new List<Player>();
List<Unit> playerList = new List<Unit>();
AnyPlayerInObjectRangeCheck checker = new AnyPlayerInObjectRangeCheck(caster, 65.0f);
PlayerListSearcher searcher = new PlayerListSearcher(caster, playerList, checker);
Cell.VisitWorldObjects(caster, searcher, 65.0f);
foreach (var player in playerList)
foreach (Player 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))
+1 -1
View File
@@ -818,7 +818,7 @@ namespace Scripts.World.NpcSpecial
bool checkNearbyPlayers()
{
// Returns true if no nearby player has aura "Test Ribbon Pole Channel".
List<Player> players = new List<Player>();
List<Unit> players = new List<Unit>();
var check = new UnitAuraCheck<Player>(true, SpellIds.RibbonDanceCosmetic);
var searcher = new PlayerListSearcher(me, players, check);
Cell.VisitWorldObjects(me, searcher, 10.0f);