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);
}
}