Fix blindness and UIs (#12326)
* fix part 1 * fix blindness and BUIs * remove extra file
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
namespace Content.Server.Eye.Blinding
|
||||
{
|
||||
[RegisterComponent]
|
||||
public sealed class ActivatableUIRequiresVisionComponent : Component
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,9 +103,21 @@ namespace Content.Shared.Eye.Blinding
|
||||
if (!Resolve(uid, ref blindable, false))
|
||||
return;
|
||||
|
||||
var oldSources = blindable.Sources;
|
||||
|
||||
blindable.Sources += amount;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -152,4 +164,17 @@ namespace Content.Shared.Eye.Blinding
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1
Resources/Locale/en-US/eye/blindness.ftl
Normal file
1
Resources/Locale/en-US/eye/blindness.ftl
Normal file
@@ -0,0 +1 @@
|
||||
blindness-fail-attempt = You can't do that if you're blind!
|
||||
@@ -687,6 +687,7 @@
|
||||
- type: ActivatableUI
|
||||
key: enum.SurveillanceCameraMonitorUiKey.Key
|
||||
- type: ActivatableUIRequiresPower
|
||||
- type: ActivatableUIRequiresVision
|
||||
- type: Transform
|
||||
anchored: true
|
||||
- type: UserInterface
|
||||
@@ -721,6 +722,7 @@
|
||||
- type: ActivatableUI
|
||||
key: enum.SurveillanceCameraMonitorUiKey.Key
|
||||
- type: ActivatableUIRequiresPower
|
||||
- type: ActivatableUIRequiresVision
|
||||
- type: Transform
|
||||
anchored: true
|
||||
- type: UserInterface
|
||||
|
||||
Reference in New Issue
Block a user