parent
f2d31a3d31
commit
525ffdc8f5
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue