Predict pipe anchoring and unanchroing (#35977)

* yay prediction

* Added cool popups

* bruh

* this is better!
This commit is contained in:
beck-thompson
2025-03-21 02:43:35 -07:00
committed by GitHub
parent 2b6c0e296d
commit 97d0f14dae
3 changed files with 31 additions and 24 deletions

View File

@@ -1,9 +1,7 @@
using Content.Shared.Construction.Components;
using Content.Shared.Eye; using Content.Shared.Eye;
using Content.Shared.SubFloor; using Content.Shared.SubFloor;
using Robust.Server.Player; using Robust.Server.Player;
using Robust.Shared.Enums; using Robust.Shared.Enums;
using Robust.Shared.Map.Components;
using Robust.Shared.Player; using Robust.Shared.Player;
namespace Content.Server.SubFloor; namespace Content.Server.SubFloor;
@@ -18,8 +16,6 @@ public sealed class SubFloorHideSystem : SharedSubFloorHideSystem
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<SubFloorHideComponent, AnchorAttemptEvent>(OnAnchorAttempt);
SubscribeLocalEvent<SubFloorHideComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
SubscribeNetworkEvent<ShowSubfloorRequestEvent>(OnShowSubfloor); SubscribeNetworkEvent<ShowSubfloorRequestEvent>(OnShowSubfloor);
SubscribeLocalEvent<GetVisMaskEvent>(OnGetVisibility); SubscribeLocalEvent<GetVisMaskEvent>(OnGetVisibility);
@@ -72,24 +68,4 @@ public sealed class SubFloorHideSystem : SharedSubFloorHideSystem
Value = ev.Value, Value = ev.Value,
}, args.SenderSession); }, 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<MapGridComponent>(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();
}
} }

View File

@@ -1,8 +1,10 @@
using Content.Shared.Audio; using Content.Shared.Audio;
using Content.Shared.Construction.Components;
using Content.Shared.Explosion; using Content.Shared.Explosion;
using Content.Shared.Eye; using Content.Shared.Eye;
using Content.Shared.Interaction.Events; using Content.Shared.Interaction.Events;
using Content.Shared.Maps; using Content.Shared.Maps;
using Content.Shared.Popups;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Map.Components; using Robust.Shared.Map.Components;
@@ -21,6 +23,7 @@ namespace Content.Shared.SubFloor
[Dependency] protected readonly SharedMapSystem Map = default!; [Dependency] protected readonly SharedMapSystem Map = default!;
[Dependency] protected readonly SharedAppearanceSystem Appearance = default!; [Dependency] protected readonly SharedAppearanceSystem Appearance = default!;
[Dependency] private readonly SharedVisibilitySystem _visibility = default!; [Dependency] private readonly SharedVisibilitySystem _visibility = default!;
[Dependency] protected readonly SharedPopupSystem _popup = default!;
private EntityQuery<SubFloorHideComponent> _hideQuery; private EntityQuery<SubFloorHideComponent> _hideQuery;
@@ -38,6 +41,32 @@ namespace Content.Shared.SubFloor
SubscribeLocalEvent<SubFloorHideComponent, GettingInteractedWithAttemptEvent>(OnInteractionAttempt); SubscribeLocalEvent<SubFloorHideComponent, GettingInteractedWithAttemptEvent>(OnInteractionAttempt);
SubscribeLocalEvent<SubFloorHideComponent, GettingAttackedAttemptEvent>(OnAttackAttempt); SubscribeLocalEvent<SubFloorHideComponent, GettingAttackedAttemptEvent>(OnAttackAttempt);
SubscribeLocalEvent<SubFloorHideComponent, GetExplosionResistanceEvent>(OnGetExplosionResistance); SubscribeLocalEvent<SubFloorHideComponent, GetExplosionResistanceEvent>(OnGetExplosionResistance);
SubscribeLocalEvent<SubFloorHideComponent, AnchorAttemptEvent>(OnAnchorAttempt);
SubscribeLocalEvent<SubFloorHideComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
}
private void OnAnchorAttempt(EntityUid uid, SubFloorHideComponent component, AnchorAttemptEvent args)
{
// No teleporting entities through floor tiles when anchoring them.
var xform = Transform(uid);
if (TryComp<MapGridComponent>(xform.GridUid, out var grid)
&& HasFloorCover(xform.GridUid.Value, grid, Map.TileIndicesFor(xform.GridUid.Value, grid, xform.Coordinates)))
{
_popup.PopupClient(Loc.GetString("subfloor-anchor-failure", ("entity", uid)), args.User);
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)
{
_popup.PopupClient(Loc.GetString("subfloor-unanchor-failure", ("entity", uid)), args.User);
args.Cancel();
}
} }
private void OnGetExplosionResistance(EntityUid uid, SubFloorHideComponent component, ref GetExplosionResistanceEvent args) private void OnGetExplosionResistance(EntityUid uid, SubFloorHideComponent component, ref GetExplosionResistanceEvent args)

View File

@@ -0,0 +1,2 @@
subfloor-anchor-failure = {CAPITALIZE(THE($entity))} can't be anchored here!
subfloor-unanchor-failure = {CAPITALIZE(THE($entity))} can't be unanchored here!