Domekologe icon

minecolonies_refinedstorage_1.21.1.lua

Domekologe | PRO | 01/20/26 12:55:15 PM UTC (Edited) | 0 ⭐ | 12636 👁️ | Never ⏰ | []
Lua |

12.45 KB

|

None

|

0 👍

/

0 👎

-- 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!
--[[
Changelog:
- Change Domum Items, that only items from architects cutter are excluded
 
]]--
 
local time_between_runs = 15
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 = {}
 
 
 
local ARCHITECTS_CUTTER_ITEMS = {
  ["domum_ornamentum:panel"] = true,
  ["domum_ornamentum:plain"] = true,
  ["domum_ornamentum:post"] = true,
  ["domum_ornamentum:fancy_door"] = true,
  ["domum_ornamentum:fancy_light"] = true,
  ["domum_ornamentum:fancy_trapdoor"] = true,
  ["domum_ornamentum:blockpaperwall"] = true,
  ["domum_ornamentum:blockpillar"] = true,
  ["domum_ornamentum:blocktiledpaperwall"] = true,
  ["domum_ornamentum:blockypillar"] = true,
  ["domum_ornamentum:centerlight"] = true,
  ["domum_ornamentum:shingle"] = true,
  ["domum_ornamentum:shingle_slab"] = true,
  ["domum_ornamentum:shingle_stairs"] = true,
  ["domum_ornamentum:vanilla_fence_gate_compat"] = true,
  ["domum_ornamentum:vanilla_fence_compat"] = true,
  ["domum_ornamentum:vanilla_wall_compat"] = true,
  ["domum_ornamentum:vanilla_stairs_compat"] = true,
  ["domum_ornamentum:vanilla_slab_compat"] = true,
  ["domum_ornamentum:vanilla_trapdoors_compat"] = true,
  ["domum_ornamentum:framed"] = true,
  ["domum_ornamentum:framed_light"] = true,
  ["domum_ornamentum:four_light"] = true,
  ["domum_ornamentum:extra"] = true,
  ["domum_ornamentum:extra_slab"] = true,
  ["domum_ornamentum:extra_stairs"] = true
}
 
 
-------------------------------------------------------------------------------
-- 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|%s|%d|%s",
    data.item.name,
    textutils.serialize(data.item.nbt),
    data.colonist,
    data.needed,
    data.building or ""
  )
end
 
 
local function getDomumVariant(nbt)
  if not nbt then return "Unknown" end
 
  if nbt.variant then
    return tostring(nbt.variant)
  end
 
  if nbt.block then
    return tostring(nbt.block)
  end
 
  if nbt.material then
    return tostring(nbt.material)
  end
 
  if nbt.texture then
    return tostring(nbt.texture)
  end
 
  if nbt.state then
    return tostring(nbt.state)
  end
 
  return "Unspecified. Check Requester"
end
 
local function isArchitectCutterItem(item)
  if not item or not item.name then return false end
  return ARCHITECTS_CUTTER_ITEMS[item.name] == true
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),
          nbt   = r.items[1].nbt
        },
        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 = {}
  local missingDomum = {}
  for _, data in ipairs(getRequests()) do
    local requestId = makeRequestId(data)
    activeRequests[requestId] = true
 
    local provided = 0
    local color = colors.blue -- default: not deliverable
 
    local isDomum = isArchitectCutterItem(data.item)
 
    local hasNBT = data.item
      and type(data.item.nbt) == "table"
      and next(data.item.nbt) ~= nil
 
    -- ======================================================
    -- DELIVERY FIRST (never blocked by crafting)
    -- ======================================================
 
    if not isDomum or hasNBT then
      -- Normal items OR Domum items with NBT
      provided = bridge.exportItem(data.item, direction)
    else
      -- Domum item without NBT -> never export
      provided = 0
    end
 
    -- Fully delivered
    if provided >= data.needed then
      deliveredRequests[requestId] = true
      craftingRequests[requestId] = nil
      color = colors.green
 
    -- Partially delivered
    elseif provided > 0 then
      color = colors.yellow
 
    -- Nothing delivered -> check / start crafting
    else
      -- Domum item without NBT must NEVER be crafted
      if isDomum and not hasNBT then
        color = colors.blue
 
      else
        -- Craft already running
        if craftingRequests[requestId] then
          color = colors.pink
 
        -- Try to start crafting
        else
          local craftItem = {
            name  = data.item.name,
            count = data.needed,
            nbt   = data.item.nbt
          }
 
          local ok = bridge.craftItem(craftItem)
 
          if ok then
            craftingRequests[requestId] = {
              started = os.epoch("utc")
            }
            color = colors.pink
          else
            color = colors.blue
          end
        end
      end
    end
    
    -- ======================================================
    -- Donum Ornamentum Missing Items
    -- ======================================================
    
    if isDomum and color == colors.blue then
      local variant = getDomumVariant(data.item.nbt)
    
      local key = data.item.name .. "|" .. variant
      missingDomum[key] = {
        name = data.name:gsub("^[%d%-]+%s*", ""),
        variant = variant
      }
    end
    -- ======================================================
    -- UI ENTRY
    -- ======================================================
    local variant = ""
    if isDomum then
      local v = getDomumVariant(data.item.nbt)
      if v ~= "unknown" then
        variant = " [" .. v .. "]"
      end
    end
 
 
    local entry = {
      left = string.format(
        "%d %s%s (%d)",
        provided,
        data.name:gsub("^[%d%-]+%s*", ""),
        variant,
        data.needed
      ),
      provided = provided,
      needed = data.needed,
      color = color
    }
 
    -- Equipment requests always show colonist
    if isEquipmentRequest(data.desc) then
      entry.right = data.colonist
      table.insert(equipment, entry)
 
    -- Builder requests show building / hut
    elseif isBuilder(data.colonist) then
      entry.right = data.building or "Builder"
      table.insert(builder, entry)
 
    -- Non-builder requests show colonist name
    else
      entry.right = data.colonist
      table.insert(nonBuilder, entry)
    end
 
    -- ======================================================
    -- TERMINAL OUTPUT
    -- ======================================================
    if color == colors.pink then
      print(string.format(
        "[CRAFTING] %s%s x%d -> %s",
        data.item.name,
        variant,
        data.needed,
        entry.right
      ))
    elseif color == colors.blue then
      if isDomum and not hasNBT then
        print(string.format(
          "[SKIP]     %s x%d -> %s (missing NBT)",
          data.item.name,
          data.needed,
          entry.right
        ))
      else
        print(string.format(
          "[MISSING]  %s x%d -> %s (no pattern)",
          data.item.name,
          data.needed,
          entry.right
        ))
      end
    elseif color == colors.green then
      print(string.format(
        "[DONE]     %s%s x%d -> %s",
        data.item.name,
        variant,
        data.needed,
        entry.right
      ))
    else
      print(string.format(
        "[PARTIAL]  %s%s x%d -> %s",
        data.item.name,
        variant,
        provided,
        entry.right
      ))
    end
  end
 
  -- ======================================================
  -- CLEANUP: remove state for vanished requests
  -- ======================================================
  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
  
  -- ======================================================
  -- MISSING DOMUM ORNAMENTUM SUMMARY
  -- ======================================================
  if next(missingDomum) ~= nil then
    row = row + 1
    row = drawSectionTitle(monitor, row, "Missing Domum Ornamentum Items")
 
    for _, entry in pairs(missingDomum) do
      local text = "- " .. entry.name .. " [" .. entry.variant .. "]"
      row = drawLine(
        monitor,
        row,
        text,
        "",
        colors.blue
      )
    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
 

Comments