Fix some NPC dancing (#13177)
- Bump the collision avoidance range, seemed okay compared to last time I tried. Means they shouldn't get caught by thindows - Removed the steer frequency because I'm pretty sure that lead to dancing in some instances.
This commit is contained in:
@@ -36,20 +36,6 @@ public sealed class NPCSteeringComponent : Component
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// How many times per second we're allowed to update our steering frequency.
|
|
||||||
/// </summary>
|
|
||||||
public const byte SteerFrequency = 10;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Last time the NPC steered.
|
|
||||||
/// </summary>
|
|
||||||
[ViewVariables]
|
|
||||||
public TimeSpan LastTimeSteer;
|
|
||||||
|
|
||||||
[ViewVariables]
|
|
||||||
public Vector2 LastSteer;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Have we currently requested a path.
|
/// Have we currently requested a path.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -216,7 +216,6 @@ namespace Content.Server.NPC.Systems
|
|||||||
var (steering, _, mover, xform) = npcs[i];
|
var (steering, _, mover, xform) = npcs[i];
|
||||||
|
|
||||||
Steer(steering, mover, xform, modifierQuery, bodyQuery, xformQuery, frameTime);
|
Steer(steering, mover, xform, modifierQuery, bodyQuery, xformQuery, frameTime);
|
||||||
steering.LastSteer = mover.CurTickSprintMovement;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -287,8 +286,7 @@ namespace Content.Server.NPC.Systems
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Pause time
|
/* If you wish to not steer every tick A) Add pause support B) fix overshoots to prevent dancing
|
||||||
// Need it on the paused event which needs an engine PR.
|
|
||||||
var nextSteer = steering.LastTimeSteer + TimeSpan.FromSeconds(1f / NPCSteeringComponent.SteerFrequency);
|
var nextSteer = steering.LastTimeSteer + TimeSpan.FromSeconds(1f / NPCSteeringComponent.SteerFrequency);
|
||||||
|
|
||||||
if (nextSteer > _timing.CurTime)
|
if (nextSteer > _timing.CurTime)
|
||||||
@@ -296,8 +294,8 @@ namespace Content.Server.NPC.Systems
|
|||||||
SetDirection(mover, steering, steering.LastSteer, false);
|
SetDirection(mover, steering, steering.LastSteer, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
steering.LastTimeSteer = _timing.CurTime;
|
|
||||||
var uid = mover.Owner;
|
var uid = mover.Owner;
|
||||||
var interest = steering.Interest;
|
var interest = steering.Interest;
|
||||||
var danger = steering.Danger;
|
var danger = steering.Danger;
|
||||||
@@ -309,7 +307,6 @@ namespace Content.Server.NPC.Systems
|
|||||||
var offsetRot = -_mover.GetParentGridAngle(mover);
|
var offsetRot = -_mover.GetParentGridAngle(mover);
|
||||||
modifierQuery.TryGetComponent(uid, out var modifier);
|
modifierQuery.TryGetComponent(uid, out var modifier);
|
||||||
var moveSpeed = GetSprintSpeed(steering.Owner, modifier);
|
var moveSpeed = GetSprintSpeed(steering.Owner, modifier);
|
||||||
var tickMove = moveSpeed * frameTime;
|
|
||||||
var body = bodyQuery.GetComponent(uid);
|
var body = bodyQuery.GetComponent(uid);
|
||||||
var dangerPoints = steering.DangerPoints;
|
var dangerPoints = steering.DangerPoints;
|
||||||
dangerPoints.Clear();
|
dangerPoints.Clear();
|
||||||
@@ -331,7 +328,7 @@ namespace Content.Server.NPC.Systems
|
|||||||
DebugTools.Assert(!float.IsNaN(interest[0]));
|
DebugTools.Assert(!float.IsNaN(interest[0]));
|
||||||
|
|
||||||
// Avoid static objects like walls
|
// Avoid static objects like walls
|
||||||
CollisionAvoidance(uid, offsetRot, worldPos, agentRadius, tickMove, layer, mask, xform, danger, dangerPoints, bodyQuery, xformQuery);
|
CollisionAvoidance(uid, offsetRot, worldPos, agentRadius, moveSpeed, layer, mask, xform, danger, dangerPoints, bodyQuery, xformQuery);
|
||||||
DebugTools.Assert(!float.IsNaN(danger[0]));
|
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, bodyQuery, xformQuery);
|
||||||
|
|||||||
Reference in New Issue
Block a user