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.
This commit is contained in:
Pieter-Jan Briers
2023-07-18 22:55:18 +02:00
committed by GitHub
parent 925971472f
commit a90e7585b9
2 changed files with 16 additions and 0 deletions

View File

@@ -39,6 +39,12 @@ public sealed class ParticleAcceleratorControlBoxComponent : Component
[ViewVariables]
public bool Firing = false;
/// <summary>
/// Block re-entrant rescanning.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public bool CurrentlyRescanning = false;
/// <summary>
/// Whether the PA is currently firing or charging to fire.
/// Bounded by <see cref="ParticleAcceleratorPowerState.Standby"/> and <see cref="MaxStrength"/>.

View File

@@ -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<ParticleAcceleratorPartComponent>();
@@ -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);
}