Fix blindness and UIs (#12326)

* fix part 1

* fix blindness and BUIs

* remove extra file
This commit is contained in:
Rane
2022-11-08 16:10:13 -05:00
committed by GitHub
parent 0b3038e1f6
commit 20032b5ecc
5 changed files with 96 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
namespace Content.Server.Eye.Blinding
{
[RegisterComponent]
public sealed class ActivatableUIRequiresVisionComponent : Component
{
}
}

View File

@@ -0,0 +1,60 @@
using Content.Shared.Eye.Blinding;
using Content.Server.UserInterface;
using Content.Server.Popups;
using Robust.Shared.Player;
using Robust.Server.GameObjects;
namespace Content.Server.Eye.Blinding
{
public sealed class ActivatableUIRequiresVisionSystem : EntitySystem
{
[Dependency] private readonly ActivatableUISystem _activatableUISystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ActivatableUIRequiresVisionComponent, ActivatableUIOpenAttemptEvent>(OnOpenAttempt);
SubscribeLocalEvent<BlindableComponent, BlindnessChangedEvent>(OnBlindnessChanged);
}
private void OnOpenAttempt(EntityUid uid, ActivatableUIRequiresVisionComponent component, ActivatableUIOpenAttemptEvent args)
{
if (args.Cancelled)
return;
if (TryComp<BlindableComponent>(args.User, out var blindable) && blindable.Sources > 0)
{
_popupSystem.PopupCursor(Loc.GetString("blindness-fail-attempt"), Filter.Entities(args.User), Shared.Popups.PopupType.MediumCaution);
args.Cancel();
}
}
private void OnBlindnessChanged(EntityUid uid, BlindableComponent component, BlindnessChangedEvent args)
{
if (!args.Blind)
return;
if (!TryComp<ActorComponent>(uid, out var actor))
return;
var uiList = _userInterfaceSystem.GetAllUIsForSession(actor.PlayerSession);
if (uiList == null)
return;
Queue<BoundUserInterface> closeList = new(); // foreach collection modified moment
foreach (var ui in uiList)
{
if (HasComp<ActivatableUIRequiresVisionComponent>(ui.Owner))
closeList.Enqueue(ui);
}
foreach (var ui in closeList)
{
_userInterfaceSystem.CloseUi(ui, actor.PlayerSession);
}
}
}
}

View File

@@ -103,9 +103,21 @@ namespace Content.Shared.Eye.Blinding
if (!Resolve(uid, ref blindable, false)) if (!Resolve(uid, ref blindable, false))
return; return;
var oldSources = blindable.Sources;
blindable.Sources += amount; blindable.Sources += amount;
blindable.Sources = Math.Max(blindable.Sources, 0); blindable.Sources = Math.Max(blindable.Sources, 0);
if (oldSources == 0 && blindable.Sources > 0)
{
var ev = new BlindnessChangedEvent(true);
RaiseLocalEvent(uid, ev, false);
} else if (blindable.Sources == 0 && oldSources > 0)
{
var ev = new BlindnessChangedEvent(false);
RaiseLocalEvent(uid, ev, false);
}
Dirty(blindable); Dirty(blindable);
} }
@@ -152,4 +164,17 @@ namespace Content.Shared.Eye.Blinding
Magnitude = magnitude; Magnitude = magnitude;
} }
} }
/// <summary>
/// You became blind or lost blindess, not just changed # of sources.
/// </summary>
public sealed class BlindnessChangedEvent : EntityEventArgs
{
public bool Blind;
public BlindnessChangedEvent(bool blind)
{
Blind = blind;
}
}
} }

View File

@@ -0,0 +1 @@
blindness-fail-attempt = You can't do that if you're blind!

View File

@@ -687,6 +687,7 @@
- type: ActivatableUI - type: ActivatableUI
key: enum.SurveillanceCameraMonitorUiKey.Key key: enum.SurveillanceCameraMonitorUiKey.Key
- type: ActivatableUIRequiresPower - type: ActivatableUIRequiresPower
- type: ActivatableUIRequiresVision
- type: Transform - type: Transform
anchored: true anchored: true
- type: UserInterface - type: UserInterface
@@ -721,6 +722,7 @@
- type: ActivatableUI - type: ActivatableUI
key: enum.SurveillanceCameraMonitorUiKey.Key key: enum.SurveillanceCameraMonitorUiKey.Key
- type: ActivatableUIRequiresPower - type: ActivatableUIRequiresPower
- type: ActivatableUIRequiresVision
- type: Transform - type: Transform
anchored: true anchored: true
- type: UserInterface - type: UserInterface