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.Power.EntitySystems; namespace Content.Shared.Stunnable; public sealed partial class StunbatonSystem : EntitySystem { [Dependency] private SharedBatterySystem _battery = default!; [Dependency] private ItemToggleSystem _itemToggle = default!; [Dependency] private SharedPopupSystem _popup = default!; /// /// Handle stamina damage application. /// Make sure the stunbaton is active and there's enough battery juice. /// [SubscribeLocalEvent] private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) { if (_itemToggle.IsActivated(entity.Owner) && _battery.TryUseCharge(entity.Owner, entity.Comp.EnergyPerUse)) return; args.Cancelled = true; } /// /// Communicate the stunbaton's status and number of remaining uses. /// [SubscribeLocalEvent] 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, out var battery)) return; var count = _battery.GetRemainingUses((entity, battery), entity.Comp.EnergyPerUse); args.PushMarkup(Loc.GetString("melee-battery-examine", ("color", "yellow"), ("count", count))); } /// /// Handle activation attempt. /// Make sure there's at least left in the battery. /// [SubscribeLocalEvent] private void TryTurnOn(Entity entity, ref ItemToggleActivateAttemptEvent args) { if (_battery.GetCharge(entity.Owner) >= entity.Comp.EnergyPerUse) return; args.Cancelled = true; if (args.User != null) _popup.PopupEntity(Loc.GetString("stunbaton-component-low-charge"), args.User.Value); } /// /// Turns off the stunbaton when battery level drops below . /// [SubscribeLocalEvent] private void OnChargeChanged(Entity entity, ref ChargeChangedEvent args) { if (_battery.GetCharge(entity.Owner) >= entity.Comp.EnergyPerUse) return; _itemToggle.TryDeactivate(entity.Owner); } }