using Content.Server.Power.Components; using Content.Shared.Silicon.Systems; using Content.Shared.Bed.Sleep; using Content.Server.Silicon.Charge; using Content.Server.Humanoid; using Content.Shared.Humanoid; namespace Content.Server.Silicon.Death; public sealed class SiliconDeathSystem : EntitySystem { [Dependency] private readonly SleepingSystem _sleep = default!; [Dependency] private readonly SiliconChargeSystem _silicon = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearanceSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnSiliconChargeStateUpdate); } private void OnSiliconChargeStateUpdate(EntityUid uid, SiliconDownOnDeadComponent siliconDeadComp, SiliconChargeStateUpdateEvent args) { if (!_silicon.TryGetSiliconBattery(uid, out var batteryComp)) { SiliconDead(uid, siliconDeadComp, null, uid); return; } if (args.ChargePercent == 0 && siliconDeadComp.Dead) return; if (args.ChargePercent == 0 && !siliconDeadComp.Dead) SiliconDead(uid, siliconDeadComp, batteryComp, uid); else if (args.ChargePercent != 0 && siliconDeadComp.Dead) SiliconUnDead(uid, siliconDeadComp, batteryComp, uid); } private void SiliconDead(EntityUid uid, SiliconDownOnDeadComponent siliconDeadComp, BatteryComponent? batteryComp, EntityUid batteryUid) { var deadEvent = new SiliconChargeDyingEvent(uid, batteryComp, batteryUid); RaiseLocalEvent(uid, deadEvent); if (deadEvent.Cancelled) return; EntityManager.EnsureComponent(uid); EntityManager.EnsureComponent(uid); if (TryComp(uid, out var humanoidAppearanceComponent)) { // Handle humanoid appearance if needed } siliconDeadComp.Dead = true; RaiseLocalEvent(uid, new SiliconChargeDeathEvent(uid, batteryComp, batteryUid)); } private void SiliconUnDead(EntityUid uid, SiliconDownOnDeadComponent siliconDeadComp, BatteryComponent? batteryComp, EntityUid batteryUid) { RemComp(uid); _sleep.TryWaking(uid, true); siliconDeadComp.Dead = false; RaiseLocalEvent(uid, new SiliconChargeAliveEvent(uid, batteryComp, batteryUid)); } } /// /// A cancellable event raised when a Silicon is about to go down due to charge. /// /// /// This probably shouldn't be modified unless you intend to fill the Silicon's battery, /// as otherwise it'll just be triggered again next frame. /// public sealed class SiliconChargeDyingEvent : CancellableEntityEventArgs { public EntityUid SiliconUid { get; } public BatteryComponent? BatteryComp { get; } public EntityUid BatteryUid { get; } public SiliconChargeDyingEvent(EntityUid siliconUid, BatteryComponent? batteryComp, EntityUid batteryUid) { SiliconUid = siliconUid; BatteryComp = batteryComp; BatteryUid = batteryUid; } } /// /// An event raised after a Silicon has gone down due to charge. /// public sealed class SiliconChargeDeathEvent : EntityEventArgs { public EntityUid SiliconUid { get; } public BatteryComponent? BatteryComp { get; } public EntityUid BatteryUid { get; } public SiliconChargeDeathEvent(EntityUid siliconUid, BatteryComponent? batteryComp, EntityUid batteryUid) { SiliconUid = siliconUid; BatteryComp = batteryComp; BatteryUid = batteryUid; } } /// /// An event raised after a Silicon has reawoken due to an increase in charge. /// public sealed class SiliconChargeAliveEvent : EntityEventArgs { public EntityUid SiliconUid { get; } public BatteryComponent? BatteryComp { get; } public EntityUid BatteryUid { get; } public SiliconChargeAliveEvent(EntityUid siliconUid, BatteryComponent? batteryComp, EntityUid batteryUid) { SiliconUid = siliconUid; BatteryComp = batteryComp; BatteryUid = batteryUid; } }