using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Overlays.Switchable; using Robust.Client.Graphics; namespace Content.Client.Overlays.Switchable; 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(EntityUid uid, NightVisionComponent component, RefreshEquipmentHudEvent args) { if (component.IsEquipment) return; base.OnRefreshComponentHud(uid, component, args); } protected override void OnRefreshEquipmentHud(EntityUid uid, NightVisionComponent component, InventoryRelayedEvent> args) { if (!component.IsEquipment) return; base.OnRefreshEquipmentHud(uid, component, args); } private void OnToggle(Entity ent, ref SwitchableOverlayToggledEvent args) { RefreshOverlay(args.User); } 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; } }