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))
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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
|
- 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
|
||||||
|
|||||||
Reference in New Issue
Block a user