Files
ss14-wega/Content.Shared/Interaction/SharedInteractionSystem.Blocking.cs
Princess Cheeseballs eb41d5010b Physics Assert in SharedMoverController (#37970)
* Physics asserts and Xenoarch fixes

* Fix blocking asserts

* Alright ready for the test fails

* Fix whitespace issues

* Fix whitespace

* Okay fix whitespace issues for real

* Fix test fails

* Temp fix

* Fix

* Whitespace

* Added a big ass comment

* Right

* A

* Should work

* Debug performance

* Mothership

* fix test fails real

* push

* fix

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
2025-12-22 02:42:39 +00:00

73 lines
2.6 KiB
C#

using Content.Shared.Hands;
using Content.Shared.Interaction.Components;
using Content.Shared.Interaction.Events;
using Content.Shared.Item;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Events;
namespace Content.Shared.Interaction;
// TODO deduplicate with AdminFrozenComponent
/// <summary>
/// Handles <see cref="BlockMovementComponent"/>, which prevents various
/// kinds of movement and interactions when attached to an entity.
/// </summary>
public partial class SharedInteractionSystem
{
private void InitializeBlocking()
{
SubscribeLocalEvent<BlockMovementComponent, UpdateCanMoveEvent>(OnMoveAttempt);
SubscribeLocalEvent<BlockMovementComponent, UseAttemptEvent>(CancelUseEvent);
SubscribeLocalEvent<BlockMovementComponent, InteractionAttemptEvent>(CancelInteractEvent);
SubscribeLocalEvent<BlockMovementComponent, DropAttemptEvent>(CancellableInteractEvent);
SubscribeLocalEvent<BlockMovementComponent, PickupAttemptEvent>(CancellableInteractEvent);
SubscribeLocalEvent<BlockMovementComponent, ChangeDirectionAttemptEvent>(CancelEvent);
SubscribeLocalEvent<BlockMovementComponent, ComponentStartup>(OnBlockingStartup);
SubscribeLocalEvent<BlockMovementComponent, ComponentShutdown>(OnBlockingShutdown);
}
private void CancelInteractEvent(Entity<BlockMovementComponent> ent, ref InteractionAttemptEvent args)
{
if (ent.Comp.BlockInteraction)
args.Cancelled = true;
}
private void CancelUseEvent(Entity<BlockMovementComponent> ent, ref UseAttemptEvent args)
{
if (ent.Comp.BlockUse)
args.Cancel();
}
private void OnMoveAttempt(EntityUid uid, BlockMovementComponent component, UpdateCanMoveEvent args)
{
// If we're relaying then don't cancel.
if (HasComp<RelayInputMoverComponent>(uid))
return;
args.Cancel(); // no more scurrying around
}
private void CancellableInteractEvent(EntityUid uid, BlockMovementComponent component, CancellableEntityEventArgs args)
{
if (component.BlockInteraction)
args.Cancel();
}
private void CancelEvent(EntityUid uid, BlockMovementComponent component, CancellableEntityEventArgs args)
{
args.Cancel();
}
private void OnBlockingStartup(EntityUid uid, BlockMovementComponent component, ComponentStartup args)
{
_actionBlockerSystem.UpdateCanMove(uid);
}
private void OnBlockingShutdown(EntityUid uid, BlockMovementComponent component, ComponentShutdown args)
{
_actionBlockerSystem.UpdateCanMove(uid);
}
}