Files
Inventory-Manager-CC/manager/config.lua
MayaTheShy 57fd3e88bc fix: resolve all paths relative to script directory for Opus package compatibility
- Add _baseDir/_path() resolution using shell.getRunningProgram() in all
  entry-point scripts (inventoryManager, inventoryClient, craftingTurtle,
  inventoryWebBridge)
- Pass _path function through to manager/config.lua for data/ and config files
- Config files (.manager_config, .inventory_cache, etc.) now resolve relative
  to the package directory rather than CWD
- Exclude startup/ auto-updater scripts from Opus .package manifest
- All dofile() calls now use _path() for portable path resolution
2026-03-22 16:07:43 -04:00

150 lines
5.4 KiB
Lua

-- manager/config.lua — Configuration constants, data tables, and lookup structures
-- Usage: local cfg = dofile(_path("manager/config.lua"))(log, _path)
return function(log, _path)
-- Fall back to CWD-relative if _path not provided (standalone use)
if not _path then _path = function(p) return p end end
local C = {}
-------------------------------------------------
-- Default configuration (overridden by .manager_config)
-------------------------------------------------
C.DROPPER_NAME = "minecraft:dropper_9"
C.BARREL_NAME = "minecraft:barrel_0"
C.POLL_INTERVAL = 2
C.MONITOR_SIDE = "left"
C.SCAN_INTERVAL = 120
C.SMELT_INTERVAL = 3
C.SMELT_RESERVE = 128
C.DEFRAG_INTERVAL = 600
C.COMPOST_INTERVAL = 3
C.ALERT_INTERVAL = 15
C.CACHE_FILE = _path(".inventory_cache")
C.SMELTER_MONITOR_SIDE = "top"
C.DISABLED_RECIPES_FILE = _path(".disabled_recipes")
-- Network
C.BROADCAST_CHANNEL = 4200
C.ORDER_CHANNEL = 4201
C.BROADCAST_INTERVAL = 1
C.CRAFT_CHANNEL = 4203
C.CRAFT_REPLY_CHANNEL = 4204
C.SYSTEM_CHANNEL = 4205
-- Crafting
C.CRAFT_TIMEOUT = 15
C.GRID_TO_SLOT = {1, 2, 3, 5, 6, 7, 9, 10, 11}
-- Compost (overridable via config file)
C.COMPOST_RESERVE = 128
C.COMPOST_DROPPER = "minecraft:dropper_10"
C.COMPOST_HOPPER = "minecraft:hopper_0"
-- Peripheral
C.PERIPHERAL_CACHE_TTL = 5
-- Furnace types
C.FURNACE_TYPES = {
"minecraft:furnace",
"minecraft:smoker",
"minecraft:blast_furnace",
}
C.SLOT_INPUT = 1
C.SLOT_FUEL = 2
C.SLOT_OUTPUT = 3
-------------------------------------------------
-- Config file loader
-------------------------------------------------
local CONFIG_FILE = _path(".manager_config")
function C.loadConfig()
if not fs.exists(CONFIG_FILE) then return end
local f = fs.open(CONFIG_FILE, "r")
local data = f.readAll()
f.close()
local ok, cfg = pcall(textutils.unserialiseJSON, data)
if not ok or not cfg then
log.warn("CONFIG", "Failed to parse %s", CONFIG_FILE)
return
end
C._raw = cfg
if cfg.dropperName then C.DROPPER_NAME = cfg.dropperName end
if cfg.barrelName then C.BARREL_NAME = cfg.barrelName end
if cfg.monitorSide then C.MONITOR_SIDE = cfg.monitorSide end
if cfg.smelterMonitorSide then C.SMELTER_MONITOR_SIDE = cfg.smelterMonitorSide end
if cfg.pollInterval then C.POLL_INTERVAL = cfg.pollInterval end
if cfg.scanInterval then C.SCAN_INTERVAL = cfg.scanInterval end
if cfg.smeltInterval then C.SMELT_INTERVAL = cfg.smeltInterval end
if cfg.defragInterval then C.DEFRAG_INTERVAL = cfg.defragInterval end
if cfg.compostInterval then C.COMPOST_INTERVAL = cfg.compostInterval end
if cfg.alertInterval then C.ALERT_INTERVAL = cfg.alertInterval end
if cfg.broadcastInterval then C.BROADCAST_INTERVAL = cfg.broadcastInterval end
if cfg.smeltReserve then C.SMELT_RESERVE = cfg.smeltReserve end
if cfg.broadcastChannel then C.BROADCAST_CHANNEL = cfg.broadcastChannel end
if cfg.orderChannel then C.ORDER_CHANNEL = cfg.orderChannel end
if cfg.craftChannel then C.CRAFT_CHANNEL = cfg.craftChannel end
if cfg.craftReplyChannel then C.CRAFT_REPLY_CHANNEL = cfg.craftReplyChannel end
if cfg.compostReserve then C.COMPOST_RESERVE = cfg.compostReserve end
if cfg.compostDropper then C.COMPOST_DROPPER = cfg.compostDropper end
if cfg.compostHopper then C.COMPOST_HOPPER = cfg.compostHopper end
if cfg.logLevel then log.setLevel(cfg.logLevel) end
log.info("CONFIG", "Loaded from %s", CONFIG_FILE)
end
-------------------------------------------------
-- Data tables
-------------------------------------------------
C.SMELTABLE = dofile(_path("data/smeltable.lua"))
C.FUEL_LIST = dofile(_path("data/fuel.lua"))
local _compostData = dofile(_path("data/compostable.lua"))
C.COMPOSTABLE = _compostData.items
C.COMPOST_TRASH = _compostData.trash
C.CRAFTABLE = dofile(_path("data/craftable.lua"))
C.LOW_STOCK_ALERTS = dofile(_path("data/alerts.lua"))
-- Pre-build furnace compatibility sets for O(1) lookup
for _, recipe in pairs(C.SMELTABLE) do
recipe.furnaceSet = {}
for _, ft in ipairs(recipe.furnaces) do
recipe.furnaceSet[ft] = true
end
end
-- Pre-built smelt candidate lists per furnace type
C.smeltCandidatesByType = {}
do
for _, ftype in ipairs(C.FURNACE_TYPES) do
C.smeltCandidatesByType[ftype] = {}
end
for itemName, recipe in pairs(C.SMELTABLE) do
local isFood = recipe.furnaceSet["minecraft:smoker"] or false
for ft, _ in pairs(recipe.furnaceSet) do
table.insert(C.smeltCandidatesByType[ft], { name = itemName, recipe = recipe, food = isFood })
end
end
for _, list in pairs(C.smeltCandidatesByType) do
table.sort(list, function(a, b)
if a.food ~= b.food then return a.food end
return a.name < b.name
end)
end
end
-- Build fuel set for quick lookup
C.FUEL_SET = {}
for _, f in ipairs(C.FUEL_LIST) do C.FUEL_SET[f.name] = true end
-- Build compostable set for quick lookup
C.COMPOSTABLE_SET = {}
for _, name in ipairs(C.COMPOSTABLE) do C.COMPOSTABLE_SET[name] = true end
return C
end