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" + } + ] +}