55 lines
1.8 KiB
C#
55 lines
1.8 KiB
C#
using Content.Shared.Bed;
|
|
using Content.Shared.Bed.Components;
|
|
using Content.Shared.Bed.Sleep;
|
|
using Content.Shared.Buckle.Components;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.Mobs.Systems;
|
|
|
|
namespace Content.Server.Bed
|
|
{
|
|
public sealed class BedSystem : SharedBedSystem
|
|
{
|
|
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
|
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
|
|
|
|
private EntityQuery<SleepingComponent> _sleepingQuery;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
_sleepingQuery = GetEntityQuery<SleepingComponent>();
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
var query = EntityQueryEnumerator<HealOnBuckleHealingComponent, HealOnBuckleComponent, StrapComponent>();
|
|
while (query.MoveNext(out var uid, out _, out var bedComponent, out var strapComponent))
|
|
{
|
|
if (Timing.CurTime < bedComponent.NextHealTime)
|
|
continue;
|
|
|
|
bedComponent.NextHealTime += TimeSpan.FromSeconds(bedComponent.HealTime);
|
|
|
|
if (strapComponent.BuckledEntities.Count == 0)
|
|
continue;
|
|
|
|
foreach (var healedEntity in strapComponent.BuckledEntities)
|
|
{
|
|
if (_mobStateSystem.IsDead(healedEntity))
|
|
continue;
|
|
|
|
var damage = bedComponent.Damage;
|
|
|
|
if (_sleepingQuery.HasComp(healedEntity))
|
|
damage *= bedComponent.SleepMultiplier;
|
|
|
|
_damageableSystem.TryChangeDamage(healedEntity, damage, true, origin: uid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|