From 8324ebea37b072f7051ac1d0a414e345806e3886 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:02:43 +0100 Subject: [PATCH 01/40] fixes --- .../Systems/ShowContrabandIconsSystem.cs | 3 +- .../ContrabandIcons/ContrabandIconsSystem.cs | 29 +++++++++++++++++- .../Components/VisibleContrabandComponent.cs | 2 +- .../Prototypes/ContrabandIcons.cs | 2 +- .../SharedContrabandIconsSystem.cs | 28 +---------------- .../ShowCriminalRecordIconsComponent.cs | 2 +- .../StatusIcon/contraband_icons.yml | 5 ++- .../hud_contraband.png | Bin .../hud_none.png | Bin .../Interface/Misc/contraband_icons/meta.json | 18 +++++++++++ .../Misc/security_icons.rsi/meta.json | 6 ---- 11 files changed, 53 insertions(+), 42 deletions(-) rename Resources/Textures/_Goobstation/Interface/Misc/{security_icons.rsi => contraband_icons}/hud_contraband.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{security_icons.rsi => contraband_icons}/hud_none.png (100%) create mode 100644 Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json diff --git a/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs index 885f2944f933..0bdad0ba094b 100644 --- a/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs @@ -1,8 +1,7 @@ using Content.Client.Overlays; using Content.Shared.StatusIcon.Components; using Robust.Shared.Prototypes; -using ShowContrabandIconsComponent = Content.Goobstation.Shared.Security.ContrabandIcons.Components.ShowContrabandIconsComponent; -using VisibleContrabandComponent = Content.Goobstation.Shared.Security.ContrabandIcons.Components.VisibleContrabandComponent; +using Content.Goobstation.Shared.Security.ContrabandIcons.Components; namespace Content.Goobstation.Client.Security.Systems; diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 5fad338ba3e8..382289b82932 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,7 +1,8 @@ using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared._Goobstation.Security.ContrabandIcons; +using Content.Shared.Hands; using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -12,10 +13,36 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnMapInit); + + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + + SubscribeLocalEvent(OnEquipHands); + SubscribeLocalEvent(OnUnequipHands); } private void OnMapInit(EntityUid uid, VisibleContrabandComponent component, MapInitEvent args) { ContrabandDetect(uid, component, SlotFlags.WITHOUT_POCKET); } + + private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) + { + ContrabandDetect(uid, component, args.SlotFlags); + } + + private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) + { + ContrabandDetect(uid, component, args.SlotFlags); + } + + private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) + { + ContrabandDetect(uid, component, SlotFlags.NONE); + } + + private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) + { + ContrabandDetect(uid, component, SlotFlags.NONE); + } } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index c188ae90a590..38407017d52e 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared._Goobstation.Security.ContrabandIcons.Prototypes; +using Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandIcons.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandIcons.cs index 4a7d298314ad..6c4654a9dafa 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandIcons.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandIcons.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; -namespace Content.Shared._Goobstation.Security.ContrabandIcons.Prototypes; +namespace Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; [Prototype("contrabandIcon")] public sealed partial class ContrabandIconPrototype : StatusIconPrototype, IInheritingPrototype diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 5c39738879b0..ac31b48ef18f 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -2,16 +2,14 @@ using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; using Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; -using Content.Shared.Hands; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; using Content.Shared.Strip.Components; using Robust.Shared.Configuration; namespace Content.Goobstation.Shared.Security.ContrabandIcons; /// -/// This handles... +/// This is responsible for updating the contraband status icon /// public abstract class SharedContrabandIconsSystem : EntitySystem { @@ -22,11 +20,6 @@ public abstract class SharedContrabandIconsSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); - - SubscribeLocalEvent(OnEquipHands); - SubscribeLocalEvent(OnUnequipHands); Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); } @@ -52,23 +45,4 @@ private string StatusToIcon(ContrabandStatus status) _ => "ContrabandIconNone" }; } - - private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) - { - ContrabandDetect(uid, component, args.SlotFlags); - } - - private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) - { - ContrabandDetect(uid, component, args.SlotFlags); - } - - private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) - { - ContrabandDetect(uid, component, SlotFlags.NONE); - } - private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) - { - ContrabandDetect(uid, component, SlotFlags.NONE); - } } diff --git a/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs b/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs index 2a4f472aedd7..0444e6636cab 100644 --- a/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs +++ b/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs @@ -13,4 +13,4 @@ namespace Content.Shared.Overlays; /// This component allows you to see criminal record status of mobs. /// [RegisterComponent, NetworkedComponent] -public sealed partial class ShowCriminalRecordIconsComponent : Component { } \ No newline at end of file +public sealed partial class ShowCriminalRecordIconsComponent : Component; \ No newline at end of file diff --git a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml index 2c81db9b71a1..030c75bf3a14 100644 --- a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml +++ b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml @@ -10,13 +10,12 @@ parent: ContrabandIcon id: ContrabandIconContraband icon: - sprite: /Textures/_Goobstation/Interface/Misc/security_icons.rsi + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_contraband - type: contrabandIcon parent: ContrabandIcon id: ContrabandIconNone icon: - sprite: /Textures/_Goobstation/Interface/Misc/security_icons.rsi + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_none - diff --git a/Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/hud_contraband.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/hud_contraband.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/hud_none.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/hud_none.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json new file mode 100644 index 000000000000..e8c53d02d6a6 --- /dev/null +++ b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Contraband icon by Jvne, 'owe' on discord", + + "size": { + "x": 8, + "y": 8 + }, + "states": [ + { + "name": "hud_contraband" + }, + { + "name": "hud_none" + } + ] +} diff --git a/Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/meta.json b/Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/meta.json index 06988689e1e9..dc93e3e48137 100644 --- a/Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/meta.json +++ b/Resources/Textures/_Goobstation/Interface/Misc/security_icons.rsi/meta.json @@ -14,12 +14,6 @@ [ [1.0,1.0] ] - }, - { - "name": "hud_contraband" - }, - { - "name": "hud_none" } ] } From 1fb3368dd87a6fd661bd9872c0f80cbc17bf017f Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:25:35 +0100 Subject: [PATCH 02/40] x d --- .../ContrabandIcons/ContrabandIconsSystem.cs | 28 ------------------- .../SharedContrabandIconsSystem.cs | 26 +++++++++++++++++ .../StatusIcon/contraband_icons.yml | 6 ++-- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 382289b82932..aa5f9c9db893 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,8 +1,6 @@ using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared.Hands; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -13,36 +11,10 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnMapInit); - - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); - - SubscribeLocalEvent(OnEquipHands); - SubscribeLocalEvent(OnUnequipHands); } private void OnMapInit(EntityUid uid, VisibleContrabandComponent component, MapInitEvent args) { ContrabandDetect(uid, component, SlotFlags.WITHOUT_POCKET); } - - private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) - { - ContrabandDetect(uid, component, args.SlotFlags); - } - - private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) - { - ContrabandDetect(uid, component, args.SlotFlags); - } - - private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) - { - ContrabandDetect(uid, component, SlotFlags.NONE); - } - - private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) - { - ContrabandDetect(uid, component, SlotFlags.NONE); - } } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index ac31b48ef18f..35d37d57cd4d 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -2,7 +2,9 @@ using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; using Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; +using Content.Shared.Hands; using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; using Content.Shared.Strip.Components; using Robust.Shared.Configuration; @@ -20,6 +22,11 @@ public abstract class SharedContrabandIconsSystem : EntitySystem public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + + SubscribeLocalEvent(OnEquipHands); + SubscribeLocalEvent(OnUnequipHands); Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); } @@ -45,4 +52,23 @@ private string StatusToIcon(ContrabandStatus status) _ => "ContrabandIconNone" }; } + + private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) + { + ContrabandDetect(uid, component, args.SlotFlags); + } + + private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) + { + ContrabandDetect(uid, component, args.SlotFlags); + } + + private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) + { + ContrabandDetect(uid, component, SlotFlags.NONE); + } + private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) + { + ContrabandDetect(uid, component, SlotFlags.NONE); + } } diff --git a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml index 030c75bf3a14..9488e31b1901 100644 --- a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml +++ b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml @@ -10,12 +10,12 @@ parent: ContrabandIcon id: ContrabandIconContraband icon: - sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons state: hud_contraband - + - type: contrabandIcon parent: ContrabandIcon id: ContrabandIconNone icon: - sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons state: hud_none From 949dadbc966afd22ccd72de945a077f357470fe0 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:28:23 +0100 Subject: [PATCH 03/40] ... readability --- .../Security/ContrabandIcons/SharedContrabandIconsSystem.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 35d37d57cd4d..38c7ce935888 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -33,9 +33,7 @@ public override void Initialize() protected void ContrabandDetect(EntityUid inventory, VisibleContrabandComponent component, SlotFlags slotFlags = SlotFlags.WITHOUT_POCKET) { - if (!_isEnabled) - return; - if (HasComp(inventory)) + if (!_isEnabled || HasComp(inventory)) return; var list = _detectorSystem.FindContraband(inventory, false, slotFlags); var isDetected = list.Count > 0; From 5cfe3cf05b24b75d9a6972b0a6c5a7846ab175be Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:33:18 +0100 Subject: [PATCH 04/40] merged thing when apropriate --- .../ContrabandIcons/Prototypes/ContrabandStatus.cs | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandStatus.cs diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandStatus.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandStatus.cs deleted file mode 100644 index 572cac8beca4..000000000000 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Prototypes/ContrabandStatus.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; - -public enum ContrabandStatus : byte -{ - None, - Contraband -} From 30e2d6921d65ce222b73b42bf16cde1477e58fdf Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:34:50 +0100 Subject: [PATCH 05/40] merged when apropriate --- .../Components/VisibleContrabandComponent.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index 38407017d52e..383a1253d6de 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -13,3 +13,9 @@ public sealed partial class VisibleContrabandComponent : Component [DataField, AutoNetworkedField] public ProtoId StatusIcon = "ContrabandIconNone"; } + +public enum ContrabandStatus : byte +{ + None, + Contraband +} From b67cf5b147e12a03bfa62236f95ecb2eb737b421 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:23:59 +0100 Subject: [PATCH 06/40] the war --- .../ContrabandIcons/SharedContrabandIconsSystem.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 38c7ce935888..c0301efeef84 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -2,11 +2,14 @@ using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; using Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; +using Content.Shared.Access.Components; using Content.Shared.Hands; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; +using Content.Shared.PDA; using Content.Shared.Strip.Components; using Robust.Shared.Configuration; +using Robust.Shared.Containers; namespace Content.Goobstation.Shared.Security.ContrabandIcons; @@ -30,7 +33,6 @@ public override void Initialize() Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); } - protected void ContrabandDetect(EntityUid inventory, VisibleContrabandComponent component, SlotFlags slotFlags = SlotFlags.WITHOUT_POCKET) { if (!_isEnabled || HasComp(inventory)) @@ -63,10 +65,11 @@ private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidU private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) { - ContrabandDetect(uid, component, SlotFlags.NONE); + if (!HasComp(args.Unequipped) && uid == args.User) + ContrabandDetect(uid, component); } private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) { - ContrabandDetect(uid, component, SlotFlags.NONE); + ContrabandDetect(uid, component); } } From 17d60251a4449de05db4e5783c5a724a9ff87a74 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:36:49 +0100 Subject: [PATCH 07/40] agh i dont know anymorre honestly just leave it like this shitcode getting triggered 10 times cause its in shared prediction is probably not needed for this and i cant be bothered --- .../ContrabandIcons/ContrabandIconsSystem.cs | 30 +++++++++++++++++++ .../SharedContrabandIconsSystem.cs | 25 ---------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index aa5f9c9db893..af51cc1ed722 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,6 +1,9 @@ using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; +using Content.Shared.Access.Components; +using Content.Shared.Hands; using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -11,10 +14,37 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnMapInit); + + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + + SubscribeLocalEvent(OnEquipHands); + SubscribeLocalEvent(OnUnequipHands); } private void OnMapInit(EntityUid uid, VisibleContrabandComponent component, MapInitEvent args) { ContrabandDetect(uid, component, SlotFlags.WITHOUT_POCKET); } + + private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) + { + ContrabandDetect(uid, component); + } + + private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) + { + ContrabandDetect(uid, component); + } + + private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) + { + if (!HasComp(args.Unequipped) && uid == args.User) + ContrabandDetect(uid, component); + } + + private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) + { + ContrabandDetect(uid, component); + } } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index c0301efeef84..24b51bfddf5d 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -25,11 +25,6 @@ public abstract class SharedContrabandIconsSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); - - SubscribeLocalEvent(OnEquipHands); - SubscribeLocalEvent(OnUnequipHands); Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); } @@ -52,24 +47,4 @@ private string StatusToIcon(ContrabandStatus status) _ => "ContrabandIconNone" }; } - - private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) - { - ContrabandDetect(uid, component, args.SlotFlags); - } - - private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) - { - ContrabandDetect(uid, component, args.SlotFlags); - } - - private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) - { - if (!HasComp(args.Unequipped) && uid == args.User) - ContrabandDetect(uid, component); - } - private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) - { - ContrabandDetect(uid, component); - } } From 1aa9d009a35e965564db9aa2a0a68900922390a8 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:50:55 +0100 Subject: [PATCH 08/40] god help me --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 4 +++- .../ContrabandIcons/SharedContrabandIconsSystem.cs | 9 +-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index af51cc1ed722..6ed5a63c48bb 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Hands; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; +using Content.Shared.Strip.Components; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -45,6 +46,7 @@ private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) { - ContrabandDetect(uid, component); + if(!HasComp(args.User)) + ContrabandDetect(uid, component); } } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 24b51bfddf5d..bb7c4b57bafa 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -1,15 +1,8 @@ using Content.Goobstation.Common.CCVar; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Goobstation.Shared.Security.ContrabandIcons.Prototypes; -using Content.Shared.Access.Components; -using Content.Shared.Hands; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; -using Content.Shared.PDA; -using Content.Shared.Strip.Components; using Robust.Shared.Configuration; -using Robust.Shared.Containers; namespace Content.Goobstation.Shared.Security.ContrabandIcons; @@ -30,7 +23,7 @@ public override void Initialize() } protected void ContrabandDetect(EntityUid inventory, VisibleContrabandComponent component, SlotFlags slotFlags = SlotFlags.WITHOUT_POCKET) { - if (!_isEnabled || HasComp(inventory)) + if (!_isEnabled) return; var list = _detectorSystem.FindContraband(inventory, false, slotFlags); var isDetected = list.Count > 0; From c14c016f78a75c02ed4e105eed04e26f2d09f679 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 18:07:47 +0100 Subject: [PATCH 09/40] hope this doesnt break anything --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 6ed5a63c48bb..59d9d624423d 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,3 +1,4 @@ +using Content.Goobstation.Common.CCVar; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; using Content.Shared.Access.Components; @@ -5,15 +6,20 @@ using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Strip.Components; +using Robust.Shared.Configuration; namespace Content.Goobstation.Server.Security.ContrabandIcons; public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { + [Dependency] private readonly IConfigurationManager _configuration = default!; + private bool _isEnabled = true; public override void Initialize() { base.Initialize(); - + Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); + if(!_isEnabled) + return; SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnEquip); From 8f290a46142ed7402ecbcd0582477d632eb7af62 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 18:13:51 +0100 Subject: [PATCH 10/40] goida code go --- .../ContrabandIcons/ContrabandIconsSystem.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 59d9d624423d..74f00427c3fa 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -14,21 +14,23 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { [Dependency] private readonly IConfigurationManager _configuration = default!; private bool _isEnabled = true; + public override void Initialize() { base.Initialize(); Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); - if(!_isEnabled) - return; - SubscribeLocalEvent(OnMapInit); + if (_isEnabled) + { + SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); - SubscribeLocalEvent(OnEquipHands); - SubscribeLocalEvent(OnUnequipHands); + SubscribeLocalEvent(OnEquipHands); + SubscribeLocalEvent(OnUnequipHands); + } } - + private void OnMapInit(EntityUid uid, VisibleContrabandComponent component, MapInitEvent args) { ContrabandDetect(uid, component, SlotFlags.WITHOUT_POCKET); From 8146afc632d9d697caa68d29dd5558c341117f64 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Mon, 1 Dec 2025 21:25:35 +0100 Subject: [PATCH 11/40] how do i go fast? --- .../ContrabandIcons/ContrabandIconsSystem.cs | 71 +++++++++++++++---- .../Components/VisibleContrabandComponent.cs | 5 ++ 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 74f00427c3fa..cc54e188ffa9 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,19 +1,46 @@ +using System.Linq; using Content.Goobstation.Common.CCVar; +using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; using Content.Shared.Access.Components; +using Content.Shared.Contraband; using Content.Shared.Hands; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Strip.Components; using Robust.Shared.Configuration; +using Robust.Shared.Timing; namespace Content.Goobstation.Server.Security.ContrabandIcons; public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; private bool _isEnabled = true; + public override void Update(float frameTime) + { + base.Update(frameTime); + if (!_isEnabled) + return; + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + var timeSpanDone = false; + var contraCheck = false; + if (comp.VisibleItems.Count != 0 && comp.VisibleItems.Values.All(value => value < _timing.CurTime)) + timeSpanDone = true; + if (!timeSpanDone) + continue; + if (CheckItemsInComponent(comp, uid)) + contraCheck = true; + comp.StatusIcon = StatusToIcon((timeSpanDone && contraCheck) ? ContrabandStatus.Contraband : ContrabandStatus.None); + Dirty(uid, comp); + } + query.Dispose(); + } public override void Initialize() { @@ -21,7 +48,7 @@ public override void Initialize() Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); if (_isEnabled) { - SubscribeLocalEvent(OnMapInit); + //SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnEquip); SubscribeLocalEvent(OnUnequip); @@ -31,30 +58,46 @@ public override void Initialize() } } - private void OnMapInit(EntityUid uid, VisibleContrabandComponent component, MapInitEvent args) + private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { - ContrabandDetect(uid, component, SlotFlags.WITHOUT_POCKET); + comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + comp.VisibleTimeout); } - - private void OnEquip(EntityUid uid, VisibleContrabandComponent component, DidEquipEvent args) + + private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) { - ContrabandDetect(uid, component); + comp.VisibleItems.TryAdd(args.Equipped, _timing.CurTime + comp.VisibleTimeout); } - private void OnUnequip(EntityUid uid, VisibleContrabandComponent component, DidUnequipEvent args) + private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) { - ContrabandDetect(uid, component); + comp.VisibleItems.Remove(args.Unequipped); } - private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent component, DidUnequipHandEvent args) + private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) { - if (!HasComp(args.Unequipped) && uid == args.User) - ContrabandDetect(uid, component); + comp.VisibleItems.Remove(args.Equipment); } - private void OnEquipHands(EntityUid uid, VisibleContrabandComponent component, DidEquipHandEvent args) + private string StatusToIcon(ContrabandStatus status) { - if(!HasComp(args.User)) - ContrabandDetect(uid, component); + return status switch + { + ContrabandStatus.None => "ContrabandIconNone", + ContrabandStatus.Contraband => "ContrabandIconContraband", + _ => "ContrabandIconNone" + }; + } + private bool CheckItemsInComponent(VisibleContrabandComponent component, EntityUid owner) + { + foreach (var item in component.VisibleItems.Keys) + { + if(!TryComp(item, out var contraband)) + continue; + if (_detectorSystem.IsContraband(item) && !_detectorSystem.CheckContrabandPermission(item, owner, contraband)) + return true; + else + return false; + } + return false; } } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index 383a1253d6de..b88f4d9dabbd 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -12,6 +12,11 @@ public sealed partial class VisibleContrabandComponent : Component /// [DataField, AutoNetworkedField] public ProtoId StatusIcon = "ContrabandIconNone"; + + [DataField, AutoNetworkedField] + public Dictionary VisibleItems = new(); + + public readonly TimeSpan VisibleTimeout = TimeSpan.FromSeconds(2f); } public enum ContrabandStatus : byte From 5c023b94535ba1b6536bc8e504e7e5db449022ec Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:05:40 +0100 Subject: [PATCH 12/40] made it faster --- .../ContrabandIcons/ContrabandIconsSystem.cs | 72 ++++++++++++------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index cc54e188ffa9..e33e308f05ad 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,15 +1,15 @@ +using System; using System.Linq; using Content.Goobstation.Common.CCVar; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared.Access.Components; using Content.Shared.Contraband; using Content.Shared.Hands; -using Content.Shared.Inventory; using Content.Shared.Inventory.Events; -using Content.Shared.Strip.Components; using Robust.Shared.Configuration; +using Robust.Shared.GameObjects; +using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -19,32 +19,23 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; + [Dependency] private readonly IRobustRandom _rng = default!; private bool _isEnabled = true; + private TimeSpan _nextUpdate; public override void Update(float frameTime) { base.Update(frameTime); if (!_isEnabled) return; - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp)) - { - var timeSpanDone = false; - var contraCheck = false; - if (comp.VisibleItems.Count != 0 && comp.VisibleItems.Values.All(value => value < _timing.CurTime)) - timeSpanDone = true; - if (!timeSpanDone) - continue; - if (CheckItemsInComponent(comp, uid)) - contraCheck = true; - comp.StatusIcon = StatusToIcon((timeSpanDone && contraCheck) ? ContrabandStatus.Contraband : ContrabandStatus.None); - Dirty(uid, comp); - } - query.Dispose(); + if (_timing.CurTime < _nextUpdate) + return; + CheckVisibleContra(); } public override void Initialize() { base.Initialize(); + _nextUpdate = TimeSpan.Zero; Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); if (_isEnabled) { @@ -60,12 +51,14 @@ public override void Initialize() private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { - comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + comp.VisibleTimeout); + if(HasComp(args.Equipment)) + comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + comp.VisibleTimeout); } private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) { - comp.VisibleItems.TryAdd(args.Equipped, _timing.CurTime + comp.VisibleTimeout); + if (HasComp(args.Equipped)) + comp.VisibleItems.TryAdd(args.Equipped, _timing.CurTime + comp.VisibleTimeout); } private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) @@ -87,17 +80,42 @@ private string StatusToIcon(ContrabandStatus status) _ => "ContrabandIconNone" }; } + + private void CheckVisibleContra() + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + var timeSpanDone = false; + var contraCheck = false; + if (comp.VisibleItems.Count != 0 && comp.VisibleItems.Values.Any(value => value < _timing.CurTime)) + timeSpanDone = true; + else + continue; + contraCheck = CheckItemsInComponent(comp, uid); + var newStatus = StatusToIcon(timeSpanDone && contraCheck + ? ContrabandStatus.Contraband + : ContrabandStatus.None); + if (comp.StatusIcon != newStatus) + { + comp.StatusIcon = newStatus; + Dirty(uid, comp); + } + } + + _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(500 + (_rng.NextFloat() - 0.5) * 500); + query.Dispose(); + } + private bool CheckItemsInComponent(VisibleContrabandComponent component, EntityUid owner) { + var returnValue = false; foreach (var item in component.VisibleItems.Keys) { - if(!TryComp(item, out var contraband)) - continue; - if (_detectorSystem.IsContraband(item) && !_detectorSystem.CheckContrabandPermission(item, owner, contraband)) - return true; - else - return false; + var contra = Comp(item); + if (!_detectorSystem.CheckContrabandPermission(item, owner, contra)) + returnValue = true; } - return false; + return returnValue; } } From be847d18402502d45b24de08d5fd68743d3a6eaa Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:14:52 +0100 Subject: [PATCH 13/40] goidaed --- .../ContrabandIcons/ContrabandIconsSystem.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index e33e308f05ad..83d1c44f3abf 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,4 +1,3 @@ -using System; using System.Linq; using Content.Goobstation.Common.CCVar; using Content.Goobstation.Shared.Contraband; @@ -22,6 +21,7 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem [Dependency] private readonly IRobustRandom _rng = default!; private bool _isEnabled = true; private TimeSpan _nextUpdate; + public override void Update(float frameTime) { base.Update(frameTime); @@ -30,6 +30,7 @@ public override void Update(float frameTime) if (_timing.CurTime < _nextUpdate) return; CheckVisibleContra(); + _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(500 + (_rng.NextFloat() - 0.5) * 500); } public override void Initialize() @@ -51,10 +52,10 @@ public override void Initialize() private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { - if(HasComp(args.Equipment)) + if (HasComp(args.Equipment)) comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + comp.VisibleTimeout); } - + private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) { if (HasComp(args.Equipped)) @@ -94,8 +95,8 @@ private void CheckVisibleContra() continue; contraCheck = CheckItemsInComponent(comp, uid); var newStatus = StatusToIcon(timeSpanDone && contraCheck - ? ContrabandStatus.Contraband - : ContrabandStatus.None); + ? ContrabandStatus.Contraband + : ContrabandStatus.None); if (comp.StatusIcon != newStatus) { comp.StatusIcon = newStatus; @@ -103,7 +104,6 @@ private void CheckVisibleContra() } } - _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(500 + (_rng.NextFloat() - 0.5) * 500); query.Dispose(); } @@ -116,6 +116,7 @@ private bool CheckItemsInComponent(VisibleContrabandComponent component, EntityU if (!_detectorSystem.CheckContrabandPermission(item, owner, contra)) returnValue = true; } + return returnValue; } -} +} \ No newline at end of file From 7b7e0b4b7e829a99943692c4862ea27eb7fadc6c Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:41:29 +0100 Subject: [PATCH 14/40] g9oida --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 2 +- .../ContrabandIcons/Components/VisibleContrabandComponent.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 83d1c44f3abf..8494c2e7795e 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -30,7 +30,7 @@ public override void Update(float frameTime) if (_timing.CurTime < _nextUpdate) return; CheckVisibleContra(); - _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(500 + (_rng.NextFloat() - 0.5) * 500); + _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(1000 + (_rng.NextFloat() - 0.5) * 500); } public override void Initialize() diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index b88f4d9dabbd..9a3571c7f005 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -16,7 +16,7 @@ public sealed partial class VisibleContrabandComponent : Component [DataField, AutoNetworkedField] public Dictionary VisibleItems = new(); - public readonly TimeSpan VisibleTimeout = TimeSpan.FromSeconds(2f); + public readonly TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); } public enum ContrabandStatus : byte From 6a3c85c58d5221a2cbf781a1d3aadcc003ac1a1d Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:35:31 +0100 Subject: [PATCH 15/40] gg --- .../Prototypes/_Goobstation/StatusIcon/contraband_icons.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml index 9488e31b1901..23548dc57e98 100644 --- a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml +++ b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml @@ -10,12 +10,12 @@ parent: ContrabandIcon id: ContrabandIconContraband icon: - sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_contraband - type: contrabandIcon parent: ContrabandIcon id: ContrabandIconNone icon: - sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_none From c75e719cc2c05d83a414a67a0b9e1cd9242d5f8e Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:11:58 +0100 Subject: [PATCH 16/40] holy shit yaml --- .../Prototypes/_Goobstation/StatusIcon/contraband_icons.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml index 23548dc57e98..482a0e83e416 100644 --- a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml +++ b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml @@ -10,12 +10,12 @@ parent: ContrabandIcon id: ContrabandIconContraband icon: - sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi + sprite: Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_contraband - type: contrabandIcon parent: ContrabandIcon id: ContrabandIconNone icon: - sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi + sprite: Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_none From 5367f4fea29857604c26fd3f6652d5100f792b01 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:24:29 +0100 Subject: [PATCH 17/40] fuck my stupid chud lif e --- .../hud_contraband.png | Bin .../hud_none.png | Bin .../meta.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons => contraband_icons.rsi}/hud_contraband.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons => contraband_icons.rsi}/hud_none.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons => contraband_icons.rsi}/meta.json (100%) diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_contraband.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_contraband.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_none.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_none.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/meta.json similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/meta.json From 097e5993e232fd4927839828090efe4b7735b8c0 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:42:32 +0100 Subject: [PATCH 18/40] h --- .../hud_contraband.png | Bin .../hud_none.png | Bin .../meta.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons.rsi => contraband_icons}/hud_contraband.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons.rsi => contraband_icons}/hud_none.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons.rsi => contraband_icons}/meta.json (100%) diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_contraband.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_contraband.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_none.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_none.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/meta.json b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/meta.json rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json From 2ba8b216dd8e810be6e91f745c13998e16099aba Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:43:28 +0100 Subject: [PATCH 19/40] yoml lontr xd --- .../hud_contraband.png | Bin .../hud_none.png | Bin .../meta.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons => contraband_icons.rsi}/hud_contraband.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons => contraband_icons.rsi}/hud_none.png (100%) rename Resources/Textures/_Goobstation/Interface/Misc/{contraband_icons => contraband_icons.rsi}/meta.json (100%) diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_contraband.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_contraband.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_contraband.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_none.png similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/hud_none.png rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/hud_none.png diff --git a/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json b/Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/meta.json similarity index 100% rename from Resources/Textures/_Goobstation/Interface/Misc/contraband_icons/meta.json rename to Resources/Textures/_Goobstation/Interface/Misc/contraband_icons.rsi/meta.json From 0003c7a498ff977dd66778ad6054fbfe8595b048 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:50:06 +0100 Subject: [PATCH 20/40] what ththe fuck is wrong with lonter --- .../Prototypes/_Goobstation/StatusIcon/contraband_icons.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml index 482a0e83e416..23548dc57e98 100644 --- a/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml +++ b/Resources/Prototypes/_Goobstation/StatusIcon/contraband_icons.yml @@ -10,12 +10,12 @@ parent: ContrabandIcon id: ContrabandIconContraband icon: - sprite: Textures/_Goobstation/Interface/Misc/contraband_icons.rsi + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_contraband - type: contrabandIcon parent: ContrabandIcon id: ContrabandIconNone icon: - sprite: Textures/_Goobstation/Interface/Misc/contraband_icons.rsi + sprite: /Textures/_Goobstation/Interface/Misc/contraband_icons.rsi state: hud_none From 9b8f555ef5eb475908c61a4849def93b3b02ea96 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 06:48:31 +0100 Subject: [PATCH 21/40] goida go --- .../Systems/ShowContrabandIconsSystem.cs | 9 ++++++--- .../ContrabandIcons/ContrabandIconsSystem.cs | 15 ++++++++++----- .../Components/VisibleContrabandComponent.cs | 2 +- .../SharedContrabandIconsSystem.cs | 19 ------------------- 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs index 0bdad0ba094b..7e54bdf19ff2 100644 --- a/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ShowContrabandIconsSystem.cs @@ -2,23 +2,26 @@ using Content.Shared.StatusIcon.Components; using Robust.Shared.Prototypes; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; +using Content.Goobstation.Common.CCVar; +using Robust.Shared.Configuration; namespace Content.Goobstation.Client.Security.Systems; public sealed class ShowContrabandIconsSystem : EquipmentHudSystem { [Dependency] private readonly IPrototypeManager _prototype = default!; - + [Dependency] private readonly IConfigurationManager _configuration = default!; + private bool _isEnabled = true; public override void Initialize() { base.Initialize(); - + Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); SubscribeLocalEvent(OnGetStatusIconsEvent); } private void OnGetStatusIconsEvent(EntityUid uid, VisibleContrabandComponent component, ref GetStatusIconsEvent ev) { - if (!IsActive) + if (!IsActive || !_isEnabled) return; if (_prototype.TryIndex(component.StatusIcon, out var iconPrototype)) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 8494c2e7795e..994ebcd2658b 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -6,8 +6,8 @@ using Content.Shared.Contraband; using Content.Shared.Hands; using Content.Shared.Inventory.Events; +using Content.Shared.Strip.Components; using Robust.Shared.Configuration; -using Robust.Shared.GameObjects; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -18,7 +18,6 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; - [Dependency] private readonly IRobustRandom _rng = default!; private bool _isEnabled = true; private TimeSpan _nextUpdate; @@ -30,7 +29,7 @@ public override void Update(float frameTime) if (_timing.CurTime < _nextUpdate) return; CheckVisibleContra(); - _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(1000 + (_rng.NextFloat() - 0.5) * 500); + _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(1000); } public override void Initialize() @@ -52,14 +51,20 @@ public override void Initialize() private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { + var thiefbuff = 1; + if (HasComp(args.Equipee)) + thiefbuff = 2; if (HasComp(args.Equipment)) - comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + comp.VisibleTimeout); + comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + (comp.VisibleTimeout * thiefbuff)); } private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) { + var thiefbuff = 1; + if (HasComp(args.User)) + thiefbuff = 2; if (HasComp(args.Equipped)) - comp.VisibleItems.TryAdd(args.Equipped, _timing.CurTime + comp.VisibleTimeout); + comp.VisibleItems.TryAdd(args.Equipped, _timing.CurTime + (comp.VisibleTimeout * thiefbuff)); } private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index 9a3571c7f005..c8e329522a1c 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -16,7 +16,7 @@ public sealed partial class VisibleContrabandComponent : Component [DataField, AutoNetworkedField] public Dictionary VisibleItems = new(); - public readonly TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); + public TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); } public enum ContrabandStatus : byte diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index bb7c4b57bafa..48437d3719f7 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -1,7 +1,5 @@ -using Content.Goobstation.Common.CCVar; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared.Inventory; using Robust.Shared.Configuration; namespace Content.Goobstation.Shared.Security.ContrabandIcons; @@ -13,23 +11,6 @@ public abstract class SharedContrabandIconsSystem : EntitySystem { [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; [Dependency] private readonly IConfigurationManager _configuration = default!; - private bool _isEnabled = true; - - public override void Initialize() - { - base.Initialize(); - - Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); - } - protected void ContrabandDetect(EntityUid inventory, VisibleContrabandComponent component, SlotFlags slotFlags = SlotFlags.WITHOUT_POCKET) - { - if (!_isEnabled) - return; - var list = _detectorSystem.FindContraband(inventory, false, slotFlags); - var isDetected = list.Count > 0; - component.StatusIcon = StatusToIcon(isDetected ? ContrabandStatus.Contraband : ContrabandStatus.None); - Dirty(inventory, component); - } private string StatusToIcon(ContrabandStatus status) { From 293696d01f38295b613fe8f0bf6198b3a9341a42 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 06:50:56 +0100 Subject: [PATCH 22/40] polishing the turd --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 994ebcd2658b..8147850cb4ea 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -92,14 +92,12 @@ private void CheckVisibleContra() var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp)) { - var timeSpanDone = false; - var contraCheck = false; + bool timeSpanDone; if (comp.VisibleItems.Count != 0 && comp.VisibleItems.Values.Any(value => value < _timing.CurTime)) timeSpanDone = true; else continue; - contraCheck = CheckItemsInComponent(comp, uid); - var newStatus = StatusToIcon(timeSpanDone && contraCheck + var newStatus = StatusToIcon(timeSpanDone && CheckItemsInComponent(comp, uid) ? ContrabandStatus.Contraband : ContrabandStatus.None); if (comp.StatusIcon != newStatus) From a547a450983649c21f0c532c305e721b3915bdd3 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:43:51 +0100 Subject: [PATCH 23/40] idk its probably faster now i used list of tuples and cached queries --- .../ContrabandIcons/ContrabandIconsSystem.cs | 56 ++++++++----------- .../Components/VisibleContrabandComponent.cs | 2 +- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 8147850cb4ea..de4a98b318a7 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using Content.Goobstation.Common.CCVar; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; @@ -8,7 +7,6 @@ using Content.Shared.Inventory.Events; using Content.Shared.Strip.Components; using Robust.Shared.Configuration; -using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -20,7 +18,8 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; private bool _isEnabled = true; private TimeSpan _nextUpdate; - + private EntityQuery _contrabandQuery; + public override void Update(float frameTime) { base.Update(frameTime); @@ -36,11 +35,12 @@ public override void Initialize() { base.Initialize(); _nextUpdate = TimeSpan.Zero; + _contrabandQuery = GetEntityQuery(); Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); if (_isEnabled) { //SubscribeLocalEvent(OnMapInit); - + SubscribeLocalEvent(OnEquip); SubscribeLocalEvent(OnUnequip); @@ -54,8 +54,8 @@ private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEve var thiefbuff = 1; if (HasComp(args.Equipee)) thiefbuff = 2; - if (HasComp(args.Equipment)) - comp.VisibleItems.TryAdd(args.Equipment, _timing.CurTime + (comp.VisibleTimeout * thiefbuff)); + if (_contrabandQuery.HasComp(args.Equipment)) + comp.VisibleItems.Add((args.Equipment, _timing.CurTime + (comp.VisibleTimeout * thiefbuff))); } private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) @@ -63,18 +63,18 @@ private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEqu var thiefbuff = 1; if (HasComp(args.User)) thiefbuff = 2; - if (HasComp(args.Equipped)) - comp.VisibleItems.TryAdd(args.Equipped, _timing.CurTime + (comp.VisibleTimeout * thiefbuff)); + if (_contrabandQuery.HasComp(args.Equipped)) + comp.VisibleItems.Add((args.Equipped, _timing.CurTime + (comp.VisibleTimeout * thiefbuff))); } private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) { - comp.VisibleItems.Remove(args.Unequipped); + comp.VisibleItems.RemoveAll(t => t.uid == args.Unequipped); } private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) { - comp.VisibleItems.Remove(args.Equipment); + comp.VisibleItems.RemoveAll(t => t.uid == args.Equipment); } private string StatusToIcon(ContrabandStatus status) @@ -92,14 +92,19 @@ private void CheckVisibleContra() var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp)) { - bool timeSpanDone; - if (comp.VisibleItems.Count != 0 && comp.VisibleItems.Values.Any(value => value < _timing.CurTime)) - timeSpanDone = true; - else - continue; - var newStatus = StatusToIcon(timeSpanDone && CheckItemsInComponent(comp, uid) - ? ContrabandStatus.Contraband - : ContrabandStatus.None); + bool hasContraband = false; + foreach (var item in comp.VisibleItems) + { + if (item.time >= _timing.CurTime) + continue; + var contra = _contrabandQuery.Comp(item.uid); + if (!_detectorSystem.CheckContrabandPermission(item.uid, uid, contra)) + { + hasContraband = true; + break; + } + } + var newStatus = StatusToIcon(hasContraband ? ContrabandStatus.Contraband : ContrabandStatus.None); if (comp.StatusIcon != newStatus) { comp.StatusIcon = newStatus; @@ -109,17 +114,4 @@ private void CheckVisibleContra() query.Dispose(); } - - private bool CheckItemsInComponent(VisibleContrabandComponent component, EntityUid owner) - { - var returnValue = false; - foreach (var item in component.VisibleItems.Keys) - { - var contra = Comp(item); - if (!_detectorSystem.CheckContrabandPermission(item, owner, contra)) - returnValue = true; - } - - return returnValue; - } -} \ No newline at end of file +} diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index c8e329522a1c..db1d17bcf2dd 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -14,7 +14,7 @@ public sealed partial class VisibleContrabandComponent : Component public ProtoId StatusIcon = "ContrabandIconNone"; [DataField, AutoNetworkedField] - public Dictionary VisibleItems = new(); + public List<(EntityUid uid, TimeSpan time)> VisibleItems = new(); public TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); } From 6f5eeb89e2053861dfb53054706e5e984f92bb31 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:44:24 +0100 Subject: [PATCH 24/40] removed rendundant code --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index de4a98b318a7..0fb4d014520b 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -39,8 +39,6 @@ public override void Initialize() Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); if (_isEnabled) { - //SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnEquip); SubscribeLocalEvent(OnUnequip); From 3add6edab75e8c81c00d7525a3f82d9b87cde941 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 16:00:06 +0100 Subject: [PATCH 25/40] I think I made this significantly faster while having the same effect. --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 3 +++ .../ContrabandIcons/Components/VisibleContrabandComponent.cs | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 0fb4d014520b..5ce10befe0dc 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -4,6 +4,7 @@ using Content.Goobstation.Shared.Security.ContrabandIcons.Components; using Content.Shared.Contraband; using Content.Shared.Hands; +using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Strip.Components; using Robust.Shared.Configuration; @@ -49,6 +50,8 @@ public override void Initialize() private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { + if(args.SlotFlags == SlotFlags.POCKET) + return; var thiefbuff = 1; if (HasComp(args.Equipee)) thiefbuff = 2; diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index db1d17bcf2dd..73668c200be2 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -13,9 +13,10 @@ public sealed partial class VisibleContrabandComponent : Component [DataField, AutoNetworkedField] public ProtoId StatusIcon = "ContrabandIconNone"; - [DataField, AutoNetworkedField] + [DataField] public List<(EntityUid uid, TimeSpan time)> VisibleItems = new(); + [DataField] public TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); } From cdabfeef889d7b5368f0f1ab73343db83c439ca0 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:48:37 +0100 Subject: [PATCH 26/40] aaaaaaaaa --- .../Security/ContrabandIcons/SharedContrabandIconsSystem.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 48437d3719f7..f4dc79d07039 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -9,9 +9,6 @@ namespace Content.Goobstation.Shared.Security.ContrabandIcons; /// public abstract class SharedContrabandIconsSystem : EntitySystem { - [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; - [Dependency] private readonly IConfigurationManager _configuration = default!; - private string StatusToIcon(ContrabandStatus status) { return status switch From e48982304c6c26a0d518c3a17cecaa27e2ec4061 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:52:18 +0100 Subject: [PATCH 27/40] idk --- .../SharedContrabandIconsSystem.cs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index f4dc79d07039..135ca86229fd 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -1,21 +1,6 @@ -using Content.Goobstation.Shared.Contraband; -using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Robust.Shared.Configuration; - namespace Content.Goobstation.Shared.Security.ContrabandIcons; /// /// This is responsible for updating the contraband status icon /// -public abstract class SharedContrabandIconsSystem : EntitySystem -{ - private string StatusToIcon(ContrabandStatus status) - { - return status switch - { - ContrabandStatus.None => "ContrabandIconNone", - ContrabandStatus.Contraband => "ContrabandIconContraband", - _ => "ContrabandIconNone" - }; - } -} +public abstract class SharedContrabandIconsSystem : EntitySystem; From a86a64ce218ec8d4567806f183356594fe53fabb Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:20:32 +0100 Subject: [PATCH 28/40] :trolled: --- Content.Goobstation.Common/CCVar/CCVars.Goob.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Content.Goobstation.Common/CCVar/CCVars.Goob.cs b/Content.Goobstation.Common/CCVar/CCVars.Goob.cs index 638496bb6763..8d05e266ce6f 100644 --- a/Content.Goobstation.Common/CCVar/CCVars.Goob.cs +++ b/Content.Goobstation.Common/CCVar/CCVars.Goob.cs @@ -641,10 +641,11 @@ public sealed partial class GoobCVars public static readonly CVarDef BleedMultiplier = CVarDef.Create("medical.bloodloss_multiplier", 4.0f, CVar.SERVER); - #endregion + /// /// Enables or disables contraband icons. /// public static readonly CVarDef ContrabandIconsEnabled = - CVarDef.Create("contraband.icons_enabled", false, CVar.SERVER | CVar.REPLICATED); -} + CVarDef.Create("contraband.icons_enabled", true, CVar.SERVER | CVar.REPLICATED); + #endregion +} \ No newline at end of file From d7c45931e796900a7568a02597364ece45e3973f Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:55:51 +0100 Subject: [PATCH 29/40] hmmm --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 5ce10befe0dc..e3ec35fcfc9a 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -26,7 +26,7 @@ public override void Update(float frameTime) base.Update(frameTime); if (!_isEnabled) return; - if (_timing.CurTime < _nextUpdate) + if (_nextUpdate < _timing.CurTime) return; CheckVisibleContra(); _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(1000); From 481e819e9ff301512ef459d8364f8bc63745622f Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Thu, 4 Dec 2025 19:19:43 +0100 Subject: [PATCH 30/40] holy goida it just works GABEN --- .../Events/SharedContrabandIconsEvents.cs | 11 ++ .../ContrabandIcons/ContrabandIconsSystem.cs | 168 +++++++++++++----- .../Components/VisibleContrabandComponent.cs | 7 +- Content.Shared/PDA/SharedPdaSystem.cs | 5 +- 4 files changed, 144 insertions(+), 47 deletions(-) create mode 100644 Content.Goobstation.Common/Security/ContrabandIcons/Events/SharedContrabandIconsEvents.cs diff --git a/Content.Goobstation.Common/Security/ContrabandIcons/Events/SharedContrabandIconsEvents.cs b/Content.Goobstation.Common/Security/ContrabandIcons/Events/SharedContrabandIconsEvents.cs new file mode 100644 index 000000000000..86a79bea570a --- /dev/null +++ b/Content.Goobstation.Common/Security/ContrabandIcons/Events/SharedContrabandIconsEvents.cs @@ -0,0 +1,11 @@ +namespace Content.Goobstation.Common.Security.ContrabandIcons.Events; + + + +/// The entity UID of the ID card that was inserted. +/// The entity UID of the Pda. +public record struct IdCardInsertedEvent(EntityUid IdCardUid, EntityUid TargetUid); + +/// The entity UID of the ID card that was removed. +/// The entity UID of the Pda. +public record struct IdCardRemovedEvent(EntityUid IdCardUid, EntityUid TargetUid); \ No newline at end of file diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index e3ec35fcfc9a..5fcbbdef69a1 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,4 +1,5 @@ using Content.Goobstation.Common.CCVar; +using Content.Goobstation.Common.Security.ContrabandIcons.Events; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; @@ -6,9 +7,9 @@ using Content.Shared.Hands; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; -using Content.Shared.Strip.Components; using Robust.Shared.Configuration; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Goobstation.Server.Security.ContrabandIcons; @@ -17,26 +18,46 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; private bool _isEnabled = true; - private TimeSpan _nextUpdate; private EntityQuery _contrabandQuery; - + private readonly HashSet _queue = new(); + private EntityQuery _visibleContrabandQuery; + public override void Update(float frameTime) { base.Update(frameTime); if (!_isEnabled) return; - if (_nextUpdate < _timing.CurTime) + if (_queue.Count == 0) return; - CheckVisibleContra(); - _nextUpdate = _timing.CurTime + TimeSpan.FromMilliseconds(1000); + foreach (var personToMark in _queue) + { + if (_visibleContrabandQuery.TryComp(personToMark, out var comp) && comp.FirstItemTime is not null) + { + if (comp.VisibleItems.Count == 0) + { + comp.StatusIcon = StatusToIcon(ContrabandStatus.None); + Dirty(personToMark, comp); + _queue.Remove(personToMark); + continue; + } + + if (comp.FirstItemTime < _timing.CurTime) + { + comp.StatusIcon = StatusToIcon(ContrabandStatus.Contraband); + Dirty(personToMark, comp); + _queue.Remove(personToMark); + } + } + } } public override void Initialize() { base.Initialize(); - _nextUpdate = TimeSpan.Zero; _contrabandQuery = GetEntityQuery(); + _visibleContrabandQuery = GetEntityQuery(); Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); if (_isEnabled) { @@ -45,39 +66,84 @@ public override void Initialize() SubscribeLocalEvent(OnEquipHands); SubscribeLocalEvent(OnUnequipHands); + + SubscribeLocalEvent(OnIdCardInserted); + SubscribeLocalEvent(OnIdCardRemoved); } } private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { - if(args.SlotFlags == SlotFlags.POCKET) + var createdTime = _timing.TickPeriod.Mul(MetaData(args.Equipee).CreationTick.Value); // time entity was created + if (!_isEnabled || + !_contrabandQuery.TryComp(args.Equipment, out var contra) || + _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra) || + !(_timing.CurTime > createdTime + TimeSpan.FromSeconds(2f)) || args.SlotFlags == SlotFlags.POCKET) return; - var thiefbuff = 1; - if (HasComp(args.Equipee)) - thiefbuff = 2; - if (_contrabandQuery.HasComp(args.Equipment)) - comp.VisibleItems.Add((args.Equipment, _timing.CurTime + (comp.VisibleTimeout * thiefbuff))); + + comp.VisibleItems.Add(args.Equipment); + var newStatus = StatusToIcon(ContrabandStatus.Contraband); + if (comp.StatusIcon != newStatus) + { + comp.StatusIcon = newStatus; + Dirty(args.Equipee, comp); + } } private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) { - var thiefbuff = 1; - if (HasComp(args.User)) - thiefbuff = 2; - if (_contrabandQuery.HasComp(args.Equipped)) - comp.VisibleItems.Add((args.Equipped, _timing.CurTime + (comp.VisibleTimeout * thiefbuff))); + var createdTime = _timing.TickPeriod.Mul(MetaData(args.User).CreationTick.Value); + if (!_isEnabled || + !_contrabandQuery.TryComp(args.Equipped, out var contra) || + _detectorSystem.CheckContrabandPermission(args.Equipped, args.User, contra) || + !(_timing.CurTime > createdTime + TimeSpan.FromSeconds(2f))) + return; + comp.VisibleItems.Add(args.Equipped); + if (comp.VisibleItems.Count <= 1) + { + _queue.Add(args.User); + comp.FirstItemTime = _timing.CurTime + comp.VisibleTimeout; + } + else + { + var newStatus = StatusToIcon(ContrabandStatus.Contraband); + if (comp.StatusIcon != newStatus) + { + comp.StatusIcon = newStatus; + Dirty(args.User, comp); + } + } } private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) { - comp.VisibleItems.RemoveAll(t => t.uid == args.Unequipped); + comp.VisibleItems.Remove(args.Unequipped); + if (comp.VisibleItems.Count == 0) + { + var newStatus = StatusToIcon(ContrabandStatus.None); + if (comp.StatusIcon != newStatus) + { + comp.StatusIcon = newStatus; + Dirty(args.User, comp); + } + } } private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) { - comp.VisibleItems.RemoveAll(t => t.uid == args.Equipment); + comp.VisibleItems.Remove(args.Equipment); + if (comp.VisibleItems.Count == 0) + { + var newStatus = StatusToIcon(ContrabandStatus.None); + if (comp.StatusIcon != newStatus) + { + comp.StatusIcon = newStatus; + Dirty(args.Equipee, comp); + } + } } + private string StatusToIcon(ContrabandStatus status) { return status switch @@ -88,31 +154,47 @@ private string StatusToIcon(ContrabandStatus status) }; } - private void CheckVisibleContra() + /// + /// Handler for identity changes. When an entity's identity changes, re-evaluate their visible items + /// and update the contraband status icon if necessary. + /// + private void OnIdCardInserted(IdCardInsertedEvent args) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp)) + var uid = args.TargetUid; + CheckAllContraOfContainerOwner(uid); + } + + private void OnIdCardRemoved(IdCardRemovedEvent args) + { + var uid = args.TargetUid; + CheckAllContraOfContainerOwner(uid); + } + + private void CheckAllContraOfContainerOwner(EntityUid uid) + { + uid = GetHighestContainerOwner(uid); + + if (!_visibleContrabandQuery.TryComp(uid, out var visible)) + return; + var contralist = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET); + var newStatus = StatusToIcon(contralist.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None); + if (visible.StatusIcon != newStatus) { - bool hasContraband = false; - foreach (var item in comp.VisibleItems) - { - if (item.time >= _timing.CurTime) - continue; - var contra = _contrabandQuery.Comp(item.uid); - if (!_detectorSystem.CheckContrabandPermission(item.uid, uid, contra)) - { - hasContraband = true; - break; - } - } - var newStatus = StatusToIcon(hasContraband ? ContrabandStatus.Contraband : ContrabandStatus.None); - if (comp.StatusIcon != newStatus) - { - comp.StatusIcon = newStatus; - Dirty(uid, comp); - } + visible.StatusIcon = newStatus; + Dirty(uid, visible); + } + } + + public EntityUid GetHighestContainerOwner(EntityUid uid) + { + while (_inventory.TryGetContainingEntity(uid, out var containerEntity)) + { + if (containerEntity is { } owner) + uid = owner; + else + break; } - query.Dispose(); + return uid; } -} +} \ No newline at end of file diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index 73668c200be2..f536b187e152 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -14,10 +14,13 @@ public sealed partial class VisibleContrabandComponent : Component public ProtoId StatusIcon = "ContrabandIconNone"; [DataField] - public List<(EntityUid uid, TimeSpan time)> VisibleItems = new(); - + public HashSet VisibleItems = new(); + [DataField] public TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); + + [DataField] + public TimeSpan? FirstItemTime; } public enum ContrabandStatus : byte diff --git a/Content.Shared/PDA/SharedPdaSystem.cs b/Content.Shared/PDA/SharedPdaSystem.cs index 6004762a8ac2..9be6dd83b09e 100644 --- a/Content.Shared/PDA/SharedPdaSystem.cs +++ b/Content.Shared/PDA/SharedPdaSystem.cs @@ -11,6 +11,7 @@ // // SPDX-License-Identifier: MIT +using Content.Goobstation.Common.Security.ContrabandIcons.Events; using Content.Shared.Access.Components; using Content.Shared.Containers.ItemSlots; using Robust.Shared.Containers; @@ -57,7 +58,7 @@ protected virtual void OnItemInserted(EntityUid uid, PdaComponent pda, EntInsert { if (args.Container.ID == PdaComponent.PdaIdSlotId) pda.ContainedId = args.Entity; - + RaiseLocalEvent(new IdCardInsertedEvent(args.Entity, args.Container.Owner)); //goob event UpdatePdaAppearance(uid, pda); } @@ -65,7 +66,7 @@ protected virtual void OnItemRemoved(EntityUid uid, PdaComponent pda, EntRemoved { if (args.Container.ID == pda.IdSlot.ID) pda.ContainedId = null; - + RaiseLocalEvent(new IdCardRemovedEvent(args.Entity, args.Container.Owner)); //goob event UpdatePdaAppearance(uid, pda); } From f2deada0d4d1ce8aad3e77872a0ad933b5a7d4f4 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Thu, 4 Dec 2025 19:58:55 +0100 Subject: [PATCH 31/40] added comments to not make it shit to read --- .../ContrabandIcons/ContrabandIconsSystem.cs | 98 ++++++++++++------- 1 file changed, 65 insertions(+), 33 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 5fcbbdef69a1..3edac1f37234 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -24,6 +24,10 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem private readonly HashSet _queue = new(); private EntityQuery _visibleContrabandQuery; + /// + /// Updates the contraband status icons for entities in the queue based on the timing of their first visible contraband + /// item. + /// public override void Update(float frameTime) { base.Update(frameTime); @@ -72,6 +76,12 @@ public override void Initialize() } } + #region EventHandlers + + // + // on item equip check for contraband and permissions for that contraband + // if contraband and no permission add to visible list and update icon + // private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { var createdTime = _timing.TickPeriod.Mul(MetaData(args.Equipee).CreationTick.Value); // time entity was created @@ -90,6 +100,9 @@ private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEve } } + // + // same as above with exception that if you take someone it takes time to actually show up + // private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) { var createdTime = _timing.TickPeriod.Mul(MetaData(args.User).CreationTick.Value); @@ -115,48 +128,24 @@ private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEqu } } + // + // triggered on unequip from hands + // private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) { - comp.VisibleItems.Remove(args.Unequipped); - if (comp.VisibleItems.Count == 0) - { - var newStatus = StatusToIcon(ContrabandStatus.None); - if (comp.StatusIcon != newStatus) - { - comp.StatusIcon = newStatus; - Dirty(args.User, comp); - } - } + UnequipContra(comp, args.User, args.Unequipped); } + // + // triggered on unequip from inventory + // private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) { - comp.VisibleItems.Remove(args.Equipment); - if (comp.VisibleItems.Count == 0) - { - var newStatus = StatusToIcon(ContrabandStatus.None); - if (comp.StatusIcon != newStatus) - { - comp.StatusIcon = newStatus; - Dirty(args.Equipee, comp); - } - } - } - - - private string StatusToIcon(ContrabandStatus status) - { - return status switch - { - ContrabandStatus.None => "ContrabandIconNone", - ContrabandStatus.Contraband => "ContrabandIconContraband", - _ => "ContrabandIconNone" - }; + UnequipContra(comp, args.Equipee, args.Equipment); } /// - /// Handler for identity changes. When an entity's identity changes, re-evaluate their visible items - /// and update the contraband status icon if necessary. + /// Handles ID card insertions and removals. /// private void OnIdCardInserted(IdCardInsertedEvent args) { @@ -170,6 +159,27 @@ private void OnIdCardRemoved(IdCardRemovedEvent args) CheckAllContraOfContainerOwner(uid); } + #endregion + + #region Helpers + + /// + /// returns the icon string based on status enum + /// + private string StatusToIcon(ContrabandStatus status) + { + return status switch + { + ContrabandStatus.None => "ContrabandIconNone", + ContrabandStatus.Contraband => "ContrabandIconContraband", + _ => "ContrabandIconNone" + }; + } + + /// + /// Checks all contraband items for the highest-level container owner of the given entity and updates their visible + /// contraband status icon accordingly. + /// private void CheckAllContraOfContainerOwner(EntityUid uid) { uid = GetHighestContainerOwner(uid); @@ -185,6 +195,11 @@ private void CheckAllContraOfContainerOwner(EntityUid uid) } } + /// + /// Recursively gets the highest-level container owner of the given entity. + /// + /// uid of the container + /// EntityUid of the highest level entity public EntityUid GetHighestContainerOwner(EntityUid uid) { while (_inventory.TryGetContainingEntity(uid, out var containerEntity)) @@ -197,4 +212,21 @@ public EntityUid GetHighestContainerOwner(EntityUid uid) return uid; } + + // + // Remove item from visible list and if list is empty update icon to none + // + private void UnequipContra(VisibleContrabandComponent comp, EntityUid unequipper, EntityUid unequipped) + { + comp.VisibleItems.Remove(unequipped); + if (comp.VisibleItems.Count != 0) + return; + var newStatus = StatusToIcon(ContrabandStatus.None); + if (comp.StatusIcon == newStatus) + return; + comp.StatusIcon = newStatus; + Dirty(unequipper, comp); + } + + #endregion } \ No newline at end of file From 254146206bdce3d922e7980bfe1376c0c73e12d5 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Thu, 4 Dec 2025 20:02:11 +0100 Subject: [PATCH 32/40] we are done herre --- .../Security/ContrabandIcons/ContrabandIconsSystem.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index 3edac1f37234..f2771e858aec 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -15,6 +15,7 @@ namespace Content.Goobstation.Server.Security.ContrabandIcons; public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { + #region Dependencies [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; @@ -23,10 +24,10 @@ public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem private EntityQuery _contrabandQuery; private readonly HashSet _queue = new(); private EntityQuery _visibleContrabandQuery; - + #endregion Dependencies /// - /// Updates the contraband status icons for entities in the queue based on the timing of their first visible contraband - /// item. + /// Updates the contraband status icons for entities in the queue based on the timing of their first visible contraband + /// item. /// public override void Update(float frameTime) { From 7545e41c8eb6701de1390a551a8a9df13a4dd7cd Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:11:39 +0100 Subject: [PATCH 33/40] made it less shitcode items in hands dont get checked --- .../Security/Systems/ContrabandIconsSystem.cs | 35 ++- .../ContrabandIcons/ContrabandIconsSystem.cs | 230 +----------------- .../SharedContrabandIconsSystem.cs | 108 +++++++- 3 files changed, 139 insertions(+), 234 deletions(-) diff --git a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs index 678056d49bf1..9e303b1b087c 100644 --- a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs @@ -1,5 +1,38 @@ using Content.Goobstation.Shared.Security.ContrabandIcons; +using Content.Goobstation.Shared.Security.ContrabandIcons.Components; namespace Content.Goobstation.Client.Security.Systems; -public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem; +public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentStartup); + } + + private void OnComponentStartup(EntityUid uid, VisibleContrabandComponent component, ComponentStartup args) + { + // Force an initial update of the icon on startup + var newStatus = component.VisibleItems.Count > 0 ? StatusToIcon(ContrabandStatus.Contraband) : StatusToIcon(ContrabandStatus.None); + if (component.StatusIcon != newStatus) + { + component.StatusIcon = newStatus; + Dirty(uid, component); + } + } + + /// + /// returns the icon string based on status enum + /// + private string StatusToIcon(ContrabandStatus status) + { + return status switch + { + ContrabandStatus.None => "ContrabandIconNone", + ContrabandStatus.Contraband => "ContrabandIconContraband", + _ => "ContrabandIconNone" + }; + } +} diff --git a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs index f2771e858aec..b58a7971a657 100644 --- a/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Server/Security/ContrabandIcons/ContrabandIconsSystem.cs @@ -1,233 +1,5 @@ -using Content.Goobstation.Common.CCVar; -using Content.Goobstation.Common.Security.ContrabandIcons.Events; -using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; -using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared.Contraband; -using Content.Shared.Hands; -using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; -using Robust.Shared.Configuration; -using Robust.Shared.Timing; -using Robust.Shared.Utility; namespace Content.Goobstation.Server.Security.ContrabandIcons; -public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem -{ - #region Dependencies - [Dependency] private readonly IConfigurationManager _configuration = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; - [Dependency] private readonly InventorySystem _inventory = default!; - private bool _isEnabled = true; - private EntityQuery _contrabandQuery; - private readonly HashSet _queue = new(); - private EntityQuery _visibleContrabandQuery; - #endregion Dependencies - /// - /// Updates the contraband status icons for entities in the queue based on the timing of their first visible contraband - /// item. - /// - public override void Update(float frameTime) - { - base.Update(frameTime); - if (!_isEnabled) - return; - if (_queue.Count == 0) - return; - foreach (var personToMark in _queue) - { - if (_visibleContrabandQuery.TryComp(personToMark, out var comp) && comp.FirstItemTime is not null) - { - if (comp.VisibleItems.Count == 0) - { - comp.StatusIcon = StatusToIcon(ContrabandStatus.None); - Dirty(personToMark, comp); - _queue.Remove(personToMark); - continue; - } - - if (comp.FirstItemTime < _timing.CurTime) - { - comp.StatusIcon = StatusToIcon(ContrabandStatus.Contraband); - Dirty(personToMark, comp); - _queue.Remove(personToMark); - } - } - } - } - - public override void Initialize() - { - base.Initialize(); - _contrabandQuery = GetEntityQuery(); - _visibleContrabandQuery = GetEntityQuery(); - Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); - if (_isEnabled) - { - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); - - SubscribeLocalEvent(OnEquipHands); - SubscribeLocalEvent(OnUnequipHands); - - SubscribeLocalEvent(OnIdCardInserted); - SubscribeLocalEvent(OnIdCardRemoved); - } - } - - #region EventHandlers - - // - // on item equip check for contraband and permissions for that contraband - // if contraband and no permission add to visible list and update icon - // - private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) - { - var createdTime = _timing.TickPeriod.Mul(MetaData(args.Equipee).CreationTick.Value); // time entity was created - if (!_isEnabled || - !_contrabandQuery.TryComp(args.Equipment, out var contra) || - _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra) || - !(_timing.CurTime > createdTime + TimeSpan.FromSeconds(2f)) || args.SlotFlags == SlotFlags.POCKET) - return; - - comp.VisibleItems.Add(args.Equipment); - var newStatus = StatusToIcon(ContrabandStatus.Contraband); - if (comp.StatusIcon != newStatus) - { - comp.StatusIcon = newStatus; - Dirty(args.Equipee, comp); - } - } - - // - // same as above with exception that if you take someone it takes time to actually show up - // - private void OnEquipHands(EntityUid uid, VisibleContrabandComponent comp, DidEquipHandEvent args) - { - var createdTime = _timing.TickPeriod.Mul(MetaData(args.User).CreationTick.Value); - if (!_isEnabled || - !_contrabandQuery.TryComp(args.Equipped, out var contra) || - _detectorSystem.CheckContrabandPermission(args.Equipped, args.User, contra) || - !(_timing.CurTime > createdTime + TimeSpan.FromSeconds(2f))) - return; - comp.VisibleItems.Add(args.Equipped); - if (comp.VisibleItems.Count <= 1) - { - _queue.Add(args.User); - comp.FirstItemTime = _timing.CurTime + comp.VisibleTimeout; - } - else - { - var newStatus = StatusToIcon(ContrabandStatus.Contraband); - if (comp.StatusIcon != newStatus) - { - comp.StatusIcon = newStatus; - Dirty(args.User, comp); - } - } - } - - // - // triggered on unequip from hands - // - private void OnUnequipHands(EntityUid uid, VisibleContrabandComponent comp, DidUnequipHandEvent args) - { - UnequipContra(comp, args.User, args.Unequipped); - } - - // - // triggered on unequip from inventory - // - private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) - { - UnequipContra(comp, args.Equipee, args.Equipment); - } - - /// - /// Handles ID card insertions and removals. - /// - private void OnIdCardInserted(IdCardInsertedEvent args) - { - var uid = args.TargetUid; - CheckAllContraOfContainerOwner(uid); - } - - private void OnIdCardRemoved(IdCardRemovedEvent args) - { - var uid = args.TargetUid; - CheckAllContraOfContainerOwner(uid); - } - - #endregion - - #region Helpers - - /// - /// returns the icon string based on status enum - /// - private string StatusToIcon(ContrabandStatus status) - { - return status switch - { - ContrabandStatus.None => "ContrabandIconNone", - ContrabandStatus.Contraband => "ContrabandIconContraband", - _ => "ContrabandIconNone" - }; - } - - /// - /// Checks all contraband items for the highest-level container owner of the given entity and updates their visible - /// contraband status icon accordingly. - /// - private void CheckAllContraOfContainerOwner(EntityUid uid) - { - uid = GetHighestContainerOwner(uid); - - if (!_visibleContrabandQuery.TryComp(uid, out var visible)) - return; - var contralist = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET); - var newStatus = StatusToIcon(contralist.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None); - if (visible.StatusIcon != newStatus) - { - visible.StatusIcon = newStatus; - Dirty(uid, visible); - } - } - - /// - /// Recursively gets the highest-level container owner of the given entity. - /// - /// uid of the container - /// EntityUid of the highest level entity - public EntityUid GetHighestContainerOwner(EntityUid uid) - { - while (_inventory.TryGetContainingEntity(uid, out var containerEntity)) - { - if (containerEntity is { } owner) - uid = owner; - else - break; - } - - return uid; - } - - // - // Remove item from visible list and if list is empty update icon to none - // - private void UnequipContra(VisibleContrabandComponent comp, EntityUid unequipper, EntityUid unequipped) - { - comp.VisibleItems.Remove(unequipped); - if (comp.VisibleItems.Count != 0) - return; - var newStatus = StatusToIcon(ContrabandStatus.None); - if (comp.StatusIcon == newStatus) - return; - comp.StatusIcon = newStatus; - Dirty(unequipper, comp); - } - - #endregion -} \ No newline at end of file +public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem; diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 135ca86229fd..e8d0ac00a622 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -1,6 +1,106 @@ +using Content.Goobstation.Common.CCVar; +using Content.Goobstation.Common.Security.ContrabandIcons.Events; +using Content.Goobstation.Shared.Contraband; +using Content.Goobstation.Shared.Security.ContrabandIcons.Components; +using Content.Shared.Contraband; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; +using Robust.Shared.Configuration; +using Robust.Shared.Timing; + namespace Content.Goobstation.Shared.Security.ContrabandIcons; -/// -/// This is responsible for updating the contraband status icon -/// -public abstract class SharedContrabandIconsSystem : EntitySystem; +public abstract class SharedContrabandIconsSystem : EntitySystem +{ + [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + + private bool _isEnabled = true; + private EntityQuery _contrabandQuery; + private EntityQuery _visibleContrabandQuery; + + public override void Initialize() + { + base.Initialize(); + _contrabandQuery = GetEntityQuery(); + _visibleContrabandQuery = GetEntityQuery(); + + Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); + + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + + SubscribeLocalEvent(OnIdCardInserted); + SubscribeLocalEvent(OnIdCardRemoved); + } + + private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) + { + if (!_isEnabled || + !_contrabandQuery.TryComp(args.Equipment, out var contra) + || (contra.Severity == "Restricted" && _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra)) + || contra.Severity == "Minor" + || contra.Severity == "GrandTheft" + || args.SlotFlags == SlotFlags.POCKET) + return; + + comp.VisibleItems.Add(args.Equipment); + UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.Contraband); + } + + private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) + { + comp.VisibleItems.Remove(args.Equipment); + if (comp.VisibleItems.Count == 0) + UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.None); + } + + private void OnIdCardInserted(IdCardInsertedEvent args) + { + CheckAllContra(args.TargetUid); + } + + private void OnIdCardRemoved(IdCardRemovedEvent args) + { + CheckAllContra(args.TargetUid); + } + + private string StatusToIcon(ContrabandStatus status) + { + return status == ContrabandStatus.Contraband ? "ContrabandIconContraband" : "ContrabandIconNone"; + } + + private void CheckAllContra(EntityUid uid) + { + uid = GetHighestContainerOwner(uid); + + if (!_visibleContrabandQuery.TryComp(uid, out var visible)) + return; + + var contralist = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET); + var status = contralist.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None; + UpdateStatusIcon(visible, uid, status); + } + + private void UpdateStatusIcon(VisibleContrabandComponent comp, EntityUid uid, ContrabandStatus status) + { + var newStatus = StatusToIcon(status); + if (comp.StatusIcon == newStatus) + return; + + comp.StatusIcon = newStatus; + Dirty(uid, comp); + } + + public EntityUid GetHighestContainerOwner(EntityUid uid) + { + while (_inventory.TryGetContainingEntity(uid, out var containerEntity)) + { + uid = containerEntity.Value; + } + + return uid; + } +} \ No newline at end of file From 60f8b27744af9ec46feeb475291c2a6b3d8e932a Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:19:24 +0100 Subject: [PATCH 34/40] goida --- .../ContrabandIcons/SharedContrabandIconsSystem.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index e8d0ac00a622..82c408f6c3be 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -13,9 +13,9 @@ namespace Content.Goobstation.Shared.Security.ContrabandIcons; public abstract class SharedContrabandIconsSystem : EntitySystem { [Dependency] private readonly IConfigurationManager _configuration = default!; - [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly IGameTiming _timing = default!; private bool _isEnabled = true; private EntityQuery _contrabandQuery; @@ -40,7 +40,7 @@ private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEve { if (!_isEnabled || !_contrabandQuery.TryComp(args.Equipment, out var contra) - || (contra.Severity == "Restricted" && _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra)) + || (contra.Severity == "Restricted" && _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra) && (MetaData(args.Equipee).CreationTick < _timing.CurTick + 200)) || contra.Severity == "Minor" || contra.Severity == "GrandTheft" || args.SlotFlags == SlotFlags.POCKET) @@ -78,7 +78,11 @@ private void CheckAllContra(EntityUid uid) if (!_visibleContrabandQuery.TryComp(uid, out var visible)) return; - + if(visible.VisibleItems.Count > 0) + { + UpdateStatusIcon(visible, uid, ContrabandStatus.Contraband); + return; + } var contralist = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET); var status = contralist.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None; UpdateStatusIcon(visible, uid, status); From 8f40201052d1f8697533c811c57cbc2de7db4cc2 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:44:29 +0100 Subject: [PATCH 35/40] stick my whole goida up there --- .../Security/Systems/ContrabandIconsSystem.cs | 23 +++---------------- .../SharedContrabandIconsSystem.cs | 17 ++++++-------- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs index 9e303b1b087c..e33e74e103fb 100644 --- a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs @@ -1,3 +1,4 @@ +using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; @@ -5,6 +6,7 @@ namespace Content.Goobstation.Client.Security.Systems; public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { + [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; public override void Initialize() { base.Initialize(); @@ -14,25 +16,6 @@ public override void Initialize() private void OnComponentStartup(EntityUid uid, VisibleContrabandComponent component, ComponentStartup args) { - // Force an initial update of the icon on startup - var newStatus = component.VisibleItems.Count > 0 ? StatusToIcon(ContrabandStatus.Contraband) : StatusToIcon(ContrabandStatus.None); - if (component.StatusIcon != newStatus) - { - component.StatusIcon = newStatus; - Dirty(uid, component); - } - } - - /// - /// returns the icon string based on status enum - /// - private string StatusToIcon(ContrabandStatus status) - { - return status switch - { - ContrabandStatus.None => "ContrabandIconNone", - ContrabandStatus.Contraband => "ContrabandIconContraband", - _ => "ContrabandIconNone" - }; + CheckAllContra(uid, component); } } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 82c408f6c3be..071878395720 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Goobstation.Common.CCVar; using Content.Goobstation.Common.Security.ContrabandIcons.Events; using Content.Goobstation.Shared.Contraband; @@ -72,23 +73,19 @@ private string StatusToIcon(ContrabandStatus status) return status == ContrabandStatus.Contraband ? "ContrabandIconContraband" : "ContrabandIconNone"; } - private void CheckAllContra(EntityUid uid) + protected void CheckAllContra(EntityUid uid, VisibleContrabandComponent? visible = null) { uid = GetHighestContainerOwner(uid); - if (!_visibleContrabandQuery.TryComp(uid, out var visible)) + if (!_visibleContrabandQuery.TryComp(uid, out var comp)) return; - if(visible.VisibleItems.Count > 0) - { - UpdateStatusIcon(visible, uid, ContrabandStatus.Contraband); - return; - } - var contralist = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET); - var status = contralist.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None; + visible ??= comp; + visible.VisibleItems = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET).ToHashSet(); + var status = visible.VisibleItems.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None; UpdateStatusIcon(visible, uid, status); } - private void UpdateStatusIcon(VisibleContrabandComponent comp, EntityUid uid, ContrabandStatus status) + protected void UpdateStatusIcon(VisibleContrabandComponent comp, EntityUid uid, ContrabandStatus status) { var newStatus = StatusToIcon(status); if (comp.StatusIcon == newStatus) From c0009f5935bdd83a307c5756628aabd86bee8562 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:47:49 +0100 Subject: [PATCH 36/40] gods strongest shitcoder --- .../Security/ContrabandIcons/SharedContrabandIconsSystem.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index 071878395720..cf2dba03c759 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -3,10 +3,12 @@ using Content.Goobstation.Common.Security.ContrabandIcons.Events; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; +using Content.Shared._Shitmed.Antags.Abductor; using Content.Shared.Contraband; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Robust.Shared.Configuration; +using Robust.Shared.Network; using Robust.Shared.Timing; namespace Content.Goobstation.Shared.Security.ContrabandIcons; @@ -17,6 +19,7 @@ public abstract class SharedContrabandIconsSystem : EntitySystem [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; private bool _isEnabled = true; private EntityQuery _contrabandQuery; @@ -92,7 +95,8 @@ protected void UpdateStatusIcon(VisibleContrabandComponent comp, EntityUid uid, return; comp.StatusIcon = newStatus; - Dirty(uid, comp); + if(_net.IsServer) + Dirty(uid, comp); } public EntityUid GetHighestContainerOwner(EntityUid uid) From 162bb0d6f2abf908ed6625bbc2aa891ed18cc441 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:55:02 +0100 Subject: [PATCH 37/40] polishing the shit --- .../Security/Systems/ContrabandIconsSystem.cs | 2 -- .../SharedContrabandIconsSystem.cs | 17 ++++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs index e33e74e103fb..7da43d6dcaba 100644 --- a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs @@ -1,4 +1,3 @@ -using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; @@ -6,7 +5,6 @@ namespace Content.Goobstation.Client.Security.Systems; public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { - [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; public override void Initialize() { base.Initialize(); diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index cf2dba03c759..b2a2ff219deb 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -3,7 +3,6 @@ using Content.Goobstation.Common.Security.ContrabandIcons.Events; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared._Shitmed.Antags.Abductor; using Content.Shared.Contraband; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; @@ -43,13 +42,13 @@ public override void Initialize() private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) { if (!_isEnabled || - !_contrabandQuery.TryComp(args.Equipment, out var contra) - || (contra.Severity == "Restricted" && _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra) && (MetaData(args.Equipee).CreationTick < _timing.CurTick + 200)) - || contra.Severity == "Minor" - || contra.Severity == "GrandTheft" - || args.SlotFlags == SlotFlags.POCKET) + !_contrabandQuery.TryComp(args.Equipment, out var contra) + || (contra.Severity == "Restricted" + && _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra) + || contra.Severity == "Minor" + || contra.Severity == "GrandTheft" + || args.SlotFlags == SlotFlags.POCKET)) return; - comp.VisibleItems.Add(args.Equipment); UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.Contraband); } @@ -95,7 +94,7 @@ protected void UpdateStatusIcon(VisibleContrabandComponent comp, EntityUid uid, return; comp.StatusIcon = newStatus; - if(_net.IsServer) + if (_net.IsServer) Dirty(uid, comp); } @@ -108,4 +107,4 @@ public EntityUid GetHighestContainerOwner(EntityUid uid) return uid; } -} \ No newline at end of file +} From b9a83196a47c47b3c54e69b2dcc692a2f8fb7b91 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:55:58 +0100 Subject: [PATCH 38/40] mr clean fixed bso --- .../Security/Systems/ContrabandIconsSystem.cs | 75 ++++++++++++++++++- .../Components/VisibleContrabandComponent.cs | 6 -- .../SharedContrabandIconsSystem.cs | 67 +++-------------- .../Entities/Objects/base_contraband.yml | 2 +- .../Entities/Objects/base_contraband.yml | 2 +- 5 files changed, 83 insertions(+), 69 deletions(-) diff --git a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs index 7da43d6dcaba..f3b81daedf16 100644 --- a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs @@ -1,19 +1,88 @@ +using Content.Goobstation.Common.CCVar; +using Content.Goobstation.Common.Security.ContrabandIcons.Events; +using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; +using Content.Shared.Contraband; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; +using Robust.Shared.Configuration; +using Robust.Shared.Network; +using Robust.Shared.Timing; +using Robust.Shared.Network; +using Robust.Shared.Timing; namespace Content.Goobstation.Client.Security.Systems; public sealed class ContrabandIconsSystem : SharedContrabandIconsSystem { + [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; + + private bool _isEnabled = true; + private EntityQuery _contrabandQuery; + public override void Initialize() { base.Initialize(); - + _contrabandQuery = GetEntityQuery(); + + Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); + + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + + SubscribeLocalEvent(OnIdCardInserted); + SubscribeLocalEvent(OnIdCardRemoved); SubscribeLocalEvent(OnComponentStartup); } - + + private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) + { + if (!_isEnabled) + return; + if (args.SlotFlags == SlotFlags.IDCARD) + { + CheckAllContra(args.Equipee); + return; + } + if (args.SlotFlags == SlotFlags.POCKET) + return; + if (!_contrabandQuery.TryComp(args.Equipment, out var contra)) + return; + if (contra.Severity == "Minor") + return; + var hasPermission = _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra); + if ((contra.Severity == "Restricted" || contra.Severity == "GrandTheft") && hasPermission) + return; + comp.VisibleItems.Add(args.Equipment); + UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.Contraband); + } + + private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) + { + if (args.SlotFlags == SlotFlags.IDCARD) + { + CheckAllContra(args.Equipee); + return; + } + comp.VisibleItems.Remove(args.Equipment); + if (comp.VisibleItems.Count == 0) + UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.None); + } + + private void OnIdCardInserted(IdCardInsertedEvent args) + { + CheckAllContra(args.TargetUid); + } + + private void OnIdCardRemoved(IdCardRemovedEvent args) + { + CheckAllContra(args.TargetUid); + } private void OnComponentStartup(EntityUid uid, VisibleContrabandComponent component, ComponentStartup args) { - CheckAllContra(uid, component); + CheckAllContra(uid); } + } diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs index f536b187e152..77b8f5c27f4b 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/Components/VisibleContrabandComponent.cs @@ -15,12 +15,6 @@ public sealed partial class VisibleContrabandComponent : Component [DataField] public HashSet VisibleItems = new(); - - [DataField] - public TimeSpan VisibleTimeout = TimeSpan.FromSeconds(5f); - - [DataField] - public TimeSpan? FirstItemTime; } public enum ContrabandStatus : byte diff --git a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs index b2a2ff219deb..8a4e5c795a21 100644 --- a/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs +++ b/Content.Goobstation.Shared/Security/ContrabandIcons/SharedContrabandIconsSystem.cs @@ -1,88 +1,39 @@ using System.Linq; -using Content.Goobstation.Common.CCVar; -using Content.Goobstation.Common.Security.ContrabandIcons.Events; using Content.Goobstation.Shared.Contraband; using Content.Goobstation.Shared.Security.ContrabandIcons.Components; -using Content.Shared.Contraband; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; -using Robust.Shared.Configuration; using Robust.Shared.Network; -using Robust.Shared.Timing; namespace Content.Goobstation.Shared.Security.ContrabandIcons; public abstract class SharedContrabandIconsSystem : EntitySystem { - [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly SharedContrabandDetectorSystem _detectorSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly INetManager _net = default!; - - private bool _isEnabled = true; - private EntityQuery _contrabandQuery; private EntityQuery _visibleContrabandQuery; public override void Initialize() { base.Initialize(); - _contrabandQuery = GetEntityQuery(); _visibleContrabandQuery = GetEntityQuery(); - - Subs.CVar(_configuration, GoobCVars.ContrabandIconsEnabled, value => _isEnabled = value); - - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); - - SubscribeLocalEvent(OnIdCardInserted); - SubscribeLocalEvent(OnIdCardRemoved); - } - - private void OnEquip(EntityUid uid, VisibleContrabandComponent comp, DidEquipEvent args) - { - if (!_isEnabled || - !_contrabandQuery.TryComp(args.Equipment, out var contra) - || (contra.Severity == "Restricted" - && _detectorSystem.CheckContrabandPermission(args.Equipment, args.Equipee, contra) - || contra.Severity == "Minor" - || contra.Severity == "GrandTheft" - || args.SlotFlags == SlotFlags.POCKET)) - return; - comp.VisibleItems.Add(args.Equipment); - UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.Contraband); } - - private void OnUnequip(EntityUid uid, VisibleContrabandComponent comp, DidUnequipEvent args) - { - comp.VisibleItems.Remove(args.Equipment); - if (comp.VisibleItems.Count == 0) - UpdateStatusIcon(comp, args.Equipee, ContrabandStatus.None); - } - - private void OnIdCardInserted(IdCardInsertedEvent args) - { - CheckAllContra(args.TargetUid); - } - - private void OnIdCardRemoved(IdCardRemovedEvent args) - { - CheckAllContra(args.TargetUid); - } - private string StatusToIcon(ContrabandStatus status) { return status == ContrabandStatus.Contraband ? "ContrabandIconContraband" : "ContrabandIconNone"; } - protected void CheckAllContra(EntityUid uid, VisibleContrabandComponent? visible = null) + protected void CheckAllContra(EntityUid uid) { uid = GetHighestContainerOwner(uid); - if (!_visibleContrabandQuery.TryComp(uid, out var comp)) + if (!_visibleContrabandQuery.TryComp(uid, out var visible)) + return; + var contraband = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET); + if (contraband == null) // this is stupid but it works return; - visible ??= comp; - visible.VisibleItems = _detectorSystem.FindContraband(uid, false, SlotFlags.WITHOUT_POCKET).ToHashSet(); + + visible.VisibleItems = contraband.ToHashSet(); var status = visible.VisibleItems.Count > 0 ? ContrabandStatus.Contraband : ContrabandStatus.None; UpdateStatusIcon(visible, uid, status); } @@ -98,7 +49,7 @@ protected void UpdateStatusIcon(VisibleContrabandComponent comp, EntityUid uid, Dirty(uid, comp); } - public EntityUid GetHighestContainerOwner(EntityUid uid) + private EntityUid GetHighestContainerOwner(EntityUid uid) { while (_inventory.TryGetContainingEntity(uid, out var containerEntity)) { @@ -107,4 +58,4 @@ public EntityUid GetHighestContainerOwner(EntityUid uid) return uid; } -} +} \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/base_contraband.yml b/Resources/Prototypes/Entities/Objects/base_contraband.yml index 67fe932ccc6a..b74b209b34eb 100644 --- a/Resources/Prototypes/Entities/Objects/base_contraband.yml +++ b/Resources/Prototypes/Entities/Objects/base_contraband.yml @@ -186,7 +186,7 @@ abstract: true components: - type: Contraband - allowedDepartments: [ Security, Cargo ] + allowedDepartments: [ Security, Cargo, CentralCommand ] # Goob - blueshield gear - type: entity id: BaseMedicalScienceContraband diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml index 8a9c003d84fb..76270cb7d80b 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml @@ -28,7 +28,7 @@ abstract: true components: - type: Contraband - allowedDepartments: [ Security, Engineering, Cargo ] + allowedDepartments: [ Security, Engineering, Cargo, CentralCommand ] # stupid fucking BSO - type: entity id: BaseSecurityZookeeperContraband # Tranq shells From fd09a885fe509ceb28d68433eba07b71bec9a4d9 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Sat, 6 Dec 2025 14:50:46 +0100 Subject: [PATCH 39/40] goida slop --- .../Security/Systems/ContrabandIconsSystem.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs index f3b81daedf16..4fe4d54c6eaf 100644 --- a/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs +++ b/Content.Goobstation.Client/Security/Systems/ContrabandIconsSystem.cs @@ -7,10 +7,7 @@ using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Robust.Shared.Configuration; -using Robust.Shared.Network; -using Robust.Shared.Timing; -using Robust.Shared.Network; -using Robust.Shared.Timing; + namespace Content.Goobstation.Client.Security.Systems; @@ -84,5 +81,4 @@ private void OnComponentStartup(EntityUid uid, VisibleContrabandComponent compon { CheckAllContra(uid); } - } From f2f4dc0a357c664e6a4024e49cda5fd27fb6c697 Mon Sep 17 00:00:00 2001 From: Androidonator <33227516+Androidonator@users.noreply.github.com> Date: Sat, 6 Dec 2025 14:52:24 +0100 Subject: [PATCH 40/40] centcomm headset for centcomm ? bruh --- Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml b/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml index b138b83ad076..5d68b9d58829 100644 --- a/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml +++ b/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml @@ -130,7 +130,7 @@ sprite: Clothing/Ears/Headsets/cargo.rsi - type: entity - parent: [ClothingHeadsetAlt, BaseCommandContraband] # Goobstation + parent: [ClothingHeadsetAlt, BaseCentcommCommandContraband] # Goobstation id: ClothingHeadsetAltCentCom name: CentComm over-ear headset components: