Fix chemical fuel generator division by zero (#24793)
This would happen when they run out of fuel.
This commit is contained in:
committed by
GitHub
parent
73d7837fab
commit
b029d05620
@@ -92,17 +92,28 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
|
|||||||
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
|
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray()).Value;
|
var totalReagent = 0f;
|
||||||
|
foreach (var (reagentId, _) in entity.Comp.Reagents)
|
||||||
|
{
|
||||||
|
totalReagent += solution.GetTotalPrototypeQuantity(reagentId).Float();
|
||||||
|
totalReagent += entity.Comp.FractionalReagents.GetValueOrDefault(reagentId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalReagent == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
|
foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
|
||||||
{
|
{
|
||||||
var availableReagent = solution.GetTotalPrototypeQuantity(reagentId).Value;
|
|
||||||
var removalPercentage = availableReagent / totalAvailableReagents;
|
|
||||||
var fractionalReagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId);
|
var fractionalReagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId);
|
||||||
|
var availableReagent = solution.GetTotalPrototypeQuantity(reagentId);
|
||||||
|
var availForRatio = fractionalReagent + availableReagent.Float();
|
||||||
|
var removalPercentage = availForRatio / totalReagent;
|
||||||
|
|
||||||
var toRemove = RemoveFractionalFuel(
|
var toRemove = RemoveFractionalFuel(
|
||||||
ref fractionalReagent,
|
ref fractionalReagent,
|
||||||
args.FuelUsed * removalPercentage,
|
args.FuelUsed * removalPercentage,
|
||||||
multiplier * FixedPoint2.Epsilon.Float(),
|
multiplier * FixedPoint2.Epsilon.Float(),
|
||||||
availableReagent);
|
availableReagent.Value);
|
||||||
|
|
||||||
entity.Comp.FractionalReagents[reagentId] = fractionalReagent;
|
entity.Comp.FractionalReagents[reagentId] = fractionalReagent;
|
||||||
_solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove));
|
_solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove));
|
||||||
@@ -114,15 +125,12 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
|
|||||||
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
|
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray());
|
|
||||||
var fuel = 0f;
|
var fuel = 0f;
|
||||||
foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
|
foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
|
||||||
{
|
{
|
||||||
var availableReagent = solution.GetTotalPrototypeQuantity(reagentId);
|
var reagent = solution.GetTotalPrototypeQuantity(reagentId).Float();
|
||||||
var percentage = availableReagent / totalAvailableReagents;
|
reagent += entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float();
|
||||||
var fractionalReagent = (availableReagent * percentage).Float();
|
|
||||||
|
|
||||||
var reagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float() + fractionalReagent;
|
|
||||||
fuel += reagent * multiplier;
|
fuel += reagent * multiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,6 +151,10 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
|
|||||||
|
|
||||||
private int RemoveFractionalFuel(ref float fractional, float fuelUsed, float multiplier, int availableQuantity)
|
private int RemoveFractionalFuel(ref float fractional, float fuelUsed, float multiplier, int availableQuantity)
|
||||||
{
|
{
|
||||||
|
// Just a sanity thing since I got worried this might be possible.
|
||||||
|
if (!float.IsFinite(fractional))
|
||||||
|
fractional = 0;
|
||||||
|
|
||||||
fractional -= fuelUsed / multiplier;
|
fractional -= fuelUsed / multiplier;
|
||||||
if (fractional >= 0)
|
if (fractional >= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user