using Content.Shared.Damage.Events; using Content.Shared.Item.ItemToggle; using Content.Shared.Stunnable; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Wieldable.Components; namespace Content.Shared._White.Item.KnockDownOnHit; public sealed class KnockDownOnHitSystem : EntitySystem { [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStaminaHitAttempt); SubscribeLocalEvent(OnHit); } private void OnHit(Entity ent, ref MeleeHitEvent args) { var time = ent.Comp.KnockdownTime; if (time <= TimeSpan.Zero) return; if (ent.Comp.RequireWield) { if (!TryComp(args.Weapon, out var weapon)) return; if (!weapon.Wielded) return; } foreach (var uid in args.HitEntities) { _stun.TryKnockdown(uid, time, true, behavior: ent.Comp.KnockDownBehavior); } } private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) { if (!_itemToggle.IsActivated(entity.Owner)) args.Cancelled = true; } }