// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 Misandry // SPDX-FileCopyrightText: 2025 Spatison <137375981+Spatison@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 gus // // SPDX-License-Identifier: AGPL-3.0-or-later using Content.Client.Overlays; using Content.Shared._Goobstation.Overlays; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Robust.Client.Graphics; namespace Content.Client._Goobstation.Overlays; public sealed class NightVisionSystem : EquipmentHudSystem { [Dependency] private readonly IOverlayManager _overlayMan = default!; [Dependency] private readonly ILightManager _lightManager = default!; private BaseSwitchableOverlay _overlay = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnToggle); _overlay = new BaseSwitchableOverlay(); } protected override void OnRefreshComponentHud(Entity ent, ref RefreshEquipmentHudEvent args) { if (!ent.Comp.IsEquipment) base.OnRefreshComponentHud(ent, ref args); } protected override void OnRefreshEquipmentHud(Entity ent, ref InventoryRelayedEvent> args) { if (ent.Comp.IsEquipment) base.OnRefreshEquipmentHud(ent, ref args); } private void OnToggle(Entity ent, ref SwitchableOverlayToggledEvent args) { RefreshOverlay(); } protected override void UpdateInternal(RefreshEquipmentHudEvent args) { base.UpdateInternal(args); var active = false; NightVisionComponent? nvComp = null; foreach (var comp in args.Components) { if (comp.IsActive || comp.PulseTime > 0f && comp.PulseAccumulator < comp.PulseTime) active = true; else continue; if (comp.DrawOverlay) { if (nvComp == null) nvComp = comp; else if (nvComp.PulseTime > 0f && comp.PulseTime <= 0f) nvComp = comp; } if (active && nvComp is { PulseTime: <= 0 }) break; } UpdateNightVision(active); UpdateOverlay(nvComp); } protected override void DeactivateInternal() { base.DeactivateInternal(); UpdateNightVision(false); UpdateOverlay(null); } private void UpdateNightVision(bool active) { _lightManager.DrawLighting = !active; } private void UpdateOverlay(NightVisionComponent? nvComp) { _overlay.Comp = nvComp; switch (nvComp) { case not null when !_overlayMan.HasOverlay>(): _overlayMan.AddOverlay(_overlay); break; case null: _overlayMan.RemoveOverlay(_overlay); break; } if (_overlayMan.TryGetOverlay>(out var overlay)) overlay.IsActive = nvComp == null; } }