#nullable enable using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects; using Content.Server.Utility; using Content.Shared.Alert; using Content.Shared.Audio; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Mobs.State; using Content.Shared.GameObjects.Components.Movement; using Content.Shared.GameObjects.EntitySystems.ActionBlocker; using Content.Shared.GameObjects.EntitySystems.EffectBlocker; using Content.Shared.Interfaces; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Players; using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Server.GameObjects.Components.Mobs { [RegisterComponent] [ComponentReference(typeof(SharedStunnableComponent))] public class StunnableComponent : SharedStunnableComponent, IDisarmedAct { [Dependency] private readonly IGameTiming _gameTiming = default!; protected override void OnKnockdown() { EntitySystem.Get().Down(Owner); } protected override void OnKnockdownEnd() { if(Owner.TryGetComponent(out IMobStateComponent? mobState) && !mobState.IsIncapacitated()) EntitySystem.Get().Standing(Owner); } public void CancelAll() { KnockdownTimer = null; StunnedTimer = null; Dirty(); } public void ResetStuns() { StunnedTimer = null; SlowdownTimer = null; if (KnockedDown && Owner.TryGetComponent(out IMobStateComponent? mobState) && !mobState.IsIncapacitated()) { EntitySystem.Get().Standing(Owner); } KnockdownTimer = null; Dirty(); } protected override void OnInteractHand() { EntitySystem.Get() .PlayFromEntity("/Audio/Effects/thudswoosh.ogg", Owner, AudioHelpers.WithVariation(0.05f)); } bool IDisarmedAct.Disarmed(DisarmedActEventArgs eventArgs) { if (!IoCManager.Resolve().Prob(eventArgs.PushProbability)) return false; Paralyze(4f); var source = eventArgs.Source; EntitySystem.Get().PlayFromEntity("/Audio/Effects/thudswoosh.ogg", source, AudioHelpers.WithVariation(0.025f)); source.PopupMessageOtherClients(Loc.GetString("{0} pushes {1}!", source.Name, eventArgs.Target.Name)); source.PopupMessageCursor(Loc.GetString("You push {0}!", eventArgs.Target.Name)); return true; } } }