diff --git a/Plugin.cs b/Plugin.cs index 113bb59..1956944 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -4,6 +4,11 @@ using UnityEngine; namespace AutoRefillFires { + public enum FuelSourcePriority + { + PlayerFirst, + ContainersFirst + } [BepInPlugin( Plugin.PluginGuid, @@ -31,6 +36,9 @@ namespace AutoRefillFires private ConfigEntry _fillWallTorches; private ConfigEntry _fillBraziers; private ConfigEntry _fillOtherFireplaces; + private ConfigEntry _keepFuelReserve; + private ConfigEntry _fuelSourcePriority; + private ConfigEntry _onlyRefillOwnPieces; private ConfigEntry _toggleHotkey; private bool _modEnabled = true; @@ -136,6 +144,27 @@ namespace AutoRefillFires "Hotkey used to enable or disable automatic refilling." ); + _keepFuelReserve = Config.Bind( + "Fuel", + "KeepFuelReserve", + 0, + "Minimum amount of fuel to keep in the source inventory. 10 means the last 10 Wood/Resin will not be used." + ); + + _fuelSourcePriority = Config.Bind( + "Fuel", + "FuelSourcePriority", + FuelSourcePriority.PlayerFirst, + "Select whether player inventory or nearby containers should be used first." + ); + + _onlyRefillOwnPieces = Config.Bind( + "General", + "OnlyRefillOwnPieces", + false, + "If enabled, only refill fireplaces and torches built by the local player." + ); + Logger.LogInfo("Auto Refill Fires loaded!"); } @@ -233,10 +262,31 @@ namespace AutoRefillFires } } + private bool IsOwnPiece(Player player, Fireplace fireplace) + { + Piece piece = fireplace.GetComponent(); + + if (piece == null) + piece = fireplace.GetComponentInParent(); + + if (piece == null) + { + // Unknown/modded fireplace without a Piece component. + // Don't block it. + return true; + } + + return piece.GetCreator() == player.GetPlayerID(); + } + private void TryRefillFireplace(Player player, Fireplace fireplace) { if (!ShouldRefillFireplace(fireplace)) return; + + if (_onlyRefillOwnPieces.Value && !IsOwnPiece(player, fireplace)) + return; + ZNetView nview = fireplace.GetComponent(); if (nview == null) @@ -326,18 +376,55 @@ namespace AutoRefillFires } } + private bool TryConsumeFuelFromPlayer(Player player, string fuelName) + { + Inventory inventory = player.GetInventory(); + + if (inventory == null) + return false; + + int availableFuel = + inventory.CountItems(fuelName); + + if (availableFuel <= _keepFuelReserve.Value) + return false; + + inventory.RemoveItem( + fuelName, + 1 + ); + + Logger.LogDebug( + $"Fuel {fuelName} taken from player inventory. " + + $"Remaining: {availableFuel - 1}" + ); + + return true; + } + private bool TryConsumeFuel(Player player, Fireplace fireplace, string fuelName) { - Inventory playerInventory = player.GetInventory(); - - if (playerInventory.CountItems(fuelName) > 0) + if (_fuelSourcePriority.Value == FuelSourcePriority.ContainersFirst) { - playerInventory.RemoveItem(fuelName, 1); + if (_useNearbyContainers.Value && + TryConsumeFuelFromNearbyContainer( + fireplace, + fuelName)) + { + return true; + } - Logger.LogDebug( - $"Fuel {fuelName} taken from player inventory." + return TryConsumeFuelFromPlayer( + player, + fuelName ); + } + // PlayerFirst + if (TryConsumeFuelFromPlayer( + player, + fuelName)) + { return true; } @@ -350,9 +437,7 @@ namespace AutoRefillFires ); } - private bool TryConsumeFuelFromNearbyContainer( - Fireplace fireplace, - string fuelName) + private bool TryConsumeFuelFromNearbyContainer(Fireplace fireplace, string fuelName) { Container[] containers = Object.FindObjectsByType( @@ -376,12 +461,24 @@ namespace AutoRefillFires if (distance > _containerRadius.Value) continue; - Inventory inventory = container.GetInventory(); + Inventory inventory = + container.GetInventory(); if (inventory == null) continue; - if (inventory.CountItems(fuelName) <= 0) + int availableFuel = + inventory.CountItems(fuelName); + + /* + * Never use the configured reserve. + * + * Example: + * reserve = 10 + * chest contains 10 -> skip + * chest contains 11 -> usable + */ + if (availableFuel <= _keepFuelReserve.Value) continue; if (distance < closestDistance) @@ -400,15 +497,22 @@ namespace AutoRefillFires if (chestInventory == null) return false; - if (chestInventory.CountItems(fuelName) <= 0) + int chestFuel = + chestInventory.CountItems(fuelName); + + if (chestFuel <= _keepFuelReserve.Value) return false; - chestInventory.RemoveItem(fuelName, 1); + chestInventory.RemoveItem( + fuelName, + 1 + ); - Logger.LogInfo( + Logger.LogDebug( $"Fuel {fuelName} taken from container " + $"{closestContainer.name} " + - $"({closestDistance:0.0}m)" + $"({closestDistance:0.0}m). " + + $"Remaining: {chestFuel - 1}" ); return true;