From eefbd9970d6eea6d4a4bf766e1b2d4e1f38bae51 Mon Sep 17 00:00:00 2001 From: Eris Date: Tue, 1 Jul 2025 20:49:44 -0400 Subject: [PATCH] no risks taken. --- Content.Server/SubFloor/SubFloorHideSystem.cs | 85 ++++++++++++++++--- 1 file changed, 72 insertions(+), 13 deletions(-) diff --git a/Content.Server/SubFloor/SubFloorHideSystem.cs b/Content.Server/SubFloor/SubFloorHideSystem.cs index 2767f500f9..4251b2feae 100644 --- a/Content.Server/SubFloor/SubFloorHideSystem.cs +++ b/Content.Server/SubFloor/SubFloorHideSystem.cs @@ -1,35 +1,94 @@ using Content.Shared.Construction.Components; +using Content.Shared.Eye; using Content.Shared.SubFloor; +using Robust.Server.Player; +using Robust.Shared.Enums; using Robust.Shared.Map.Components; +using Robust.Shared.Player; namespace Content.Server.SubFloor; public sealed class SubFloorHideSystem : SharedSubFloorHideSystem { + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly SharedEyeSystem _eye = default!; + + private HashSet _showFloors = new(); + public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAnchorAttempt); - SubscribeLocalEvent(OnUnanchorAttempt); + + SubscribeNetworkEvent(OnShowSubfloor); + SubscribeLocalEvent(OnGetVisibility); + + _player.PlayerStatusChanged += OnPlayerStatus; } - private void OnAnchorAttempt(EntityUid uid, SubFloorHideComponent component, AnchorAttemptEvent args) + private void OnPlayerStatus(object? sender, SessionStatusEventArgs e) { - // No teleporting entities through floor tiles when anchoring them. - var xform = Transform(uid); + if (e.NewStatus == SessionStatus.Connected) + return; - if (TryComp(xform.GridUid, out var grid) - && HasFloorCover(grid, grid.TileIndicesFor(xform.Coordinates))) + _showFloors.Remove(e.Session); + + if (e.Session.AttachedEntity != null) + _eye.RefreshVisibilityMask(e.Session.AttachedEntity.Value); + } + + private void OnGetVisibility(ref GetVisMaskEvent ev) + { + if (!TryComp(ev.Entity, out ActorComponent? actor)) + return; + + if (_showFloors.Contains(actor.PlayerSession)) { - args.Cancel(); + ev.VisibilityMask |= (int)VisibilityFlags.Subfloor; } } - private void OnUnanchorAttempt(EntityUid uid, SubFloorHideComponent component, UnanchorAttemptEvent args) + private void OnShowSubfloor(ShowSubfloorRequestEvent ev, EntitySessionEventArgs args) { - // No un-anchoring things under the floor. Only required for something like vents, which are still interactable - // despite being partially under the floor. - if (component.IsUnderCover) - args.Cancel(); + // TODO: Commands are a bit of an eh? for client-only but checking shared perms + var ent = args.SenderSession.AttachedEntity; + + if (!TryComp(ent, out EyeComponent? eyeComp)) + return; + + if (ev.Value) + { + _showFloors.Add(args.SenderSession); + } + else + { + _showFloors.Remove(args.SenderSession); + } + + _eye.RefreshVisibilityMask((ent.Value, eyeComp)); + + RaiseNetworkEvent(new ShowSubfloorRequestEvent() + { + Value = ev.Value, + }, args.SenderSession); } + + // private void OnAnchorAttempt(EntityUid uid, SubFloorHideComponent component, AnchorAttemptEvent args) + // { + // // No teleporting entities through floor tiles when anchoring them. + // var xform = Transform(uid); + + // if (TryComp(xform.GridUid, out var grid) + // && HasFloorCover(xform.GridUid.Value, grid, Map.TileIndicesFor(xform.GridUid.Value, grid, xform.Coordinates))) + // { + // args.Cancel(); + // } + // } + + // private void OnUnanchorAttempt(EntityUid uid, SubFloorHideComponent component, UnanchorAttemptEvent args) + // { + // // No un-anchoring things under the floor. Only required for something like vents, which are still interactable + // // despite being partially under the floor. + // if (component.IsUnderCover) + // args.Cancel(); + // } }