From a90e7585b96e6e9b29e79aed7a78c0eed7840152 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Tue, 18 Jul 2023 22:55:18 +0200 Subject: [PATCH] More PA fixes (#18131) If the PA Control Box isn't rotated to match the Fuel Chamber, it actually rotates itself to match. This rotation triggered a rotation event, which in turn caused RescanParts() to run again, re-entrantly. This broke everything. Fixed by adding a boolean to just guard against this. --- .../ParticleAcceleratorControlBoxComponent.cs | 6 ++++++ .../EntitySystems/ParticleAcceleratorSystem.Parts.cs | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/Content.Server/ParticleAccelerator/Components/ParticleAcceleratorControlBoxComponent.cs b/Content.Server/ParticleAccelerator/Components/ParticleAcceleratorControlBoxComponent.cs index a48d7576e2..035c6ead72 100644 --- a/Content.Server/ParticleAccelerator/Components/ParticleAcceleratorControlBoxComponent.cs +++ b/Content.Server/ParticleAccelerator/Components/ParticleAcceleratorControlBoxComponent.cs @@ -39,6 +39,12 @@ public sealed class ParticleAcceleratorControlBoxComponent : Component [ViewVariables] public bool Firing = false; + /// + /// Block re-entrant rescanning. + /// + [ViewVariables(VVAccess.ReadWrite)] + public bool CurrentlyRescanning = false; + /// /// Whether the PA is currently firing or charging to fire. /// Bounded by and . diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs index fc8272185d..860fbdcefe 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs @@ -23,6 +23,9 @@ public sealed partial class ParticleAcceleratorSystem if (!Resolve(uid, ref controller)) return; + if (controller.CurrentlyRescanning) + return; + SwitchOff(uid, user, controller); var partQuery = GetEntityQuery(); @@ -67,6 +70,11 @@ public sealed partial class ParticleAcceleratorSystem return; } + // When we call SetLocalRotation down there to rotate the control box, + // that ends up re-entrantly calling RescanParts() through the move event. + // You'll have to take my word for it that that breaks everything, yeah? + controller.CurrentlyRescanning = true; + // Align ourselves to match fuel chamber orientation. // This means that if you mess up the orientation of the control box it's not a big deal, // because the sprite is far from obvious about the orientation. @@ -112,6 +120,8 @@ public sealed partial class ParticleAcceleratorSystem partState.Master = uid; } + controller.CurrentlyRescanning = false; + UpdatePowerDraw(uid, controller); UpdateUI(uid, controller); }