From 32ba8e4f9d70ced2884a52163bb958b9e2dba8d8 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 23 Nov 2022 19:26:51 +1100 Subject: [PATCH] Cleanup internals (#12719) Co-authored-by: DrSmugleaf --- Content.Server/Alert/Click/ToggleInternals.cs | 32 +--- .../Body/Systems/InternalsSystem.cs | 137 ++++++++---------- 2 files changed, 66 insertions(+), 103 deletions(-) diff --git a/Content.Server/Alert/Click/ToggleInternals.cs b/Content.Server/Alert/Click/ToggleInternals.cs index 3fa7e525f4..96e8e93420 100644 --- a/Content.Server/Alert/Click/ToggleInternals.cs +++ b/Content.Server/Alert/Click/ToggleInternals.cs @@ -19,35 +19,7 @@ public sealed class ToggleInternals : IAlertClick { public void AlertClicked(EntityUid player) { - var entManager = IoCManager.Resolve(); - - if (!entManager.TryGetComponent(player, out var internals)) return; - - var popups = entManager.EntitySysManager.GetEntitySystem(); - var internalsSystem = entManager.EntitySysManager.GetEntitySystem(); - - // Toggle off if they're on - if (internalsSystem.AreInternalsWorking(internals)) - { - internalsSystem.DisconnectTank(internals); - return; - } - - // If they're not on then check if we have a mask to use - if (internals.BreathToolEntity == null) - { - popups.PopupEntity(Loc.GetString("internals-no-breath-tool"), player, Filter.Entities(player)); - return; - } - - var tank = internalsSystem.FindBestGasTank(internals); - - if (tank == null) - { - popups.PopupEntity(Loc.GetString("internals-no-tank"), player, Filter.Entities(player)); - return; - } - - entManager.EntitySysManager.GetEntitySystem().ConnectToInternals(tank); + var internalsSystem = IoCManager.Resolve().GetEntitySystem(); + internalsSystem.ToggleInternals(player, player, false); } } diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs index c7072717c1..3099cae6a9 100644 --- a/Content.Server/Body/Systems/InternalsSystem.cs +++ b/Content.Server/Body/Systems/InternalsSystem.cs @@ -8,7 +8,6 @@ using Content.Shared.Inventory; using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Content.Shared.Verbs; -using Robust.Server.GameObjects; using Content.Server.Popups; using Robust.Shared.Player; using Content.Server.DoAfter; @@ -21,11 +20,11 @@ public sealed class InternalsSystem : EntitySystem [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly AtmosphereSystem _atmos = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly GasTankSystem _gasTank = default!; [Dependency] private readonly HandsSystem _hands = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly DoAfterSystem _doAfter = default!; public override void Initialize() { @@ -35,8 +34,8 @@ public sealed class InternalsSystem : EntitySystem SubscribeLocalEvent(OnInternalsStartup); SubscribeLocalEvent(OnInternalsShutdown); SubscribeLocalEvent>(OnGetInteractionVerbs); - SubscribeLocalEvent(OnToggleOtherInternalsComplete); - SubscribeLocalEvent(OnToggleOtherInternalCanceled); + SubscribeLocalEvent(OnToggleOtherInternalsComplete); + SubscribeLocalEvent(OnToggleOtherInternalCanceled); } private void OnGetInteractionVerbs(EntityUid uid, InternalsComponent component, GetVerbsEvent args) @@ -44,63 +43,11 @@ public sealed class InternalsSystem : EntitySystem if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; - if (!EntityManager.TryGetComponent(args.User, out var actor)) - return; - InteractionVerb verb = new() { Act = () => { - var entManager = IoCManager.Resolve(); - if (!entManager.TryGetComponent(uid, out var internals)) return; - - // Toggle off if they're on - if (AreInternalsWorking(component)) - { - DisconnectTank(component); - return; - } - - // If they're not on then check if we have a mask to use - if (component.BreathToolEntity == null) - { - _popupSystem.PopupEntity(Loc.GetString("internals-no-breath-tool"), args.User, Filter.Entities(args.User)); - return; - } - - var tank = FindBestGasTank(component); - if (tank == null) - { - _popupSystem.PopupEntity(Loc.GetString("internals-no-tank"), args.User, Filter.Entities(args.User)); - return; - } - - // Is the target not you? If yes, use a do-after to give them time to respond. - if (args.User != args.Target) - { - component.CancelToken = new CancellationTokenSource(); - _doAfter.DoAfter(new DoAfterEventArgs(args.User, component.Delay, component.CancelToken.Token, args.Target) - { - BreakOnUserMove = true, - BreakOnDamage = true, - BreakOnStun = true, - BreakOnTargetMove = true, - MovementThreshold = 0.1f, - BroadcastFinishedEvent = new ToggleOtherInternalsCompleteEvent() - { - Component = component, - User = args.User, - Target = args.Target, - Tank = tank - }, - BroadcastCancelledEvent = new ToggleOtherInternalsCancelledEvent() - { - Component = component, - } - }); - return; - } - entManager.EntitySysManager.GetEntitySystem().ConnectToInternals(tank); + ToggleInternals(uid, args.User, false, component); }, Message = Loc.GetString("action-description-internals-toggle"), IconTexture = "/Textures/Interface/VerbIcons/dot.svg.192dpi.png", @@ -110,17 +57,66 @@ public sealed class InternalsSystem : EntitySystem args.Verbs.Add(verb); } - private void OnToggleOtherInternalsComplete(ToggleOtherInternalsCompleteEvent ev) + public void ToggleInternals(EntityUid uid, EntityUid user, bool force, InternalsComponent? internals = null) { - ev.Component.CancelToken = null; - var entManager = IoCManager.Resolve(); - if (ev.Tank != null) - entManager.EntitySysManager.GetEntitySystem().ConnectToInternals(ev.Tank); + if (!Resolve(uid, ref internals, false)) + { + return; + } + + // Toggle off if they're on + if (AreInternalsWorking(internals)) + { + DisconnectTank(internals); + return; + } + + // If they're not on then check if we have a mask to use + if (internals.BreathToolEntity == null) + { + _popupSystem.PopupEntity(Loc.GetString("internals-no-breath-tool"), uid, Filter.Entities(user)); + return; + } + + var tank = FindBestGasTank(internals); + + if (tank == null) + { + _popupSystem.PopupEntity(Loc.GetString("internals-no-tank"), uid, Filter.Entities(user)); + return; + } + + // Is the target not you? If yes, use a do-after to give them time to respond. + if (!force && uid != user) + { + internals.CancelToken?.Cancel(); + internals.CancelToken = new CancellationTokenSource(); + _doAfter.DoAfter(new DoAfterEventArgs(user, internals.Delay, internals.CancelToken.Token, uid) + { + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true, + BreakOnTargetMove = true, + MovementThreshold = 0.1f, + TargetFinishedEvent = new ToggleOtherInternalsCompleteEvent(user, tank), + TargetCancelledEvent = new ToggleOtherInternalsCancelledEvent(), + }); + + return; + } + + _gasTank.ConnectToInternals(tank); } - private static void OnToggleOtherInternalCanceled(ToggleOtherInternalsCancelledEvent ev) + private void OnToggleOtherInternalsComplete(EntityUid uid, InternalsComponent component, ToggleOtherInternalsCompleteEvent ev) { - ev.Component.CancelToken = null; + component.CancelToken = null; + ToggleInternals(uid, ev.User, true, component); + } + + private static void OnToggleOtherInternalCanceled(EntityUid uid, InternalsComponent component, ToggleOtherInternalsCancelledEvent ev) + { + component.CancelToken = null; } private void OnInternalsStartup(EntityUid uid, InternalsComponent component, ComponentStartup args) @@ -269,16 +265,11 @@ public sealed class InternalsSystem : EntitySystem return null; } - private sealed class ToggleOtherInternalsCompleteEvent : EntityEventArgs + private readonly record struct ToggleOtherInternalsCompleteEvent(EntityUid User, GasTankComponent Tank) { - public InternalsComponent Component = default!; - public EntityUid User { get; init; } - public EntityUid Target { get; init; } - public GasTankComponent? Tank { get; init; } + public readonly EntityUid User = User; + public readonly GasTankComponent Tank = Tank; } - private sealed class ToggleOtherInternalsCancelledEvent : EntityEventArgs - { - public InternalsComponent Component = default!; - } + private readonly record struct ToggleOtherInternalsCancelledEvent; }