From e1df251cbc3c2deced8a254676b248f0ee5f3f15 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 25 Aug 2024 12:17:03 +0000 Subject: [PATCH] decouple ItemToggle from PowerCellDraw (#31392) * remove ItemToggle from PowerCellDraw query * add EntityQuery for resolves, make them all optional * move integration to ToggleCellDraw * add ToggleCellDraw to almost every PowerCellDraw prototype * :trollface: * :trollface: * :trollface: * let it disable on mapinit * set update time on mapinit, make borg power logic consistent now * :trollface: --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../PowerCell/PowerCellSystem.Draw.cs | 14 +++--- Content.Server/Silicons/Borgs/BorgSystem.cs | 2 + .../Item/ItemToggle/ItemToggleSystem.cs | 12 +++-- .../Components/ToggleCellDrawComponent.cs | 10 ++++ .../PowerCell/PowerCellDrawComponent.cs | 4 +- .../PowerCell/SharedPowerCellSystem.cs | 26 +++++----- .../PowerCell/ToggleCellDrawSystem.cs | 49 +++++++++++++++++++ .../Entities/Clothing/OuterClothing/suits.yml | 1 + .../Entities/Clothing/Shoes/misc.yml | 1 + .../Mobs/Cyborgs/base_borg_chassis.yml | 1 + .../Objects/Devices/base_handheld.yml | 1 + .../Specific/Medical/healthanalyzer.yml | 1 + .../Objects/Specific/Research/anomaly.yml | 2 + .../Objects/Tools/handheld_mass_scanner.yml | 1 + .../Weapons/Guns/Launchers/launchers.yml | 2 + 15 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 Content.Shared/PowerCell/Components/ToggleCellDrawComponent.cs create mode 100644 Content.Shared/PowerCell/ToggleCellDrawSystem.cs diff --git a/Content.Server/PowerCell/PowerCellSystem.Draw.cs b/Content.Server/PowerCell/PowerCellSystem.Draw.cs index 9ebd677f47..ae43b6dae9 100644 --- a/Content.Server/PowerCell/PowerCellSystem.Draw.cs +++ b/Content.Server/PowerCell/PowerCellSystem.Draw.cs @@ -1,5 +1,4 @@ using Content.Server.Power.Components; -using Content.Shared.Item.ItemToggle.Components; using Content.Shared.PowerCell; using Content.Shared.PowerCell.Components; @@ -14,11 +13,11 @@ public sealed partial class PowerCellSystem public override void Update(float frameTime) { base.Update(frameTime); - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp, out var slot, out var toggle)) + while (query.MoveNext(out var uid, out var comp, out var slot)) { - if (!comp.Enabled || !toggle.Activated) + if (!comp.Enabled) continue; if (Timing.CurTime < comp.NextUpdateTime) @@ -32,8 +31,6 @@ public sealed partial class PowerCellSystem if (_battery.TryUseCharge(batteryEnt.Value, comp.DrawRate, battery)) continue; - Toggle.TryDeactivate((uid, toggle)); - var ev = new PowerCellSlotEmptyEvent(); RaiseLocalEvent(uid, ref ev); } @@ -60,7 +57,10 @@ public sealed partial class PowerCellSystem var canUse = !args.Ejected && HasActivatableCharge(uid, component); if (!canDraw) - Toggle.TryDeactivate(uid); + { + var ev = new PowerCellSlotEmptyEvent(); + RaiseLocalEvent(uid, ref ev); + } if (canUse != component.CanUse || canDraw != component.CanDraw) { diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index 3f32afbffb..bd85282a0f 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -282,6 +282,7 @@ public sealed partial class BorgSystem : SharedBorgSystem { Popup.PopupEntity(Loc.GetString("borg-mind-added", ("name", Identity.Name(uid, EntityManager))), uid); Toggle.TryActivate(uid); + _powerCell.SetDrawEnabled(uid, _mobState.IsAlive(uid)); _appearance.SetData(uid, BorgVisuals.HasPlayer, true); } @@ -292,6 +293,7 @@ public sealed partial class BorgSystem : SharedBorgSystem { Popup.PopupEntity(Loc.GetString("borg-mind-removed", ("name", Identity.Name(uid, EntityManager))), uid); Toggle.TryDeactivate(uid); + _powerCell.SetDrawEnabled(uid, false); _appearance.SetData(uid, BorgVisuals.HasPlayer, false); } diff --git a/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs b/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs index 6b969d1d62..1cc8699d70 100644 --- a/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs +++ b/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs @@ -23,10 +23,14 @@ public sealed class ItemToggleSystem : EntitySystem [Dependency] private readonly SharedPointLightSystem _light = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; + private EntityQuery _query; + public override void Initialize() { base.Initialize(); + _query = GetEntityQuery(); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(TurnOffOnUnwielded); @@ -69,7 +73,7 @@ public sealed class ItemToggleSystem : EntitySystem /// Same as public bool Toggle(Entity ent, EntityUid? user = null, bool predicted = true) { - if (!Resolve(ent, ref ent.Comp)) + if (!_query.Resolve(ent, ref ent.Comp, false)) return false; return TrySetActive(ent, !ent.Comp.Activated, user, predicted); @@ -92,7 +96,7 @@ public sealed class ItemToggleSystem : EntitySystem /// public bool TryActivate(Entity ent, EntityUid? user = null, bool predicted = true) { - if (!Resolve(ent, ref ent.Comp)) + if (!_query.Resolve(ent, ref ent.Comp, false)) return false; var uid = ent.Owner; @@ -135,7 +139,7 @@ public sealed class ItemToggleSystem : EntitySystem /// public bool TryDeactivate(Entity ent, EntityUid? user = null, bool predicted = true) { - if (!Resolve(ent, ref ent.Comp)) + if (!_query.Resolve(ent, ref ent.Comp, false)) return false; var uid = ent.Owner; @@ -230,7 +234,7 @@ public sealed class ItemToggleSystem : EntitySystem public bool IsActivated(Entity ent) { - if (!Resolve(ent, ref ent.Comp, false)) + if (!_query.Resolve(ent, ref ent.Comp, false)) return true; // assume always activated if no component return ent.Comp.Activated; diff --git a/Content.Shared/PowerCell/Components/ToggleCellDrawComponent.cs b/Content.Shared/PowerCell/Components/ToggleCellDrawComponent.cs new file mode 100644 index 0000000000..20e2d4fe02 --- /dev/null +++ b/Content.Shared/PowerCell/Components/ToggleCellDrawComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.PowerCell.Components; + +/// +/// Integrate PowerCellDraw and ItemToggle. +/// Make toggling this item require power, and deactivates the item when power runs out. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ToggleCellDrawComponent : Component; diff --git a/Content.Shared/PowerCell/PowerCellDrawComponent.cs b/Content.Shared/PowerCell/PowerCellDrawComponent.cs index 94de7c7787..9c2f72661d 100644 --- a/Content.Shared/PowerCell/PowerCellDrawComponent.cs +++ b/Content.Shared/PowerCell/PowerCellDrawComponent.cs @@ -8,7 +8,6 @@ namespace Content.Shared.PowerCell; /// /// /// With ActivatableUI it will activate and deactivate when the ui is opened and closed, drawing power inbetween. -/// Requires to work. /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] public sealed partial class PowerCellDrawComponent : Component @@ -30,9 +29,8 @@ public sealed partial class PowerCellDrawComponent : Component #endregion /// - /// Whether drawing is enabled, regardless of ItemToggle. + /// Whether drawing is enabled. /// Having no cell will still disable it. - /// Only use this if you really don't want it to use power for some time. /// [DataField, AutoNetworkedField] public bool Enabled = true; diff --git a/Content.Shared/PowerCell/SharedPowerCellSystem.cs b/Content.Shared/PowerCell/SharedPowerCellSystem.cs index 2b2a836633..f098f575c4 100644 --- a/Content.Shared/PowerCell/SharedPowerCellSystem.cs +++ b/Content.Shared/PowerCell/SharedPowerCellSystem.cs @@ -1,6 +1,4 @@ using Content.Shared.Containers.ItemSlots; -using Content.Shared.Item.ItemToggle; -using Content.Shared.Item.ItemToggle.Components; using Content.Shared.PowerCell.Components; using Content.Shared.Rejuvenate; using Robust.Shared.Containers; @@ -13,19 +11,22 @@ public abstract class SharedPowerCellSystem : EntitySystem [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] protected readonly ItemToggleSystem Toggle = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnCellInserted); SubscribeLocalEvent(OnCellRemoved); SubscribeLocalEvent(OnCellInsertAttempt); + } - SubscribeLocalEvent(OnActivateAttempt); - SubscribeLocalEvent(OnToggled); + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + QueueUpdate((ent, ent.Comp)); } private void OnRejuvenate(EntityUid uid, PowerCellSlotComponent component, RejuvenateEvent args) @@ -70,16 +71,13 @@ public abstract class SharedPowerCellSystem : EntitySystem RaiseLocalEvent(uid, new PowerCellChangedEvent(true), false); } - private void OnActivateAttempt(Entity ent, ref ItemToggleActivateAttemptEvent args) + /// + /// Makes the draw logic update in the next tick. + /// + public void QueueUpdate(Entity ent) { - if (!HasDrawCharge(ent, ent.Comp, user: args.User) - || !HasActivatableCharge(ent, ent.Comp, user: args.User)) - args.Cancelled = true; - } - - private void OnToggled(Entity ent, ref ItemToggledEvent args) - { - ent.Comp.NextUpdateTime = Timing.CurTime; + if (Resolve(ent, ref ent.Comp)) + ent.Comp.NextUpdateTime = Timing.CurTime; } public void SetDrawEnabled(Entity ent, bool enabled) diff --git a/Content.Shared/PowerCell/ToggleCellDrawSystem.cs b/Content.Shared/PowerCell/ToggleCellDrawSystem.cs new file mode 100644 index 0000000000..070937b8b4 --- /dev/null +++ b/Content.Shared/PowerCell/ToggleCellDrawSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Item.ItemToggle; +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.PowerCell.Components; + +namespace Content.Shared.PowerCell; + +/// +/// Handles events to integrate PowerCellDraw with ItemToggle +/// +public sealed class ToggleCellDrawSystem : EntitySystem +{ + [Dependency] private readonly ItemToggleSystem _toggle = default!; + [Dependency] private readonly SharedPowerCellSystem _cell = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnActivateAttempt); + SubscribeLocalEvent(OnToggled); + SubscribeLocalEvent(OnEmpty); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + _cell.SetDrawEnabled(ent.Owner, _toggle.IsActivated(ent.Owner)); + } + + private void OnActivateAttempt(Entity ent, ref ItemToggleActivateAttemptEvent args) + { + if (!_cell.HasDrawCharge(ent, user: args.User) + || !_cell.HasActivatableCharge(ent, user: args.User)) + args.Cancelled = true; + } + + private void OnToggled(Entity ent, ref ItemToggledEvent args) + { + var uid = ent.Owner; + var draw = Comp(uid); + _cell.QueueUpdate((uid, draw)); + _cell.SetDrawEnabled((uid, draw), args.Activated); + } + + private void OnEmpty(Entity ent, ref PowerCellSlotEmptyEvent args) + { + _toggle.TryDeactivate(ent.Owner); + } +} diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index a04bdde31f..0f1b9536da 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -160,6 +160,7 @@ lastVisibility: 0.1 - type: PowerCellDraw drawRate: 1.8 # 200 seconds on the default cell + - type: ToggleCellDraw # throwing star ability - type: ItemCreator action: ActionCreateThrowingStar diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml index fae8717223..ea4c9d9c7c 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml @@ -116,6 +116,7 @@ price: 500 - type: PowerCellDraw drawRate: 4 + - type: ToggleCellDraw - type: ItemSlots slots: cell_slot: diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index b701bbd8f4..15f34bd81f 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -126,6 +126,7 @@ # TODO: or just have sentient speedboots be fast idk - type: PowerCellDraw drawRate: 0.6 + # no ToggleCellDraw since dont want to lose access when power is gone - type: ItemSlots slots: cell_slot: diff --git a/Resources/Prototypes/Entities/Objects/Devices/base_handheld.yml b/Resources/Prototypes/Entities/Objects/Devices/base_handheld.yml index 259323fede..c377519ddb 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/base_handheld.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/base_handheld.yml @@ -9,3 +9,4 @@ - type: PowerCellDraw drawRate: 0 useRate: 20 + - type: ToggleCellDraw diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index 97a41a50df..e3f2e1cd1e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -47,6 +47,7 @@ components: - type: PowerCellDraw drawRate: 1.2 #Calculated for 5 minutes on a small cell + - type: ToggleCellDraw - type: ActivatableUIRequiresPowerCell - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml index 929f509710..ff53218e22 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml @@ -68,6 +68,7 @@ - type: PowerCellDraw drawRate: 1 useRate: 0 + - type: ToggleCellDraw - type: entity id: AnomalyLocatorEmpty @@ -101,6 +102,7 @@ - type: PowerCellDraw drawRate: 1 useRate: 0 + - type: ToggleCellDraw - type: entity id: AnomalyLocatorWideEmpty diff --git a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml index de45119cdd..e10c5b84af 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml @@ -26,6 +26,7 @@ False: { visible: false } - type: PowerCellDraw drawRate: 1.5 + - type: ToggleCellDraw - type: ActivatableUI key: enum.RadarConsoleUiKey.Key inHandsOnly: true diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index 3abb32a37f..5ea853cd8d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -169,6 +169,7 @@ - type: ItemToggle onUse: false - type: PowerCellDraw + - type: ToggleCellDraw - type: Sprite sprite: Objects/Weapons/Guns/Launchers/tether_gun.rsi layers: @@ -216,6 +217,7 @@ - type: ItemToggle onUse: false - type: PowerCellDraw + - type: ToggleCellDraw - type: Sprite sprite: Objects/Weapons/Guns/Launchers/force_gun.rsi layers: