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