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;
using Content.Shared.Silicons.Borgs.Components;
namespace Content.Shared.Interaction;
// TODO deduplicate with AdminFrozenComponent
///
/// Handles , which prevents various
/// kinds of movement and interactions when attached to an entity.
///
public partial class SharedInteractionSystem
{
private void InitializeBlocking()
{
SubscribeLocalEvent(OnMoveAttempt);
SubscribeLocalEvent(CancelEvent);
SubscribeLocalEvent(CancelInteractEvent);
SubscribeLocalEvent(CancelEvent);
SubscribeLocalEvent(CancelEvent);
SubscribeLocalEvent(CancelEvent);
SubscribeLocalEvent(OnBlockingStartup);
SubscribeLocalEvent(OnBlockingShutdown);
}
private void CancelInteractEvent(Entity ent, ref InteractionAttemptEvent args)
{
// StarHorizon start
if (!ent.Comp.BlockInteraction)
return;
// Фикс бага с взаимодействием мозга
if (args.Target != null && HasComp(args.Target.Value))
{
// Если цель - борг, то разрешаем взаимодействие
// Это позволит взаимодействовать с боргом - позже в цепочке вызовов проверяется, что игрок держит мозг
return;
}
args.Cancelled = true;
// StarHorizon end
}
private void OnMoveAttempt(EntityUid uid, BlockMovementComponent component, UpdateCanMoveEvent args)
{
// If we're relaying then don't cancel.
if (HasComp(uid))
return;
args.Cancel(); // no more scurrying around
}
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);
}
}