From 3279840bf0011cf94cd546ad4cfff5dc0a7e8e7f Mon Sep 17 00:00:00 2001
From: Pok <113675512+Pok27@users.noreply.github.com>
Date: Fri, 24 Apr 2026 19:49:54 +0300
Subject: [PATCH] TemporaryBlindness StatusEffect (#43705)
* TemporaryBlindnessStatusEffect
* review
---
...t.cs => BlindnessStatusEffectComponent.cs} | 6 +--
.../Eye/Blinding/Systems/BlindnessSystem.cs | 47 +++++++++++++++++++
.../Blinding/Systems/EyeProtectionSystem.cs | 6 +--
.../Systems/TemporaryBlindnessSystem.cs | 37 ---------------
Content.Shared/Flash/SharedFlashSystem.cs | 6 ---
.../StatusEffectSystem.Relay.cs | 4 ++
.../entity-effects/statuseffects.ftl | 1 -
Resources/Prototypes/Body/species_base.yml | 1 -
.../Entities/Mobs/NPCs/asteroid.yml | 1 -
.../Entities/Mobs/NPCs/simplemob.yml | 2 -
.../Entities/Mobs/Player/dragon.yml | 1 -
.../Entities/StatusEffects/misc.yml | 13 +++++
Resources/Prototypes/Reagents/narcotics.yml | 12 ++---
Resources/Prototypes/status_effects.yml | 3 --
14 files changed, 75 insertions(+), 65 deletions(-)
rename Content.Shared/Eye/Blinding/Components/{TemporaryBlindnessComponent.cs => BlindnessStatusEffectComponent.cs} (55%)
create mode 100644 Content.Shared/Eye/Blinding/Systems/BlindnessSystem.cs
delete mode 100644 Content.Shared/Eye/Blinding/Systems/TemporaryBlindnessSystem.cs
diff --git a/Content.Shared/Eye/Blinding/Components/TemporaryBlindnessComponent.cs b/Content.Shared/Eye/Blinding/Components/BlindnessStatusEffectComponent.cs
similarity index 55%
rename from Content.Shared/Eye/Blinding/Components/TemporaryBlindnessComponent.cs
rename to Content.Shared/Eye/Blinding/Components/BlindnessStatusEffectComponent.cs
index 1f89c3df86..7e8016d8d7 100644
--- a/Content.Shared/Eye/Blinding/Components/TemporaryBlindnessComponent.cs
+++ b/Content.Shared/Eye/Blinding/Components/BlindnessStatusEffectComponent.cs
@@ -3,9 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Shared.Eye.Blinding.Components;
///
-/// Component used for the blind status effect.
+/// Prevents the target from seeing while active.
///
[NetworkedComponent, RegisterComponent]
-public sealed partial class TemporaryBlindnessComponent : Component
-{
-}
+public sealed partial class BlindnessStatusEffectComponent : Component;
diff --git a/Content.Shared/Eye/Blinding/Systems/BlindnessSystem.cs b/Content.Shared/Eye/Blinding/Systems/BlindnessSystem.cs
new file mode 100644
index 0000000000..79822485d0
--- /dev/null
+++ b/Content.Shared/Eye/Blinding/Systems/BlindnessSystem.cs
@@ -0,0 +1,47 @@
+using Content.Shared.Eye.Blinding.Components;
+using Content.Shared.Flash;
+using Content.Shared.StatusEffectNew;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Eye.Blinding.Systems;
+
+public sealed class BlindnessSystem : EntitySystem
+{
+ public static readonly EntProtoId BlindingStatusEffect = "StatusEffectBlindness";
+
+ [Dependency] private readonly BlindableSystem _blindableSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnApplied);
+ SubscribeLocalEvent(OnRemoved);
+ SubscribeLocalEvent>(OnBlindTrySee);
+ SubscribeLocalEvent>(OnFlashAttempt);
+ }
+
+ private void OnApplied(Entity ent, ref StatusEffectAppliedEvent args)
+ {
+ _blindableSystem.UpdateIsBlind(args.Target);
+ }
+
+ private void OnRemoved(Entity ent, ref StatusEffectRemovedEvent args)
+ {
+ _blindableSystem.UpdateIsBlind(args.Target);
+ }
+
+ private void OnBlindTrySee(Entity ent, ref StatusEffectRelayedEvent args)
+ {
+ var ev = args.Args;
+ ev.Cancel();
+ args.Args = ev;
+ }
+
+ private void OnFlashAttempt(Entity ent, ref StatusEffectRelayedEvent args)
+ {
+ var ev = args.Args;
+ ev.Cancelled = true;
+ args.Args = ev;
+ }
+}
diff --git a/Content.Shared/Eye/Blinding/Systems/EyeProtectionSystem.cs b/Content.Shared/Eye/Blinding/Systems/EyeProtectionSystem.cs
index 0b4353eeda..cf1dc2f15d 100644
--- a/Content.Shared/Eye/Blinding/Systems/EyeProtectionSystem.cs
+++ b/Content.Shared/Eye/Blinding/Systems/EyeProtectionSystem.cs
@@ -1,4 +1,4 @@
-using Content.Shared.StatusEffect;
+using Content.Shared.StatusEffectNew;
using Content.Shared.Inventory;
using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Tools.Components;
@@ -55,9 +55,9 @@ namespace Content.Shared.Eye.Blinding.Systems
// how much damage they already accumulated.
_blindingSystem.AdjustEyeDamage((args.User, blindable), 1);
var statusTimeSpan = TimeSpan.FromSeconds(time * MathF.Sqrt(blindable.EyeDamage));
- _statusEffectsSystem.TryAddStatusEffect(args.User, TemporaryBlindnessSystem.BlindingStatusEffect,
- statusTimeSpan, false, TemporaryBlindnessSystem.BlindingStatusEffect);
+ _statusEffectsSystem.TryAddStatusEffectDuration(args.User, BlindnessSystem.BlindingStatusEffect, statusTimeSpan);
}
+
private void OnWelderToggled(EntityUid uid, RequiresEyeProtectionComponent component, ItemToggledEvent args)
{
component.Toggled = args.Activated;
diff --git a/Content.Shared/Eye/Blinding/Systems/TemporaryBlindnessSystem.cs b/Content.Shared/Eye/Blinding/Systems/TemporaryBlindnessSystem.cs
deleted file mode 100644
index 34680b12ef..0000000000
--- a/Content.Shared/Eye/Blinding/Systems/TemporaryBlindnessSystem.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using Content.Shared.Eye.Blinding.Components;
-using Content.Shared.StatusEffect;
-using Robust.Shared.Prototypes;
-
-namespace Content.Shared.Eye.Blinding.Systems;
-
-public sealed class TemporaryBlindnessSystem : EntitySystem
-{
- public static readonly ProtoId BlindingStatusEffect = "TemporaryBlindness";
-
- [Dependency] private readonly BlindableSystem _blindableSystem = default!;
-
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent(OnStartup);
- SubscribeLocalEvent(OnShutdown);
- SubscribeLocalEvent(OnBlindTrySee);
- }
-
- private void OnStartup(EntityUid uid, TemporaryBlindnessComponent component, ComponentStartup args)
- {
- _blindableSystem.UpdateIsBlind(uid);
- }
-
- private void OnShutdown(EntityUid uid, TemporaryBlindnessComponent component, ComponentShutdown args)
- {
- _blindableSystem.UpdateIsBlind(uid);
- }
-
- private void OnBlindTrySee(EntityUid uid, TemporaryBlindnessComponent component, CanSeeAttemptEvent args)
- {
- if (component.LifeStage <= ComponentLifeStage.Running)
- args.Cancel();
- }
-}
diff --git a/Content.Shared/Flash/SharedFlashSystem.cs b/Content.Shared/Flash/SharedFlashSystem.cs
index 30f11efdeb..ada70e49b8 100644
--- a/Content.Shared/Flash/SharedFlashSystem.cs
+++ b/Content.Shared/Flash/SharedFlashSystem.cs
@@ -61,7 +61,6 @@ public abstract class SharedFlashSystem : EntitySystem
SubscribeLocalEvent(OnRangedInteract);
SubscribeLocalEvent(OnLightToggle);
SubscribeLocalEvent(OnPermanentBlindnessFlashAttempt);
- SubscribeLocalEvent(OnTemporaryBlindnessFlashAttempt);
Subs.SubscribeWithRelay(OnFlashImmunityFlashAttempt, held: false);
SubscribeLocalEvent(OnExamine);
}
@@ -273,11 +272,6 @@ public abstract class SharedFlashSystem : EntitySystem
args.Cancelled = true;
}
- private void OnTemporaryBlindnessFlashAttempt(Entity ent, ref FlashAttemptEvent args)
- {
- args.Cancelled = true;
- }
-
private void OnFlashImmunityFlashAttempt(Entity ent, ref FlashAttemptEvent args)
{
if (TryComp(ent, out var mask) && mask.IsToggled)
diff --git a/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs b/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs
index cf81f66d9f..77fe0cb612 100644
--- a/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs
+++ b/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs
@@ -1,6 +1,8 @@
using Content.Shared.Body.Events;
using Content.Shared.Damage.Events;
using Content.Shared.Damage.Systems;
+using Content.Shared.Eye.Blinding.Systems;
+using Content.Shared.Flash;
using Content.Shared.Mobs.Events;
using Content.Shared.Movement.Events;
using Content.Shared.Movement.Systems;
@@ -29,6 +31,8 @@ public sealed partial class StatusEffectsSystem
SubscribeLocalEvent(RefRelayStatusEffectEvent);
SubscribeLocalEvent(RefRelayStatusEffectEvent);
SubscribeLocalEvent(RefRelayStatusEffectEvent);
+ SubscribeLocalEvent(RelayStatusEffectEvent);
+ SubscribeLocalEvent(RefRelayStatusEffectEvent);
SubscribeLocalEvent(RelayStatusEffectEvent);
SubscribeLocalEvent(RelayStatusEffectEvent);
diff --git a/Resources/Locale/en-US/guidebook/entity-effects/statuseffects.ftl b/Resources/Locale/en-US/guidebook/entity-effects/statuseffects.ftl
index 435041dc68..98c97ed138 100644
--- a/Resources/Locale/en-US/guidebook/entity-effects/statuseffects.ftl
+++ b/Resources/Locale/en-US/guidebook/entity-effects/statuseffects.ftl
@@ -1,7 +1,6 @@
entity-effect-status-effect-Stun = stunning
entity-effect-status-effect-KnockedDown = knockdown
entity-effect-status-effect-Jitter = jittering
-entity-effect-status-effect-TemporaryBlindness = blindness
entity-effect-status-effect-SeeingRainbows = hallucinations
entity-effect-status-effect-Muted = inability to speak
entity-effect-status-effect-Stutter = stuttering
diff --git a/Resources/Prototypes/Body/species_base.yml b/Resources/Prototypes/Body/species_base.yml
index 4716e3ca7f..d03b2f3e2c 100644
--- a/Resources/Prototypes/Body/species_base.yml
+++ b/Resources/Prototypes/Body/species_base.yml
@@ -75,7 +75,6 @@
- RatvarianLanguage
- PressureImmunity
- Muted
- - TemporaryBlindness
- Pacified
- Flashed
- Adrenaline
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml
index f790b4abf9..61eb23c929 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml
@@ -19,7 +19,6 @@
- type: StatusEffects
allowed:
- Electrocution
- - TemporaryBlindness
- Adrenaline
- type: StandingState
- type: Tag
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml
index 0bdfcdfa27..1fda20dbf3 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml
@@ -19,7 +19,6 @@
- type: StatusEffects
allowed:
- Electrocution
- - TemporaryBlindness
- Pacified
- Flashed
- Adrenaline
@@ -91,7 +90,6 @@
- type: StatusEffects
allowed:
- Electrocution
- - TemporaryBlindness
- Pacified
- Flashed
- Adrenaline
diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml
index 7a1dbd7144..6f8b225ed7 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml
@@ -104,7 +104,6 @@
- type: StatusEffects # Overwriting basesimplemob to remove flash, getting flashed as dragon just feelsbad
allowed:
- Electrocution
- - TemporaryBlindness
- Pacified
- Adrenaline
- type: Temperature
diff --git a/Resources/Prototypes/Entities/StatusEffects/misc.yml b/Resources/Prototypes/Entities/StatusEffects/misc.yml
index 14c6b5b649..430003fe8f 100644
--- a/Resources/Prototypes/Entities/StatusEffects/misc.yml
+++ b/Resources/Prototypes/Entities/StatusEffects/misc.yml
@@ -92,3 +92,16 @@
parent: [ StatusEffectWoozy, StatusEffectSlurred ]
id: StatusEffectDrunk
name: drunk
+
+# Prevents the target from seeing
+- type: entity
+ parent: MobStatusEffectDebuff
+ id: StatusEffectBlindness
+ name: temporary blindness
+ components:
+ - type: StatusEffect
+ whitelist:
+ components:
+ - MobState
+ - Blindable
+ - type: BlindnessStatusEffect
diff --git a/Resources/Prototypes/Reagents/narcotics.yml b/Resources/Prototypes/Reagents/narcotics.yml
index 65674bb5a2..87828bc000 100644
--- a/Resources/Prototypes/Reagents/narcotics.yml
+++ b/Resources/Prototypes/Reagents/narcotics.yml
@@ -388,9 +388,9 @@
min: 20
probability: 0.03
#If anyone wants to add a light dimming or grayscale effect when under 20u, be my guest
- - !type:GenericStatusEffect
- key: TemporaryBlindness
- component: TemporaryBlindness
+ - !type:ModifyStatusEffect
+ effectProto: StatusEffectBlindness
+ type: Add
conditions:
- !type:ReagentCondition
reagent: NorepinephricAcid
@@ -441,9 +441,9 @@
- !type:Emote
emote: Cough
probability: 0.08
- - !type:GenericStatusEffect
- key: TemporaryBlindness
- component: TemporaryBlindness
+ - !type:ModifyStatusEffect
+ effectProto: StatusEffectBlindness
+ type: Add
conditions:
- !type:ReagentCondition
reagent: TearGas
diff --git a/Resources/Prototypes/status_effects.yml b/Resources/Prototypes/status_effects.yml
index c40b26fe85..201e1e2aa1 100644
--- a/Resources/Prototypes/status_effects.yml
+++ b/Resources/Prototypes/status_effects.yml
@@ -41,9 +41,6 @@
id: Corporeal
alert: Corporeal
-- type: statusEffect
- id: TemporaryBlindness
-
- type: statusEffect
id: Pacified #cannot attack