electrification hud
This commit is contained in:
parent
54e0e6639f
commit
f6dda6b725
|
|
@ -0,0 +1,101 @@
|
|||
using Content.Shared.Electrocution;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Client.Electrocution;
|
||||
|
||||
/// <summary>
|
||||
/// Shows the ElectrocutionOverlay to entities with the ElectrocutionOverlayComponent.
|
||||
/// </summary>
|
||||
public sealed class ElectrocutionOverlaySystem : EntitySystem
|
||||
{
|
||||
|
||||
[Dependency] private readonly AppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerMan = default!;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<ElectrocutionOverlayComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<ElectrocutionOverlayComponent, ComponentShutdown>(OnShutdown);
|
||||
SubscribeLocalEvent<ElectrocutionOverlayComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
|
||||
SubscribeLocalEvent<ElectrocutionOverlayComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
|
||||
|
||||
SubscribeLocalEvent<ElectrifiedComponent, AppearanceChangeEvent>(OnAppearanceChange);
|
||||
}
|
||||
|
||||
private void OnPlayerAttached(Entity<ElectrocutionOverlayComponent> ent, ref LocalPlayerAttachedEvent args)
|
||||
{
|
||||
ShowOverlay();
|
||||
}
|
||||
|
||||
private void OnPlayerDetached(Entity<ElectrocutionOverlayComponent> ent, ref LocalPlayerDetachedEvent args)
|
||||
{
|
||||
RemoveOverlay();
|
||||
}
|
||||
|
||||
private void OnInit(Entity<ElectrocutionOverlayComponent> ent, ref ComponentInit args)
|
||||
{
|
||||
if (_playerMan.LocalEntity == ent)
|
||||
{
|
||||
ShowOverlay();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnShutdown(Entity<ElectrocutionOverlayComponent> ent, ref ComponentShutdown args)
|
||||
{
|
||||
if (_playerMan.LocalEntity == ent)
|
||||
{
|
||||
RemoveOverlay();
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowOverlay()
|
||||
{
|
||||
var electrifiedQuery = AllEntityQuery<ElectrifiedComponent, AppearanceComponent, SpriteComponent>();
|
||||
while (electrifiedQuery.MoveNext(out var uid, out var _, out var appearanceComp, out var spriteComp))
|
||||
{
|
||||
if (!_appearance.TryGetData<bool>(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<ElectrifiedComponent, AppearanceComponent, SpriteComponent>();
|
||||
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<ElectrifiedComponent> ent, ref AppearanceChangeEvent args)
|
||||
{
|
||||
if (args.Sprite == null)
|
||||
return;
|
||||
|
||||
if (!_appearance.TryGetData<bool>(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<ElectrocutionOverlayComponent>(player))
|
||||
args.Sprite.LayerSetVisible(layer, true);
|
||||
else
|
||||
args.Sprite.LayerSetVisible(layer, false);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<ActivatedElectrifiedComponent>(uid);
|
||||
}
|
||||
}
|
||||
|
|
@ -217,7 +217,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem
|
|||
return false;
|
||||
|
||||
EnsureComp<ActivatedElectrifiedComponent>(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<ElectrifiedComponent> ent, bool value)
|
||||
{
|
||||
if (ent.Comp.IsWireCut == value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ent.Comp.IsWireCut = value;
|
||||
Dirty(ent);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/// <returns>false if failed, true otherwise, or if the entity cannot be electrified</returns>
|
||||
|
|
@ -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<ElectrocutionSystem>();
|
||||
_electrocution = EntityManager.System<ElectrocutionSystem>();
|
||||
}
|
||||
|
||||
// This should add a wire into the entity's state, whether it be
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Electrocution;
|
||||
|
||||
/// <summary>
|
||||
/// Allow an entity to see the ElectrocutionOverlay showing electrocuted doors.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class ElectrocutionOverlayComponent : Component;
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ElectrifiedComponent> ent, bool value)
|
||||
{
|
||||
if (ent.Comp.IsWireCut == value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ent.Comp.IsWireCut = value;
|
||||
Dirty(ent);
|
||||
}
|
||||
|
||||
/// <param name="uid">Entity being electrocuted.</param>
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
skipChecks: true
|
||||
- type: Ghost
|
||||
- type: GhostHearing
|
||||
- type: ElectrocutionOverlay
|
||||
- type: IntrinsicRadioReceiver
|
||||
- type: ActiveRadio
|
||||
receiveAllChannels: true
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
- type: IgnoreUIRange
|
||||
- type: StationAiHeld
|
||||
- type: StationAiOverlay
|
||||
- type: ElectrocutionOverlay
|
||||
- type: ActionGrant
|
||||
actions:
|
||||
- ActionJumpToCore
|
||||
|
|
|
|||
|
|
@ -31,6 +31,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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 561 B |
Binary file not shown.
|
After Width: | Height: | Size: 812 B |
|
|
@ -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
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue