|
1 | 1 | using System.Numerics; |
2 | 2 | using Content.Shared.Administration.Components; |
3 | 3 | using Robust.Client.GameObjects; |
4 | | -using Robust.Shared.Utility; |
| 4 | +using Robust.Client.Player; |
5 | 5 |
|
6 | 6 | namespace Content.Client.Administration.Systems; |
7 | 7 |
|
8 | 8 | public sealed class KillSignSystem : EntitySystem |
9 | 9 | { |
10 | 10 | [Dependency] private readonly SpriteSystem _sprite = default!; |
| 11 | + [Dependency] private readonly IPlayerManager _player = default!; |
11 | 12 |
|
12 | 13 | public override void Initialize() |
13 | 14 | { |
14 | 15 | SubscribeLocalEvent<KillSignComponent, ComponentStartup>(KillSignAdded); |
15 | 16 | SubscribeLocalEvent<KillSignComponent, ComponentShutdown>(KillSignRemoved); |
| 17 | + SubscribeLocalEvent<KillSignComponent, AfterAutoHandleStateEvent>(AfterAutoHandleState); |
16 | 18 | } |
17 | 19 |
|
18 | | - private void KillSignRemoved(EntityUid uid, KillSignComponent component, ComponentShutdown args) |
| 20 | + private void KillSignRemoved(Entity<KillSignComponent> ent, ref ComponentShutdown args) |
19 | 21 | { |
20 | | - if (!TryComp<SpriteComponent>(uid, out var sprite)) |
21 | | - return; |
| 22 | + RemoveKillsign(ent); |
| 23 | + } |
22 | 24 |
|
23 | | - if (!_sprite.LayerMapTryGet((uid, sprite), KillSignKey.Key, out var layer, false)) |
24 | | - return; |
| 25 | + private void KillSignAdded(Entity<KillSignComponent> ent, ref ComponentStartup args) |
| 26 | + { |
| 27 | + AddKillsign(ent); |
| 28 | + } |
25 | 29 |
|
26 | | - _sprite.RemoveLayer((uid, sprite), layer); |
| 30 | + private void AfterAutoHandleState(Entity<KillSignComponent> ent, ref AfterAutoHandleStateEvent args) |
| 31 | + { |
| 32 | + // After receiving a new state for the component, we remove the old killsign and build a new one. |
| 33 | + // This is so changes to the sprite can be displayed live and allowing them to be edited via ViewVariables. |
| 34 | + // This could just update an existing sprite, but this is both easier and runs rarely anyway. |
| 35 | + RemoveKillsign(ent); |
| 36 | + AddKillsign(ent); |
27 | 37 | } |
28 | 38 |
|
29 | | - private void KillSignAdded(EntityUid uid, KillSignComponent component, ComponentStartup args) |
| 39 | + private void AddKillsign(Entity<KillSignComponent> ent) |
30 | 40 | { |
31 | | - if (!TryComp<SpriteComponent>(uid, out var sprite)) |
| 41 | + // If we hide from owner and we ARE the owner, don't add a killsign. |
| 42 | + // This could use session specific networking to FULLY hide it, but I am too lazy right now. |
| 43 | + if (ent.Comp.HideFromOwner && _player.LocalEntity == ent) |
| 44 | + return; |
| 45 | + |
| 46 | + if (!TryComp<SpriteComponent>(ent, out var sprite)) |
32 | 47 | return; |
33 | 48 |
|
34 | | - if (_sprite.LayerMapTryGet((uid, sprite), KillSignKey.Key, out var _, false)) |
| 49 | + if (_sprite.LayerMapTryGet((ent, sprite), KillSignKey.Key, out var _, false)) |
35 | 50 | return; |
36 | 51 |
|
37 | | - var adj = _sprite.GetLocalBounds((uid, sprite)).Height / 2 + ((1.0f / 32) * 6.0f); |
| 52 | + if (ent.Comp.Sprite == null) |
| 53 | + return; |
38 | 54 |
|
39 | | - var layer = _sprite.AddLayer((uid, sprite), new SpriteSpecifier.Rsi(new ResPath("Objects/Misc/killsign.rsi"), "sign")); |
40 | | - _sprite.LayerMapSet((uid, sprite), KillSignKey.Key, layer); |
| 55 | + var adj = _sprite.GetLocalBounds((ent, sprite)).Height / 2 + ((1.0f / 32) * 6.0f); |
| 56 | + |
| 57 | + var layer = _sprite.AddLayer((ent, sprite), ent.Comp.Sprite); |
| 58 | + _sprite.LayerMapSet((ent, sprite), KillSignKey.Key, layer); |
| 59 | + _sprite.LayerSetScale((ent, sprite), layer, ent.Comp.Scale); |
| 60 | + _sprite.LayerSetOffset((ent, sprite), layer, ent.Comp.DoOffset ? new Vector2(0.0f, adj) : new Vector2(0.0f, 0.0f)); |
| 61 | + |
| 62 | + if (ent.Comp.ForceUnshaded) |
| 63 | + sprite.LayerSetShader(layer, "unshaded"); |
| 64 | + } |
| 65 | + |
| 66 | + private void RemoveKillsign(Entity<KillSignComponent> ent) |
| 67 | + { |
| 68 | + if (!TryComp<SpriteComponent>(ent, out var sprite)) |
| 69 | + return; |
| 70 | + |
| 71 | + if (!_sprite.LayerMapTryGet((ent, sprite), KillSignKey.Key, out var layer, false)) |
| 72 | + return; |
41 | 73 |
|
42 | | - _sprite.LayerSetOffset((uid, sprite), layer, new Vector2(0.0f, adj)); |
43 | | - sprite.LayerSetShader(layer, "unshaded"); |
| 74 | + _sprite.RemoveLayer((ent, sprite), layer); |
44 | 75 | } |
45 | 76 |
|
46 | 77 | private enum KillSignKey |
|
0 commit comments