using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Power.Events; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Damage.Events; using Content.Shared.Examine; using Content.Shared.Item.ItemToggle; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Popups; using Content.Shared.Power; using Content.Shared.Power.Components; using Content.Shared.Stunnable; namespace Content.Server.Stunnable.Systems { public sealed class StunbatonSystem : SharedStunbatonSystem { [Dependency] private readonly RiggableSystem _riggableSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly ItemToggleSystem _itemToggle = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnSolutionChange); SubscribeLocalEvent(OnStaminaHitAttempt); SubscribeLocalEvent(OnChargeChanged); } private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) { if (!_itemToggle.IsActivated(entity.Owner) || !TryComp(entity.Owner, out var battery) || !_battery.TryUseCharge(entity.Owner, entity.Comp.EnergyPerUse, battery)) { args.Cancelled = true; } } private void OnExamined(Entity entity, ref ExaminedEvent args) { var onMsg = _itemToggle.IsActivated(entity.Owner) ? Loc.GetString("comp-stunbaton-examined-on") : Loc.GetString("comp-stunbaton-examined-off"); args.PushMarkup(onMsg); if (TryComp(entity.Owner, out var battery)) { var count = (int) (battery.CurrentCharge / entity.Comp.EnergyPerUse); args.PushMarkup(Loc.GetString("melee-battery-examine", ("color", "yellow"), ("count", count))); } } protected override void TryTurnOn(Entity entity, ref ItemToggleActivateAttemptEvent args) { base.TryTurnOn(entity, ref args); if (!TryComp(entity, out var battery) || battery.CurrentCharge < entity.Comp.EnergyPerUse) { args.Cancelled = true; if (args.User != null) { _popup.PopupEntity(Loc.GetString("stunbaton-component-low-charge"), (EntityUid) args.User, (EntityUid) args.User); } return; } if (TryComp(entity, out var rig) && rig.IsRigged) { _riggableSystem.Explode(entity.Owner, battery, args.User); } } // https://github.com/space-wizards/space-station-14/pull/17288#discussion_r1241213341 private void OnSolutionChange(Entity entity, ref SolutionContainerChangedEvent args) { // Explode if baton is activated and rigged. if (!TryComp(entity, out var riggable) || !TryComp(entity, out var battery)) return; if (_itemToggle.IsActivated(entity.Owner) && riggable.IsRigged) _riggableSystem.Explode(entity.Owner, battery); } private void SendPowerPulse(EntityUid target, EntityUid? user, EntityUid used) { RaiseLocalEvent(target, new PowerPulseEvent() { Used = used, User = user }); } private void OnChargeChanged(Entity entity, ref ChargeChangedEvent args) { if (TryComp(entity.Owner, out var battery) && battery.CurrentCharge < entity.Comp.EnergyPerUse) { _itemToggle.TryDeactivate(entity.Owner, predicted: false); } } } }