Files
OldThink/Content.Shared/_White/BuffedFlashGrenade/FlashSoundSuppressionSystem.cs
Aviu00 d4525a91e6 Fixes & more (#548)
* - fix: Narsie not spawning, items not dropping on paralyze, cult tweaks.

* - fix: Diagonal grilles layer.

* - add: Cockroaches don't drop organs.

* - add: Magic hands now work on interact & disable context menu interaction.

* - fix: Shackles speech after doafter.

* - tweak: Reduce flashbang knockdown, check for CanLieDown.

* - tweak: Hspear limit.

* - tweak: Remove knockdown tile friction.

* - tweak: Engi belt in sus box.

* - fix: Constructs can hear cult chat.

* - fix: Desword audio.

* - fix: Context menu.

* - fix: Actually drop items on paralyze.

* - tweak: Revert range reduction.

* - add: Update thermal visibility.

* - add: NPCs can miss.

* - tweak: Update desc.

* - fix: Actually fix desword audio.

* - tweak: Secret weights & game presets.

* - fix: Cult stun.
2024-08-03 18:23:46 +03:00

61 lines
2.0 KiB
C#

using Content.Shared.Inventory;
using Content.Shared.Standing;
using Content.Shared.Stunnable;
namespace Content.Shared._White.BuffedFlashGrenade;
public sealed class FlashSoundSuppressionSystem : EntitySystem
{
[Dependency] private readonly SharedStunSystem _stunSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FlashSoundSuppressionComponent, InventoryRelayedEvent<GetFlashbangedEvent>>(
OnGetFlashbanged);
}
private void OnGetFlashbanged(Entity<FlashSoundSuppressionComponent> ent,
ref InventoryRelayedEvent<GetFlashbangedEvent> args)
{
args.Args.MaxRange = MathF.Min(args.Args.MaxRange, ent.Comp.MaxRange);
}
public void Stun(EntityUid target, float stunDuration, float knockdownDuration, float distance, float range)
{
if (TryComp<FlashSoundSuppressionComponent>(target, out var suppression))
range = MathF.Min(range, suppression.MaxRange);
var ev = new GetFlashbangedEvent();
ev.MaxRange = range;
RaiseLocalEvent(target, ev);
range = MathF.Min(range, ev.MaxRange);
if (range <= 0f)
return;
if (distance < 0f)
distance = 0f;
if (distance > range)
return;
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);
}
var stunTime = float.Lerp(stunDuration, 0f, distance / range);
if (stunTime > 0f)
_stunSystem.TryStun(target, TimeSpan.FromSeconds(stunTime), true);
}
}
public sealed class GetFlashbangedEvent : EntityEventArgs, IInventoryRelayEvent
{
public float MaxRange = 7f;
public SlotFlags TargetSlots => SlotFlags.EARS | SlotFlags.HEAD;
}