diff --git a/Content.Server/Cuffs/Components/CuffableComponent.cs b/Content.Server/Cuffs/Components/CuffableComponent.cs index 753fe6a507..2e6194ca12 100644 --- a/Content.Server/Cuffs/Components/CuffableComponent.cs +++ b/Content.Server/Cuffs/Components/CuffableComponent.cs @@ -31,16 +31,6 @@ namespace Content.Server.Cuffs.Components [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - /// - /// How many of this entity's hands are currently cuffed. - /// - [ViewVariables] - public int CuffedHandCount => Container.ContainedEntities.Count * 2; - - public EntityUid LastAddedCuffs => Container.ContainedEntities[^1]; - - public IReadOnlyList StoredEntities => Container.ContainedEntities; - private bool _uncuffing; protected override void Initialize() @@ -102,24 +92,10 @@ namespace Content.Server.Cuffs.Components sys.TryDrop(user, handcuff); Container.Insert(handcuff); - CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? ownerHands) && ownerHands.Hands.Count() > CuffedHandCount; - _entMan.EntitySysManager.GetEntitySystem().UpdateCanMove(Owner); - - var ev = new CuffedStateChangeEvent(); - _entMan.EventBus.RaiseLocalEvent(Owner, ref ev, true); - UpdateAlert(); UpdateHeldItems(handcuff); - Dirty(_entMan); return true; } - public void CuffedStateChanged() - { - UpdateAlert(); - var ev = new CuffedStateChangeEvent(); - _entMan.EventBus.RaiseLocalEvent(Owner, ref ev, true); - } - /// /// Adds virtual cuff items to the user's hands. /// @@ -269,6 +245,7 @@ namespace Content.Server.Cuffs.Components SoundSystem.Play(cuff.EndUncuffSound.GetSound(), Filter.Pvs(Owner), Owner); _entMan.EntitySysManager.GetEntitySystem().DeleteInHandsMatching(user, cuffsToRemove); + Container.Remove(cuffsToRemove); if (cuff.BreakOnRemove) { @@ -281,14 +258,6 @@ namespace Content.Server.Cuffs.Components _entMan.EntitySysManager.GetEntitySystem().PickupOrDrop(user, cuffsToRemove); } - CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? handsComponent) && handsComponent.SortedHands.Count() > CuffedHandCount; - _entMan.EntitySysManager.GetEntitySystem().UpdateCanMove(Owner); - - var ev = new CuffedStateChangeEvent(); - _entMan.EventBus.RaiseLocalEvent(Owner, ref ev, true); - UpdateAlert(); - Dirty(_entMan); - if (CuffedHandCount == 0) { user.PopupMessage(Loc.GetString("cuffable-component-remove-cuffs-success-message")); diff --git a/Content.Server/Cuffs/CuffableSystem.cs b/Content.Server/Cuffs/CuffableSystem.cs index 6d220840b1..efb525102d 100644 --- a/Content.Server/Cuffs/CuffableSystem.cs +++ b/Content.Server/Cuffs/CuffableSystem.cs @@ -193,10 +193,7 @@ namespace Content.Server.Cuffs if (dirty) { - cuffable.CanStillInteract = handCount > cuffable.CuffedHandCount; - _actionBlockerSystem.UpdateCanMove(cuffable.Owner); - cuffable.CuffedStateChanged(); - Dirty(cuffable); + UpdateCuffState(owner, cuffable); } } } diff --git a/Content.Shared/Cuffs/Components/SharedCuffableComponent.cs b/Content.Shared/Cuffs/Components/SharedCuffableComponent.cs index 76c25b15d4..9d7f341542 100644 --- a/Content.Shared/Cuffs/Components/SharedCuffableComponent.cs +++ b/Content.Shared/Cuffs/Components/SharedCuffableComponent.cs @@ -13,6 +13,16 @@ namespace Content.Shared.Cuffs.Components [Dependency] private readonly IEntitySystemManager _sysMan = default!; [Dependency] private readonly IComponentFactory _componentFactory = default!; + /// + /// How many of this entity's hands are currently cuffed. + /// + [ViewVariables] + public int CuffedHandCount => Container.ContainedEntities.Count * 2; + + public EntityUid LastAddedCuffs => Container.ContainedEntities[^1]; + + public IReadOnlyList StoredEntities => Container.ContainedEntities; + /// /// Container of various handcuffs currently applied to the entity. /// diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 6bf5b2b27f..db17972ac8 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -1,24 +1,33 @@ using Content.Shared.ActionBlocker; +using Content.Shared.Alert; using Content.Shared.Cuffs.Components; using Content.Shared.DragDrop; +using Content.Shared.Hands.Components; using Content.Shared.Interaction.Events; using Content.Shared.Inventory.Events; using Content.Shared.Item; -using Content.Shared.Movement; using Content.Shared.Movement.Events; using Content.Shared.Physics.Pull; using Content.Shared.Pulling.Components; using Content.Shared.Pulling.Events; +using Content.Shared.Rejuvenate; +using Robust.Shared.Containers; namespace Content.Shared.Cuffs { public abstract class SharedCuffableSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly AlertsSystem _alerts = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnCuffCountChanged); + SubscribeLocalEvent(OnCuffCountChanged); + SubscribeLocalEvent(OnRejuvenate); + SubscribeLocalEvent(HandleStopPull); SubscribeLocalEvent(HandleMoveAttempt); SubscribeLocalEvent(CheckAct); @@ -33,6 +42,36 @@ namespace Content.Shared.Cuffs SubscribeLocalEvent(OnPull); } + private void OnRejuvenate(EntityUid uid, SharedCuffableComponent component, RejuvenateEvent args) + { + _container.EmptyContainer(component.Container, true, attachToGridOrMap: true); + } + + private void OnCuffCountChanged(EntityUid uid, SharedCuffableComponent component, ContainerModifiedMessage args) + { + if (args.Container == component.Container) + UpdateCuffState(uid, component); + } + + public void UpdateCuffState(EntityUid uid, SharedCuffableComponent component) + { + var canInteract = TryComp(uid, out SharedHandsComponent? hands) && hands.Hands.Count > component.CuffedHandCount; + + if (canInteract == component.CanStillInteract) + return; + + component.CanStillInteract = canInteract; + Dirty(component); + _blocker.UpdateCanMove(uid); + + if (component.CanStillInteract) + _alerts.ClearAlert(uid, AlertType.Handcuffed); + else + _alerts.ShowAlert(uid, AlertType.Handcuffed); + + var ev = new CuffedStateChangeEvent(); + RaiseLocalEvent(uid, ref ev); + } private void OnBeingPulledAttempt(EntityUid uid, SharedCuffableComponent component, BeingPulledAttemptEvent args) {