2023-04-19 05:46:00 +00:00
|
|
|
using Content.Shared.Charges.Components;
|
|
|
|
|
using Content.Shared.Examine;
|
|
|
|
|
|
|
|
|
|
namespace Content.Shared.Charges.Systems;
|
|
|
|
|
|
|
|
|
|
public abstract class SharedChargesSystem : EntitySystem
|
|
|
|
|
{
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
{
|
|
|
|
|
base.Initialize();
|
|
|
|
|
|
|
|
|
|
SubscribeLocalEvent<LimitedChargesComponent, ExaminedEvent>(OnExamine);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void OnExamine(EntityUid uid, LimitedChargesComponent comp, ExaminedEvent args)
|
|
|
|
|
{
|
|
|
|
|
if (!args.IsInDetailsRange)
|
|
|
|
|
return;
|
|
|
|
|
|
2024-01-05 23:53:13 -07:00
|
|
|
using (args.PushGroup(nameof(LimitedChargesComponent)))
|
2023-04-19 05:46:00 +00:00
|
|
|
{
|
2024-01-05 23:53:13 -07:00
|
|
|
args.PushMarkup(Loc.GetString("limited-charges-charges-remaining", ("charges", comp.Charges)));
|
|
|
|
|
if (comp.Charges == comp.MaxCharges)
|
|
|
|
|
{
|
|
|
|
|
args.PushMarkup(Loc.GetString("limited-charges-max-charges"));
|
|
|
|
|
}
|
2023-04-19 05:46:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Tries to add a number of charges. If it over or underflows it will be clamped, wasting the extra charges.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void AddCharges(EntityUid uid, int change, LimitedChargesComponent? comp = null)
|
|
|
|
|
{
|
|
|
|
|
if (!Resolve(uid, ref comp, false))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var old = comp.Charges;
|
|
|
|
|
comp.Charges = Math.Clamp(comp.Charges + change, 0, comp.MaxCharges);
|
|
|
|
|
if (comp.Charges != old)
|
2024-02-13 22:48:39 +01:00
|
|
|
Dirty(uid, comp);
|
2023-04-19 05:46:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the limited charges component and returns true if there are no charges. Will return false if there is no limited charges component.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsEmpty(EntityUid uid, LimitedChargesComponent? comp = null)
|
|
|
|
|
{
|
|
|
|
|
// can't be empty if there are no limited charges
|
|
|
|
|
if (!Resolve(uid, ref comp, false))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return comp.Charges <= 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Uses a single charge. Must check IsEmpty beforehand to prevent using with 0 charge.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public virtual void UseCharge(EntityUid uid, LimitedChargesComponent? comp = null)
|
|
|
|
|
{
|
|
|
|
|
if (Resolve(uid, ref comp, false))
|
|
|
|
|
AddCharges(uid, -1, comp);
|
|
|
|
|
}
|
2024-03-30 23:29:47 -05:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the limited charges component and returns true if the number of charges remaining is less than the specified value.
|
|
|
|
|
/// Will return false if there is no limited charges component.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool HasInsufficientCharges(EntityUid uid, int requiredCharges, LimitedChargesComponent? comp = null)
|
|
|
|
|
{
|
|
|
|
|
// can't be empty if there are no limited charges
|
|
|
|
|
if (!Resolve(uid, ref comp, false))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return comp.Charges < requiredCharges;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Uses up a specified number of charges. Must check HasInsufficentCharges beforehand to prevent using with insufficient remaining charges.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public virtual void UseCharges(EntityUid uid, int chargesUsed, LimitedChargesComponent? comp = null)
|
|
|
|
|
{
|
|
|
|
|
if (Resolve(uid, ref comp, false))
|
|
|
|
|
AddCharges(uid, -chargesUsed, comp);
|
|
|
|
|
}
|
2023-04-19 05:46:00 +00:00
|
|
|
}
|