Pool NPC entitylookup fields (#21806)
This commit is contained in:
@@ -469,12 +469,13 @@ public sealed partial class NPCSteeringSystem
|
|||||||
{
|
{
|
||||||
var objectRadius = 0.15f;
|
var objectRadius = 0.15f;
|
||||||
var detectionRadius = MathF.Max(0.35f, agentRadius + objectRadius);
|
var detectionRadius = MathF.Max(0.35f, agentRadius + objectRadius);
|
||||||
|
var ents = _entSetPool.Get();
|
||||||
|
_lookup.GetEntitiesInRange(uid, detectionRadius, ents, LookupFlags.Static);
|
||||||
|
|
||||||
foreach (var ent in _lookup.GetEntitiesInRange(uid, detectionRadius, LookupFlags.Static))
|
foreach (var ent in ents)
|
||||||
{
|
{
|
||||||
// TODO: If we can access the door or smth.
|
// TODO: If we can access the door or smth.
|
||||||
if (ent == uid ||
|
if (!_physicsQuery.TryGetComponent(ent, out var otherBody) ||
|
||||||
!_physicsQuery.TryGetComponent(ent, out var otherBody) ||
|
|
||||||
!otherBody.Hard ||
|
!otherBody.Hard ||
|
||||||
!otherBody.CanCollide ||
|
!otherBody.CanCollide ||
|
||||||
(mask & otherBody.CollisionLayer) == 0x0 &&
|
(mask & otherBody.CollisionLayer) == 0x0 &&
|
||||||
@@ -521,6 +522,7 @@ public sealed partial class NPCSteeringSystem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_entSetPool.Return(ents);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -545,12 +547,13 @@ public sealed partial class NPCSteeringSystem
|
|||||||
var detectionRadius = MathF.Max(0.35f, agentRadius + objectRadius);
|
var detectionRadius = MathF.Max(0.35f, agentRadius + objectRadius);
|
||||||
var ourVelocity = body.LinearVelocity;
|
var ourVelocity = body.LinearVelocity;
|
||||||
_factionQuery.TryGetComponent(uid, out var ourFaction);
|
_factionQuery.TryGetComponent(uid, out var ourFaction);
|
||||||
|
var ents = _entSetPool.Get();
|
||||||
|
_lookup.GetEntitiesInRange(uid, detectionRadius, ents, LookupFlags.Dynamic);
|
||||||
|
|
||||||
foreach (var ent in _lookup.GetEntitiesInRange(uid, detectionRadius, LookupFlags.Dynamic))
|
foreach (var ent in ents)
|
||||||
{
|
{
|
||||||
// TODO: If we can access the door or smth.
|
// TODO: If we can access the door or smth.
|
||||||
if (ent == uid ||
|
if (!_physicsQuery.TryGetComponent(ent, out var otherBody) ||
|
||||||
!_physicsQuery.TryGetComponent(ent, out var otherBody) ||
|
|
||||||
!otherBody.Hard ||
|
!otherBody.Hard ||
|
||||||
!otherBody.CanCollide ||
|
!otherBody.CanCollide ||
|
||||||
(mask & otherBody.CollisionLayer) == 0x0 &&
|
(mask & otherBody.CollisionLayer) == 0x0 &&
|
||||||
@@ -602,6 +605,8 @@ public sealed partial class NPCSteeringSystem
|
|||||||
danger[i] = MathF.Max(dot * weight, danger[i]);
|
danger[i] = MathF.Max(dot * weight, danger[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_entSetPool.Return(ents);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ using Robust.Shared.Random;
|
|||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
using Content.Shared.Prying.Systems;
|
using Content.Shared.Prying.Systems;
|
||||||
|
using Microsoft.Extensions.ObjectPool;
|
||||||
|
using Robust.Shared.Threading;
|
||||||
|
|
||||||
namespace Content.Server.NPC.Systems;
|
namespace Content.Server.NPC.Systems;
|
||||||
|
|
||||||
@@ -49,17 +51,16 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
|
|||||||
[Dependency] private readonly IRobustRandom _random = default!;
|
[Dependency] private readonly IRobustRandom _random = default!;
|
||||||
[Dependency] private readonly ClimbSystem _climb = default!;
|
[Dependency] private readonly ClimbSystem _climb = default!;
|
||||||
[Dependency] private readonly DoAfterSystem _doAfter = default!;
|
[Dependency] private readonly DoAfterSystem _doAfter = default!;
|
||||||
[Dependency] private readonly DoorSystem _doors = default!;
|
|
||||||
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
||||||
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
|
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
|
||||||
[Dependency] private readonly PathfindingSystem _pathfindingSystem = default!;
|
[Dependency] private readonly PathfindingSystem _pathfindingSystem = default!;
|
||||||
|
[Dependency] private readonly PryingSystem _pryingSystem = default!;
|
||||||
[Dependency] private readonly SharedInteractionSystem _interaction = default!;
|
[Dependency] private readonly SharedInteractionSystem _interaction = default!;
|
||||||
[Dependency] private readonly SharedMeleeWeaponSystem _melee = default!;
|
[Dependency] private readonly SharedMeleeWeaponSystem _melee = default!;
|
||||||
[Dependency] private readonly SharedMoverController _mover = default!;
|
[Dependency] private readonly SharedMoverController _mover = default!;
|
||||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
[Dependency] private readonly SharedCombatModeSystem _combat = default!;
|
[Dependency] private readonly SharedCombatModeSystem _combat = default!;
|
||||||
[Dependency] private readonly PryingSystem _pryingSystem = default!;
|
|
||||||
|
|
||||||
private EntityQuery<FixturesComponent> _fixturesQuery;
|
private EntityQuery<FixturesComponent> _fixturesQuery;
|
||||||
private EntityQuery<MovementSpeedModifierComponent> _modifierQuery;
|
private EntityQuery<MovementSpeedModifierComponent> _modifierQuery;
|
||||||
@@ -67,6 +68,9 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
|
|||||||
private EntityQuery<PhysicsComponent> _physicsQuery;
|
private EntityQuery<PhysicsComponent> _physicsQuery;
|
||||||
private EntityQuery<TransformComponent> _xformQuery;
|
private EntityQuery<TransformComponent> _xformQuery;
|
||||||
|
|
||||||
|
private ObjectPool<HashSet<EntityUid>> _entSetPool =
|
||||||
|
new DefaultObjectPool<HashSet<EntityUid>>(new SetPolicy<EntityUid>());
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enabled antistuck detection so if an NPC is in the same spot for a while it will re-path.
|
/// Enabled antistuck detection so if an NPC is in the same spot for a while it will re-path.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user