Allow chemical-fueled generators to use multiple reagents (#24258)

multi-reagent generators
This commit is contained in:
Nemanja
2024-01-20 20:25:52 -05:00
committed by GitHub
parent ecc21d8f52
commit 691c3d55b8
3 changed files with 38 additions and 25 deletions

View File

@@ -1,4 +1,5 @@
using Content.Server.Audio;
using System.Linq;
using Content.Server.Audio;
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Fluids.EntitySystems;
using Content.Server.Materials;
@@ -81,7 +82,7 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
foreach (var reagentQuantity in solution)
{
if (reagentQuantity.Reagent.Prototype != entity.Comp.Reagent)
if (!entity.Comp.Reagents.ContainsKey(reagentQuantity.Reagent.Prototype))
{
args.Clogged = true;
return;
@@ -94,14 +95,21 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
return;
var availableReagent = solution.GetTotalPrototypeQuantity(entity.Comp.Reagent).Value;
var toRemove = RemoveFractionalFuel(
ref entity.Comp.FractionalReagent,
args.FuelUsed,
entity.Comp.Multiplier * FixedPoint2.Epsilon.Float(),
availableReagent);
var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray()).Value;
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 toRemove = RemoveFractionalFuel(
ref fractionalReagent,
args.FuelUsed * removalPercentage,
multiplier * FixedPoint2.Epsilon.Float(),
availableReagent);
_solutionContainer.RemoveReagent(entity.Comp.Solution.Value, entity.Comp.Reagent, FixedPoint2.FromCents(toRemove));
entity.Comp.FractionalReagents[reagentId] = fractionalReagent;
_solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove));
}
}
private void ChemicalGetFuel(Entity<ChemicalFuelGeneratorAdapterComponent> entity, ref GeneratorGetFuelEvent args)
@@ -109,9 +117,19 @@ public sealed class GeneratorSystem : SharedGeneratorSystem
if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution))
return;
var availableReagent = solution.GetTotalPrototypeQuantity(entity.Comp.Reagent).Float();
var reagent = entity.Comp.FractionalReagent * FixedPoint2.Epsilon.Float() + availableReagent;
args.Fuel = reagent * entity.Comp.Multiplier;
var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray());
var fuel = 0f;
foreach (var (reagentId, multiplier) in entity.Comp.Reagents)
{
var availableReagent = solution.GetTotalPrototypeQuantity(reagentId);
var percentage = availableReagent / totalAvailableReagents;
var fractionalReagent = (availableReagent * percentage).Float();
var reagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float() + fractionalReagent;
fuel += reagent * multiplier;
}
args.Fuel = fuel;
}
private void SolidUseFuel(EntityUid uid, SolidFuelGeneratorAdapterComponent component, GeneratorUseFuel args)