Add client dropper registration and merging functionality

This commit is contained in:
MayaTheShy
2026-03-21 20:36:58 -04:00
parent 4fcec03a59
commit a2f7df448c

View File

@@ -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)