Add client dropper registration and merging functionality
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user