Files
tbd-station-14/Content.Shared/Damage/Systems/DamageContactsSystem.cs
Nemanja c4a92fdfa3 Meat Anomaly Tweaks (#14026)
* Meat Anomaly Tweaks

* 50%
2023-02-12 20:17:54 +00:00

73 lines
2.3 KiB
C#

using Content.Shared.Damage.Components;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Events;
using Robust.Shared.Physics.Systems;
using Robust.Shared.Timing;
namespace Content.Shared.Damage.Systems;
public sealed class DamageContactsSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DamageContactsComponent, StartCollideEvent>(OnEntityEnter);
SubscribeLocalEvent<DamageContactsComponent, EndCollideEvent>(OnEntityExit);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
foreach (var damaged in EntityQuery<DamagedByContactComponent>())
{
var ent = damaged.Owner;
if (_timing.CurTime < damaged.NextSecond)
continue;
damaged.NextSecond = _timing.CurTime + TimeSpan.FromSeconds(1);
if (damaged.Damage != null)
_damageable.TryChangeDamage(ent, damaged.Damage, interruptsDoAfters: false);
}
}
private void OnEntityExit(EntityUid uid, DamageContactsComponent component, ref EndCollideEvent args)
{
var otherUid = args.OtherFixture.Body.Owner;
if (!TryComp<PhysicsComponent>(uid, out var body))
return;
var damageQuery = GetEntityQuery<DamageContactsComponent>();
foreach (var contact in _physics.GetContactingEntities(body))
{
var ent = contact.Owner;
if (ent == uid)
continue;
if (damageQuery.HasComponent(ent))
return;
}
RemComp<DamagedByContactComponent>(otherUid);
}
private void OnEntityEnter(EntityUid uid, DamageContactsComponent component, ref StartCollideEvent args)
{
var otherUid = args.OtherFixture.Body.Owner;
if (HasComp<DamagedByContactComponent>(otherUid))
return;
if (component.IgnoreWhitelist?.IsValid(otherUid) ?? false)
return;
var damagedByContact = EnsureComp<DamagedByContactComponent>(otherUid);
damagedByContact.Damage = component.Damage;
}
}