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 checker = new AnyPlayerInObjectRangeCheck(capturePoint, radius);
var searcher = new PlayerListSearcher(capturePoint, players, checker); var searcher = new PlayerListSearcher(capturePoint, players, checker);
Cell.VisitWorldObjects(capturePoint, searcher, radius); Cell.VisitWorldObjects(capturePoint, searcher, radius);
foreach (var player in players) foreach (Player player in players)
{ {
if (player.IsOutdoorPvPActive()) if (player.IsOutdoorPvPActive())
{ {
+21 -16
View File
@@ -347,6 +347,21 @@ namespace Game.Entities
HandleUnitEnterExit(targetList); 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) void SearchUnitInSphere(List<Unit> targetList)
{ {
float radius = GetTemplate().SphereDatas.Radius; float radius = GetTemplate().SphereDatas.Radius;
@@ -358,9 +373,7 @@ namespace Game.Entities
} }
} }
var check = new AnyUnitInObjectRangeCheck(this, radius); SearchUnits(targetList, radius, true);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
} }
void SearchUnitInBox(List<Unit> targetList) void SearchUnitInBox(List<Unit> targetList)
@@ -374,9 +387,7 @@ namespace Game.Entities
extentsZ = GetTemplate().BoxDatas.Extents[2]; extentsZ = GetTemplate().BoxDatas.Extents[2];
} }
var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); SearchUnits(targetList, GetTemplate().MaxSearchRadius, false);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
float halfExtentsX = extentsX / 2.0f; float halfExtentsX = extentsX / 2.0f;
float halfExtentsY = extentsY / 2.0f; float halfExtentsY = extentsY / 2.0f;
@@ -398,30 +409,24 @@ namespace Game.Entities
void SearchUnitInPolygon(List<Unit> targetList) void SearchUnitInPolygon(List<Unit> targetList)
{ {
var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); SearchUnits(targetList, GetTemplate().MaxSearchRadius, false);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
float height = GetTemplate().PolygonDatas.Height; float height = GetTemplate().PolygonDatas.Height;
float minZ = GetPositionZ() - height; float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height; float maxZ = GetPositionZ() + height;
targetList.RemoveAll(unit => targetList.RemoveAll(unit => !CheckIsInPolygon2D(unit) || unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
!CheckIsInPolygon2D(unit) || unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
} }
void SearchUnitInCylinder(List<Unit> targetList) void SearchUnitInCylinder(List<Unit> targetList)
{ {
var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); SearchUnits(targetList, GetTemplate().MaxSearchRadius, false);
var searcher = new UnitListSearcher(this, targetList, check);
Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
float height = GetTemplate().CylinderDatas.Height; float height = GetTemplate().CylinderDatas.Height;
float minZ = GetPositionZ() - height; float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height; float maxZ = GetPositionZ() + height;
targetList.RemoveAll(unit => unit.GetPositionZ() < minZ targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
|| unit.GetPositionZ() > maxZ);
} }
void HandleUnitEnterExit(List<Unit> newTargetList) 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 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 spellInfo.HasAttribute(SpellAttr5.DontTurnDuringCast))) // client gets confused if we attempt to turn at the regularly scheduled update packet
{ {
List<Player> playersNearby = GetPlayerListInGrid(GetVisibilityRange()); List<Unit> playersNearby = GetPlayerListInGrid(GetVisibilityRange());
foreach (var player in playersNearby) foreach (Player player in playersNearby)
{ {
// only update players that are known to the client (have already been created) // only update players that are known to the client (have already been created)
if (player.HaveAtClient(this)) if (player.HaveAtClient(this))
+5 -4
View File
@@ -1578,9 +1578,9 @@ namespace Game.Entities
Cell.VisitGridObjects(this, searcher, maxSearchRange); 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 checker = new AnyPlayerInObjectRangeCheck(this, maxSearchRange);
var searcher = new PlayerListSearcher(this, playerList, checker); var searcher = new PlayerListSearcher(this, playerList, checker);
@@ -1633,12 +1633,13 @@ namespace Game.Entities
{ {
if (!IsInWorld) if (!IsInWorld)
return; return;
List<Player> targets = new List<Player>();
List<Unit> targets = new List<Unit>();
var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false); var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false);
var searcher = new PlayerListSearcher(this, targets, check); var searcher = new PlayerListSearcher(this, targets, check);
Cell.VisitWorldObjects(this, searcher, GetVisibilityRange()); Cell.VisitWorldObjects(this, searcher, GetVisibilityRange());
foreach (var player in targets) foreach (Player player in targets)
{ {
if (player == this) if (player == this)
continue; continue;
+2 -2
View File
@@ -1760,7 +1760,7 @@ namespace Game.Maps
} }
public class PlayerListSearcher : Notifier 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; _searcher = searcher;
i_objects = objects; i_objects = objects;
@@ -1779,7 +1779,7 @@ namespace Game.Maps
} }
WorldObject _searcher; WorldObject _searcher;
List<Player> i_objects; List<Unit> i_objects;
ICheck<Player> i_check; 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 checker = new AnyPlayerInObjectRangeCheck(m_capturePoint, radius);
var searcher = new PlayerListSearcher(m_capturePoint, players, checker); var searcher = new PlayerListSearcher(m_capturePoint, players, checker);
Cell.VisitWorldObjects(m_capturePoint, searcher, radius); Cell.VisitWorldObjects(m_capturePoint, searcher, radius);
foreach (var player in players) foreach (Player player in players)
{ {
if (player.IsOutdoorPvPActive()) if (player.IsOutdoorPvPActive())
{ {
+2 -2
View File
@@ -189,11 +189,11 @@ namespace Scripts.Spells.Holiday
bool foundSomeone = false; bool foundSomeone = false;
// For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123)
// required by achievement and "hearts" visual // 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); AnyPlayerInObjectRangeCheck checker = new AnyPlayerInObjectRangeCheck(target, SharedConst.InteractionDistance * 2);
var searcher = new PlayerListSearcher(target, playerList, checker); var searcher = new PlayerListSearcher(target, playerList, checker);
Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2); 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) 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(); Unit caster = GetCaster();
// Check for player that is in 65 y range // 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); AnyPlayerInObjectRangeCheck checker = new AnyPlayerInObjectRangeCheck(caster, 65.0f);
PlayerListSearcher searcher = new PlayerListSearcher(caster, playerList, checker); PlayerListSearcher searcher = new PlayerListSearcher(caster, playerList, checker);
Cell.VisitWorldObjects(caster, searcher, 65.0f); 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 // Check if found player target is on fly mount or using flying form
if (player.HasAuraType(AuraType.Fly) || player.HasAuraType(AuraType.ModIncreaseMountedFlightSpeed)) if (player.HasAuraType(AuraType.Fly) || player.HasAuraType(AuraType.ModIncreaseMountedFlightSpeed))
+1 -1
View File
@@ -818,7 +818,7 @@ namespace Scripts.World.NpcSpecial
bool checkNearbyPlayers() bool checkNearbyPlayers()
{ {
// Returns true if no nearby player has aura "Test Ribbon Pole Channel". // 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 check = new UnitAuraCheck<Player>(true, SpellIds.RibbonDanceCosmetic);
var searcher = new PlayerListSearcher(me, players, check); var searcher = new PlayerListSearcher(me, players, check);
Cell.VisitWorldObjects(me, searcher, 10.0f); Cell.VisitWorldObjects(me, searcher, 10.0f);