Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Content.Client/Administration/UI/Tabs/AdminTab/AdminTab.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ SPDX-License-Identifier: AGPL-3.0-or-later
<cc:UICommandButton Command="kick" Text="{Loc admin-player-actions-window-title}" WindowType="{x:Type at:PlayerActionsWindow}" />
<cc:CommandButton Command="banpanel" Text="{Loc admin-player-actions-window-ban}" />
<cc:CommandButton Command="aghost" Text="{Loc admin-player-actions-window-admin-ghost}" />
<cc:CommandButton Command="stealthmin" Text="{Loc admin-player-actions-window-admin-stealthmin}"/>
<cc:CommandButton Command="invisibility" Text="{Loc admin-player-actions-window-admin-invisibility}"/>
<cc:UICommandButton Command="tpto" Text="{Loc admin-player-actions-window-teleport}" WindowType="{x:Type at:TeleportWindow}" />
<cc:CommandButton Command="permissions" Text="{Loc admin-player-actions-window-permissions}" />
<cc:CommandButton Command="announceui" Text="{Loc admin-player-actions-window-announce}"/>
Expand Down
63 changes: 63 additions & 0 deletions Content.Server/_Amour/Administration/InvisibilitySystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using Content.Shared._Amour.Administration;
using Content.Shared.Eye;
using Content.Shared.Follower;
using Content.Shared.Follower.Components;
using Content.Shared.Ghost;
using Robust.Server.GameObjects;
using InvisibilityComponent = Content.Shared._Amour.Administration.InvisibilityComponent;

namespace Content.Server._Amour.Administration;

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()
{
base.Initialize();

SubscribeLocalEvent<InvisibilityComponent, ComponentStartup>(OnInvisibilityStartup);
SubscribeLocalEvent<InvisibilityComponent, ComponentShutdown>(OnInvisibilityShutdown);
}

private void OnInvisibilityStartup(EntityUid uid, InvisibilityComponent component, ComponentStartup args)
{
if (EntityManager.TryGetComponent(uid, out EyeComponent? eye))
{
_eyeSystem.SetVisibilityMask(uid, eye.VisibilityMask | (int) VisibilityFlags.Admin, eye);
}
}

private void OnInvisibilityShutdown(EntityUid uid, InvisibilityComponent component, ComponentShutdown args)
{
if (EntityManager.TryGetComponent(uid, out VisibilityComponent? visibility))
{
_visibilitySystem.RemoveLayer((uid, visibility), (int) VisibilityFlags.Admin);
}

if (EntityManager.TryGetComponent(uid, out EyeComponent? eye))
{
_eyeSystem.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.Admin, eye);
}
}

public void ToggleInvisibility(EntityUid uid, InvisibilityComponent component)
{
if (!EntityManager.TryGetComponent(uid, out VisibilityComponent? visibility))
return;

if (TryComp(uid, out FollowedComponent? followed))
_followerSystem.StopAllFollowers(uid, followed);

component.Invisible = !component.Invisible;

_visibilitySystem.SetLayer((uid, visibility),
(ushort) (component.Invisible ? VisibilityFlags.Admin :
EntityManager.HasComponent<GhostComponent>(uid) ? VisibilityFlags.Ghost : VisibilityFlags.Normal
));

RaiseNetworkEvent(new InvisibilityToggleEvent(GetNetEntity(uid), component.Invisible));
}
}
33 changes: 33 additions & 0 deletions Content.Server/_Amour/Commands/InvisibilityCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Content.Server.Administration;
using Content.Server._Amour.Administration;
using Content.Shared.Administration;
using Robust.Shared.Console;
using InvisibilityComponent = Content.Shared._Amour.Administration.InvisibilityComponent;

namespace Content.Server._Amour.Commands;

[AdminCommand(AdminFlags.Admin)]
public sealed class InvisibilityCommand : IConsoleCommand
{
public string Command => "invisibility";
public string Description => "Amour. Переключает режим невидимости.";
public string Help => "invisibility";

public void Execute(IConsoleShell shell, string argStr, string[] args)
{
if (shell.Player == null)
shell.WriteLine("You can only toggle invisibility on a client.");

var entityManager = IoCManager.Resolve<EntityManager>();
var uid = shell.Player?.AttachedEntity;
if (uid == null
|| !entityManager.TryGetComponent<InvisibilityComponent>(uid, out var invisibilityComponent))
return;

entityManager.System<InvisibilitySystem>().ToggleInvisibility(uid.Value, invisibilityComponent);

shell.WriteLine(invisibilityComponent.Invisible
? "Теперь вы в режиме невидимости"
: "Теперь вы не в режиме невидимости");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Content.Shared.Actions;
using Robust.Shared.Prototypes;

namespace Content.Shared._Amour.Administration;

[RegisterComponent]
[Access(typeof(SharedInvisibilitySystem))]
public sealed partial class InvisibilityComponent : Component
{
[ViewVariables]
public bool Invisible;

public float? DefaultAlpha;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Content.Shared.Actions;
using Content.Shared.Examine;
using Robust.Shared.Serialization;

namespace Content.Shared._Amour.Administration;

public abstract class SharedInvisibilitySystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actions = default!;

public override void Initialize()
{
base.Initialize();

SubscribeLocalEvent<InvisibilityComponent, ExaminedEvent>(OnExamined);
}

private void OnExamined(EntityUid uid, InvisibilityComponent component, ExaminedEvent args)
{
if (component.Invisible)
args.PushMarkup("[color=lightsteelblue]Оно доступно лишь взору богов.[/color]");
}
}

[Serializable, NetSerializable]
public sealed class InvisibilityToggleEvent(NetEntity uid, bool invisible) : EntityEventArgs
{
public NetEntity Uid { get; } = uid;
public bool Invisible { get; } = invisible;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
admin-player-actions-window-title = Действия с игроками
admin-player-actions-window-ban = Панель банов
admin-player-actions-window-admin-ghost = Админ призрак
admin-player-actions-window-admin-stealthmin = Спрятаться/показаться
admin-player-actions-window-admin-invisibility = Переключить инвиз
admin-player-actions-window-teleport = Телепорт
admin-player-actions-window-permissions = Панель доступов
admin-player-actions-window-announce = Сделать объявление
Expand Down
1 change: 1 addition & 0 deletions Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@
allowedVerbs: []
- type: ExplosionResistance
damageCoefficient: 0
- type: Invisibility # Amour edit

- type: entity
abstract: true
Expand Down
Loading