Fix zipties (#13600)

This commit is contained in:
Leon Friedrich
2023-01-21 02:48:19 +13:00
committed by GitHub
parent 8335f418e1
commit 3965c2efe6
4 changed files with 52 additions and 37 deletions

View File

@@ -31,16 +31,6 @@ namespace Content.Server.Cuffs.Components
[Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IComponentFactory _componentFactory = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!;
/// <summary>
/// How many of this entity's hands are currently cuffed.
/// </summary>
[ViewVariables]
public int CuffedHandCount => Container.ContainedEntities.Count * 2;
public EntityUid LastAddedCuffs => Container.ContainedEntities[^1];
public IReadOnlyList<EntityUid> StoredEntities => Container.ContainedEntities;
private bool _uncuffing; private bool _uncuffing;
protected override void Initialize() protected override void Initialize()
@@ -102,24 +92,10 @@ namespace Content.Server.Cuffs.Components
sys.TryDrop(user, handcuff); sys.TryDrop(user, handcuff);
Container.Insert(handcuff); Container.Insert(handcuff);
CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? ownerHands) && ownerHands.Hands.Count() > CuffedHandCount;
_entMan.EntitySysManager.GetEntitySystem<ActionBlockerSystem>().UpdateCanMove(Owner);
var ev = new CuffedStateChangeEvent();
_entMan.EventBus.RaiseLocalEvent(Owner, ref ev, true);
UpdateAlert();
UpdateHeldItems(handcuff); UpdateHeldItems(handcuff);
Dirty(_entMan);
return true; return true;
} }
public void CuffedStateChanged()
{
UpdateAlert();
var ev = new CuffedStateChangeEvent();
_entMan.EventBus.RaiseLocalEvent(Owner, ref ev, true);
}
/// <summary> /// <summary>
/// Adds virtual cuff items to the user's hands. /// Adds virtual cuff items to the user's hands.
/// </summary> /// </summary>
@@ -269,6 +245,7 @@ namespace Content.Server.Cuffs.Components
SoundSystem.Play(cuff.EndUncuffSound.GetSound(), Filter.Pvs(Owner), Owner); SoundSystem.Play(cuff.EndUncuffSound.GetSound(), Filter.Pvs(Owner), Owner);
_entMan.EntitySysManager.GetEntitySystem<HandVirtualItemSystem>().DeleteInHandsMatching(user, cuffsToRemove); _entMan.EntitySysManager.GetEntitySystem<HandVirtualItemSystem>().DeleteInHandsMatching(user, cuffsToRemove);
Container.Remove(cuffsToRemove);
if (cuff.BreakOnRemove) if (cuff.BreakOnRemove)
{ {
@@ -281,14 +258,6 @@ namespace Content.Server.Cuffs.Components
_entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, cuffsToRemove); _entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, cuffsToRemove);
} }
CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? handsComponent) && handsComponent.SortedHands.Count() > CuffedHandCount;
_entMan.EntitySysManager.GetEntitySystem<ActionBlockerSystem>().UpdateCanMove(Owner);
var ev = new CuffedStateChangeEvent();
_entMan.EventBus.RaiseLocalEvent(Owner, ref ev, true);
UpdateAlert();
Dirty(_entMan);
if (CuffedHandCount == 0) if (CuffedHandCount == 0)
{ {
user.PopupMessage(Loc.GetString("cuffable-component-remove-cuffs-success-message")); user.PopupMessage(Loc.GetString("cuffable-component-remove-cuffs-success-message"));

View File

@@ -193,10 +193,7 @@ namespace Content.Server.Cuffs
if (dirty) if (dirty)
{ {
cuffable.CanStillInteract = handCount > cuffable.CuffedHandCount; UpdateCuffState(owner, cuffable);
_actionBlockerSystem.UpdateCanMove(cuffable.Owner);
cuffable.CuffedStateChanged();
Dirty(cuffable);
} }
} }
} }

View File

@@ -13,6 +13,16 @@ namespace Content.Shared.Cuffs.Components
[Dependency] private readonly IEntitySystemManager _sysMan = default!; [Dependency] private readonly IEntitySystemManager _sysMan = default!;
[Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IComponentFactory _componentFactory = default!;
/// <summary>
/// How many of this entity's hands are currently cuffed.
/// </summary>
[ViewVariables]
public int CuffedHandCount => Container.ContainedEntities.Count * 2;
public EntityUid LastAddedCuffs => Container.ContainedEntities[^1];
public IReadOnlyList<EntityUid> StoredEntities => Container.ContainedEntities;
/// <summary> /// <summary>
/// Container of various handcuffs currently applied to the entity. /// Container of various handcuffs currently applied to the entity.
/// </summary> /// </summary>

View File

@@ -1,24 +1,33 @@
using Content.Shared.ActionBlocker; using Content.Shared.ActionBlocker;
using Content.Shared.Alert;
using Content.Shared.Cuffs.Components; using Content.Shared.Cuffs.Components;
using Content.Shared.DragDrop; using Content.Shared.DragDrop;
using Content.Shared.Hands.Components;
using Content.Shared.Interaction.Events; using Content.Shared.Interaction.Events;
using Content.Shared.Inventory.Events; using Content.Shared.Inventory.Events;
using Content.Shared.Item; using Content.Shared.Item;
using Content.Shared.Movement;
using Content.Shared.Movement.Events; using Content.Shared.Movement.Events;
using Content.Shared.Physics.Pull; using Content.Shared.Physics.Pull;
using Content.Shared.Pulling.Components; using Content.Shared.Pulling.Components;
using Content.Shared.Pulling.Events; using Content.Shared.Pulling.Events;
using Content.Shared.Rejuvenate;
using Robust.Shared.Containers;
namespace Content.Shared.Cuffs namespace Content.Shared.Cuffs
{ {
public abstract class SharedCuffableSystem : EntitySystem public abstract class SharedCuffableSystem : EntitySystem
{ {
[Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly ActionBlockerSystem _blocker = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly AlertsSystem _alerts = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<SharedCuffableComponent, EntRemovedFromContainerMessage>(OnCuffCountChanged);
SubscribeLocalEvent<SharedCuffableComponent, EntInsertedIntoContainerMessage>(OnCuffCountChanged);
SubscribeLocalEvent<SharedCuffableComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<SharedCuffableComponent, StopPullingEvent>(HandleStopPull); SubscribeLocalEvent<SharedCuffableComponent, StopPullingEvent>(HandleStopPull);
SubscribeLocalEvent<SharedCuffableComponent, UpdateCanMoveEvent>(HandleMoveAttempt); SubscribeLocalEvent<SharedCuffableComponent, UpdateCanMoveEvent>(HandleMoveAttempt);
SubscribeLocalEvent<SharedCuffableComponent, AttackAttemptEvent>(CheckAct); SubscribeLocalEvent<SharedCuffableComponent, AttackAttemptEvent>(CheckAct);
@@ -33,6 +42,36 @@ namespace Content.Shared.Cuffs
SubscribeLocalEvent<SharedCuffableComponent, PullStoppedMessage>(OnPull); SubscribeLocalEvent<SharedCuffableComponent, PullStoppedMessage>(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) private void OnBeingPulledAttempt(EntityUid uid, SharedCuffableComponent component, BeingPulledAttemptEvent args)
{ {