From c4dca43d788b675dbaf4b44f1204f778a0ecd066 Mon Sep 17 00:00:00 2001 From: Justin Trotter Date: Mon, 14 Nov 2022 01:45:45 -0600 Subject: [PATCH] salvage magnet status indicator (#12585) --- .../Salvage/SalvageMagnetComponent.cs | 5 ++ .../Salvage/SalvageMagnetComponent.cs | 22 ++++++- Content.Server/Salvage/SalvageSystem.cs | 43 ++++++++++++++ .../Salvage/SharedSalvageMagnetComponent.cs | 15 +++++ .../Entities/Structures/Machines/salvage.yml | 48 +++++++++++++++- .../Structures/Machines/salvage.rsi/meta.json | 54 +++++++++++++++++- .../salvage.rsi/salvage-magnet-o0.png | Bin 0 -> 5298 bytes .../salvage.rsi/salvage-magnet-o1.png | Bin 0 -> 5639 bytes .../salvage.rsi/salvage-magnet-o2.png | Bin 0 -> 5919 bytes .../salvage.rsi/salvage-magnet-o3.png | Bin 0 -> 5933 bytes .../salvage.rsi/salvage-magnet-o4.png | Bin 0 -> 6080 bytes .../salvage-magnet-ready-blinking.png | Bin 0 -> 697 bytes .../salvage.rsi/salvage-magnet-ready.png | Bin 0 -> 5312 bytes .../salvage-magnet-unready-blinking.png | Bin 0 -> 702 bytes .../salvage.rsi/salvage-magnet-unready.png | Bin 0 -> 5401 bytes 15 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 Content.Client/Salvage/SalvageMagnetComponent.cs create mode 100644 Content.Shared/Salvage/SharedSalvageMagnetComponent.cs create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o0.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o1.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o2.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o3.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o4.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-ready-blinking.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-ready.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-unready-blinking.png create mode 100644 Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-unready.png diff --git a/Content.Client/Salvage/SalvageMagnetComponent.cs b/Content.Client/Salvage/SalvageMagnetComponent.cs new file mode 100644 index 0000000000..44b8b9d958 --- /dev/null +++ b/Content.Client/Salvage/SalvageMagnetComponent.cs @@ -0,0 +1,5 @@ +using Content.Shared.Salvage; +using Robust.Shared.GameStates; + +[NetworkedComponent, RegisterComponent] +public sealed class SalvageMagnetComponent : SharedSalvageMagnetComponent {} diff --git a/Content.Server/Salvage/SalvageMagnetComponent.cs b/Content.Server/Salvage/SalvageMagnetComponent.cs index 6ec6339467..a756a1cbdf 100644 --- a/Content.Server/Salvage/SalvageMagnetComponent.cs +++ b/Content.Server/Salvage/SalvageMagnetComponent.cs @@ -1,14 +1,17 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Content.Shared.Radio; +using Content.Shared.Salvage; +using Robust.Shared.GameStates; namespace Content.Server.Salvage { /// /// A salvage magnet. /// - [RegisterComponent] - public sealed class SalvageMagnetComponent : Component + [NetworkedComponent, RegisterComponent] + [Access(typeof(SalvageSystem))] + public sealed class SalvageMagnetComponent : SharedSalvageMagnetComponent { /// /// Offset relative to magnet used as centre of the placement circle. @@ -49,6 +52,21 @@ namespace Content.Server.Salvage [DataField("salvageChannel", customTypeSerializer: typeof(PrototypeIdSerializer))] public string SalvageChannel = "Supply"; + /// + /// Current how much charge the magnet currently has + /// + public int ChargeRemaining = 5; + + /// + /// How much capacity the magnet can hold + /// + public int ChargeCapacity = 5; + + /// + /// Used as a guard to prevent spamming the appearance system + /// + public int PreviousCharge = 5; + } public record struct MagnetState(MagnetStateType StateType, TimeSpan Until) { diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs index ebbd4651a9..1330314b1d 100644 --- a/Content.Server/Salvage/SalvageSystem.cs +++ b/Content.Server/Salvage/SalvageSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.CCVar; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Popups; +using Content.Shared.Salvage; using Robust.Server.Maps; using Robust.Shared.Configuration; using Robust.Shared.Map; @@ -27,6 +28,7 @@ namespace Content.Server.Salvage [Dependency] private readonly MapLoaderSystem _map = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly RadioSystem _radioSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; private static readonly TimeSpan AttachingTime = TimeSpan.FromSeconds(30); private static readonly TimeSpan HoldTime = TimeSpan.FromMinutes(4); @@ -58,6 +60,42 @@ namespace Content.Server.Salvage } } + private void UpdateAppearance(EntityUid uid, SalvageMagnetComponent? component = null) + { + if (!Resolve(uid, ref component, false)) + return; + + _appearanceSystem.SetData(uid, SalvageMagnetVisuals.ReadyBlinking, component.MagnetState.StateType == MagnetStateType.Attaching); + _appearanceSystem.SetData(uid, SalvageMagnetVisuals.Ready, component.MagnetState.StateType == MagnetStateType.Holding); + _appearanceSystem.SetData(uid, SalvageMagnetVisuals.Unready, component.MagnetState.StateType == MagnetStateType.CoolingDown); + _appearanceSystem.SetData(uid, SalvageMagnetVisuals.UnreadyBlinking, component.MagnetState.StateType == MagnetStateType.Detaching); + } + + private void UpdateChargeStateAppearance(EntityUid uid, TimeSpan currentTime, SalvageMagnetComponent? component = null) + { + if (!Resolve(uid, ref component, false)) + return; + + int timeLeft = (component.MagnetState.Until.Minutes * 60 + component.MagnetState.Until.Seconds) - (currentTime.Minutes * 60 + currentTime.Seconds); + if (component.MagnetState.StateType == MagnetStateType.Inactive) + component.ChargeRemaining = 5; + else if (component.MagnetState.StateType == MagnetStateType.Holding) + { + component.ChargeRemaining = (timeLeft / ((HoldTime.Minutes * 60 + HoldTime.Seconds) / component.ChargeCapacity)) + 1; + } + else if (component.MagnetState.StateType == MagnetStateType.Detaching) + component.ChargeRemaining = 0; + else if (component.MagnetState.StateType == MagnetStateType.CoolingDown) + { + component.ChargeRemaining = component.ChargeCapacity - (timeLeft / ((CooldownTime.Minutes * 60 + CooldownTime.Seconds) / component.ChargeCapacity)) - 1; + } + if (component.PreviousCharge != component.ChargeRemaining) + { + _appearanceSystem.SetData(uid, SalvageMagnetVisuals.ChargeState, component.ChargeRemaining); + component.PreviousCharge = component.ChargeRemaining; + } + } + private void OnGridRemoval(GridRemovalEvent ev) { // If we ever want to give magnets names, and announce them individually, we would need to loop this, before removing it. @@ -146,6 +184,7 @@ namespace Content.Server.Salvage return; args.Handled = true; StartMagnet(component, args.User); + UpdateAppearance(uid, component); } private void StartMagnet(SalvageMagnetComponent component, EntityUid user) @@ -356,6 +395,8 @@ namespace Content.Server.Salvage magnet.MagnetState = MagnetState.Inactive; break; } + UpdateAppearance(magnet.Owner, magnet); + UpdateChargeStateAppearance(magnet.Owner, currentTime, magnet); } public override void Update(float frameTime) @@ -373,8 +414,10 @@ namespace Content.Server.Salvage state.CurrentTime += secondsPassed; var deleteQueue = new RemQueue(); + foreach(var magnet in state.ActiveMagnets) { + UpdateChargeStateAppearance(magnet.Owner, state.CurrentTime, magnet); if (magnet.MagnetState.Until > state.CurrentTime) continue; Transition(magnet, state.CurrentTime); if (magnet.MagnetState.StateType == MagnetStateType.Inactive) diff --git a/Content.Shared/Salvage/SharedSalvageMagnetComponent.cs b/Content.Shared/Salvage/SharedSalvageMagnetComponent.cs new file mode 100644 index 0000000000..fac5870d2d --- /dev/null +++ b/Content.Shared/Salvage/SharedSalvageMagnetComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Salvage; + +public abstract class SharedSalvageMagnetComponent : Component {} + +[Serializable, NetSerializable] +public enum SalvageMagnetVisuals : byte +{ + ChargeState, + Ready, + ReadyBlinking, + Unready, + UnreadyBlinking +} diff --git a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml index 3d010ac4cb..39887c2243 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml @@ -5,10 +5,52 @@ description: "Pulls in salvage." components: - type: Sprite + netsync: false + sprite: Structures/Machines/salvage.rsi layers: - - sprite: Structures/Machines/salvage.rsi - state: salvage-magnet - # Ideally, there'd be lights indicating power usage and a big red lamp indicating loss + - state: salvage-magnet + - state: salvage-magnet-ready + visible: false + map: [ "ready" ] + - state: salvage-magnet-ready-blinking + visible: false + map: [ "readyBlinking" ] + - state: salvage-magnet-unready + visible: false + map: [ "unready" ] + - state: salvage-magnet-unready-blinking + visible: false + map: [ "unreadyBlinking" ] + - state: salvage-magnet-o4 + map: ["chargeState"] + shader: unshaded + - type: Appearance + - type: GenericVisualizer + visuals: + enum.SalvageMagnetVisuals.ChargeState: + chargeState: + 0: { state: salvage-magnet-o0, shader: "unshaded", visible: false } + 1: { state: salvage-magnet-o0, shader: "unshaded", visible: true } + 2: { state: salvage-magnet-o1, shader: "unshaded", visible: true } + 3: { state: salvage-magnet-o2, shader: "unshaded", visible: true } + 4: { state: salvage-magnet-o3, shader: "unshaded", visible: true } + 5: { state: salvage-magnet-o4, shader: "unshaded", visible: true } + enum.SalvageMagnetVisuals.Ready: + ready: + False: { state: salvage-magnet-ready, visible: false, shader: "unshaded" } + True: { state: salvage-magnet-ready, visible: true, shader: "unshaded" } + enum.SalvageMagnetVisuals.ReadyBlinking: + readyBlinking: + False: { state: salvage-magnet-ready-blinking, visible: false, shader: "unshaded" } + True: { state: salvage-magnet-ready-blinking, visible: true, shader: "unshaded" } + enum.SalvageMagnetVisuals.Unready: + unready: + False: { state: salvage-magnet-unready, visible: false, shader: "unshaded" } + True: { state: salvage-magnet-unready, visible: true, shader: "unshaded" } + enum.SalvageMagnetVisuals.UnreadyBlinking: + unreadyBlinking: + False: { state: salvage-magnet-unready-blinking, visible: false, shader: "unshaded" } + True: { state: salvage-magnet-unready-blinking, visible: true, shader: "unshaded" } - type: Rotatable - type: Transform noRot: false diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/meta.json b/Resources/Textures/Structures/Machines/salvage.rsi/meta.json index 852e539aef..6b62026074 100644 --- a/Resources/Textures/Structures/Machines/salvage.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/salvage.rsi/meta.json @@ -9,8 +9,60 @@ "states": [ { "name": "salvage-magnet", + "directions": 4 + }, + { + "name": "salvage-magnet-o0", "directions": 4, - "commentary": "So presumably the lights would represent the power usage of the magnet, when that's in, and the big red lamp would mean something's being lost." + "commentary": "o0 - 04 represent the amount of time remaining during holding/detaching and cooldown." + }, + { + "name": "salvage-magnet-o1", + "directions": 4 + }, + { + "name": "salvage-magnet-o2", + "directions": 4 + }, + { + "name": "salvage-magnet-o3", + "directions": 4 + }, + { + "name": "salvage-magnet-o4", + "directions": 4 + }, + { + "name": "salvage-magnet-unready", + "directions": 4, + "commentary": "Cooldown state" + }, + { + "name": "salvage-magnet-ready", + "directions": 4, + "commentary": "Holding state" + }, + { + "name": "salvage-magnet-ready-blinking", + "directions": 4, + "delays": [ + [ 0.2, 0.2], + [ 0.2, 0.2], + [ 0.2, 0.2], + [ 0.2, 0.2] + ], + "commentary": "Attaching state" + }, + { + "name": "salvage-magnet-unready-blinking", + "directions": 4, + "delays": [ + [ 0.2, 0.2], + [ 0.2, 0.2], + [ 0.2, 0.2], + [ 0.2, 0.2] + ], + "commentary": "Detaching state" } ] } diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o0.png b/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o0.png new file mode 100644 index 0000000000000000000000000000000000000000..6df11fbe99c98becf9242ae66248965096667d93 GIT binary patch literal 5298 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 TIyWl5tPyZMeb_&`N3Hu07q69W literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o2.png b/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac86dc152da8cd98727348e80c105bc34ba0ca71 GIT binary patch literal 5919 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o3.png b/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-o3.png new file mode 100644 index 0000000000000000000000000000000000000000..6a313591d35a6d136d1865b4fed4855c7f9e2558 GIT binary patch literal 5933 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-ready.png b/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-ready.png new file mode 100644 index 0000000000000000000000000000000000000000..084dc7ecf0067e3a47335b31459ba2a96ec09cbd GIT binary patch literal 5312 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 E07qW{zW@LL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-unready-blinking.png b/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-unready-blinking.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc46e2eb39b590b72090873877f8fb33e97f9e0 GIT binary patch literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZrHeuZtvf7IRx~9zh8zi89niwHFf8Nh!6%pWGcHY7vcrOF9V@%N z*lIq#bGxi|a5X((?^rx}@}ll3KlU%VpmeSIaowKX-*;5Ab6i!ryk=XW!{uCK!S1e= zUsg#}xQbUPB#6`+ZSJx3>{|Tv$FBDN_2q)|uKv0+e{uBL2%Zm}M>d}^$bH27=%w%N z2YdWwk}4xr?bPLrUp5`-j|sP_dpxH&^1)0+kSct9^;wZ*yb8y{csWB6}eu+;p| zQZ0keo>fa1w)QvN%YE=@*Fw$e15f!3KBSyj_QtDjmXjIxp7|Hemp1;3UQm4Y_1b;? zm)R9OV~^%HG&?7#xZixOd++YWJGb|zzxw-^!Ffy3lyn2b3}C#lC3(BM0O|h>Z0mMt zEeEnV3p^r=85s1GL71^(seKtxkiEpy*OmPlHy@Lw;c*Gy&p;u`64!_l=ltB<)VvY~ z=c3falGGH1^30M91$R&1fbd2>aiF59o-U3d6}R5r*~oi9fyecr|F`=$BNY}YaUCgF z73%$}r92U+2o9D@`L|EK^5l@gw*NbNK%%!cT#02Hr;+IHP} zehf?w3>*xMAn6My*PWlX=dfA;NI-#s1tf+52hQbfFXR!Qd_nRVNYK;O&t;ucLK6T% C1r^W$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-unready.png b/Resources/Textures/Structures/Machines/salvage.rsi/salvage-magnet-unready.png new file mode 100644 index 0000000000000000000000000000000000000000..a20b91edd163bdc05e1e45b3a7334dc20914968e GIT binary patch literal 5401 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