From: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Date: Thu, 21 Nov 2024 23:43:02 +0000 (+0100)
Subject: electrification hud
X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=3758715bdc8cd0209d3de3714b69897182546a20;p=space-station-14.git
electrification hud
---
diff --git a/Content.Client/Electrocution/ElectrocutionOverlaySystem.cs b/Content.Client/Electrocution/ElectrocutionOverlaySystem.cs
new file mode 100644
index 0000000000..2751c498de
--- /dev/null
+++ b/Content.Client/Electrocution/ElectrocutionOverlaySystem.cs
@@ -0,0 +1,101 @@
+using Content.Shared.Electrocution;
+using Robust.Client.GameObjects;
+using Robust.Client.Player;
+using Robust.Shared.Player;
+
+namespace Content.Client.Electrocution;
+
+///
+/// Shows the ElectrocutionOverlay to entities with the ElectrocutionOverlayComponent.
+///
+public sealed class ElectrocutionOverlaySystem : EntitySystem
+{
+
+ [Dependency] private readonly AppearanceSystem _appearance = default!;
+ [Dependency] private readonly IPlayerManager _playerMan = default!;
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnInit);
+ SubscribeLocalEvent(OnShutdown);
+ SubscribeLocalEvent(OnPlayerAttached);
+ SubscribeLocalEvent(OnPlayerDetached);
+
+ SubscribeLocalEvent(OnAppearanceChange);
+ }
+
+ private void OnPlayerAttached(Entity ent, ref LocalPlayerAttachedEvent args)
+ {
+ ShowOverlay();
+ }
+
+ private void OnPlayerDetached(Entity ent, ref LocalPlayerDetachedEvent args)
+ {
+ RemoveOverlay();
+ }
+
+ private void OnInit(Entity ent, ref ComponentInit args)
+ {
+ if (_playerMan.LocalEntity == ent)
+ {
+ ShowOverlay();
+ }
+ }
+
+ private void OnShutdown(Entity ent, ref ComponentShutdown args)
+ {
+ if (_playerMan.LocalEntity == ent)
+ {
+ RemoveOverlay();
+ }
+ }
+
+ private void ShowOverlay()
+ {
+ var electrifiedQuery = AllEntityQuery();
+ while (electrifiedQuery.MoveNext(out var uid, out var _, out var appearanceComp, out var spriteComp))
+ {
+ if (!_appearance.TryGetData(uid, ElectrifiedVisuals.IsElectrified, out var electrified, appearanceComp))
+ continue;
+
+ if (!spriteComp.LayerMapTryGet(ElectrifiedLayers.Overlay, out var layer))
+ continue;
+
+ if (electrified)
+ spriteComp.LayerSetVisible(ElectrifiedLayers.Overlay, true);
+ else
+ spriteComp.LayerSetVisible(ElectrifiedLayers.Overlay, false);
+ }
+ }
+
+ private void RemoveOverlay()
+ {
+ var electrifiedQuery = AllEntityQuery();
+ while (electrifiedQuery.MoveNext(out var uid, out var _, out var appearanceComp, out var spriteComp))
+ {
+ if (!spriteComp.LayerMapTryGet(ElectrifiedLayers.Overlay, out var layer))
+ continue;
+
+ spriteComp.LayerSetVisible(layer, false);
+ }
+ }
+
+ private void OnAppearanceChange(Entity ent, ref AppearanceChangeEvent args)
+ {
+ if (args.Sprite == null)
+ return;
+
+ if (!_appearance.TryGetData(ent.Owner, ElectrifiedVisuals.IsElectrified, out var electrified, args.Component))
+ return;
+
+ if (!args.Sprite.LayerMapTryGet(ElectrifiedLayers.Overlay, out var layer))
+ return;
+
+ var player = _playerMan.LocalEntity;
+ if (electrified && HasComp(player))
+ args.Sprite.LayerSetVisible(layer, true);
+ else
+ args.Sprite.LayerSetVisible(layer, false);
+ }
+}
diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs
index 88404c4aa9..eb10f8d280 100644
--- a/Content.Server/Electrocution/ElectrocutionSystem.cs
+++ b/Content.Server/Electrocution/ElectrocutionSystem.cs
@@ -121,7 +121,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem
activated.TimeLeft -= frameTime;
if (activated.TimeLeft <= 0 || !IsPowered(uid, electrified, transform))
{
- _appearance.SetData(uid, ElectrifiedVisuals.IsPowered, false);
+ _appearance.SetData(uid, ElectrifiedVisuals.ShowSparks, false);
RemComp(uid);
}
}
@@ -217,7 +217,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem
return false;
EnsureComp(uid);
- _appearance.SetData(uid, ElectrifiedVisuals.IsPowered, true);
+ _appearance.SetData(uid, ElectrifiedVisuals.ShowSparks, true);
siemens *= electrified.SiemensCoefficient;
if (!DoCommonElectrocutionAttempt(targetUid, uid, ref siemens) || siemens <= 0)
@@ -488,15 +488,4 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem
}
_audio.PlayPvs(electrified.ShockNoises, targetUid, AudioParams.Default.WithVolume(electrified.ShockVolume));
}
-
- public void SetElectrifiedWireCut(Entity ent, bool value)
- {
- if (ent.Comp.IsWireCut == value)
- {
- return;
- }
-
- ent.Comp.IsWireCut = value;
- Dirty(ent);
- }
}
diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs
index cebb7de8ec..9e4e6a6086 100644
--- a/Content.Server/Power/PowerWireAction.cs
+++ b/Content.Server/Power/PowerWireAction.cs
@@ -17,7 +17,7 @@ public sealed partial class PowerWireAction : BaseWireAction
[DataField("pulseTimeout")]
private int _pulseTimeout = 30;
- private ElectrocutionSystem _electrocutionSystem = default!;
+ private ElectrocutionSystem _electrocution = default!;
public override object StatusKey { get; } = PowerWireActionKey.Status;
@@ -105,8 +105,8 @@ public sealed partial class PowerWireAction : BaseWireAction
&& !EntityManager.TryGetComponent(used, out electrified))
return;
- _electrocutionSystem.SetElectrifiedWireCut((used, electrified), setting);
- electrified.Enabled = setting;
+ _electrocution.SetElectrifiedWireCut((used, electrified), setting);
+ _electrocution.SetElectrified((used, electrified), setting);
}
/// false if failed, true otherwise, or if the entity cannot be electrified
@@ -120,7 +120,7 @@ public sealed partial class PowerWireAction : BaseWireAction
// always set this to true
SetElectrified(wire.Owner, true, electrified);
- var electrifiedAttempt = _electrocutionSystem.TryDoElectrifiedAct(wire.Owner, user);
+ var electrifiedAttempt = _electrocution.TryDoElectrifiedAct(wire.Owner, user);
// if we were electrified, then return false
return !electrifiedAttempt;
@@ -161,7 +161,7 @@ public sealed partial class PowerWireAction : BaseWireAction
{
base.Initialize();
- _electrocutionSystem = EntityManager.System();
+ _electrocution = EntityManager.System();
}
// This should add a wire into the entity's state, whether it be
diff --git a/Content.Shared/Electrocution/Components/ElectrocutionOverlayComponent.cs b/Content.Shared/Electrocution/Components/ElectrocutionOverlayComponent.cs
new file mode 100644
index 0000000000..e03e8cb934
--- /dev/null
+++ b/Content.Shared/Electrocution/Components/ElectrocutionOverlayComponent.cs
@@ -0,0 +1,9 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Electrocution;
+
+///
+/// Allow an entity to see the ElectrocutionOverlay showing electrocuted doors.
+///
+[RegisterComponent, NetworkedComponent]
+public sealed partial class ElectrocutionOverlayComponent : Component;
diff --git a/Content.Shared/Electrocution/SharedElectrocution.cs b/Content.Shared/Electrocution/SharedElectrocution.cs
index 4060856d4d..b00fb1afdb 100644
--- a/Content.Shared/Electrocution/SharedElectrocution.cs
+++ b/Content.Shared/Electrocution/SharedElectrocution.cs
@@ -5,11 +5,13 @@ namespace Content.Shared.Electrocution;
[Serializable, NetSerializable]
public enum ElectrifiedLayers : byte
{
- Powered
+ Sparks,
+ Overlay,
}
[Serializable, NetSerializable]
public enum ElectrifiedVisuals : byte
{
- IsPowered
+ ShowSparks, // only shown when zapping someone, deactivated after a short time
+ IsElectrified, // if the entity is electrified or not, used for the AI HUD
}
diff --git a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs
index e36e4a804b..5da344e023 100644
--- a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs
+++ b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs
@@ -5,6 +5,8 @@ namespace Content.Shared.Electrocution
{
public abstract class SharedElectrocutionSystem : EntitySystem
{
+ [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+
public override void Initialize()
{
base.Initialize();
@@ -35,6 +37,19 @@ namespace Content.Shared.Electrocution
ent.Comp.Enabled = value;
Dirty(ent, ent.Comp);
+
+ _appearance.SetData(ent.Owner, ElectrifiedVisuals.IsElectrified, value);
+ }
+
+ public void SetElectrifiedWireCut(Entity ent, bool value)
+ {
+ if (ent.Comp.IsWireCut == value)
+ {
+ return;
+ }
+
+ ent.Comp.IsWireCut = value;
+ Dirty(ent);
}
/// Entity being electrocuted.
diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml
index d7c5dfe97b..dc89e635bf 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml
@@ -55,6 +55,7 @@
skipChecks: true
- type: Ghost
- type: GhostHearing
+ - type: ElectrocutionOverlay
- type: IntrinsicRadioReceiver
- type: ActiveRadio
receiveAllChannels: true
diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml
index bcac46ed84..3b2b65e679 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml
@@ -30,6 +30,7 @@
- type: IgnoreUIRange
- type: StationAiHeld
- type: StationAiOverlay
+ - type: ElectrocutionOverlay
- type: ActionGrant
actions:
- ActionJumpToCore
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
index fe725b0684..27f4973d05 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
@@ -30,6 +30,11 @@
shader: unshaded
- state: panel_open
map: ["enum.WiresVisualLayers.MaintenancePanel"]
+ - state: electrified
+ sprite: Interface/Misc/ai_hud.rsi
+ shader: unshaded
+ visible: false
+ map: ["enum.ElectrifiedLayers.Overlay"]
- type: AnimationPlayer
- type: Physics
- type: Fixtures
diff --git a/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml b/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml
index 2d0c55af5a..b5fa7d9190 100644
--- a/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml
+++ b/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml
@@ -70,8 +70,8 @@
- type: Appearance
- type: GenericVisualizer
visuals:
- enum.ElectrifiedVisuals.IsPowered:
- enum.ElectrifiedLayers.Powered:
+ enum.ElectrifiedVisuals.ShowSparks:
+ enum.ElectrifiedLayers.Sparks:
True: { visible: True }
False: { visible: False }
- type: AnimationPlayer
@@ -91,7 +91,7 @@
- state: straight_broken
- state: electrified
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Physics
@@ -151,7 +151,7 @@
- state: straight
- state: electrified
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Fixtures
@@ -209,7 +209,7 @@
- state: corner
- state: electrified
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Fixtures
@@ -256,7 +256,7 @@
- state: end
- state: electrified
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Fixtures
@@ -292,7 +292,7 @@
map: ["enum.DoorVisualLayers.Base"]
- state: electrified
sprite: Effects/electricity.rsi
- map: [ "enum.ElectrifiedLayers.Powered" ]
+ map: [ "enum.ElectrifiedLayers.Sparks" ]
shader: unshaded
visible: false
- type: Fixtures
diff --git a/Resources/Prototypes/Entities/Structures/Walls/grille.yml b/Resources/Prototypes/Entities/Structures/Walls/grille.yml
index 2b65528d22..3433ffc366 100644
--- a/Resources/Prototypes/Entities/Structures/Walls/grille.yml
+++ b/Resources/Prototypes/Entities/Structures/Walls/grille.yml
@@ -21,7 +21,7 @@
- state: grille
- state: electrified
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Icon
@@ -82,8 +82,8 @@
- type: Appearance
- type: GenericVisualizer
visuals:
- enum.ElectrifiedVisuals.IsPowered:
- enum.ElectrifiedLayers.Powered:
+ enum.ElectrifiedVisuals.ShowSparks:
+ enum.ElectrifiedLayers.Sparks:
True: { visible: True }
False: { visible: False }
- type: AnimationPlayer
@@ -176,7 +176,7 @@
- state: grille_diagonal
- state: electrified_diagonal
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Icon
@@ -211,7 +211,7 @@
- state: ratvargrille_diagonal
- state: electrified_diagonal
sprite: Effects/electricity.rsi
- map: ["enum.ElectrifiedLayers.Powered"]
+ map: ["enum.ElectrifiedLayers.Sparks"]
shader: unshaded
visible: false
- type: Icon
diff --git a/Resources/Textures/Interface/Misc/ai_hud.rsi/apc_hacked.png b/Resources/Textures/Interface/Misc/ai_hud.rsi/apc_hacked.png
new file mode 100644
index 0000000000..72e111edac
Binary files /dev/null and b/Resources/Textures/Interface/Misc/ai_hud.rsi/apc_hacked.png differ
diff --git a/Resources/Textures/Interface/Misc/ai_hud.rsi/electrified.png b/Resources/Textures/Interface/Misc/ai_hud.rsi/electrified.png
new file mode 100644
index 0000000000..046a307d09
Binary files /dev/null and b/Resources/Textures/Interface/Misc/ai_hud.rsi/electrified.png differ
diff --git a/Resources/Textures/Interface/Misc/ai_hud.rsi/meta.json b/Resources/Textures/Interface/Misc/ai_hud.rsi/meta.json
new file mode 100644
index 0000000000..7f1e67ac4d
--- /dev/null
+++ b/Resources/Textures/Interface/Misc/ai_hud.rsi/meta.json
@@ -0,0 +1,37 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d170a410d40eec4fc19fe5eb8d561d58a0902082",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "electrified",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "apc_hacked",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file