Predict blocking examine + fix blocking breaking persistence (#36619)

* Predict blocking examine

No idea why this was blocked.

* Fix blocking

* remove nullcheck that made no sense

* predict popups

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
This commit is contained in:
metalgearsloth
2025-04-18 22:57:23 +10:00
committed by GitHub
parent f2232e2ffb
commit e838667d87
2 changed files with 45 additions and 65 deletions

View File

@@ -13,13 +13,9 @@ using Content.Shared.Physics;
using Content.Shared.Popups;
using Content.Shared.Toggleable;
using Content.Shared.Verbs;
using Robust.Shared.Network;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Systems;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Shared.Blocking;
@@ -35,8 +31,6 @@ public sealed partial class BlockingSystem : EntitySystem
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly ExamineSystemShared _examine = default!;
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
public override void Initialize()
{
@@ -156,61 +150,53 @@ public sealed partial class BlockingSystem : EntitySystem
var msgUser = Loc.GetString("action-popup-blocking-user", ("shield", shieldName));
var msgOther = Loc.GetString("action-popup-blocking-other", ("blockerName", blockerName), ("shield", shieldName));
if (component.BlockingToggleAction != null)
//Don't allow someone to block if they're not parented to a grid
if (xform.GridUid != xform.ParentUid)
{
//Don't allow someone to block if they're not parented to a grid
if (xform.GridUid != xform.ParentUid)
{
CantBlockError(user);
return false;
}
CantBlockError(user);
return false;
}
// Don't allow someone to block if they're not holding the shield
if(!_handsSystem.IsHolding(user, item, out _))
{
CantBlockError(user);
return false;
}
// Don't allow someone to block if they're not holding the shield
if (!_handsSystem.IsHolding(user, item, out _))
{
CantBlockError(user);
return false;
}
//Don't allow someone to block if someone else is on the same tile
var playerTileRef = xform.Coordinates.GetTileRef();
if (playerTileRef != null)
//Don't allow someone to block if someone else is on the same tile
var playerTileRef = xform.Coordinates.GetTileRef();
if (playerTileRef != null)
{
var intersecting = _lookup.GetLocalEntitiesIntersecting(playerTileRef.Value, 0f);
var mobQuery = GetEntityQuery<MobStateComponent>();
foreach (var uid in intersecting)
{
var intersecting = _lookup.GetLocalEntitiesIntersecting(playerTileRef.Value, 0f);
var mobQuery = GetEntityQuery<MobStateComponent>();
foreach (var uid in intersecting)
if (uid != user && mobQuery.HasComponent(uid))
{
if (uid != user && mobQuery.HasComponent(uid))
{
TooCloseError(user);
return false;
}
TooCloseError(user);
return false;
}
}
//Don't allow someone to block if they're somehow not anchored.
_transformSystem.AnchorEntity(user, xform);
if (!xform.Anchored)
{
CantBlockError(user);
return false;
}
_actionsSystem.SetToggled(component.BlockingToggleActionEntity, true);
if (_gameTiming.IsFirstTimePredicted)
{
_popupSystem.PopupEntity(msgOther, user, Filter.PvsExcept(user), true);
if(_gameTiming.InPrediction)
_popupSystem.PopupEntity(msgUser, user, user);
}
}
//Don't allow someone to block if they're somehow not anchored.
_transformSystem.AnchorEntity(user, xform);
if (!xform.Anchored)
{
CantBlockError(user);
return false;
}
_actionsSystem.SetToggled(component.BlockingToggleActionEntity, true);
_popupSystem.PopupPredicted(msgUser, msgOther, user, user);
if (TryComp<PhysicsComponent>(user, out var physicsComponent))
{
_fixtureSystem.TryCreateFixture(user,
component.Shape,
BlockingComponent.BlockFixtureID,
hard: true,
collisionLayer: (int) CollisionGroup.WallLayer,
collisionLayer: (int)CollisionGroup.WallLayer,
body: physicsComponent);
}
@@ -223,13 +209,13 @@ public sealed partial class BlockingSystem : EntitySystem
private void CantBlockError(EntityUid user)
{
var msgError = Loc.GetString("action-popup-blocking-user-cant-block");
_popupSystem.PopupEntity(msgError, user, user);
_popupSystem.PopupClient(msgError, user, user);
}
private void TooCloseError(EntityUid user)
{
var msgError = Loc.GetString("action-popup-blocking-user-too-close");
_popupSystem.PopupEntity(msgError, user, user);
_popupSystem.PopupClient(msgError, user, user);
}
/// <summary>
@@ -255,8 +241,7 @@ public sealed partial class BlockingSystem : EntitySystem
//If the component blocking toggle isn't null, grab the users SharedBlockingUserComponent and PhysicsComponent
//then toggle the action to false, unanchor the user, remove the hard fixture
//and set the users bodytype back to their original type
if (component.BlockingToggleAction != null && TryComp<BlockingUserComponent>(user, out var blockingUserComponent)
&& TryComp<PhysicsComponent>(user, out var physicsComponent))
if (TryComp<BlockingUserComponent>(user, out var blockingUserComponent) && TryComp<PhysicsComponent>(user, out var physicsComponent))
{
if (xform.Anchored)
_transformSystem.Unanchor(user, xform);
@@ -264,12 +249,7 @@ public sealed partial class BlockingSystem : EntitySystem
_actionsSystem.SetToggled(component.BlockingToggleActionEntity, false);
_fixtureSystem.DestroyFixture(user, BlockingComponent.BlockFixtureID, body: physicsComponent);
_physics.SetBodyType(user, blockingUserComponent.OriginalBodyType, body: physicsComponent);
if (_gameTiming.IsFirstTimePredicted)
{
_popupSystem.PopupEntity(msgOther, user, Filter.PvsExcept(user), true);
if(_gameTiming.InPrediction)
_popupSystem.PopupEntity(msgUser, user, user);
}
_popupSystem.PopupPredicted(msgUser, msgOther, user, user);
}
component.IsBlocking = false;
@@ -313,7 +293,7 @@ public sealed partial class BlockingSystem : EntitySystem
private void OnVerbExamine(EntityUid uid, BlockingComponent component, GetVerbsEvent<ExamineVerb> args)
{
if (!args.CanInteract || !args.CanAccess || !_net.IsServer)
if (!args.CanInteract || !args.CanAccess)
return;
var fraction = component.IsBlocking ? component.ActiveBlockFraction : component.PassiveBlockFraction;