// Curently every single flashlight has the same number of levels for status and that's all it uses the charge for
// Thus we'll just check if the level changes.
- if (!_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery))
+ if (!_powerCell.TryGetBatteryFromSlotOrEntity(ent.Owner, out var battery))
return null;
var currentCharge = _battery.GetCharge(battery.Value.AsNullable());
return false;
}
- if (!_powerCell.TryGetBatteryFromSlot(uid.Owner, out var battery))
+ if (!_powerCell.TryGetBatteryFromSlotOrEntity(uid.Owner, out var battery))
{
_audio.PlayPvs(_audio.ResolveSound(component.TurnOnFailSound), uid);
_popup.PopupEntity(Loc.GetString("handheld-light-component-cell-missing-message"), uid, user);
public void TryUpdate(Entity<HandheldLightComponent> uid, float frameTime)
{
var component = uid.Comp;
- if (!_powerCell.TryGetBatteryFromSlot(uid.Owner, out var battery))
+ if (!_powerCell.TryGetBatteryFromSlotOrEntity(uid.Owner, out var battery))
{
TurnOff(uid, false);
return;
// add how much each item is charged it
foreach (var contained in container.ContainedEntities)
{
- if (!SearchForBattery(contained, out var battery))
+ if (!_powerCell.TryGetBatteryFromEntityOrSlot(contained, out var battery))
continue;
var chargePercentage = _battery.GetCharge(battery.Value.AsNullable()) / battery.Value.Comp.MaxCharge * 100;
return;
AddComp<InsideChargerComponent>(args.Entity);
- if (SearchForBattery(args.Entity, out var battery))
+ if (_powerCell.TryGetBatteryFromEntityOrSlot(args.Entity, out var battery))
_battery.RefreshChargeRate(battery.Value.AsNullable());
UpdateStatus(ent);
}
return;
RemComp<InsideChargerComponent>(args.Entity);
- if (SearchForBattery(args.Entity, out var battery))
+ if (_powerCell.TryGetBatteryFromEntityOrSlot(args.Entity, out var battery))
_battery.RefreshChargeRate(battery.Value.AsNullable());
UpdateStatus(ent);
}
UpdateStatus((chargerUid, chargerComp));
}
- private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out Entity<PredictedBatteryComponent>? battery)
- {
- // try get a battery directly on the inserted entity
- if (TryComp<PredictedBatteryComponent>(uid, out var batteryComp))
- {
- battery = (uid, batteryComp);
- return true;
- }
- // or by checking for a power cell slot on the inserted entity
- if (_powerCell.TryGetBatteryFromSlot(uid, out battery))
- return true;
-
- battery = null;
- return false;
- }
-
private void RefreshAllBatteries(Entity<ChargerComponent> ent)
{
// try to get contents of the charger
foreach (var item in container.ContainedEntities)
{
- if (SearchForBattery(item, out var battery))
+ if (_powerCell.TryGetBatteryFromEntityOrSlot(item, out var battery))
_battery.RefreshChargeRate(battery.Value.AsNullable());
}
}
return CellChargerStatus.Empty;
// Use the first stored battery for visuals. If someone ever makes a multi-slot charger then this will need to be changed.
- if (!SearchForBattery(container.ContainedEntities[0], out var battery))
+ if (!_powerCell.TryGetBatteryFromEntityOrSlot(container.ContainedEntities[0], out var battery))
return CellChargerStatus.Off;
if (_battery.IsFull(battery.Value.AsNullable()))
return true;
}
+ /// <summary>
+ /// First tries to get a battery from the entity's power cell slot.
+ /// If that fails check if the entity itself is a battery with <see cref="PredictedBatteryComponent"/>.
+ /// </summary>
+ [PublicAPI]
+ public bool TryGetBatteryFromSlotOrEntity(Entity<PowerCellSlotComponent?> ent, [NotNullWhen(true)] out Entity<PredictedBatteryComponent>? battery)
+ {
+ if (TryGetBatteryFromSlot(ent, out battery))
+ return true;
+
+ if (TryComp<PredictedBatteryComponent>(ent, out var batteryComp))
+ {
+ battery = (ent.Owner, batteryComp);
+ return true;
+ }
+
+ battery = null;
+ return false;
+ }
+
+ /// <summary>
+ /// First checks if the entity itself is a battery with <see cref="PredictedBatteryComponent"/>.
+ /// If that fails it will try to get a battery from the entity's power cell slot instead.
+ /// </summary>
+ [PublicAPI]
+ public bool TryGetBatteryFromEntityOrSlot(Entity<PowerCellSlotComponent?> ent, [NotNullWhen(true)] out Entity<PredictedBatteryComponent>? battery)
+ {
+ if (TryComp<PredictedBatteryComponent>(ent, out var batteryComp))
+ {
+ battery = (ent.Owner, batteryComp);
+ return true;
+ }
+ if (TryGetBatteryFromSlot(ent, out battery))
+ return true;
+
+ battery = null;
+ return false;
+ }
+
/// <summary>
/// Returns whether the entity has a slotted battery and charge for the requested action.
/// </summary>