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
|
droppers = {}, -- list of available dropper peripherals for dispensing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- Client-registered droppers, keyed by clientId
|
||||||
|
local clientDroppers = {}
|
||||||
|
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
-- Activity state (shown on monitor)
|
-- Activity state (shown on monitor)
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
@@ -918,6 +921,19 @@ local function refreshCache(onProgress)
|
|||||||
if a.isDefault ~= b.isDefault then return a.isDefault end
|
if a.isDefault ~= b.isDefault then return a.isDefault end
|
||||||
return a.name < b.name
|
return a.name < b.name
|
||||||
end)
|
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
|
cache.droppers = droppers
|
||||||
|
|
||||||
-- Furnace count already computed from single-pass above
|
-- Furnace count already computed from single-pass above
|
||||||
@@ -943,6 +959,7 @@ local function refreshCache(onProgress)
|
|||||||
barrelOk = cache.barrelOk,
|
barrelOk = cache.barrelOk,
|
||||||
furnaceCount = cache.furnaceCount,
|
furnaceCount = cache.furnaceCount,
|
||||||
furnaceStatus = cache.furnaceStatus,
|
furnaceStatus = cache.furnaceStatus,
|
||||||
|
droppers = cache.droppers,
|
||||||
savedAt = os.epoch("utc"),
|
savedAt = os.epoch("utc"),
|
||||||
}
|
}
|
||||||
local f = fs.open(CACHE_FILE, "w")
|
local f = fs.open(CACHE_FILE, "w")
|
||||||
@@ -972,6 +989,7 @@ local function loadCacheFromDisk()
|
|||||||
cache.barrelOk = data.barrelOk or false
|
cache.barrelOk = data.barrelOk or false
|
||||||
cache.furnaceCount = data.furnaceCount or 0
|
cache.furnaceCount = data.furnaceCount or 0
|
||||||
cache.furnaceStatus = data.furnaceStatus or {}
|
cache.furnaceStatus = data.furnaceStatus or {}
|
||||||
|
cache.droppers = data.droppers or {}
|
||||||
else
|
else
|
||||||
error("invalid cache data")
|
error("invalid cache data")
|
||||||
end
|
end
|
||||||
@@ -3353,6 +3371,32 @@ local function main()
|
|||||||
print("[NET] Sort barrel: " .. message.barrelName)
|
print("[NET] Sort barrel: " .. message.barrelName)
|
||||||
pcall(sortBarrel, message.barrelName)
|
pcall(sortBarrel, message.barrelName)
|
||||||
pcall(broadcastState)
|
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
|
elseif message.type == "craft" and message.recipeIdx then
|
||||||
print(string.format("[NET] Craft request: recipe #%d", message.recipeIdx))
|
print(string.format("[NET] Craft request: recipe #%d", message.recipeIdx))
|
||||||
local pok, ok, err = pcall(craftItem, message.recipeIdx)
|
local pok, ok, err = pcall(craftItem, message.recipeIdx)
|
||||||
|
|||||||
Reference in New Issue
Block a user