2024-07-20 18:28:44 +03:00
|
|
|
using Content.Shared.Inventory;
|
2024-08-03 15:23:46 +00:00
|
|
|
using Content.Shared.Standing;
|
2024-07-20 05:08:01 +03:00
|
|
|
using Content.Shared.Stunnable;
|
|
|
|
|
|
|
|
|
|
namespace Content.Shared._White.BuffedFlashGrenade;
|
|
|
|
|
|
|
|
|
|
public sealed class FlashSoundSuppressionSystem : EntitySystem
|
|
|
|
|
{
|
|
|
|
|
[Dependency] private readonly SharedStunSystem _stunSystem = default!;
|
|
|
|
|
|
2024-07-20 18:28:44 +03:00
|
|
|
public override void Initialize()
|
|
|
|
|
{
|
|
|
|
|
base.Initialize();
|
|
|
|
|
|
|
|
|
|
SubscribeLocalEvent<FlashSoundSuppressionComponent, InventoryRelayedEvent<GetFlashbangedEvent>>(
|
|
|
|
|
OnGetFlashbanged);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnGetFlashbanged(Entity<FlashSoundSuppressionComponent> ent,
|
|
|
|
|
ref InventoryRelayedEvent<GetFlashbangedEvent> args)
|
|
|
|
|
{
|
2024-07-22 17:06:02 +00:00
|
|
|
args.Args.MaxRange = MathF.Min(args.Args.MaxRange, ent.Comp.MaxRange);
|
2024-07-20 18:28:44 +03:00
|
|
|
}
|
|
|
|
|
|
2024-08-01 17:49:56 +00:00
|
|
|
public void Stun(EntityUid target, float stunDuration, float knockdownDuration, float distance, float range)
|
2024-07-20 05:08:01 +03:00
|
|
|
{
|
2024-07-22 17:06:02 +00:00
|
|
|
if (TryComp<FlashSoundSuppressionComponent>(target, out var suppression))
|
|
|
|
|
range = MathF.Min(range, suppression.MaxRange);
|
2024-07-20 05:08:01 +03:00
|
|
|
|
2024-07-20 18:28:44 +03:00
|
|
|
var ev = new GetFlashbangedEvent();
|
2024-07-22 17:06:02 +00:00
|
|
|
ev.MaxRange = range;
|
2024-07-20 18:28:44 +03:00
|
|
|
RaiseLocalEvent(target, ev);
|
2024-07-22 17:06:02 +00:00
|
|
|
range = MathF.Min(range, ev.MaxRange);
|
|
|
|
|
|
|
|
|
|
if (range <= 0f)
|
|
|
|
|
return;
|
|
|
|
|
if (distance < 0f)
|
|
|
|
|
distance = 0f;
|
|
|
|
|
if (distance > range)
|
|
|
|
|
return;
|
|
|
|
|
|
2024-08-03 15:23:46 +00:00
|
|
|
if (TryComp<StandingStateComponent>(target, out var standingState) && standingState.CanLieDown)
|
|
|
|
|
{
|
|
|
|
|
var knockdownTime = float.Lerp(knockdownDuration, 0f, distance / range);
|
|
|
|
|
if (knockdownTime > 0f)
|
|
|
|
|
_stunSystem.TryKnockdown(target, TimeSpan.FromSeconds(knockdownTime), true);
|
|
|
|
|
}
|
2024-07-20 18:28:44 +03:00
|
|
|
|
2024-08-01 17:49:56 +00:00
|
|
|
var stunTime = float.Lerp(stunDuration, 0f, distance / range);
|
|
|
|
|
if (stunTime > 0f)
|
|
|
|
|
_stunSystem.TryStun(target, TimeSpan.FromSeconds(stunTime), true);
|
2024-07-20 05:08:01 +03:00
|
|
|
}
|
|
|
|
|
}
|
2024-07-20 18:28:44 +03:00
|
|
|
|
|
|
|
|
public sealed class GetFlashbangedEvent : EntityEventArgs, IInventoryRelayEvent
|
|
|
|
|
{
|
2024-07-22 17:06:02 +00:00
|
|
|
public float MaxRange = 7f;
|
2024-07-20 18:28:44 +03:00
|
|
|
|
|
|
|
|
public SlotFlags TargetSlots => SlotFlags.EARS | SlotFlags.HEAD;
|
|
|
|
|
}
|