From 4dfcacb86a1249323914e02d7d582054d87e5279 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Wed, 16 Feb 2022 19:57:16 +1300 Subject: [PATCH] Update battery-gun item status when charge changes (#6579) Co-authored-by: mirrorcult --- .../ClientBatteryBarrelComponent.cs | 52 ++++++------------- .../ClientBatteryBarrelSystem.cs | 19 +++++++ .../Weapon/Ranged/GunSystem.Battery.cs | 13 ----- Content.Server/Weapon/Ranged/GunSystem.cs | 1 - .../SharedBatteryBarrelComponent.cs | 22 -------- 5 files changed, 34 insertions(+), 73 deletions(-) create mode 100644 Content.Client/Weapons/Ranged/Barrels/EntitySystems/ClientBatteryBarrelSystem.cs delete mode 100644 Content.Shared/Weapons/Ranged/Barrels/Components/SharedBatteryBarrelComponent.cs diff --git a/Content.Client/Weapons/Ranged/Barrels/Components/ClientBatteryBarrelComponent.cs b/Content.Client/Weapons/Ranged/Barrels/Components/ClientBatteryBarrelComponent.cs index 537ed655df..bc8720faf1 100644 --- a/Content.Client/Weapons/Ranged/Barrels/Components/ClientBatteryBarrelComponent.cs +++ b/Content.Client/Weapons/Ranged/Barrels/Components/ClientBatteryBarrelComponent.cs @@ -1,62 +1,39 @@ -using System; using Content.Client.Items.Components; using Content.Client.Stylesheets; -using Content.Shared.Containers.ItemSlots; using Content.Shared.Weapons.Ranged.Barrels.Components; using Robust.Client.Graphics; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; -using Robust.Shared.GameObjects; using Robust.Shared.GameStates; -using Robust.Shared.Maths; -using Robust.Shared.Serialization.Manager.Attributes; -using Robust.Shared.ViewVariables; using static Robust.Client.UserInterface.Controls.BoxContainer; namespace Content.Client.Weapons.Ranged.Barrels.Components { [RegisterComponent] [NetworkedComponent()] - public class ClientBatteryBarrelComponent : Component, IItemStatus + public sealed class ClientBatteryBarrelComponent : Component, IItemStatus { - private StatusControl? _statusControl; - - /// - /// Count of bullets in the magazine. - /// - /// - /// Null if no magazine is inserted. - /// - [ViewVariables] - public (int count, int max)? MagazineCount { get; private set; } - - public override void HandleComponentState(ComponentState? curState, ComponentState? nextState) - { - base.HandleComponentState(curState, nextState); - - if (curState is not BatteryBarrelComponentState cast) - return; - - MagazineCount = cast.Magazine; - _statusControl?.Update(); - } + public StatusControl? ItemStatus; public Control MakeControl() { - _statusControl = new StatusControl(this); - _statusControl.Update(); - return _statusControl; + ItemStatus = new StatusControl(this); + + if (IoCManager.Resolve().TryGetComponent(Owner, out AppearanceComponent appearance)) + ItemStatus.Update(appearance); + + return ItemStatus; } public void DestroyControl(Control control) { - if (_statusControl == control) + if (ItemStatus == control) { - _statusControl = null; + ItemStatus = null; } } - private sealed class StatusControl : Control + public sealed class StatusControl : Control { private readonly ClientBatteryBarrelComponent _parent; private readonly BoxContainer _bulletsList; @@ -104,18 +81,19 @@ namespace Content.Client.Weapons.Ranged.Barrels.Components }); } - public void Update() + public void Update(AppearanceComponent appearance) { _bulletsList.RemoveAllChildren(); - if (_parent.MagazineCount == null) + if (!appearance.TryGetData(MagazineBarrelVisuals.MagLoaded, out bool loaded) || !loaded) { _noBatteryLabel.Visible = true; _ammoCount.Visible = false; return; } - var (count, capacity) = _parent.MagazineCount.Value; + appearance.TryGetData(AmmoVisuals.AmmoCount, out int count); + appearance.TryGetData(AmmoVisuals.AmmoMax, out int capacity); _noBatteryLabel.Visible = false; _ammoCount.Visible = true; diff --git a/Content.Client/Weapons/Ranged/Barrels/EntitySystems/ClientBatteryBarrelSystem.cs b/Content.Client/Weapons/Ranged/Barrels/EntitySystems/ClientBatteryBarrelSystem.cs new file mode 100644 index 0000000000..19523712ab --- /dev/null +++ b/Content.Client/Weapons/Ranged/Barrels/EntitySystems/ClientBatteryBarrelSystem.cs @@ -0,0 +1,19 @@ +using Content.Client.Weapons.Ranged.Barrels.Components; +using Robust.Client.GameObjects; + +namespace Content.Client.Weapons.Ranged.Barrels.EntitySystems; + +public sealed class ClientBatteryBarrelSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChange); + } + + private void OnAppearanceChange(EntityUid uid, ClientBatteryBarrelComponent component, ref AppearanceChangeEvent args) + { + component.ItemStatus?.Update(args.Component); + } +} diff --git a/Content.Server/Weapon/Ranged/GunSystem.Battery.cs b/Content.Server/Weapon/Ranged/GunSystem.Battery.cs index 676cca5157..2604d8bec3 100644 --- a/Content.Server/Weapon/Ranged/GunSystem.Battery.cs +++ b/Content.Server/Weapon/Ranged/GunSystem.Battery.cs @@ -1,12 +1,8 @@ -using System; -using Content.Server.PowerCell; using Content.Server.Projectiles.Components; using Content.Server.Weapon.Ranged.Barrels.Components; using Content.Shared.PowerCell.Components; using Content.Shared.Weapons.Ranged.Barrels.Components; using Robust.Shared.Containers; -using Robust.Shared.GameObjects; -using Robust.Shared.GameStates; using Robust.Shared.Map; namespace Content.Server.Weapon.Ranged; @@ -28,15 +24,6 @@ public sealed partial class GunSystem UpdateBatteryAppearance(component); } - private void OnBatteryGetState(EntityUid uid, BatteryBarrelComponent component, ref ComponentGetState args) - { - (int, int)? count = (component.ShotsLeft, component.Capacity); - - args.State = new BatteryBarrelComponentState( - component.FireRateSelector, - count); - } - private void OnCellSlotUpdated(EntityUid uid, BatteryBarrelComponent component, PowerCellChangedEvent args) { UpdateBatteryAppearance(component); diff --git a/Content.Server/Weapon/Ranged/GunSystem.cs b/Content.Server/Weapon/Ranged/GunSystem.cs index df7681ad2d..445459d88b 100644 --- a/Content.Server/Weapon/Ranged/GunSystem.cs +++ b/Content.Server/Weapon/Ranged/GunSystem.cs @@ -86,7 +86,6 @@ public sealed partial class GunSystem : EntitySystem // (All of these would be comp references so max you only ever have 2 components on the gun). SubscribeLocalEvent(OnBatteryInit); SubscribeLocalEvent(OnBatteryMapInit); - SubscribeLocalEvent(OnBatteryGetState); SubscribeLocalEvent(OnCellSlotUpdated); SubscribeLocalEvent(OnBoltInit); diff --git a/Content.Shared/Weapons/Ranged/Barrels/Components/SharedBatteryBarrelComponent.cs b/Content.Shared/Weapons/Ranged/Barrels/Components/SharedBatteryBarrelComponent.cs deleted file mode 100644 index c82b2bcf68..0000000000 --- a/Content.Shared/Weapons/Ranged/Barrels/Components/SharedBatteryBarrelComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using Content.Shared.Weapons.Ranged.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization; - -namespace Content.Shared.Weapons.Ranged.Barrels.Components -{ - [Serializable, NetSerializable] - public class BatteryBarrelComponentState : ComponentState - { - public FireRateSelector FireRateSelector { get; } - public (int count, int max)? Magazine { get; } - - public BatteryBarrelComponentState( - FireRateSelector fireRateSelector, - (int count, int max)? magazine) - { - FireRateSelector = fireRateSelector; - Magazine = magazine; - } - } -}