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,8 +150,6 @@ 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)
{
@@ -166,7 +158,7 @@ public sealed partial class BlockingSystem : EntitySystem
}
// Don't allow someone to block if they're not holding the shield
if(!_handsSystem.IsHolding(user, item, out _))
if (!_handsSystem.IsHolding(user, item, out _))
{
CantBlockError(user);
return false;
@@ -196,13 +188,7 @@ public sealed partial class BlockingSystem : EntitySystem
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);
}
}
_popupSystem.PopupPredicted(msgUser, msgOther, user, user);
if (TryComp<PhysicsComponent>(user, out var physicsComponent))
{
@@ -210,7 +196,7 @@ public sealed partial class BlockingSystem : EntitySystem
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;

View File

@@ -16,13 +16,13 @@ public sealed partial class BlockingComponent : Component
/// <summary>
/// The entity that's blocking
/// </summary>
[ViewVariables, AutoNetworkedField]
[DataField, AutoNetworkedField]
public EntityUid? User;
/// <summary>
/// Is it currently blocking?
/// </summary>
[ViewVariables, AutoNetworkedField]
[DataField, AutoNetworkedField]
public bool IsBlocking;
/// <summary>
@@ -33,7 +33,7 @@ public sealed partial class BlockingComponent : Component
/// <summary>
/// The shape of the blocking fixture that will be dynamically spawned
/// </summary>
[DataField("shape"), ViewVariables(VVAccess.ReadWrite)]
[DataField]
public IPhysShape Shape = new PhysShapeCircle(0.5f);
/// <summary>
@@ -48,8 +48,8 @@ public sealed partial class BlockingComponent : Component
[DataField("activeBlockModifier", required: true)]
public DamageModifierSet ActiveBlockDamageModifier = default!;
[DataField("blockingToggleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string BlockingToggleAction = "ActionToggleBlock";
[DataField]
public EntProtoId BlockingToggleAction = "ActionToggleBlock";
[DataField, AutoNetworkedField]
public EntityUid? BlockingToggleActionEntity;
@@ -57,7 +57,7 @@ public sealed partial class BlockingComponent : Component
/// <summary>
/// The sound to be played when you get hit while actively blocking
/// </summary>
[DataField("blockSound")] public SoundSpecifier BlockSound =
[DataField] public SoundSpecifier BlockSound =
new SoundPathSpecifier("/Audio/Weapons/block_metal1.ogg")
{
Params = AudioParams.Default.WithVariation(0.25f)
@@ -67,13 +67,13 @@ public sealed partial class BlockingComponent : Component
/// Fraction of original damage shield will take instead of user
/// when not blocking
/// </summary>
[DataField("passiveBlockFraction"), ViewVariables(VVAccess.ReadWrite)]
[DataField]
public float PassiveBlockFraction = 0.5f;
/// <summary>
/// Fraction of original damage shield will take instead of user
/// when blocking
/// </summary>
[DataField("activeBlockFraction"), ViewVariables(VVAccess.ReadWrite)]
[DataField]
public float ActiveBlockFraction = 1.0f;
}