Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -------------------------------------------------------------------------------
- -- verbose-packer-safe.lua <modemSide>
- -- • AE2 Interface ⇄ Turtle via wired modem
- -- • Crafts 9→1 blocks, sends them back
- -- • Guaranteed clean grid before every batch
- -------------------------------------------------------------------------------
- local modemSide = ... or "front"
- -- 1. Peripherals ------------------------------------------------------------
- local modem = assert(peripheral.wrap(modemSide), "No modem on "..modemSide)
- local interface = assert(peripheral.find("inventory"), "No inventory/interface")
- local turtleName = modem.getNameLocal()
- local intName = peripheral.getName(interface)
- print(("Bound turtle [%s] <> interface [%s] via %s"):format(turtleName, intName, modemSide))
- -- 2. Helpers ----------------------------------------------------------------
- local craftSlots = {1,2,3, 5,6,7, 9,10,11} -- 3×3 inside 4×4 grid
- local function ts() return textutils.formatTime(os.time(), true) end
- local function log(msg,col)
- if term.isColour() and col then local o=term.getTextColor(); term.setTextColor(col) end
- print((" [%s] %s"):format(ts(), msg))
- if term.isColour() and col then term.setTextColor(colours.white) end
- end
- -- Empty any leftovers from previous attempts --------------------------------
- local function clearCraftGrid()
- for _,s in ipairs(craftSlots) do
- local n = turtle.getItemCount(s)
- if n > 0 then
- local back = interface.pullItems(turtleName, s, n) or 0
- sleep(0.1)
- log((" cleared %d item(s) from turtle slot %d"):format(back, s), colours.orange)
- end
- end
- end
- -- Emergency rollback --------------------------------------------------------
- local function rollback(reason)
- log("! "..reason.." – rolling back", colours.red)
- clearCraftGrid()
- local n = turtle.getItemCount(16)
- if n > 0 then interface.pullItems(turtleName, 16, n) end
- sleep(0.1)
- end
- -- 3. One craft batch --------------------------------------------------------
- local function craftFrom(slot, count)
- clearCraftGrid() -- make sure every slot is empty first
- local info = interface.getItemDetail(slot) -- full metadata :contentReference[oaicite:2]{index=2}
- local limit = info and info.maxCount or 64 -- 64 for most, 16 for eggs, … :contentReference[oaicite:3]{index=3}
- local sets = math.min(math.floor(count/9), limit) -- safe chunk size
- if sets == 0 then return end
- log(("Preparing %d craft(s) from interface slot %d (%d items)"):format(sets, slot, count),
- colours.yellow)
- -- Push ingredients – one shot per craft-grid slot ------------------------
- for _,dest in ipairs(craftSlots) do
- local moved = interface.pushItems(turtleName, slot, sets, dest) -- docs :contentReference[oaicite:4]{index=4}
- sleep(0.1)
- moved = moved or 0
- log((" >> moved %d/%d -> turtle slot %d"):format(moved, sets, dest),
- moved == sets and colours.green or colours.red)
- if moved ~= sets then return rollback("couldn't fill slot "..dest) end
- end
- -- Craft ------------------------------------------------------------------
- turtle.select(16) -- output goes here
- local ok, err = turtle.craft() -- turtle.craft docs :contentReference[oaicite:5]{index=5}
- if not ok then return rollback("craft failed: "..tostring(err)) end
- local out = turtle.getItemCount(16)
- log((" * crafted %d item(s)"):format(out), colours.lime)
- -- Return finished block(s) ----------------------------------------------
- local back = interface.pullItems(turtleName, 16, out) -- pullItems docs :contentReference[oaicite:6]{index=6}
- sleep(0.1)
- if back < out then return rollback("only pulled "..back.."/"..out) end
- log((" >> sent %d crafted item(s) back"):format(back), colours.green)
- turtle.select(1)
- end
- -- 4. Main loop --------------------------------------------------------------
- while true do
- for slot, itm in pairs(interface.list()) do -- list() docs :contentReference[oaicite:7]{index=7}
- if itm.count >= 9 then craftFrom(slot, itm.count) end
- end
- sleep(0.1)
- end
Advertisement
Add Comment
Please, Sign In to add comment