Fix helmet lights (#41599)

fix helmet lights
This commit is contained in:
slarticodefast 2025-11-27 17:01:13 +01:00 committed by BarryNorfolk
parent f2d31a3d31
commit 525ffdc8f5
4 changed files with 88 additions and 53 deletions

View File

@ -108,7 +108,7 @@ namespace Content.Server.Light.EntitySystems
// 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());
@ -203,7 +203,7 @@ namespace Content.Server.Light.EntitySystems
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);
@ -230,7 +230,7 @@ namespace Content.Server.Light.EntitySystems
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;

View File

@ -15,6 +15,7 @@ using Robust.Shared.Containers;
using Content.Server._EE.Power.Components;
using Content.Server._EE.Silicon;
using Content.Shared.Power.EntitySystems;
using Content.Shared.PowerCell;
namespace Content.Server._EE.Power;
@ -24,7 +25,7 @@ public sealed class BatteryDrinkerSystem : EntitySystem
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly PredictedBatterySystem _battery = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly ChargerSystem _chargers = default!; // DeltaV - people with augment power cells can drink batteries
[Dependency] private readonly PowerCellSystem _powerCell = default!; // DeltaV - people with augment power cells can drink batteries
public override void Initialize()
{
@ -43,7 +44,7 @@ public sealed class BatteryDrinkerSystem : EntitySystem
if (!TryComp<BatteryDrinkerComponent>(args.User, out var drinkerComp) ||
!TestDrinkableBattery(uid, drinkerComp) ||
// DeltaV - people with augment power cells can drink batteries
!_chargers.SearchForBattery(args.User, out _))
!_powerCell.TryGetBatteryFromEntityOrSlot(args.User, out _))
return;
AlternativeVerb verb = new()
@ -96,7 +97,7 @@ public sealed class BatteryDrinkerSystem : EntitySystem
var sourceBattery = Comp<BatteryComponent>(source);
// Begin DeltaV - people with augment power cells can drink batteries
if (!_chargers.SearchForBattery(drinker, out var battery))
if (!_powerCell.TryGetBatteryFromEntityOrSlot(drinker, out var battery))
return;
TryComp<BatteryDrinkerSourceComponent>(source, out var sourceComp);

View File

@ -68,7 +68,7 @@ public sealed class ChargerSystem : EntitySystem
// 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;
@ -93,7 +93,7 @@ public sealed class ChargerSystem : EntitySystem
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);
}
@ -107,7 +107,7 @@ public sealed class ChargerSystem : EntitySystem
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);
}
@ -187,31 +187,6 @@ public sealed class ChargerSystem : EntitySystem
UpdateStatus((chargerUid, chargerComp));
}
// Start DeltaV - event-based search for battery
public 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;
var evt = new SearchForBatteryEvent();
RaiseLocalEvent(uid, ref evt);
if (evt.Handled && evt.Uid.HasValue)
{
battery = (evt.Uid.Value, evt.Component!);
return true;
}
battery = null;
return false;
}
// End DeltaV - event-based search for battery
private void RefreshAllBatteries(Entity<ChargerComponent> ent)
{
// try to get contents of the charger
@ -220,7 +195,7 @@ public sealed class ChargerSystem : EntitySystem
foreach (var item in container.ContainedEntities)
{
if (SearchForBattery(item, out var battery))
if (_powerCell.TryGetBatteryFromEntityOrSlot(item, out var battery))
_battery.RefreshChargeRate(battery.Value.AsNullable());
}
}
@ -268,7 +243,7 @@ public sealed class ChargerSystem : EntitySystem
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()))
@ -277,20 +252,3 @@ public sealed class ChargerSystem : EntitySystem
return CellChargerStatus.Charging;
}
}
// Begin DeltaV - event-based search for battery
/// <summary>
/// Event raised to search for batteries within an entity
/// </summary>
[ByRefEvent]
public struct SearchForBatteryEvent
{
public EntityUid? Uid;
public PredictedBatteryComponent? Component;
public bool Handled;
}
// End DeltaV - event-based search for battery

View File

@ -38,6 +38,65 @@ public sealed partial class PowerCellSystem
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;
}
// Begin DeltaV additions - event-based search for battery
var evt = new SearchForBatteryEvent();
RaiseLocalEvent(ent, ref evt);
if (evt.Handled && evt.Uid.HasValue)
{
battery = (evt.Uid.Value, evt.Component!);
return true;
}
// End DeltaV additions - event-based search for battery
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;
// Begin DeltaV additions - event-based search for battery
var evt = new SearchForBatteryEvent();
RaiseLocalEvent(ent, ref evt);
if (evt.Handled && evt.Uid.HasValue)
{
battery = (evt.Uid.Value, evt.Component!);
return true;
}
// End DeltaV additions - event-based search for battery
battery = null;
return false;
}
/// <summary>
/// Returns whether the entity has a slotted battery and charge for the requested action.
/// </summary>
@ -143,3 +202,20 @@ public sealed partial class PowerCellSystem
return _battery.GetMaxUses(battery.Value.AsNullable(), cost);
}
}
// Begin DeltaV - event-based search for battery
/// <summary>
/// Event raised to search for batteries within an entity
/// </summary>
[ByRefEvent]
public struct SearchForBatteryEvent
{
public EntityUid? Uid;
public PredictedBatteryComponent? Component;
public bool Handled;
}
// End DeltaV - event-based search for battery