using System.Linq;
using Content.Shared._Shitmed.Targeting;
using Content.Shared.Damage;
using Content.Shared.Mobs.Components;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Map.Components;
using Robust.Shared.Timing;
namespace Content.Shared._Lavaland.Damage;
///
/// We have to use it's own system even for the damage field because WIZDEN SYSTEMS FUCKING SUUUUUUUUUUUCKKKKKKKKKKKKKKK
///
public abstract class SharedDamageSquareSystem : EntitySystem
{
[Dependency] private readonly SharedMapSystem _map = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly DamageableSystem _dmg = default!;
[Dependency] private readonly SharedAudioSystem _aud = default!;
[Dependency] private readonly IGameTiming _timing = default!;
private const float ImmunityFrames = 0.3f;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnMapInit);
}
private void OnMapInit(Entity ent, ref MapInitEvent args)
{
Timer.Spawn((int) ent.Comp.DamageDelay * 1000,
() =>
{
if (!TerminatingOrDeleted(ent))
Damage(ent);
});
}
private void Damage(Entity field)
{
var xform = Transform(field);
if (xform.GridUid == null)
return;
var grid = xform.GridUid.Value;
var tile = _map.GetTileRef(grid, Comp(grid), xform.Coordinates);
var lookup = _lookup.GetLocalEntitiesIntersecting(tile, 0f, LookupFlags.Uncontained)
.Where(HasComp)
.ToList();
foreach (var entity in lookup)
{
if (!TryComp(entity, out var dmg))
continue;
if (TryComp(entity, out var immunity))
{
if (immunity.HasImmunityUntil > _timing.CurTime || immunity.IsImmune)
continue;
RemComp(entity, immunity);
}
// Damage
_dmg.TryChangeDamage(entity, field.Comp.Damage, damageable: dmg, targetPart: TargetBodyPart.Torso);
// Sound
if (field.Comp.Sound != null)
_aud.PlayEntity(field.Comp.Sound, entity, entity, AudioParams.Default.WithVolume(-3f));
// Immunity frames
EnsureComp(entity).HasImmunityUntil = _timing.CurTime + TimeSpan.FromSeconds(ImmunityFrames);
}
RemComp(field, field.Comp);
}
}