using Content.Server.Chat.Systems; using Content.Server.Lightning; using Content.Server.Popups; using Content.Server._EE.Silicon.Charge; using Content.Shared._EE.Silicon.DeadStartupButton; using Content.Shared.Audio; using Content.Shared.Damage; using Content.Shared.Electrocution; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Random; using Content.Shared.Damage.Components; using Content.Shared.PowerCell; using Content.Shared.Power.EntitySystems; namespace Content.Server._EE.Silicon.DeadStartupButton; public sealed class DeadStartupButtonSystem : SharedDeadStartupButtonSystem { [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly LightningSystem _lightning = default!; [Dependency] private readonly SiliconChargeSystem _siliconChargeSystem = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!; [Dependency] private readonly SharedBatterySystem _battery = default!; /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent(OnElectrocuted); SubscribeLocalEvent(OnMobStateChanged); } private void OnDoAfter(EntityUid uid, DeadStartupButtonComponent comp, OnDoAfterButtonPressedEvent args) { if (args.Handled || args.Cancelled || !TryComp(uid, out var mobStateComponent) || !_mobState.IsDead(uid, mobStateComponent) || !TryComp(uid, out var mobThresholdsComponent) || !TryComp(uid, out var damageable) || !_mobThreshold.TryGetThresholdForState(uid, MobState.Critical, out var criticalThreshold, mobThresholdsComponent)) return; if (damageable.TotalDamage < criticalThreshold) _mobState.ChangeMobState(uid, MobState.Alive, mobStateComponent); else { _audio.PlayPvs(comp.BuzzSound, uid, AudioParams.Default.WithVariation(0.05f)); _popup.PopupEntity(Loc.GetString("dead-startup-system-reboot-failed", ("target", MetaData(uid).EntityName)), uid); Spawn("EffectSparks", Transform(uid).Coordinates); } } private void OnElectrocuted(EntityUid uid, DeadStartupButtonComponent comp, ElectrocutedEvent args) { if (!TryComp(uid, out var mobStateComponent) || !_mobState.IsDead(uid, mobStateComponent) || !_siliconChargeSystem.TryGetSiliconBattery(uid, out var bateria)) return; var charge = _battery.GetCharge(bateria.Value.AsNullable()); if (charge <= 0) return; _lightning.ShootRandomLightnings(uid, 2, 4); _powerCell.TryUseCharge(uid, charge); } private void OnMobStateChanged(EntityUid uid, DeadStartupButtonComponent comp, MobStateChangedEvent args) { if (args.NewMobState != MobState.Alive) return; _popup.PopupEntity(Loc.GetString("dead-startup-system-reboot-success", ("target", MetaData(uid).EntityName)), uid); _audio.PlayPvs(comp.Sound, uid); } }