diff --git a/Content.Client/White/Administration/InvisibilitySystem.cs b/Content.Client/White/Administration/InvisibilitySystem.cs index 9d25288363..bbf34208c7 100644 --- a/Content.Client/White/Administration/InvisibilitySystem.cs +++ b/Content.Client/White/Administration/InvisibilitySystem.cs @@ -8,7 +8,6 @@ namespace Content.Client.White.Administration; public sealed class InvisibilitySystem : SharedInvisibilitySystem { - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly IClientConsoleHost _console = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; @@ -16,19 +15,18 @@ public sealed class InvisibilitySystem : SharedInvisibilitySystem { base.Initialize(); - SubscribeLocalEvent(OnInvisibilityInit); - SubscribeLocalEvent(OnInvisibilityRemove); - SubscribeLocalEvent(OnToggleGhosts); SubscribeNetworkEvent(OnInvisibilityToggle); } private void OnInvisibilityToggle(InvisibilityToggleEvent ev) { - if (!EntityManager.TryGetComponent(ev.Uid, out SpriteComponent? sprite)) + var ent = GetEntity(ev.Uid); + + if (!EntityManager.TryGetComponent(ent, out SpriteComponent? sprite)) return; - var component = EntityManager.EnsureComponent(ev.Uid); + var component = EntityManager.EnsureComponent(ent); component.Invisible = ev.Invisible; component.DefaultAlpha ??= sprite.Color.A; @@ -36,16 +34,6 @@ public sealed class InvisibilitySystem : SharedInvisibilitySystem sprite.Color = sprite.Color.WithAlpha(newAlpha); } - private void OnInvisibilityInit(EntityUid uid, InvisibilityComponent component, ComponentInit args) - { - _actions.AddAction(uid, component.ToggleInvisibilityAction, null); - } - - private void OnInvisibilityRemove(EntityUid uid, InvisibilityComponent component, ComponentRemove args) - { - _actions.RemoveAction(uid, component.ToggleInvisibilityAction); - } - private void OnToggleGhosts(EntityUid uid, InvisibilityComponent component, ToggleInvisibilityActionEvent args) { if (args.Handled) diff --git a/Content.Server/Administration/Systems/BwoinkSystem.cs b/Content.Server/Administration/Systems/BwoinkSystem.cs index eaa42aa50e..7db7abbc00 100644 --- a/Content.Server/Administration/Systems/BwoinkSystem.cs +++ b/Content.Server/Administration/Systems/BwoinkSystem.cs @@ -453,7 +453,7 @@ namespace Content.Server.Administration.Systems overrideMsgText = $"{senderSession.Name}: {escapedText}"; // Not an admin, name is not overridden. } - RaiseNetworkEvent(new BwoinkTextMessage(message.UserId, senderSession.UserId, overrideMsgText), session.ConnectedClient); + RaiseNetworkEvent(new BwoinkTextMessage(message.UserId, senderSession.UserId, overrideMsgText, senderAHelpAdmin), session.ConnectedClient); } else RaiseNetworkEvent(msg, session.ConnectedClient); diff --git a/Content.Server/White/Administration/InvisibilitySystem.cs b/Content.Server/White/Administration/InvisibilitySystem.cs index 26c69b5559..a156cbfaa3 100644 --- a/Content.Server/White/Administration/InvisibilitySystem.cs +++ b/Content.Server/White/Administration/InvisibilitySystem.cs @@ -11,6 +11,7 @@ public sealed class InvisibilitySystem : SharedInvisibilitySystem { [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly FollowerSystem _followerSystem = default!; + [Dependency] private readonly SharedEyeSystem _eyeSystem = default!; public override void Initialize() { @@ -24,7 +25,7 @@ public sealed class InvisibilitySystem : SharedInvisibilitySystem { if (EntityManager.TryGetComponent(uid, out EyeComponent? eye)) { - eye.VisibilityMask |= (int) VisibilityFlags.AdminInvisible; + _eyeSystem.SetVisibilityMask(uid, eye.VisibilityMask | (int) VisibilityFlags.AdminInvisible, eye); } } @@ -37,7 +38,7 @@ public sealed class InvisibilitySystem : SharedInvisibilitySystem if (EntityManager.TryGetComponent(uid, out EyeComponent? eye)) { - eye.VisibilityMask &= ~(int) VisibilityFlags.AdminInvisible; + _eyeSystem.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.AdminInvisible, eye); } } @@ -56,6 +57,6 @@ public sealed class InvisibilitySystem : SharedInvisibilitySystem EntityManager.HasComponent(uid) ? VisibilityFlags.Ghost : VisibilityFlags.Normal )); - RaiseNetworkEvent(new InvisibilityToggleEvent(uid, component.Invisible)); + RaiseNetworkEvent(new InvisibilityToggleEvent(GetNetEntity(uid), component.Invisible)); } } diff --git a/Content.Server/White/Commands/StealthCommand.cs b/Content.Server/White/Commands/StealthCommand.cs index 8d3a559b5c..f61a096fdd 100644 --- a/Content.Server/White/Commands/StealthCommand.cs +++ b/Content.Server/White/Commands/StealthCommand.cs @@ -16,7 +16,7 @@ public sealed class StealthCommand : IConsoleCommand public void Execute(IConsoleShell shell, string argStr, string[] args) { - if (shell.Player is not IPlayerSession player) + if (shell.Player is not {} player) { shell.WriteLine("You cannot use this command from the server console."); return; diff --git a/Content.Shared/White/Administration/InvisibilityComponent.cs b/Content.Shared/White/Administration/InvisibilityComponent.cs index cd70362106..b17bb56c6c 100644 --- a/Content.Shared/White/Administration/InvisibilityComponent.cs +++ b/Content.Shared/White/Administration/InvisibilityComponent.cs @@ -1,30 +1,24 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; -using Robust.Shared.Utility; +using Robust.Shared.Prototypes; namespace Content.Shared.White.Administration; [RegisterComponent] [Access(typeof(SharedInvisibilitySystem))] -public sealed class InvisibilityComponent : Component +public sealed partial class InvisibilityComponent : Component { [ViewVariables] public bool Invisible; public float? DefaultAlpha; - public readonly InstantAction ToggleInvisibilityAction = new() - { - Icon = new SpriteSpecifier.Texture(new("White/Icons/transparent-ghost.png")), - DisplayName = "Переключить невидимость", - Description = "Переключить невидимость вашего призрака.", - ClientExclusive = true, - CheckCanInteract = false, - Priority = -5, - Event = new ToggleInvisibilityActionEvent() - }; + [DataField] + public EntProtoId ToggleInvisibilityAction = "ToggleInvisibilityAction"; + + [DataField] + public EntityUid? ToggleInvisibilityActionEntity; } -public sealed class ToggleInvisibilityActionEvent : InstantActionEvent +public sealed partial class ToggleInvisibilityActionEvent : InstantActionEvent { } diff --git a/Content.Shared/White/Administration/SharedInvisibilitySystem.cs b/Content.Shared/White/Administration/SharedInvisibilitySystem.cs index 944da241f3..4c7e91c524 100644 --- a/Content.Shared/White/Administration/SharedInvisibilitySystem.cs +++ b/Content.Shared/White/Administration/SharedInvisibilitySystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Actions; using Content.Shared.Examine; using Robust.Shared.Serialization; @@ -5,11 +6,25 @@ namespace Content.Shared.White.Administration; public abstract class SharedInvisibilitySystem : EntitySystem { + [Dependency] private readonly SharedActionsSystem _actions = default!; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnInvisibilityInit); + SubscribeLocalEvent(OnInvisibilityRemove); + } + + private void OnInvisibilityInit(EntityUid uid, InvisibilityComponent component, MapInitEvent args) + { + _actions.AddAction(uid, ref component.ToggleInvisibilityActionEntity, component.ToggleInvisibilityAction); + } + + private void OnInvisibilityRemove(EntityUid uid, InvisibilityComponent component, ComponentRemove args) + { + _actions.RemoveAction(uid, component.ToggleInvisibilityActionEntity); } private void OnExamined(EntityUid uid, InvisibilityComponent component, ExaminedEvent args) @@ -22,10 +37,10 @@ public abstract class SharedInvisibilitySystem : EntitySystem [Serializable, NetSerializable] public sealed class InvisibilityToggleEvent : EntityEventArgs { - public EntityUid Uid { get; } + public NetEntity Uid { get; } public bool Invisible { get; } - public InvisibilityToggleEvent(EntityUid uid, bool invisible) + public InvisibilityToggleEvent(NetEntity uid, bool invisible) { Uid = uid; Invisible = invisible; diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 8f9bb6a35f..552ed02129 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -167,3 +167,16 @@ keywords: [ "AI", "console", "interface" ] priority: -10 event: !type:ToggleIntrinsicUIEvent { key: enum.GeneralStationRecordConsoleKey.Key } + +- type: entity + id: ToggleInvisibilityAction + name: Переключить невидимость + description: Переключить невидимость вашего призрака. + noSpawn: true + components: + - type: InstantAction + icon: "White/Icons/transparent-ghost.png" + checkCanInteract: false + clientExclusive: true + priority: -5 + event: !type:ToggleInvisibilityActionEvent