-- RSWarehouse.lua
-- Construction: https://cdn.domekologe.eu/gameserver/minecraft/cc/Minecolonies_RefinedStorage_Integration.png
-- IMPORTANT: Entangled Block MUST be on left Side of Computer, if not, change direction variable!
local time_between_runs = 30
local MAX_EXPORT = 256
local direction = "left"
-------------------------------------------------------------------------------
-- INIT
-------------------------------------------------------------------------------
local monitor = peripheral.find("monitor")
if not monitor then error("Monitor not found") end
monitor.setTextScale(0.5)
local bridge = peripheral.find("rs_bridge")
if not bridge then error("RS Bridge not found") end
local colony = peripheral.find("colony_integrator")
if not colony then error("Colony Integrator not found") end
local deliveredRequests = {}
local craftingRequests = {}
-------------------------------------------------------------------------------
-- HELPERS
-------------------------------------------------------------------------------
local function isBuilder(colonistName)
return string.find(colonistName, "Builder") ~= nil
end
local function isEquipmentRequest(desc)
return desc and string.find(desc, "level")
end
local function makeRequestId(data)
return string.format(
"%s|%s|%d",
data.item.name,
data.colonist,
data.needed
)
end
-------------------------------------------------------------------------------
-- MONITOR UI
-------------------------------------------------------------------------------
local function drawHeader(mon, remaining)
local w, _ = mon.getSize()
local now = os.time()
local cycle = "day"
local color = colors.lightBlue
if now >= 18.5 or now < 5 then
cycle = "night"
color = colors.red
elseif now >= 18 then
cycle = "sunset"
color = colors.orange
elseif now < 6 then
cycle = "sunrise"
color = colors.yellow
end
mon.setCursorPos(1,1)
mon.setTextColor(color)
mon.write("Time: "..textutils.formatTime(now, false).." ["..cycle.."]")
mon.setCursorPos(w - 16, 1)
mon.setTextColor(colors.green)
mon.write(string.format("Remaining: %02ds", remaining))
end
local function drawSectionTitle(mon, row, title)
local w, _ = mon.getSize()
mon.setCursorPos(math.floor((w - #title) / 2), row)
mon.setTextColor(colors.white)
mon.write(title)
return row + 1
end
local function drawLine(mon, row, left, right, color)
local w, _ = mon.getSize()
mon.setCursorPos(1, row)
mon.setTextColor(color)
mon.write(left)
mon.setCursorPos(w - #right, row)
mon.write(right)
return row + 1
end
-------------------------------------------------------------------------------
-- REQUEST FETCH
-------------------------------------------------------------------------------
local function getRequests()
local list = {}
for _, r in pairs(colony.getRequests()) do
if r.items and r.items[1] and r.items[1].name then
table.insert(list, {
name = r.name,
desc = r.desc,
needed = r.count or 0,
item = {
name = r.items[1].name,
count = math.min(r.count or 0, MAX_EXPORT)
},
colonist = r.target,
building = r.building or r.target
})
end
end
return list
end
-------------------------------------------------------------------------------
-- MAIN SCAN
-------------------------------------------------------------------------------
local function scan(monitor, remaining)
local builder = {}
local nonBuilder = {}
local equipment = {}
local activeRequests = {}
for _, data in ipairs(getRequests()) do
local requestId = makeRequestId(data)
activeRequests[requestId] = true
local provided = 0
local color = colors.blue -- default: nicht lieferbar
local crafting = false
-- ===============================
-- LIEFERLOGIK
-- ===============================
if not deliveredRequests[requestId] then
provided = bridge.exportItem(data.item, direction)
-- vollständig geliefert
if provided >= data.needed then
deliveredRequests[requestId] = true
color = colors.green
-- teilweise geliefert
elseif provided > 0 then
color = colors.yellow
-- nichts lieferbar → Crafting prüfen
else
if not craftingRequests[requestId] then
local ok = bridge.craftItem({
name = data.item.name,
count = data.needed
})
if ok then
craftingRequests[requestId] = true
crafting = true
color = colors.pink
else
color = colors.blue
end
else
-- Craft läuft bereits
crafting = true
color = colors.pink
end
end
else
provided = 0
color = colors.green
end
-- ===============================
-- UI-EINTRAG
-- ===============================
local entry = {
left = string.format(
"%d %s (%d)",
provided,
data.name:gsub("^[%d%-]+%s*", ""),
data.needed
),
provided = provided,
needed = data.needed,
color = color
}
-- Equipment → immer Kolonist
if isEquipmentRequest(data.desc) then
entry.right = data.colonist
table.insert(equipment, entry)
-- Builder → Gebäude
elseif isBuilder(data.colonist) then
entry.right = data.building or "Builder"
table.insert(builder, entry)
-- Non-Builder → Kolonist
else
entry.right = data.colonist
table.insert(nonBuilder, entry)
end
-- ===============================
-- TERMINAL LOG
-- ===============================
if color == colors.pink then
print(string.format(
"[CRAFT] %s x%d -> %s",
data.item.name,
data.needed,
entry.right
))
elseif color == colors.blue then
print(string.format(
"[MISS] %s x%d -> %s (no pattern)",
data.item.name,
data.needed,
entry.right
))
else
print(string.format(
"[%s] %s x%d -> %s",
provided > 0 and "OK" or "FAIL",
data.item.name,
data.item.count,
entry.right
))
end
end
-- ===============================
-- CLEANUP DELIVERED + CRAFTING
-- ===============================
for requestId, _ in pairs(deliveredRequests) do
if not activeRequests[requestId] then
deliveredRequests[requestId] = nil
craftingRequests[requestId] = nil
end
end
-- ===============================
-- MONITOR UI
-- ===============================
monitor.clear()
drawHeader(monitor, remaining)
local row = 3
if #builder > 0 then
row = drawSectionTitle(monitor, row, "Builder Requests")
for _, r in ipairs(builder) do
row = drawLine(monitor, row, r.left, r.right, r.color)
end
row = row + 1
end
if #nonBuilder > 0 then
row = drawSectionTitle(monitor, row, "Non Builder Requests")
for _, r in ipairs(nonBuilder) do
row = drawLine(monitor, row, r.left, r.right, r.color)
end
row = row + 1
end
if #equipment > 0 then
row = drawSectionTitle(monitor, row, "Equipment Requests")
for _, r in ipairs(equipment) do
row = drawLine(monitor, row, r.left, r.right, r.color)
end
end
end
-------------------------------------------------------------------------------
-- LOOP
-------------------------------------------------------------------------------
local counter = time_between_runs
scan(monitor, counter)
local timer = os.startTimer(1)
while true do
local e = { os.pullEvent() }
if e[1] == "timer" and e[2] == timer then
counter = counter - 1
if counter <= 0 then
scan(monitor, time_between_runs)
counter = time_between_runs
else
drawHeader(monitor, counter)
end
timer = os.startTimer(1)
end
end