From 8415f085603145f5277fd1ffe54ebb2cc765f0d4 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 11 Sep 2022 16:50:59 +1000 Subject: [PATCH] Update disposals code standards (#11076) Co-authored-by: Kara --- .../Disposal/Mailing/MailingUnitSystem.cs | 8 +- .../Components/ActiveDisposalUnitComponent.cs | 7 + .../Unit/EntitySystems/DisposalUnitSystem.cs | 121 +++++++++--------- 3 files changed, 69 insertions(+), 67 deletions(-) create mode 100644 Content.Server/Disposal/Unit/Components/ActiveDisposalUnitComponent.cs diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs index dfb85947bb..1431a86a1a 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs +++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs @@ -32,10 +32,10 @@ public sealed class MailingUnitSystem : EntitySystem SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnPacketReceived); - SubscribeLocalEvent(OnBeforeFlush); + SubscribeLocalEvent(OnBeforeFlush); SubscribeLocalEvent(OnConfigurationUpdated); SubscribeLocalEvent(HandleActivate); - SubscribeLocalEvent(OnDisposalUnitUIStateChange); + SubscribeLocalEvent(OnDisposalUnitUIStateChange); SubscribeLocalEvent(OnTargetSelected); } @@ -83,7 +83,7 @@ public sealed class MailingUnitSystem : EntitySystem /// /// Prevents the unit from flushing if no target is selected /// - private void OnBeforeFlush(EntityUid uid, MailingUnitComponent component, DisposalUnitSystem.BeforeDisposalFlushEvent args) + private void OnBeforeFlush(EntityUid uid, MailingUnitComponent component, BeforeDisposalFlushEvent args) { if (string.IsNullOrEmpty(component.Target)) { @@ -164,7 +164,7 @@ public sealed class MailingUnitSystem : EntitySystem /// /// Gets called when the disposal unit components ui state changes. This is required because the mailing unit requires a disposal unit component and overrides its ui /// - private void OnDisposalUnitUIStateChange(EntityUid uid, MailingUnitComponent component, DisposalUnitSystem.DisposalUnitUIStateUpdatedEvent args) + private void OnDisposalUnitUIStateChange(EntityUid uid, MailingUnitComponent component, DisposalUnitUIStateUpdatedEvent args) { component.DisposalUnitInterfaceState = args.State; UpdateUserInterface(component); diff --git a/Content.Server/Disposal/Unit/Components/ActiveDisposalUnitComponent.cs b/Content.Server/Disposal/Unit/Components/ActiveDisposalUnitComponent.cs new file mode 100644 index 0000000000..cdac8ef496 --- /dev/null +++ b/Content.Server/Disposal/Unit/Components/ActiveDisposalUnitComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.Disposal.Unit.Components; + +[RegisterComponent] +public sealed class ActiveDisposalUnitComponent : Component +{ + +} diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index 25b78ac030..41eaf72b64 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -7,9 +7,6 @@ using Content.Server.DoAfter; using Content.Server.Hands.Components; using Content.Server.Popups; using Content.Server.Power.Components; -using Content.Server.UserInterface; -using Content.Server.Storage.Components; -using Content.Server.Storage.EntitySystems; using Content.Shared.ActionBlocker; using Content.Shared.Atmos; using Content.Shared.Construction.Components; @@ -21,16 +18,13 @@ using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Item; -using Content.Shared.Movement; using Content.Shared.Movement.Events; using Content.Shared.Popups; using Content.Shared.Throwing; using Content.Shared.Verbs; -using Content.Shared.Storage.Components; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Containers; -using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Random; @@ -40,15 +34,16 @@ namespace Content.Server.Disposal.Unit.EntitySystems { [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly AppearanceSystem _appearance = default!; [Dependency] private readonly AtmosphereSystem _atmosSystem = default!; + [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly DumpableSystem _dumpableSystem = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - - private readonly List _activeDisposals = new(); + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly TransformSystem _transformSystem = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; public override void Initialize() { @@ -187,11 +182,12 @@ namespace Content.Server.Disposal.Unit.EntitySystems public override void Update(float frameTime) { base.Update(frameTime); - for (var i = _activeDisposals.Count - 1; i >= 0; i--) + foreach (var (_, comp) in EntityQuery()) { - var comp = _activeDisposals[i]; - if (!Update(comp, frameTime)) continue; - _activeDisposals.RemoveAt(i); + if (!Update(comp, frameTime)) + continue; + + RemComp(comp.Owner); } } @@ -213,7 +209,8 @@ namespace Content.Server.Disposal.Unit.EntitySystems break; case SharedDisposalUnitComponent.UiButton.Power: TogglePower(component); - SoundSystem.Play("/Audio/Machines/machine_switch.ogg", Filter.Pvs(component.Owner), component.Owner, AudioParams.Default.WithVolume(-2f)); + _audio.PlayPvs(new SoundPathSpecifier("/Audio/Machines/machine_switch.ogg"), component.Owner, + AudioParams.Default.WithVolume(-2f)); break; default: throw new ArgumentOutOfRangeException(); @@ -255,7 +252,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems } args.Handled = true; - component.Owner.GetUIOrNull(SharedDisposalUnitComponent.DisposalUnitUiKey.Key)?.Open(actor.PlayerSession); + _ui.TryOpen(component.Owner, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); } private void HandleAfterInteractUsing(EntityUid uid, DisposalUnitComponent component, AfterInteractUsingEvent args) @@ -263,7 +260,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems if (args.Handled || !args.CanReach) return; - if (!EntityManager.TryGetComponent(args.User, out HandsComponent? hands)) + if (!EntityManager.HasComponent(args.User)) { return; } @@ -311,13 +308,12 @@ namespace Content.Server.Disposal.Unit.EntitySystems component.Container.ForceRemove(entity); } - component.Owner.GetUIOrNull(SharedDisposalUnitComponent.DisposalUnitUiKey.Key)?.CloseAll(); - + _ui.TryCloseAll(component.Owner, SharedDisposalUnitComponent.DisposalUnitUiKey.Key); component.AutomaticEngageToken?.Cancel(); component.AutomaticEngageToken = null; component.Container = null!; - _activeDisposals.Remove(component); + RemComp(uid); } private void HandlePowerChange(EntityUid uid, DisposalUnitComponent component, PowerChangedEvent args) @@ -351,12 +347,11 @@ namespace Content.Server.Disposal.Unit.EntitySystems { if (active) { - if (!_activeDisposals.Contains(component)) - _activeDisposals.Add(component); + EnsureComp(component.Owner); } else { - _activeDisposals.Remove(component); + RemComp(component.Owner); } } @@ -428,7 +423,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems } else { - disposalsBounds = disposalsBody.GetWorldAABB(); + disposalsBounds = _lookup.GetWorldAABB(disposalsBody.Owner); } } @@ -440,7 +435,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems { // TODO: We need to use a specific collision method (which sloth hasn't coded yet) for actual bounds overlaps. // Check for itemcomp as we won't just block the disposal unit "sleeping" for something it can't collide with anyway. - if (!EntityManager.HasComponent(uid) && body.GetWorldAABB().Intersects(disposalsBounds!.Value)) continue; + if (!EntityManager.HasComponent(uid) && _lookup.GetWorldAABB(body.Owner).Intersects(disposalsBounds!.Value)) continue; component.RecentlyEjected.RemoveAt(i); } } @@ -500,7 +495,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems //Allows the MailingUnitSystem to add tags or prevent flushing var beforeFlushArgs = new BeforeDisposalFlushEvent(); - RaiseLocalEvent(component.Owner, beforeFlushArgs, false); + RaiseLocalEvent(component.Owner, beforeFlushArgs); if (beforeFlushArgs.Cancelled) { @@ -552,11 +547,11 @@ namespace Content.Server.Disposal.Unit.EntitySystems public void UpdateInterface(DisposalUnitComponent component, bool powered) { var stateString = Loc.GetString($"{component.State}"); - var state = new SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState(EntityManager.GetComponent(component.Owner).EntityName, stateString, EstimatedFullPressure(component), powered, component.Engaged); - component.Owner.GetUIOrNull(SharedDisposalUnitComponent.DisposalUnitUiKey.Key)?.SetState(state); + var state = new SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState(Name(component.Owner), stateString, EstimatedFullPressure(component), powered, component.Engaged); + _ui.TrySetUiState(component.Owner, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state); var stateUpdatedEvent = new DisposalUnitUIStateUpdatedEvent(state); - RaiseLocalEvent(component.Owner, stateUpdatedEvent, false); + RaiseLocalEvent(component.Owner, stateUpdatedEvent); } private TimeSpan EstimatedFullPressure(DisposalUnitComponent component) @@ -583,40 +578,40 @@ namespace Content.Server.Disposal.Unit.EntitySystems if (!EntityManager.GetComponent(component.Owner).Anchored) { - appearance.SetData(SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.UnAnchored); - appearance.SetData(SharedDisposalUnitComponent.Visuals.Handle, SharedDisposalUnitComponent.HandleState.Normal); - appearance.SetData(SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Off); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.UnAnchored, appearance); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Handle, SharedDisposalUnitComponent.HandleState.Normal, appearance); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Off, appearance); return; } - appearance.SetData(SharedDisposalUnitComponent.Visuals.VisualState, component.Pressure < 1 ? SharedDisposalUnitComponent.VisualState.Charging : SharedDisposalUnitComponent.VisualState.Anchored); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.VisualState, component.Pressure < 1 ? SharedDisposalUnitComponent.VisualState.Charging : SharedDisposalUnitComponent.VisualState.Anchored, appearance); - appearance.SetData(SharedDisposalUnitComponent.Visuals.Handle, component.Engaged + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Handle, component.Engaged ? SharedDisposalUnitComponent.HandleState.Engaged - : SharedDisposalUnitComponent.HandleState.Normal); + : SharedDisposalUnitComponent.HandleState.Normal, appearance); if (!component.Powered) { - appearance.SetData(SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Off); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Off, appearance); return; } if (flush) { - appearance.SetData(SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.Flushing); - appearance.SetData(SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Off); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.Flushing, appearance); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Off, appearance); return; } if (component.Container.ContainedEntities.Count > 0) { - appearance.SetData(SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Full); + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightState.Full, appearance); return; } - appearance.SetData(SharedDisposalUnitComponent.Visuals.Light, component.Pressure < 1 + _appearance.SetData(component.Owner, SharedDisposalUnitComponent.Visuals.Light, component.Pressure < 1 ? SharedDisposalUnitComponent.LightState.Charging - : SharedDisposalUnitComponent.LightState.Ready); + : SharedDisposalUnitComponent.LightState.Ready, appearance); } public void Remove(DisposalUnitComponent component, EntityUid entity) @@ -707,33 +702,33 @@ namespace Content.Server.Disposal.Unit.EntitySystems if (EntityManager.TryGetComponent(entity, out ActorComponent? actor)) { - component.Owner.GetUIOrNull(SharedDisposalUnitComponent.DisposalUnitUiKey.Key)?.Close(actor.PlayerSession); + _ui.TryClose(component.Owner, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); } UpdateVisualState(component); } + } - /// - /// Sent before the disposal unit flushes it's contents. - /// Allows adding tags for sorting and preventing the disposal unit from flushing. - /// - public sealed class BeforeDisposalFlushEvent : CancellableEntityEventArgs + /// + /// Sent before the disposal unit flushes it's contents. + /// Allows adding tags for sorting and preventing the disposal unit from flushing. + /// + public sealed class DisposalUnitUIStateUpdatedEvent : EntityEventArgs + { + public SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState State; + + public DisposalUnitUIStateUpdatedEvent(SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState state) { - public List Tags = new(); - } - - /// - /// Sent before the disposal unit flushes it's contents. - /// Allows adding tags for sorting and preventing the disposal unit from flushing. - /// - public sealed class DisposalUnitUIStateUpdatedEvent : EntityEventArgs - { - public SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState State; - - public DisposalUnitUIStateUpdatedEvent(SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState state) - { - State = state; - } + State = state; } } + + /// + /// Sent before the disposal unit flushes it's contents. + /// Allows adding tags for sorting and preventing the disposal unit from flushing. + /// + public sealed class BeforeDisposalFlushEvent : CancellableEntityEventArgs + { + public readonly List Tags = new(); + } }