using Content.Shared.ActionBlocker; using Content.Shared.Emoting; using Content.Shared.Interaction.Events; using Content.Shared.Item; using Content.Shared.Movement.Events; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Speech; using Content.Shared.Throwing; namespace Content.Shared.Administration; // TODO deduplicate with BlockMovementComponent public sealed class AdminFrozenSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly PullingSystem _pulling = default!; public override void Initialize() { SubscribeLocalEvent(OnAttempt); SubscribeLocalEvent(OnAttempt); SubscribeLocalEvent(OnAttempt); SubscribeLocalEvent(OnInteractAttempt); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(UpdateCanMove); SubscribeLocalEvent(OnUpdateCanMove); SubscribeLocalEvent(OnPullAttempt); SubscribeLocalEvent(OnAttempt); SubscribeLocalEvent(OnAttempt); SubscribeLocalEvent(OnEmoteAttempt); SubscribeLocalEvent(OnSpeakAttempt); } /// /// Freezes and mutes the given entity. /// public void FreezeAndMute(EntityUid uid) { var comp = EnsureComp(uid); comp.Muted = true; Dirty(uid, comp); } private void OnInteractAttempt(Entity ent, ref InteractionAttemptEvent args) { args.Cancelled = true; } private void OnSpeakAttempt(EntityUid uid, AdminFrozenComponent component, SpeakAttemptEvent args) { if (!component.Muted) return; args.Cancel(); } private void OnAttempt(EntityUid uid, AdminFrozenComponent component, CancellableEntityEventArgs args) { args.Cancel(); } private void OnPullAttempt(EntityUid uid, AdminFrozenComponent component, PullAttemptEvent args) { args.Cancelled = true; } private void OnStartup(EntityUid uid, AdminFrozenComponent component, ComponentStartup args) { if (TryComp(uid, out var pullable)) { _pulling.TryStopPull(uid, pullable); } UpdateCanMove(uid, component, args); } private void OnUpdateCanMove(EntityUid uid, AdminFrozenComponent component, UpdateCanMoveEvent args) { if (component.LifeStage > ComponentLifeStage.Running) return; args.Cancel(); } private void UpdateCanMove(EntityUid uid, AdminFrozenComponent component, EntityEventArgs args) { _blocker.UpdateCanMove(uid); } private void OnEmoteAttempt(EntityUid uid, AdminFrozenComponent component, EmoteAttemptEvent args) { if (component.Muted) args.Cancel(); } }