Fixes Blocking bugs (#9424)
* Fixes Riot shield bugs * Removes redundant check and extra parenthesis * Requested changes * Prevent block with another shield if already blocking.
This commit is contained in:
@@ -1,11 +1,14 @@
|
|||||||
using Content.Shared.Actions;
|
using Content.Shared.Actions;
|
||||||
using Content.Shared.Actions.ActionTypes;
|
using Content.Shared.Actions.ActionTypes;
|
||||||
|
using Content.Shared.Buckle.Components;
|
||||||
using Content.Shared.Hands;
|
using Content.Shared.Hands;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
using Content.Shared.Hands.EntitySystems;
|
||||||
using Content.Shared.IdentityManagement;
|
using Content.Shared.IdentityManagement;
|
||||||
using Content.Shared.Physics;
|
using Content.Shared.Physics;
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
using Content.Shared.Toggleable;
|
using Content.Shared.Toggleable;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Physics;
|
using Robust.Shared.Physics;
|
||||||
using Robust.Shared.Physics.Dynamics;
|
using Robust.Shared.Physics.Dynamics;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
@@ -21,6 +24,8 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
[Dependency] private readonly FixtureSystem _fixtureSystem = default!;
|
[Dependency] private readonly FixtureSystem _fixtureSystem = default!;
|
||||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||||
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
||||||
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
|
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -71,6 +76,17 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
if(args.Handled)
|
if(args.Handled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
foreach (var shield in _handsSystem.EnumerateHeld(args.Performer))
|
||||||
|
{
|
||||||
|
if (shield == uid)
|
||||||
|
continue;
|
||||||
|
if (TryComp<BlockingComponent>(shield, out var otherBlockComp) && otherBlockComp.IsBlocking)
|
||||||
|
{
|
||||||
|
CantBlockError(args.Performer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (component.IsBlocking)
|
if (component.IsBlocking)
|
||||||
StopBlocking(uid, component, args.Performer);
|
StopBlocking(uid, component, args.Performer);
|
||||||
else
|
else
|
||||||
@@ -112,11 +128,16 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
|
|
||||||
if (component.BlockingToggleAction != null)
|
if (component.BlockingToggleAction != null)
|
||||||
{
|
{
|
||||||
|
if (_containerSystem.IsEntityInContainer(user) || !_mapManager.TryFindGridAt(xform.MapPosition, out var grid))
|
||||||
|
{
|
||||||
|
CantBlockError(user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
_transformSystem.AnchorEntity(xform);
|
_transformSystem.AnchorEntity(xform);
|
||||||
if (!xform.Anchored)
|
if (!xform.Anchored)
|
||||||
{
|
{
|
||||||
var msgError = Loc.GetString("action-popup-blocking-user-cant-block");
|
CantBlockError(user);
|
||||||
_popupSystem.PopupEntity(msgError, user, Filter.Entities(user));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_actionsSystem.SetToggled(component.BlockingToggleAction, true);
|
_actionsSystem.SetToggled(component.BlockingToggleAction, true);
|
||||||
@@ -141,6 +162,12 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CantBlockError(EntityUid user)
|
||||||
|
{
|
||||||
|
var msgError = Loc.GetString("action-popup-blocking-user-cant-block");
|
||||||
|
_popupSystem.PopupEntity(msgError, user, Filter.Entities(user));
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called where you want the user to stop blocking.
|
/// Called where you want the user to stop blocking.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -166,7 +193,9 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
if (component.BlockingToggleAction != null && TryComp<BlockingUserComponent>(user, out var blockingUserComponent)
|
if (component.BlockingToggleAction != null && TryComp<BlockingUserComponent>(user, out var blockingUserComponent)
|
||||||
&& TryComp<PhysicsComponent>(user, out var physicsComponent))
|
&& TryComp<PhysicsComponent>(user, out var physicsComponent))
|
||||||
{
|
{
|
||||||
_transformSystem.Unanchor(xform);
|
if (xform.Anchored)
|
||||||
|
_transformSystem.Unanchor(xform);
|
||||||
|
|
||||||
_actionsSystem.SetToggled(component.BlockingToggleAction, false);
|
_actionsSystem.SetToggled(component.BlockingToggleAction, false);
|
||||||
_fixtureSystem.DestroyFixture(physicsComponent, BlockingComponent.BlockFixtureID);
|
_fixtureSystem.DestroyFixture(physicsComponent, BlockingComponent.BlockFixtureID);
|
||||||
physicsComponent.BodyType = blockingUserComponent.OriginalBodyType;
|
physicsComponent.BodyType = blockingUserComponent.OriginalBodyType;
|
||||||
@@ -181,6 +210,7 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called where you want someone to stop blocking and to remove the <see cref="BlockingUserComponent"/> from them
|
/// Called where you want someone to stop blocking and to remove the <see cref="BlockingUserComponent"/> from them
|
||||||
|
/// Won't remove the <see cref="BlockingUserComponent"/> if they're holding another blocking item
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="uid"> The item the component is attached to</param>
|
/// <param name="uid"> The item the component is attached to</param>
|
||||||
/// <param name="component"> The <see cref="BlockingComponent"/> </param>
|
/// <param name="component"> The <see cref="BlockingComponent"/> </param>
|
||||||
@@ -190,6 +220,15 @@ public sealed class BlockingSystem : EntitySystem
|
|||||||
if (component.IsBlocking)
|
if (component.IsBlocking)
|
||||||
StopBlocking(uid, component, user);
|
StopBlocking(uid, component, user);
|
||||||
|
|
||||||
|
foreach (var shield in _handsSystem.EnumerateHeld(user))
|
||||||
|
{
|
||||||
|
if (HasComp<BlockingComponent>(shield) && TryComp<BlockingUserComponent>(user, out var blockingUserComponent))
|
||||||
|
{
|
||||||
|
blockingUserComponent.BlockingItem = shield;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RemComp<BlockingUserComponent>(user);
|
RemComp<BlockingUserComponent>(user);
|
||||||
component.User = null;
|
component.User = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
using Content.Shared.Audio;
|
using Content.Shared.Audio;
|
||||||
|
using Content.Shared.Buckle.Components;
|
||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Damage.Prototypes;
|
using Content.Shared.Damage.Prototypes;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
using Content.Shared.Hands.EntitySystems;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
@@ -21,12 +23,30 @@ public sealed class BlockingUserSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<BlockingUserComponent, DamageChangedEvent>(OnDamageChanged);
|
SubscribeLocalEvent<BlockingUserComponent, DamageChangedEvent>(OnDamageChanged);
|
||||||
SubscribeLocalEvent<BlockingUserComponent, DamageModifyEvent>(OnUserDamageModified);
|
SubscribeLocalEvent<BlockingUserComponent, DamageModifyEvent>(OnUserDamageModified);
|
||||||
|
|
||||||
|
SubscribeLocalEvent<BlockingUserComponent, EntParentChangedMessage>(OnParentChanged);
|
||||||
|
SubscribeLocalEvent<BlockingUserComponent, ContainerGettingInsertedAttemptEvent>(OnInsertAttempt);
|
||||||
SubscribeLocalEvent<BlockingUserComponent, AnchorStateChangedEvent>(OnAnchorChanged);
|
SubscribeLocalEvent<BlockingUserComponent, AnchorStateChangedEvent>(OnAnchorChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnParentChanged(EntityUid uid, BlockingUserComponent component, ref EntParentChangedMessage args)
|
||||||
|
{
|
||||||
|
if (TryComp<BlockingComponent>(component.BlockingItem, out var blockComp) && blockComp.IsBlocking)
|
||||||
|
{
|
||||||
|
_blockingSystem.StopBlocking(component.BlockingItem.Value, blockComp, uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInsertAttempt(EntityUid uid, BlockingUserComponent component, ContainerGettingInsertedAttemptEvent args)
|
||||||
|
{
|
||||||
|
if (TryComp<BlockingComponent>(component.BlockingItem, out var blockComp) && blockComp.IsBlocking)
|
||||||
|
{
|
||||||
|
_blockingSystem.StopBlocking(component.BlockingItem.Value, blockComp, uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void OnAnchorChanged(EntityUid uid, BlockingUserComponent component, ref AnchorStateChangedEvent args)
|
private void OnAnchorChanged(EntityUid uid, BlockingUserComponent component, ref AnchorStateChangedEvent args)
|
||||||
{
|
{
|
||||||
if (!args.Anchored)
|
if (args.Anchored)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (TryComp<BlockingComponent>(component.BlockingItem, out var blockComp) && blockComp.IsBlocking)
|
if (TryComp<BlockingComponent>(component.BlockingItem, out var blockComp) && blockComp.IsBlocking)
|
||||||
|
|||||||
@@ -7,4 +7,4 @@ action-popup-blocking-disabling-user = You lower your {$shield}!
|
|||||||
action-popup-blocking-other = {CAPITALIZE(THE($blockerName))} raises {POSS-ADJ($blockerName)} {$shield}!
|
action-popup-blocking-other = {CAPITALIZE(THE($blockerName))} raises {POSS-ADJ($blockerName)} {$shield}!
|
||||||
action-popup-blocking-disabling-other = {CAPITALIZE(THE($blockerName))} lowers {POSS-ADJ($blockerName)} {$shield}!
|
action-popup-blocking-disabling-other = {CAPITALIZE(THE($blockerName))} lowers {POSS-ADJ($blockerName)} {$shield}!
|
||||||
|
|
||||||
action-popup-blocking-user-cant-block = The gravity here prevents you from blocking.
|
action-popup-blocking-user-cant-block = You tried to raise your shield, but it was no use.
|
||||||
|
|||||||
Reference in New Issue
Block a user