From e061cb3f8c9dc8ddc26624ead2086dfb41465aae Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Wed, 20 Mar 2024 12:57:39 +0100 Subject: [PATCH] Thrown soap/banana/(etc?) will fail to slip until it lands (#24494) * throw miss * event * whoops Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * fix popup duplication * Separate cancellable event * no popup, no problem * remove leftover stuff --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- Content.Shared/Slippery/SlipperySystem.cs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index 1f602b9b52..d20495cfa6 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -1,9 +1,12 @@ using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Inventory; +using Robust.Shared.Network; +using Content.Shared.Popups; using Content.Shared.StatusEffect; using Content.Shared.StepTrigger.Systems; using Content.Shared.Stunnable; +using Content.Shared.Throwing; using JetBrains.Annotations; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -30,6 +33,7 @@ public sealed class SlipperySystem : EntitySystem SubscribeLocalEvent(HandleAttemptCollide); SubscribeLocalEvent(HandleStepTrigger); SubscribeLocalEvent(OnNoSlipAttempt); + SubscribeLocalEvent(OnThrownSlipAttempt); // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer). SubscribeLocalEvent>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args)); } @@ -52,6 +56,11 @@ public sealed class SlipperySystem : EntitySystem args.Cancel(); } + private void OnThrownSlipAttempt(EntityUid uid, ThrownItemComponent comp, ref SlipCausingAttemptEvent args) + { + args.Cancelled = true; + } + private bool CanSlip(EntityUid uid, EntityUid toSlip) { return !_container.IsEntityInContainer(uid) @@ -68,6 +77,11 @@ public sealed class SlipperySystem : EntitySystem if (attemptEv.Cancelled) return; + var attemptCausingEv = new SlipCausingAttemptEvent(); + RaiseLocalEvent(uid, ref attemptCausingEv); + if (attemptCausingEv.Cancelled) + return; + var ev = new SlipEvent(other); RaiseLocalEvent(uid, ref ev); @@ -107,7 +121,13 @@ public sealed class SlipAttemptEvent : CancellableEntityEventArgs, IInventoryRel } /// -/// This event is raised directed at an entity that CAUSED some other entity to slip (e.g., the banana peel). +/// Raised on an entity that is causing the slip event (e.g, the banana peel), to determine if the slip attempt should be cancelled. /// +/// If the slip should be cancelled +[ByRefEvent] +public record struct SlipCausingAttemptEvent (bool Cancelled); + +/// Raised on an entity that CAUSED some other entity to slip (e.g., the banana peel). +/// The entity being slipped [ByRefEvent] public readonly record struct SlipEvent(EntityUid Slipped); -- 2.51.2