Fix NPC assert (#17770)

This commit is contained in:
metalgearsloth
2023-07-01 23:38:14 +10:00
committed by GitHub
parent 67d7be9978
commit c2e5990c2e
3 changed files with 38 additions and 46 deletions

View File

@@ -19,6 +19,7 @@ using Content.Shared.Weapons.Melee;
using Robust.Server.Player;
using Robust.Shared.Configuration;
using Robust.Shared.Map;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Systems;
using Robust.Shared.Player;
@@ -60,6 +61,11 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedCombatModeSystem _combat = default!;
private EntityQuery<FixturesComponent> _fixturesQuery;
private EntityQuery<PhysicsComponent> _physicsQuery;
private EntityQuery<MovementSpeedModifierComponent> _modifierQuery;
private EntityQuery<TransformComponent> _xformQuery;
/// <summary>
/// Enabled antistuck detection so if an NPC is in the same spot for a while it will re-path.
/// </summary>
@@ -75,16 +81,19 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
private object _obstacles = new();
private ISawmill _sawmill = default!;
public override void Initialize()
{
base.Initialize();
_sawmill = Logger.GetSawmill("npc.steering");
_fixturesQuery = GetEntityQuery<FixturesComponent>();
_physicsQuery = GetEntityQuery<PhysicsComponent>();
_modifierQuery = GetEntityQuery<MovementSpeedModifierComponent>();
_xformQuery = GetEntityQuery<TransformComponent>();
#if DEBUG
_sawmill.Level = LogLevel.Warning;
Log.Level = LogLevel.Warning;
#else
_sawmill.Level = LogLevel.Debug;
Log.Level = LogLevel.Debug;
#endif
for (var i = 0; i < InterestDirections; i++)
@@ -226,10 +235,6 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
return;
// Not every mob has the modifier component so do it as a separate query.
var bodyQuery = GetEntityQuery<PhysicsComponent>();
var modifierQuery = GetEntityQuery<MovementSpeedModifierComponent>();
var xformQuery = GetEntityQuery<TransformComponent>();
var npcs = EntityQuery<ActiveNPCComponent, NPCSteeringComponent, InputMoverComponent, TransformComponent>()
.Select(o => (o.Item1.Owner, o.Item2, o.Item3, o.Item4)).ToArray();
@@ -243,7 +248,7 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
Parallel.For(0, npcs.Length, options, i =>
{
var (uid, steering, mover, xform) = npcs[i];
Steer(uid, steering, mover, xform, modifierQuery, bodyQuery, xformQuery, frameTime, curTime);
Steer(uid, steering, mover, xform, frameTime, curTime);
});
@@ -288,9 +293,6 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
NPCSteeringComponent steering,
InputMoverComponent mover,
TransformComponent xform,
EntityQuery<MovementSpeedModifierComponent> modifierQuery,
EntityQuery<PhysicsComponent> bodyQuery,
EntityQuery<TransformComponent> xformQuery,
float frameTime,
TimeSpan curTime)
{
@@ -319,14 +321,14 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
var interest = steering.Interest;
var danger = steering.Danger;
var agentRadius = steering.Radius;
var worldPos = _transform.GetWorldPosition(xform, xformQuery);
var worldPos = _transform.GetWorldPosition(xform);
var (layer, mask) = _physics.GetHardCollision(uid);
// Use rotation relative to parent to rotate our context vectors by.
var offsetRot = -_mover.GetParentGridAngle(mover);
modifierQuery.TryGetComponent(uid, out var modifier);
_modifierQuery.TryGetComponent(uid, out var modifier);
var moveSpeed = GetSprintSpeed(uid, modifier);
var body = bodyQuery.GetComponent(uid);
var body = _physicsQuery.GetComponent(uid);
var dangerPoints = steering.DangerPoints;
dangerPoints.Clear();
@@ -341,7 +343,7 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
// If seek has arrived at the target node for example then immediately re-steer.
var forceSteer = true;
if (steering.CanSeek && !TrySeek(uid, mover, steering, body, xform, offsetRot, moveSpeed, interest, bodyQuery, frameTime, ref forceSteer))
if (steering.CanSeek && !TrySeek(uid, mover, steering, body, xform, offsetRot, moveSpeed, interest, frameTime, ref forceSteer))
{
SetDirection(mover, steering, Vector2.Zero);
return;
@@ -360,10 +362,10 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
}
// Avoid static objects like walls
CollisionAvoidance(uid, offsetRot, worldPos, agentRadius, layer, mask, xform, danger, dangerPoints, bodyQuery, xformQuery);
CollisionAvoidance(uid, offsetRot, worldPos, agentRadius, layer, mask, xform, danger);
DebugTools.Assert(!float.IsNaN(danger[0]));
Separation(uid, offsetRot, worldPos, agentRadius, layer, mask, body, xform, danger, bodyQuery, xformQuery);
Separation(uid, offsetRot, worldPos, agentRadius, layer, mask, body, xform, danger);
// Remove the danger map from the interest map.
var desiredDirection = -1;