diff --git a/Content.IntegrationTests/Tests/DoAfter/DoAfterServerTest.cs b/Content.IntegrationTests/Tests/DoAfter/DoAfterServerTest.cs index 186a6a6d8c..f9e6ddff39 100644 --- a/Content.IntegrationTests/Tests/DoAfter/DoAfterServerTest.cs +++ b/Content.IntegrationTests/Tests/DoAfter/DoAfterServerTest.cs @@ -88,7 +88,7 @@ namespace Content.IntegrationTests.Tests.DoAfter }); await server.WaitRunTicks(3); - Assert.That(data.Cancelled, Is.False); + Assert.That(data.Cancelled, Is.True); await pairTracker.CleanReturnAsync(); } diff --git a/Content.Server/Construction/ConstructionSystem.Interactions.cs b/Content.Server/Construction/ConstructionSystem.Interactions.cs index 5319047054..e39a4c3d39 100644 --- a/Content.Server/Construction/ConstructionSystem.Interactions.cs +++ b/Content.Server/Construction/ConstructionSystem.Interactions.cs @@ -582,6 +582,7 @@ namespace Content.Server.Construction { RaiseLocalEvent(args.Args.Target.Value, args.AdditionalData.CancelEvent); args.Handled = true; + return; } RaiseLocalEvent(args.Args.Target.Value, args.AdditionalData.CompleteEvent); diff --git a/Content.Server/Fluids/EntitySystems/MoppingSystem.cs b/Content.Server/Fluids/EntitySystems/MoppingSystem.cs index 6272279205..eb98c103df 100644 --- a/Content.Server/Fluids/EntitySystems/MoppingSystem.cs +++ b/Content.Server/Fluids/EntitySystems/MoppingSystem.cs @@ -270,7 +270,17 @@ public sealed class MoppingSystem : SharedMoppingSystem private void OnDoAfter(EntityUid uid, AbsorbentComponent component, DoAfterEvent args) { - if (args.Handled || args.Cancelled || args.Args.Target == null) + if (args.Args.Target == null) + return; + + if (args.Cancelled) + { + //Remove the interacting entities or else it breaks the mop + component.InteractingEntities.Remove(args.Args.Target.Value); + return; + } + + if (args.Handled) return; _audio.PlayPvs(args.AdditionalData.Sound, uid); diff --git a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs index 77b56bfa2f..3b608ceb87 100644 --- a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs @@ -77,12 +77,19 @@ namespace Content.Server.Kitchen.EntitySystems if (TryComp(args.Args.Target.Value, out var butcherable)) butcherable.BeingButchered = false; - if (args.Handled || args.Cancelled) + if (args.Cancelled) + { + component.InUse = false; + return; + } + + if (args.Handled) return; if (Spikeable(uid, args.Args.User, args.Args.Target.Value, component, butcherable)) Spike(uid, args.Args.User, args.Args.Target.Value, component); + component.InUse = false; args.Handled = true; } diff --git a/Content.Server/Resist/CanEscapeInventoryComponent.cs b/Content.Server/Resist/CanEscapeInventoryComponent.cs index aff5a0b0e3..b67adfc203 100644 --- a/Content.Server/Resist/CanEscapeInventoryComponent.cs +++ b/Content.Server/Resist/CanEscapeInventoryComponent.cs @@ -1,3 +1,5 @@ +using System.Threading; + namespace Content.Server.Resist; [RegisterComponent] @@ -8,4 +10,9 @@ public sealed class CanEscapeInventoryComponent : Component /// [DataField("baseResistTime")] public float BaseResistTime = 5f; + + [DataField("isEscaping")] + public bool IsEscaping; + + public CancellationTokenSource? CancelToken; } diff --git a/Content.Server/Resist/EscapeInventorySystem.cs b/Content.Server/Resist/EscapeInventorySystem.cs index 2e3fc66ea8..6230b16fc6 100644 --- a/Content.Server/Resist/EscapeInventorySystem.cs +++ b/Content.Server/Resist/EscapeInventorySystem.cs @@ -1,3 +1,4 @@ +using System.Threading; using Content.Server.DoAfter; using Content.Server.Contests; using Robust.Shared.Containers; @@ -65,11 +66,16 @@ public sealed class EscapeInventorySystem : EntitySystem private void AttemptEscape(EntityUid user, EntityUid container, CanEscapeInventoryComponent component, float multiplier = 1f) { + if (component.IsEscaping) + return; + + component.CancelToken = new CancellationTokenSource(); + component.IsEscaping = true; var escapeEvent = new EscapeInventoryEvent(); - var doAfterEventArgs = new DoAfterEventArgs(user, component.BaseResistTime * multiplier, target:container) + var doAfterEventArgs = new DoAfterEventArgs(user, component.BaseResistTime * multiplier, cancelToken: component.CancelToken.Token, target:container) { BreakOnTargetMove = false, - BreakOnUserMove = false, + BreakOnUserMove = true, BreakOnDamage = true, BreakOnStun = true, NeedHand = false @@ -82,17 +88,27 @@ public sealed class EscapeInventorySystem : EntitySystem private void OnEscape(EntityUid uid, CanEscapeInventoryComponent component, DoAfterEvent args) { - if (args.Handled || args.Cancelled) + if (args.Cancelled) + { + component.CancelToken = null; + component.IsEscaping = false; + return; + } + + if (args.Handled) return; Transform(uid).AttachParentToContainerOrGrid(EntityManager); + component.CancelToken = null; + component.IsEscaping = false; args.Handled = true; } private void OnDropped(EntityUid uid, CanEscapeInventoryComponent component, DroppedEvent args) { - //TODO: Enter cancel logic here + component.CancelToken?.Cancel(); + component.CancelToken = null; } private sealed class EscapeInventoryEvent : EntityEventArgs diff --git a/Content.Server/Resist/ResistLockerComponent.cs b/Content.Server/Resist/ResistLockerComponent.cs index 6cf4102d45..7cb2149100 100644 --- a/Content.Server/Resist/ResistLockerComponent.cs +++ b/Content.Server/Resist/ResistLockerComponent.cs @@ -18,8 +18,5 @@ public sealed class ResistLockerComponent : Component [ViewVariables] public bool IsResisting = false; - /// - /// Used to cancel the DoAfter when a locker is open - /// - public Shared.DoAfter.DoAfter? DoAfter; + public CancellationTokenSource? CancelToken; } diff --git a/Content.Server/Resist/ResistLockerSystem.cs b/Content.Server/Resist/ResistLockerSystem.cs index 85b4176d9c..c096d529f4 100644 --- a/Content.Server/Resist/ResistLockerSystem.cs +++ b/Content.Server/Resist/ResistLockerSystem.cs @@ -1,3 +1,4 @@ +using System.Threading; using Content.Server.DoAfter; using Content.Server.Popups; using Content.Server.Storage.Components; @@ -44,7 +45,9 @@ public sealed class ResistLockerSystem : EntitySystem if (!Resolve(target, ref storageComponent, ref resistLockerComponent)) return; - var doAfterEventArgs = new DoAfterEventArgs(user, resistLockerComponent.ResistTime, target:target) + resistLockerComponent.CancelToken = new CancellationTokenSource(); + + var doAfterEventArgs = new DoAfterEventArgs(user, resistLockerComponent.ResistTime, cancelToken:resistLockerComponent.CancelToken.Token, target:target) { BreakOnTargetMove = false, BreakOnUserMove = true, @@ -55,13 +58,13 @@ public sealed class ResistLockerSystem : EntitySystem resistLockerComponent.IsResisting = true; _popupSystem.PopupEntity(Loc.GetString("resist-locker-component-start-resisting"), user, user, PopupType.Large); - resistLockerComponent.DoAfter = _doAfterSystem.DoAfter(doAfterEventArgs); + _doAfterSystem.DoAfter(doAfterEventArgs); } private void OnRemoved(EntityUid uid, ResistLockerComponent component, EntRemovedFromContainerMessage args) { - if (component.DoAfter != null) - _doAfterSystem.Cancel(uid, component.DoAfter); + component.CancelToken?.Cancel(); + component.CancelToken = null; } private void OnDoAfter(EntityUid uid, ResistLockerComponent component, DoAfterEvent args) @@ -69,6 +72,7 @@ public sealed class ResistLockerSystem : EntitySystem if (args.Cancelled) { component.IsResisting = false; + component.CancelToken = null; _popupSystem.PopupEntity(Loc.GetString("resist-locker-component-resist-interrupted"), args.Args.User, args.Args.User, PopupType.Medium); return; } @@ -89,6 +93,7 @@ public sealed class ResistLockerSystem : EntitySystem _entityStorage.TryOpenStorage(args.Args.User, uid); } + component.CancelToken = null; args.Handled = true; } } diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index 8be77f8a0e..6c6add46db 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -467,7 +467,7 @@ public sealed class WiresSystem : EntitySystem } else if (!component.IsScrewing && _toolSystem.HasQuality(args.Used, "Screwing", tool)) { - var toolEvData = new ToolEventData(new WireToolFinishedEvent(uid, args.User)); + var toolEvData = new ToolEventData(new WireToolFinishedEvent(uid, args.User), cancelledEv: new WireToolCanceledEvent(uid)); component.IsScrewing = _toolSystem.UseTool(args.Used, args.User, uid, ScrewTime, new[] { "Screwing" }, toolEvData, toolComponent: tool); args.Handled = component.IsScrewing; diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.cs index d83570d73b..18c92cc700 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.cs @@ -179,19 +179,16 @@ public abstract class SharedDoAfterSystem : EntitySystem /// Use this if you don't have any extra data to send with the DoAfter /// /// The DoAfterEventArgs - public DoAfter DoAfter(DoAfterEventArgs eventArgs) + public void DoAfter(DoAfterEventArgs eventArgs) { var doAfter = CreateDoAfter(eventArgs); doAfter.Done = cancelled => { Send(cancelled, eventArgs); }; - - return doAfter; } private DoAfter CreateDoAfter(DoAfterEventArgs eventArgs) { // Setup - eventArgs.CancelToken = new CancellationToken(); var doAfter = new DoAfter(eventArgs, EntityManager); // Caller's gonna be responsible for this I guess var doAfterComponent = Comp(eventArgs.User);