Make PathfindingSystem take a nap during large explosions (#12309)
This commit is contained in:
@@ -63,7 +63,8 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
_activeExplosion = null;
|
_activeExplosion = null;
|
||||||
_nodeGroupSystem.Snoozing = false;
|
_nodeGroupSystem.PauseUpdating = false;
|
||||||
|
_pathfindingSystem.PauseUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -107,7 +108,8 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
// just a lil nap
|
// just a lil nap
|
||||||
if (SleepNodeSys)
|
if (SleepNodeSys)
|
||||||
{
|
{
|
||||||
_nodeGroupSystem.Snoozing = true;
|
_nodeGroupSystem.PauseUpdating = true;
|
||||||
|
_pathfindingSystem.PauseUpdating = true;
|
||||||
// snooze grid-chunk regeneration?
|
// snooze grid-chunk regeneration?
|
||||||
// snooze power network (recipients look for new suppliers as wires get destroyed).
|
// snooze power network (recipients look for new suppliers as wires get destroyed).
|
||||||
}
|
}
|
||||||
@@ -136,7 +138,8 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
// Ensure the system does not get stuck in an error-loop.
|
// Ensure the system does not get stuck in an error-loop.
|
||||||
_activeExplosion = null;
|
_activeExplosion = null;
|
||||||
RaiseNetworkEvent(new ExplosionOverlayUpdateEvent(_explosionCounter, int.MaxValue));
|
RaiseNetworkEvent(new ExplosionOverlayUpdateEvent(_explosionCounter, int.MaxValue));
|
||||||
_nodeGroupSystem.Snoozing = false;
|
_nodeGroupSystem.PauseUpdating = false;
|
||||||
|
_pathfindingSystem.PauseUpdating = false;
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -163,7 +166,8 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
RaiseNetworkEvent(new ExplosionOverlayUpdateEvent(_explosionCounter, int.MaxValue));
|
RaiseNetworkEvent(new ExplosionOverlayUpdateEvent(_explosionCounter, int.MaxValue));
|
||||||
|
|
||||||
//wakey wakey
|
//wakey wakey
|
||||||
_nodeGroupSystem.Snoozing = false;
|
_nodeGroupSystem.PauseUpdating = false;
|
||||||
|
_pathfindingSystem.PauseUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Content.Server.Administration.Logs;
|
|||||||
using Content.Server.Atmos.Components;
|
using Content.Server.Atmos.Components;
|
||||||
using Content.Server.Explosion.Components;
|
using Content.Server.Explosion.Components;
|
||||||
using Content.Server.NodeContainer.EntitySystems;
|
using Content.Server.NodeContainer.EntitySystems;
|
||||||
|
using Content.Server.NPC.Pathfinding;
|
||||||
using Content.Shared.Camera;
|
using Content.Shared.Camera;
|
||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
@@ -32,6 +33,7 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
|
|
||||||
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
||||||
[Dependency] private readonly NodeGroupSystem _nodeGroupSystem = default!;
|
[Dependency] private readonly NodeGroupSystem _nodeGroupSystem = default!;
|
||||||
|
[Dependency] private readonly PathfindingSystem _pathfindingSystem = default!;
|
||||||
[Dependency] private readonly SharedCameraRecoilSystem _recoilSystem = default!;
|
[Dependency] private readonly SharedCameraRecoilSystem _recoilSystem = default!;
|
||||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||||
[Dependency] private readonly ThrowingSystem _throwingSystem = default!;
|
[Dependency] private readonly ThrowingSystem _throwingSystem = default!;
|
||||||
@@ -85,14 +87,16 @@ public sealed partial class ExplosionSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
_explosionQueue.Clear();
|
_explosionQueue.Clear();
|
||||||
_activeExplosion = null;
|
_activeExplosion = null;
|
||||||
_nodeGroupSystem.Snoozing = false;
|
_nodeGroupSystem.PauseUpdating = false;
|
||||||
|
_pathfindingSystem.PauseUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Shutdown()
|
public override void Shutdown()
|
||||||
{
|
{
|
||||||
base.Shutdown();
|
base.Shutdown();
|
||||||
UnsubscribeCvars();
|
UnsubscribeCvars();
|
||||||
_nodeGroupSystem.Snoozing = false;
|
_nodeGroupSystem.PauseUpdating = false;
|
||||||
|
_pathfindingSystem.PauseUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnGetResistance(EntityUid uid, ExplosionResistanceComponent component, GetExplosionResistanceEvent args)
|
private void OnGetResistance(EntityUid uid, ExplosionResistanceComponent component, GetExplosionResistanceEvent args)
|
||||||
|
|||||||
@@ -27,6 +27,15 @@ public sealed partial class PathfindingSystem
|
|||||||
public const int PathfindingCollisionMask = (int) CollisionGroup.MobMask;
|
public const int PathfindingCollisionMask = (int) CollisionGroup.MobMask;
|
||||||
public const int PathfindingCollisionLayer = (int) CollisionGroup.MobLayer;
|
public const int PathfindingCollisionLayer = (int) CollisionGroup.MobLayer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If true, UpdateGrid() will not process grids.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Useful if something like a large explosion is in the process of shredding the grid, as it avoids uneccesary
|
||||||
|
/// updating.
|
||||||
|
/// </remarks>
|
||||||
|
public bool PauseUpdating = false;
|
||||||
|
|
||||||
private readonly Stopwatch _stopwatch = new();
|
private readonly Stopwatch _stopwatch = new();
|
||||||
|
|
||||||
// Probably can't pool polys as there might be old pathfinding refs to them.
|
// Probably can't pool polys as there might be old pathfinding refs to them.
|
||||||
@@ -66,6 +75,9 @@ public sealed partial class PathfindingSystem
|
|||||||
|
|
||||||
private void UpdateGrid()
|
private void UpdateGrid()
|
||||||
{
|
{
|
||||||
|
if (PauseUpdating)
|
||||||
|
return;
|
||||||
|
|
||||||
var curTime = _timing.CurTime;
|
var curTime = _timing.CurTime;
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
var updateCount = 0;
|
var updateCount = 0;
|
||||||
|
|||||||
@@ -45,7 +45,14 @@ namespace Content.Server.NodeContainer.EntitySystems
|
|||||||
private int _gen = 1;
|
private int _gen = 1;
|
||||||
private int _groupNetIdCounter = 1;
|
private int _groupNetIdCounter = 1;
|
||||||
|
|
||||||
public bool Snoozing = false;
|
/// <summary>
|
||||||
|
/// If true, UpdateGrid() will not process grids.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Useful if something like a large explosion is in the process of shredding the grid, as it avoids uneccesary
|
||||||
|
/// updating.
|
||||||
|
/// </remarks>
|
||||||
|
public bool PauseUpdating = false;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -135,7 +142,7 @@ namespace Content.Server.NodeContainer.EntitySystems
|
|||||||
{
|
{
|
||||||
base.Update(frameTime);
|
base.Update(frameTime);
|
||||||
|
|
||||||
if (!Snoozing)
|
if (!PauseUpdating)
|
||||||
{
|
{
|
||||||
DoGroupUpdates();
|
DoGroupUpdates();
|
||||||
VisDoUpdate(frameTime);
|
VisDoUpdate(frameTime);
|
||||||
|
|||||||
Reference in New Issue
Block a user