--- /dev/null
+using Robust.Client.Graphics;
+using Robust.Client.Player;
+using Robust.Shared.Enums;
+using Robust.Shared.Prototypes;
+
+namespace Content.Client.Overlays;
+
+public sealed partial class BlackAndWhiteOverlay : Overlay
+{
+ [Dependency] private readonly IEntityManager _entityManager = default!;
+ [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
+
+ public override OverlaySpace Space => OverlaySpace.WorldSpace;
+ public override bool RequestScreenTexture => true;
+ private readonly ShaderInstance _greyscaleShader;
+
+ public BlackAndWhiteOverlay()
+ {
+ IoCManager.InjectDependencies(this);
+ _greyscaleShader = _prototypeManager.Index<ShaderPrototype>("GreyscaleFullscreen").InstanceUnique();
+ ZIndex = 10; // draw this over the DamageOverlay, RainbowOverlay etc.
+ }
+
+ protected override bool BeforeDraw(in OverlayDrawArgs args)
+ {
+ if (!_entityManager.TryGetComponent(_playerManager.LocalEntity, out EyeComponent? eyeComp))
+ return false;
+
+ if (args.Viewport.Eye != eyeComp.Eye)
+ return false;
+
+ return true;
+ }
+
+ protected override void Draw(in OverlayDrawArgs args)
+ {
+ if (ScreenTexture == null)
+ return;
+
+ var handle = args.WorldHandle;
+ _greyscaleShader.SetParameter("SCREEN_TEXTURE", ScreenTexture);
+ handle.UseShader(_greyscaleShader);
+ handle.DrawRect(args.WorldBounds, Color.White);
+ handle.UseShader(null);
+ }
+}
--- /dev/null
+using Content.Shared.Inventory.Events;
+using Content.Shared.Overlays;
+using Robust.Client.Graphics;
+using Robust.Client.Player;
+
+namespace Content.Client.Overlays;
+
+public sealed partial class BlackAndWhiteOverlaySystem : EquipmentHudSystem<BlackAndWhiteOverlayComponent>
+{
+ [Dependency] private readonly IOverlayManager _overlayMan = default!;
+
+ private BlackAndWhiteOverlay _overlay = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ _overlay = new();
+ }
+
+ protected override void UpdateInternal(RefreshEquipmentHudEvent<BlackAndWhiteOverlayComponent> component)
+ {
+ base.UpdateInternal(component);
+
+ _overlayMan.AddOverlay(_overlay);
+ }
+
+ protected override void DeactivateInternal()
+ {
+ base.DeactivateInternal();
+
+ _overlayMan.RemoveOverlay(_overlay);
+ }
+}
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowMindShieldIconsComponent>>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowSyndicateIconsComponent>>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowCriminalRecordIconsComponent>>(RefRelayInventoryEvent);
+ SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<BlackAndWhiteOverlayComponent>>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<EquipmentVerb>>(OnGetEquipmentVerbs);
SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<InnateVerb>>(OnGetInnateVerbs);
--- /dev/null
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Overlays;
+
+/// <summary>
+/// Makes the entity see everything in black and white by adding an overlay.
+/// When added to a clothing item it will also grant the wearer the same overlay.
+/// </summary>
+[RegisterComponent, NetworkedComponent]
+public sealed partial class BlackAndWhiteOverlayComponent : Component;
components:
- type: StorageFill
contents:
- - id: ClothingEyesGlassesSecurity
- prob: 0.3
+ - id: ClothingEyesGlassesNoir
- id: ClothingHeadHatDetGadget
- id: ClothingNeckTieDet
- id: ClothingOuterVestDetective
- type: Clothing
sprite: Clothing/Eyes/Glasses/ninjavisor.rsi
- type: FlashImmunity
+
+- type: entity
+ parent: ClothingEyesBase
+ id: ClothingEyesGlassesNoir
+ name: noir-tech glasses
+ description: A pair of glasses that simulate what the world looked like before the invention of color.
+ components:
+ - type: Sprite
+ sprite: Clothing/Eyes/Glasses/noir.rsi
+ - type: Clothing
+ sprite: Clothing/Eyes/Glasses/sunglasses.rsi
+ - type: IdentityBlocker
+ coverage: EYES
+ - type: FlashImmunity
+ - type: EyeProtection
+ protectionTime: 5
+ - type: BlackAndWhiteOverlay
+ - type: Tag
+ tags:
+ - HamsterWearable
+ - WhitelistChameleon
--- /dev/null
+{
+ "version": 1,
+ "license": "CC-BY-NC-SA-3.0",
+ "copyright": "taken from goonstation at commit https://github.com/goonstation/goonstation/commit/9affe47cd1b192f6d1900a64a5b5a07a54251e37",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "equipped-EYES",
+ "directions": 4
+ },
+ {
+ "name": "icon"
+ }
+ ]
+}