diff --git a/inventoryManager.lua b/inventoryManager.lua index 78fdd80..2504ae9 100644 --- a/inventoryManager.lua +++ b/inventoryManager.lua @@ -648,6 +648,9 @@ local cache = { droppers = {}, -- list of available dropper peripherals for dispensing } +-- Client-registered droppers, keyed by clientId +local clientDroppers = {} + ------------------------------------------------- -- Activity state (shown on monitor) ------------------------------------------------- @@ -918,6 +921,19 @@ local function refreshCache(onProgress) if a.isDefault ~= b.isDefault then return a.isDefault end return a.name < b.name end) + + -- Merge in droppers registered by remote clients + local seenNames = {} + for _, d in ipairs(droppers) do seenNames[d.name] = true end + for clientId, clientList in pairs(clientDroppers) do + for _, d in ipairs(clientList) do + if not seenNames[d.name] then + table.insert(droppers, { name = d.name, isDefault = false, clientId = clientId }) + seenNames[d.name] = true + end + end + end + cache.droppers = droppers -- Furnace count already computed from single-pass above @@ -943,6 +959,7 @@ local function refreshCache(onProgress) barrelOk = cache.barrelOk, furnaceCount = cache.furnaceCount, furnaceStatus = cache.furnaceStatus, + droppers = cache.droppers, savedAt = os.epoch("utc"), } local f = fs.open(CACHE_FILE, "w") @@ -972,6 +989,7 @@ local function loadCacheFromDisk() cache.barrelOk = data.barrelOk or false cache.furnaceCount = data.furnaceCount or 0 cache.furnaceStatus = data.furnaceStatus or {} + cache.droppers = data.droppers or {} else error("invalid cache data") end @@ -3353,6 +3371,32 @@ local function main() print("[NET] Sort barrel: " .. message.barrelName) pcall(sortBarrel, message.barrelName) pcall(broadcastState) + elseif message.type == "register_droppers" and message.clientId and message.droppers then + -- Client is announcing its locally-attached droppers + local cid = tostring(message.clientId) + clientDroppers[cid] = message.droppers + print(string.format("[NET] Client %s registered %d dropper(s)", cid, #message.droppers)) + -- Rebuild the merged dropper list immediately + local seenNames = {} + local merged = {} + -- Master droppers first + for _, d in ipairs(cache.droppers or {}) do + if not d.clientId then + table.insert(merged, d) + seenNames[d.name] = true + end + end + -- Then all client droppers + for clientId, clientList in pairs(clientDroppers) do + for _, d in ipairs(clientList) do + if not seenNames[d.name] then + table.insert(merged, { name = d.name, isDefault = false, clientId = clientId }) + seenNames[d.name] = true + end + end + end + cache.droppers = merged + pcall(broadcastState) elseif message.type == "craft" and message.recipeIdx then print(string.format("[NET] Craft request: recipe #%d", message.recipeIdx)) local pok, ok, err = pcall(craftItem, message.recipeIdx)