diff --git a/Content.Client/SSDIndicator/SSDIndicatorSystem.cs b/Content.Client/SSDIndicator/SSDIndicatorSystem.cs
new file mode 100644
index 0000000000..dc7548f8e4
--- /dev/null
+++ b/Content.Client/SSDIndicator/SSDIndicatorSystem.cs
@@ -0,0 +1,32 @@
+using Content.Shared.CCVar;
+using Content.Shared.SSDIndicator;
+using Content.Shared.StatusIcon;
+using Content.Shared.StatusIcon.Components;
+using Robust.Shared.Configuration;
+using Robust.Shared.Prototypes;
+
+namespace Content.Client.SSDIndicator;
+
+///
+/// Handles displaying SSD indicator as status icon
+///
+public sealed class SSDIndicatorSystem : EntitySystem
+{
+ [Dependency] private readonly IPrototypeManager _prototype = default!;
+ [Dependency] private readonly IConfigurationManager _cfg = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnGetStatusIcon);
+ }
+
+ private void OnGetStatusIcon(EntityUid uid, SSDIndicatorComponent component, ref GetStatusIconsEvent args)
+ {
+ if (!component.IsSSD || !_cfg.GetCVar(CCVars.ICShowSSDIndicator))
+ return;
+
+ args.StatusIcons.Add(_prototype.Index(component.Icon));
+ }
+}
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index bd9375f103..34294ebcbd 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -1461,6 +1461,12 @@ namespace Content.Shared.CCVar
public static readonly CVarDef ICRandomSpeciesWeights =
CVarDef.Create("ic.random_species_weights", "SpeciesWeights", CVar.SERVER);
+ ///
+ /// Control displaying SSD indicators near players
+ ///
+ public static readonly CVarDef ICShowSSDIndicator =
+ CVarDef.Create("ic.show_ssd_indicator", true, CVar.CLIENTONLY);
+
/*
* Salvage
*/
diff --git a/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs b/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs
new file mode 100644
index 0000000000..66310505a1
--- /dev/null
+++ b/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs
@@ -0,0 +1,21 @@
+using Content.Shared.StatusIcon;
+using Robust.Shared.GameStates;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Shared.SSDIndicator;
+
+///
+/// Shows status icon when player in SSD
+///
+[RegisterComponent, NetworkedComponent]
+[AutoGenerateComponentState]
+public sealed partial class SSDIndicatorComponent : Component
+{
+ [ViewVariables(VVAccess.ReadWrite)]
+ [AutoNetworkedField]
+ public bool IsSSD = true;
+
+ [ViewVariables(VVAccess.ReadWrite)]
+ [DataField("icon", customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string Icon = "SSDIcon";
+}
diff --git a/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs b/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs
new file mode 100644
index 0000000000..d6db56be9c
--- /dev/null
+++ b/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs
@@ -0,0 +1,27 @@
+using Content.Shared.Mind.Components;
+
+namespace Content.Shared.SSDIndicator;
+
+///
+/// Handle changing player SSD indicator status
+///
+public sealed class SSDIndicatorSystem : EntitySystem
+{
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnMindAdded);
+ SubscribeLocalEvent(OnMindRemoved);
+ }
+
+ private void OnMindAdded(EntityUid uid, SSDIndicatorComponent component, MindAddedMessage args)
+ {
+ component.IsSSD = false;
+ Dirty(uid, component);
+ }
+
+ private void OnMindRemoved(EntityUid uid, SSDIndicatorComponent component, MindRemovedMessage args)
+ {
+ component.IsSSD = true;
+ Dirty(uid, component);
+ }
+}
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index f2625090f6..464e8b510b 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -312,6 +312,7 @@
deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less.
- type: ContentEye
- type: SleepEmitSound
+ - type: SSDIndicator
- type: entity
save: false
diff --git a/Resources/Prototypes/StatusEffects/ssd.yml b/Resources/Prototypes/StatusEffects/ssd.yml
new file mode 100644
index 0000000000..70253cc6b1
--- /dev/null
+++ b/Resources/Prototypes/StatusEffects/ssd.yml
@@ -0,0 +1,6 @@
+- type: statusIcon
+ id: SSDIcon
+ icon:
+ sprite: /Textures/Effects/ssd.rsi
+ state: default0
+ locationPreference: Left
diff --git a/Resources/Textures/Effects/ssd.rsi/default0.png b/Resources/Textures/Effects/ssd.rsi/default0.png
new file mode 100644
index 0000000000..bfd8c84da9
Binary files /dev/null and b/Resources/Textures/Effects/ssd.rsi/default0.png differ
diff --git a/Resources/Textures/Effects/ssd.rsi/meta.json b/Resources/Textures/Effects/ssd.rsi/meta.json
new file mode 100644
index 0000000000..6c5e7b24e3
--- /dev/null
+++ b/Resources/Textures/Effects/ssd.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Take from https://github.com/Skyrat-SS13/Skyrat-tg/blob/92377cd6203bc4d93a6e289d7b857e19bb6cf338/modular_skyrat/modules/indicators/icons/ssd_indicator.dmi",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "default0"
+ }
+ ]
+}