diff --git a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs index a7f5801f32..52b6614790 100644 --- a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs +++ b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs @@ -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 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; diff --git a/Content.Server/_EE/Power/Systems/BatteryDrinkerSystem.cs b/Content.Server/_EE/Power/Systems/BatteryDrinkerSystem.cs index 572f842fbd..232b8d4cb5 100644 --- a/Content.Server/_EE/Power/Systems/BatteryDrinkerSystem.cs +++ b/Content.Server/_EE/Power/Systems/BatteryDrinkerSystem.cs @@ -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(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(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(source, out var sourceComp); diff --git a/Content.Shared/Power/EntitySystems/ChargerSystem.cs b/Content.Shared/Power/EntitySystems/ChargerSystem.cs index 813dc841b1..d22e45bf29 100644 --- a/Content.Shared/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Shared/Power/EntitySystems/ChargerSystem.cs @@ -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(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(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? battery) - { - // try get a battery directly on the inserted entity - if (TryComp(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 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 - -/// -/// Event raised to search for batteries within an entity -/// -[ByRefEvent] -public struct SearchForBatteryEvent -{ - public EntityUid? Uid; - - public PredictedBatteryComponent? Component; - - public bool Handled; -} - -// End DeltaV - event-based search for battery diff --git a/Content.Shared/PowerCell/PowerCellSystem.API.cs b/Content.Shared/PowerCell/PowerCellSystem.API.cs index 98b24edcce..6739d36120 100644 --- a/Content.Shared/PowerCell/PowerCellSystem.API.cs +++ b/Content.Shared/PowerCell/PowerCellSystem.API.cs @@ -38,6 +38,65 @@ public sealed partial class PowerCellSystem return true; } + /// + /// 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 . + /// + [PublicAPI] + public bool TryGetBatteryFromSlotOrEntity(Entity ent, [NotNullWhen(true)] out Entity? battery) + { + if (TryGetBatteryFromSlot(ent, out battery)) + return true; + + if (TryComp(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; + } + + /// + /// First checks if the entity itself is a battery with . + /// If that fails it will try to get a battery from the entity's power cell slot instead. + /// + [PublicAPI] + public bool TryGetBatteryFromEntityOrSlot(Entity ent, [NotNullWhen(true)] out Entity? battery) + { + if (TryComp(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; + } + /// /// Returns whether the entity has a slotted battery and charge for the requested action. /// @@ -143,3 +202,20 @@ public sealed partial class PowerCellSystem return _battery.GetMaxUses(battery.Value.AsNullable(), cost); } } + +// Begin DeltaV - event-based search for battery + +/// +/// Event raised to search for batteries within an entity +/// +[ByRefEvent] +public struct SearchForBatteryEvent +{ + public EntityUid? Uid; + + public PredictedBatteryComponent? Component; + + public bool Handled; +} + +// End DeltaV - event-based search for battery