TrySetChargeCooldown(ent.Owner);
- var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge);
+ var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, delta, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref ev);
return delta;
}
return;
}
- var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge);
+ var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.CurrentCharge - oldCharge, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref ev);
}
+
public override void SetMaxCharge(Entity<BatteryComponent?> ent, float value)
{
if (!Resolve(ent, ref ent.Comp))
return;
var old = ent.Comp.MaxCharge;
+ var oldCharge = ent.Comp.CurrentCharge;
ent.Comp.MaxCharge = Math.Max(value, 0);
ent.Comp.CurrentCharge = Math.Min(ent.Comp.CurrentCharge, ent.Comp.MaxCharge);
if (MathHelper.CloseTo(ent.Comp.MaxCharge, old))
return;
- var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge);
+ var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.CurrentCharge - oldCharge, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref ev);
}
if (!ent.Comp.IsRigged)
return;
- if (TryComp<BatteryComponent>(ent, out var batteryComponent))
- {
- if (batteryComponent.CurrentCharge == 0f)
- return;
+ if (args.Charge == 0f)
+ return; // No charge to cause an explosion.
- Explode(ent, batteryComponent.CurrentCharge);
- }
+ Explode(ent, args.Charge);
}
// predicted batteries
if (!ent.Comp.IsRigged)
return;
- if (TryComp<PredictedBatteryComponent>(ent, out var predictedBatteryComponent))
- {
- var charge = _predictedBattery.GetCharge((ent.Owner, predictedBatteryComponent));
- if (charge == 0f)
- return;
+ if (args.CurrentCharge == 0f)
+ return; // No charge to cause an explosion.
- Explode(ent, charge);
- }
+ // Don't explode if we are not using any charge.
+ if (args.CurrentChargeRate == 0f && args.Delta == 0f)
+ return;
+
+ Explode(ent, args.CurrentCharge);
}
}
/// Only raised for entities with <see cref="BatteryComponent"/>.
/// </summary>
[ByRefEvent]
-public readonly record struct ChargeChangedEvent(float Charge, float MaxCharge);
+public readonly record struct ChargeChangedEvent(float Charge, float Delta, float MaxCharge)
+{
+ /// <summary>
+ /// The new charge of the battery.
+ /// </summary>
+ public readonly float Charge = Charge;
+
+ /// <summary>
+ /// The amount the charge was changed by.
+ /// </summary>
+ public readonly float Delta = Delta;
+
+ /// <summary>
+ /// The maximum charge of the battery.
+ /// </summary>
+ public readonly float MaxCharge = MaxCharge;
+}
/// <summary>
/// Raised when a predicted battery's charge or capacity changes (capacity affects relative charge percentage).
/// Only raised for entities with <see cref="PredictedBatteryComponent"/>.
/// </summary>
[ByRefEvent]
-public readonly record struct PredictedBatteryChargeChangedEvent(float CurrentCharge, float CurrentChargeRate, TimeSpan CurrentTime, float MaxCharge);
+public readonly record struct PredictedBatteryChargeChangedEvent(float CurrentCharge, float Delta, float CurrentChargeRate, float MaxCharge)
+{
+ /// <summary>
+ /// The new charge of the battery.
+ /// </summary>
+ public readonly float CurrentCharge = CurrentCharge;
+
+ /// <summary>
+ /// The amount the charge was changed by.
+ /// This might be 0 if only the charge rate was modified.
+ /// </summary>
+ public readonly float Delta = Delta;
+
+ /// <summary>
+ /// The new charge rate of the battery.
+ /// </summary>
+ public readonly float CurrentChargeRate = CurrentChargeRate;
+
+ /// <summary>
+ /// The maximum charge of the battery.
+ /// </summary>
+ public readonly float MaxCharge = MaxCharge;
+}
/// <summary>
/// Raised when a battery changes its state between full, empty, or neither.
TrySetChargeCooldown(ent.Owner);
- var changedEv = new PredictedBatteryChargeChangedEvent(newValue, ent.Comp.ChargeRate, curTime, ent.Comp.MaxCharge);
+ var changedEv = new PredictedBatteryChargeChangedEvent(newValue, delta, ent.Comp.ChargeRate, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref changedEv);
// Raise events if the battery status changed between full, empty, or neither.
ent.Comp.LastUpdate = curTime;
Dirty(ent);
- var ev = new PredictedBatteryChargeChangedEvent(newValue, ent.Comp.ChargeRate, curTime, ent.Comp.MaxCharge);
+ var ev = new PredictedBatteryChargeChangedEvent(newValue, delta, ent.Comp.ChargeRate, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref ev);
// Raise events if the battery status changed between full, empty, or neither.
if (value == ent.Comp.MaxCharge)
return;
+ var oldCharge = GetCharge(ent);
ent.Comp.MaxCharge = Math.Max(value, 0);
ent.Comp.LastCharge = GetCharge(ent); // This clamps it using the new max.
var curTime = _timing.CurTime;
ent.Comp.LastUpdate = curTime;
Dirty(ent);
- var ev = new PredictedBatteryChargeChangedEvent(ent.Comp.LastCharge, ent.Comp.ChargeRate, curTime, ent.Comp.MaxCharge);
+ var ev = new PredictedBatteryChargeChangedEvent(ent.Comp.LastCharge, ent.Comp.LastCharge - oldCharge, ent.Comp.ChargeRate, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref ev);
// Raise events if the battery status changed between full, empty, or neither.
Dirty(ent);
// Inform other systems about the new rate;
- var changedEv = new PredictedBatteryChargeChangedEvent(ent.Comp.LastCharge, ent.Comp.ChargeRate, curTime, ent.Comp.MaxCharge);
+ var changedEv = new PredictedBatteryChargeChangedEvent(ent.Comp.LastCharge, 0f, ent.Comp.ChargeRate, ent.Comp.MaxCharge);
RaiseLocalEvent(ent, ref changedEv);
return refreshEv.NewChargeRate;