Make PathfindingSystem take a nap during large explosions (#12309)

This commit is contained in:
Leon Friedrich
2022-11-04 14:24:41 +13:00
committed by GitHub
parent a0627b7558
commit 86ef8c5473
4 changed files with 35 additions and 8 deletions

View File

@@ -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>

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);