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;
[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()
{
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))
{
component.Shape,
BlockingComponent.BlockFixtureID,
hard: true,
- collisionLayer: (int) CollisionGroup.WallLayer,
+ collisionLayer: (int)CollisionGroup.WallLayer,
body: physicsComponent);
}
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>
//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);
_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;
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;
/// <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>
/// <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>
[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;
/// <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)
/// 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;
}