Add client dropper discovery and announcement functionality

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

View File

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