From 4fcec03a597d4327a3f0bdc3bab801c45987afee Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sat, 21 Mar 2026 20:36:49 -0400 Subject: [PATCH] Add client dropper discovery and announcement functionality --- inventoryClient.lua | 64 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/inventoryClient.lua b/inventoryClient.lua index 205ea7d..5a42ad4 100644 --- a/inventoryClient.lua +++ b/inventoryClient.lua @@ -18,6 +18,8 @@ local SMELTER_MONITOR_SIDE = "top" local CLIENT_DROPPER_NAME = "" -- e.g. "minecraft:dropper_5" local CLIENT_BARREL_NAME = "" -- e.g. "minecraft:barrel_3" +local DROPPER_ANNOUNCE_INTERVAL = 30 -- seconds between dropper announcements + ------------------------------------------------- -- State (received from master) ------------------------------------------------- @@ -312,6 +314,53 @@ local function sendToMaster(message) networkModem.transmit(ORDER_CHANNEL, CLIENT_CHANNEL, message) end +------------------------------------------------- +-- Client dropper discovery +------------------------------------------------- + +local function discoverLocalDroppers() + local droppers = {} + -- Check configured dropper first + if CLIENT_DROPPER_NAME ~= "" then + local exists = peripheral.wrap(CLIENT_DROPPER_NAME) ~= nil + if exists then + table.insert(droppers, { name = CLIENT_DROPPER_NAME, isDefault = false, clientId = os.getComputerID() }) + end + end + -- Also discover any other droppers on client's local network + for _, name in ipairs(peripheral.getNames()) do + local isDropper = name:match("^minecraft:dropper_") + if not isDropper and peripheral.hasType then + isDropper = peripheral.hasType(name, "minecraft:dropper") + end + if not isDropper then + isDropper = peripheral.getType(name) == "minecraft:dropper" + end + if isDropper then + -- Avoid duplicates with configured dropper + local isDuplicate = false + for _, d in ipairs(droppers) do + if d.name == name then isDuplicate = true; break end + end + if not isDuplicate then + table.insert(droppers, { name = name, isDefault = false, clientId = os.getComputerID() }) + end + end + end + return droppers +end + +local function announceDroppers() + local droppers = discoverLocalDroppers() + if #droppers > 0 then + sendToMaster({ + type = "register_droppers", + clientId = os.getComputerID(), + droppers = droppers, + }) + end +end + ------------------------------------------------- -- Inventory Dashboard (identical to master) ------------------------------------------------- @@ -1384,7 +1433,18 @@ local function main() end end, - -- Task 4: Client barrel auto-sort (sends to master only when barrel has items) + -- Task 4: Announce local droppers to master periodically + function() + -- Initial announcement after short delay + sleep(3) + pcall(announceDroppers) + while true do + sleep(DROPPER_ANNOUNCE_INTERVAL) + pcall(announceDroppers) + end + end, + + -- Task 5: Client barrel auto-sort (sends to master only when barrel has items) function() if CLIENT_BARREL_NAME == "" then return end print("[OK] Client barrel: " .. CLIENT_BARREL_NAME) @@ -1400,7 +1460,7 @@ local function main() end end, - -- Task 5: Touch event listener (both monitors) + -- Task 6: Touch event listener (both monitors) function() while true do local event, side, x, y = os.pullEvent("monitor_touch")