diff --git a/Content.Server/Holopad/HolopadSystem.cs b/Content.Server/Holopad/HolopadSystem.cs index 51cb3876fe..af8c5a36a1 100644 --- a/Content.Server/Holopad/HolopadSystem.cs +++ b/Content.Server/Holopad/HolopadSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Chat.TypingIndicator; using Content.Shared.Holopad; using Content.Shared.IdentityManagement; using Content.Shared.Labels.Components; +using Content.Shared.Power; using Content.Shared.Silicons.StationAi; using Content.Shared.Speech; using Content.Shared.Telephone; @@ -74,6 +75,8 @@ public sealed class HolopadSystem : SharedHolopadSystem SubscribeLocalEvent(OnJumpToCore); SubscribeLocalEvent>(AddToggleProjectorVerb); SubscribeLocalEvent(OnAiRemove); + SubscribeLocalEvent(OnParentChanged); + SubscribeLocalEvent(OnPowerChanged); } #region: Holopad UI bound user interface messages @@ -432,6 +435,17 @@ public sealed class HolopadSystem : SharedHolopadSystem _telephoneSystem.EndTelephoneCalls((entity, entityTelephone)); } + private void OnParentChanged(Entity entity, ref EntParentChangedMessage args) + { + UpdateHolopadControlLockoutStartTime(entity); + } + + private void OnPowerChanged(Entity entity, ref PowerChangedEvent args) + { + if (args.Powered) + UpdateHolopadControlLockoutStartTime(entity); + } + #endregion public override void Update(float frameTime) @@ -678,11 +692,10 @@ public sealed class HolopadSystem : SharedHolopadSystem _telephoneSystem.TerminateTelephoneCalls(sourceTelephoneEntity); // Find all holopads in range of the source - var sourceXform = Transform(source); var receivers = new HashSet>(); - var query = AllEntityQuery(); - while (query.MoveNext(out var receiver, out var receiverHolopad, out var receiverTelephone, out var receiverXform)) + var query = AllEntityQuery(); + while (query.MoveNext(out var receiver, out var receiverHolopad, out var receiverTelephone)) { var receiverTelephoneEntity = new Entity(receiver, receiverTelephone); @@ -745,6 +758,33 @@ public sealed class HolopadSystem : SharedHolopadSystem return linkedHolopads; } + private void UpdateHolopadControlLockoutStartTime(Entity source) + { + if (!TryComp(source, out var sourceTelephone)) + return; + + var sourceTelephoneEntity = new Entity(source, sourceTelephone); + var isDirty = false; + + var query = AllEntityQuery(); + while (query.MoveNext(out var receiver, out var receiverHolopad, out var receiverTelephone)) + { + var receiverTelephoneEntity = new Entity(receiver, receiverTelephone); + + if (!_telephoneSystem.IsSourceInRangeOfReceiver(sourceTelephoneEntity, receiverTelephoneEntity)) + continue; + + if (receiverHolopad.ControlLockoutStartTime > source.Comp.ControlLockoutStartTime) + { + source.Comp.ControlLockoutStartTime = receiverHolopad.ControlLockoutStartTime; + isDirty = true; + } + } + + if (isDirty) + Dirty(source); + } + private void SetHolopadAmbientState(Entity entity, bool isEnabled) { if (TryComp(entity, out var pointLight))