mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-21 15:38:52 +03:00
# Description I'm going to go put powergamers on suicide watch. This PR makes it so that specializing in psionic traits, and specializing in cybernetic traits are both mutually exclusive. You are only allowed to have a single cybernetric trait if you wish to have psionic traits. And you are only allowed to have Latent Psychic with no other traits if you wish to have Cybernetics. Also fixes a bug with Thermographic Vision not correctly being measured in seconds. You now get a 2 second pulse with Thermographic vision, as intended. # Changelog 🆑 - tweak: Psionic traits are now mutually exclusive with cybernetic traits, and vice versa. - fix: Thermographic Vision now correctly measures its pulse duration in seconds instead of nanoseconds. It provides a 2 second scan. --------- Co-authored-by: stellar-novas <stellar_novas@riseup.net> (cherry picked from commit 87eb664fa6e95b659c5753b07115d1aaea82b442)
120 lines
3.8 KiB
C#
120 lines
3.8 KiB
C#
using Content.Shared.Inventory;
|
|
using Content.Shared.Inventory.Events;
|
|
using Content.Shared.Overlays.Switchable;
|
|
using Robust.Client.Graphics;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Content.Client.Overlays.Switchable;
|
|
|
|
public sealed class ThermalVisionSystem : EquipmentHudSystem<ThermalVisionComponent>
|
|
{
|
|
[Dependency] private readonly IOverlayManager _overlayMan = default!;
|
|
[Dependency] private readonly IGameTiming _timing = default!;
|
|
|
|
private ThermalVisionOverlay _thermalOverlay = default!;
|
|
private BaseSwitchableOverlay<ThermalVisionComponent> _overlay = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<ThermalVisionComponent, SwitchableOverlayToggledEvent>(OnToggle);
|
|
|
|
_thermalOverlay = new ThermalVisionOverlay();
|
|
_overlay = new BaseSwitchableOverlay<ThermalVisionComponent>();
|
|
}
|
|
|
|
protected override void OnRefreshComponentHud(EntityUid uid,
|
|
ThermalVisionComponent component,
|
|
RefreshEquipmentHudEvent<ThermalVisionComponent> args)
|
|
{
|
|
if (component.IsEquipment)
|
|
return;
|
|
|
|
base.OnRefreshComponentHud(uid, component, args);
|
|
}
|
|
|
|
protected override void OnRefreshEquipmentHud(EntityUid uid,
|
|
ThermalVisionComponent component,
|
|
InventoryRelayedEvent<RefreshEquipmentHudEvent<ThermalVisionComponent>> args)
|
|
{
|
|
if (!component.IsEquipment)
|
|
return;
|
|
|
|
base.OnRefreshEquipmentHud(uid, component, args);
|
|
}
|
|
|
|
private void OnToggle(Entity<ThermalVisionComponent> ent, ref SwitchableOverlayToggledEvent args)
|
|
{
|
|
RefreshOverlay(args.User);
|
|
}
|
|
|
|
protected override void UpdateInternal(RefreshEquipmentHudEvent<ThermalVisionComponent> args)
|
|
{
|
|
base.UpdateInternal(args);
|
|
ThermalVisionComponent? tvComp = null;
|
|
var lightRadius = 0f;
|
|
foreach (var comp in args.Components)
|
|
{
|
|
if (!comp.IsActive && (comp.PulseTime <= 0 || _timing.CurTime < comp.PulseEndTime))
|
|
continue;
|
|
|
|
if (tvComp == null)
|
|
tvComp = comp;
|
|
else if (!tvComp.DrawOverlay && comp.DrawOverlay)
|
|
tvComp = comp;
|
|
else if (tvComp.DrawOverlay == comp.DrawOverlay && tvComp.PulseTime > 0 && comp.PulseTime <= 0)
|
|
tvComp = comp;
|
|
|
|
lightRadius = MathF.Max(lightRadius, comp.LightRadius);
|
|
}
|
|
|
|
UpdateThermalOverlay(tvComp, lightRadius);
|
|
UpdateOverlay(tvComp);
|
|
}
|
|
|
|
protected override void DeactivateInternal()
|
|
{
|
|
base.DeactivateInternal();
|
|
|
|
_thermalOverlay.ResetLight(false);
|
|
UpdateOverlay(null);
|
|
UpdateThermalOverlay(null, 0f);
|
|
}
|
|
|
|
private void UpdateThermalOverlay(ThermalVisionComponent? comp, float lightRadius)
|
|
{
|
|
_thermalOverlay.LightRadius = lightRadius;
|
|
_thermalOverlay.Comp = comp;
|
|
|
|
switch (comp)
|
|
{
|
|
case not null when !_overlayMan.HasOverlay<ThermalVisionOverlay>():
|
|
_overlayMan.AddOverlay(_thermalOverlay);
|
|
break;
|
|
case null:
|
|
_overlayMan.RemoveOverlay(_thermalOverlay);
|
|
_thermalOverlay.ResetLight();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void UpdateOverlay(ThermalVisionComponent? tvComp)
|
|
{
|
|
_overlay.Comp = tvComp;
|
|
|
|
switch (tvComp)
|
|
{
|
|
case { DrawOverlay: true } when !_overlayMan.HasOverlay<BaseSwitchableOverlay<ThermalVisionComponent>>():
|
|
_overlayMan.AddOverlay(_overlay);
|
|
break;
|
|
case null or { DrawOverlay: false }:
|
|
_overlayMan.RemoveOverlay(_overlay);
|
|
break;
|
|
}
|
|
|
|
// Night vision overlay is prioritized
|
|
_overlay.IsActive = !_overlayMan.HasOverlay<BaseSwitchableOverlay<NightVisionComponent>>();
|
|
}
|
|
}
|