Files
OldThink/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs
2025-01-05 21:12:53 +03:00

50 lines
1.5 KiB
C#

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<KnockDownOnHitComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<KnockDownOnHitComponent, MeleeHitEvent>(OnHit);
}
private void OnHit(Entity<KnockDownOnHitComponent> ent, ref MeleeHitEvent args)
{
var time = ent.Comp.KnockdownTime;
if (time <= TimeSpan.Zero)
return;
if (ent.Comp.RequireWield)
{
if (!TryComp<WieldableComponent>(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<KnockDownOnHitComponent> entity, ref StaminaDamageOnHitAttemptEvent args)
{
if (!_itemToggle.IsActivated(entity.Owner))
args.Cancelled = true;
}
}