Refactored into separated components

This commit is contained in:
2026-09-06 14:32:27 +02:00
parent 6519ec5d97
commit 073d20ff28
12 changed files with 761 additions and 1059 deletions
+169
View File
@@ -0,0 +1,169 @@
using System.Collections.Generic;
using UnityEngine;
namespace AutoRefillFires
{
internal class FuelManager
{
private readonly ModConfig _config;
private readonly ModLogger _log;
public FuelManager(ModConfig config, ModLogger log)
{
_config = config;
_log = log;
}
public int ConsumeFuel(Player player, Transform target, string fuelName, int requestedAmount, Container[] containers)
{
if (requestedAmount <= 0)
return 0;
_log.Debug(
$"Fuel request: fuel='{fuelName}', " +
$"requested={requestedAmount}, " +
$"priority={_config.FuelSourcePriority.Value}, " +
$"containers={_config.UseNearbyContainers.Value}, " +
$"reserve={_config.KeepFuelReserve.Value}"
);
int consumed = 0;
if (_config.FuelSourcePriority.Value == FuelSourcePriority.ContainersFirst)
{
if (_config.UseNearbyContainers.Value && containers != null)
consumed += ConsumeFuelFromNearbyContainers(target, fuelName, requestedAmount - consumed, containers);
if (consumed < requestedAmount)
consumed += ConsumeFuelFromPlayer(player, fuelName, requestedAmount - consumed);
}
else
{
consumed += ConsumeFuelFromPlayer(player, fuelName, requestedAmount);
if (_config.UseNearbyContainers.Value && containers != null && consumed < requestedAmount)
consumed += ConsumeFuelFromNearbyContainers(target, fuelName, requestedAmount - consumed, containers);
}
_log.Debug(
$"Fuel request result: fuel='{fuelName}', " +
$"requested={requestedAmount}, " +
$"consumed={consumed}"
);
return consumed;
}
private int ConsumeFuelFromPlayer(Player player, string fuelName, int requestedAmount)
{
if (requestedAmount <= 0)
return 0;
Inventory inventory = player.GetInventory();
if (inventory == null)
{
_log.Debug("Player inventory is null.");
return 0;
}
int availableFuel = inventory.CountItems(fuelName);
int usableFuel = Mathf.Max(availableFuel - _config.KeepFuelReserve.Value, 0);
int amountToTake = Mathf.Min(requestedAmount, usableFuel);
if (amountToTake <= 0)
{
_log.Debug(
$"Player inventory: fuel='{fuelName}', " +
$"available={availableFuel}, " +
$"reserve={_config.KeepFuelReserve.Value}, " +
$"usable=0"
);
return 0;
}
inventory.RemoveItem(fuelName, amountToTake);
_log.Debug(
$"Player inventory: consumed={amountToTake}x {fuelName}, " +
$"before={availableFuel}, " +
$"remaining={availableFuel - amountToTake}"
);
return amountToTake;
}
private int ConsumeFuelFromNearbyContainers(Transform target, string fuelName, int requestedAmount, Container[] containers)
{
if (requestedAmount <= 0)
return 0;
if (containers == null || containers.Length == 0)
return 0;
List<ContainerCandidate> candidates = new List<ContainerCandidate>();
foreach (Container container in containers)
{
if (container == null)
continue;
float distance = Vector3.Distance(target.position, container.transform.position);
if (distance > _config.ContainerRadius.Value)
continue;
Inventory inventory = container.GetInventory();
if (inventory == null)
continue;
int availableFuel = inventory.CountItems(fuelName);
int usableFuel = Mathf.Max(availableFuel - _config.KeepFuelReserve.Value, 0);
if (usableFuel <= 0)
continue;
candidates.Add(new ContainerCandidate
{
Container = container,
Distance = distance
});
}
candidates.Sort((a, b) => a.Distance.CompareTo(b.Distance));
int consumed = 0;
foreach (ContainerCandidate candidate in candidates)
{
if (consumed >= requestedAmount)
break;
Inventory inventory = candidate.Container.GetInventory();
if (inventory == null)
continue;
int availableFuel = inventory.CountItems(fuelName);
int usableFuel = Mathf.Max(availableFuel - _config.KeepFuelReserve.Value, 0);
if (usableFuel <= 0)
continue;
int amountToTake = Mathf.Min(requestedAmount - consumed, usableFuel);
inventory.RemoveItem(fuelName, amountToTake);
consumed += amountToTake;
_log.Debug(
$"Container '{candidate.Container.name}' ({candidate.Distance:0.0}m): " +
$"consumed={amountToTake}x {fuelName}"
);
}
return consumed;
}
}
}