Core/AreaTriggers: Optimize target searching
Port From (https://github.com/TrinityCore/TrinityCore/commit/23144d0665504e2e24ee790e900bb8de0df4aa08)
This commit is contained in:
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user