Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function getSlot(name)
- for i=1,16 do
- local detail = turtle.getItemDetail(i)
- if detail then
- local nameInSlot = detail.name .. ":" .. detail.damage
- if name == nameInSlot then
- return i
- end
- end
- end
- end
- local function tscript(s)
- for i=1, #s do
- local c = s:sub(i, i)
- if c == "f" then
- turtle.forward()
- elseif c == "d" then
- turtle.down()
- elseif c == "b" then
- turtle.back()
- elseif c == "u" then
- turtle.up()
- elseif c == "l" then
- turtle.turnLeft()
- elseif c == "r" then
- turtle.turnRight()
- elseif c == "P" then
- local detail = turtle.getItemDetail()
- local nameInSlot = detail.name .. ":" .. detail.damage
- turtle.place()
- local slot = getSlot(nameInSlot)
- if slot then turtle.select(slot) end
- elseif c == "D" then
- turtle.drop()
- elseif c == "S" then
- turtle.suck()
- end
- end
- end
- local function defragment()
- print("defragmenting inventory...")
- local nameToSlot = {}
- for i=1,16 do
- local detail = turtle.getItemDetail(i)
- if detail then
- local nameInSlot = detail.name .. ":" .. detail.damage
- if nameToSlot[nameInSlot] then
- turtle.select(i)
- turtle.transferTo(nameToSlot[nameInSlot])
- else
- nameToSlot[nameInSlot] = i
- end
- end
- end
- end
- local function firstEmptySlot()
- for i=1,16 do
- local detail = turtle.getItemDetail(i)
- if not detail then
- return i
- end
- end
- end
- local refuel
- refuel = function()
- if turtle.getFuelLevel() > 100 then return end
- print("refueling...")
- local coalSlot = getSlot("minecraft:coal:0")
- if coalSlot then
- print("found coal.")
- turtle.select(coalSlot)
- turtle.refuel()
- else
- print("finding coal...")
- tscript("rflSlfr")
- refuel()
- end
- end
- local function makeWall()
- turtle.select(getSlot("minecraft:iron_block:0"))
- tscript("rfrfP")
- turtle.select(getSlot("minecraft:redstone:0"))
- tscript("uPb")
- turtle.drop(1)
- tscript("dlbl")
- end
- local function makeTunnel()
- turtle.select(getSlot("compactmachines3:wallbreakable:0"))
- tscript("rrfddfP")
- turtle.select(getSlot("minecraft:hopper:0"))
- tscript("uPdb")
- turtle.select(getSlot("minecraft:redstone:0"))
- tscript("PrflPrflfflPrflPrflfflPrflPrflfflPrflPrflffluub")
- turtle.drop(1)
- tscript("rr")
- end
- local function makeSmallMachine(center) return function()
- turtle.select(getSlot("compactmachines3:wallbreakable:0"))
- tscript("rrfddf")
- -- first layer
- tscript("ffPbPbPlfrffPbPbPlfrffPbPbPurffl")
- -- second layer
- tscript("ffPbPbPlfrffPb")
- if center then
- turtle.select(getSlot(center))
- turtle.place()
- turtle.select(getSlot("compactmachines3:wallbreakable:0"))
- end
- tscript("bPlfrffPbPbPurffl")
- -- third layer
- tscript("ffPbPbPlfrffPbPbPlfrffPbPbPrflbb")
- turtle.select(getSlot("minecraft:ender_pearl:0"))
- turtle.drop(1)
- tscript("rfr")
- end end
- local function makeLargeMachine(center) return function()
- tscript("lflfdd")
- -- layer 1
- for i=1,5 do
- tscript("ffffPbPbPbPbPlfr")
- end
- tscript("urfffffl")
- -- layer 2
- tscript("ffffPbPbPbPbPlfr")
- for i=1,3 do
- tscript("ffffPbbbbPlfr")
- end
- tscript("ffffPbPbPbPbPlfr")
- tscript("urfffffl")
- -- layer 3
- tscript("ffffPbPbPbPbPlfr")
- tscript("ffffPbbbbPlfr")
- tscript("ffffPbb")
- if center then
- turtle.select(getSlot(center))
- turtle.place()
- turtle.select(getSlot("compactmachines3:wallbreakable:0"))
- end
- tscript("bbPlfr")
- tscript("ffffPbbbbPlfr")
- tscript("ffffPbPbPbPbPlfr")
- tscript("urfffffl")
- -- layer 4
- tscript("ffffPbPbPbPbPlfr")
- for i=1,3 do
- tscript("ffffPbbbbPlfr")
- end
- tscript("ffffPbPbPbPbPlfr")
- tscript("urfffffl")
- -- layer 5
- for i=1,5 do
- tscript("ffffPbPbPbPbPlfr")
- end
- -- done
- tscript("rffflddb")
- turtle.select(getSlot("minecraft:ender_pearl:0"))
- turtle.drop(1)
- tscript("rrlfr")
- end end
- local recipes = {
- ["minecraft:stick:0"] = { -- stick == compact wall
- ingredients = {
- ["minecraft:iron_block:0"] = 1,
- ["minecraft:redstone:0"] = 2,
- },
- handler = makeWall,
- durationInTicks = 100,
- },
- ["minecraft:log:0"] = { -- oak == tunnel
- ingredients = {
- ["minecraft:redstone:0"] = 9,
- ["minecraft:hopper:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 1,
- },
- handler = makeTunnel,
- durationInTicks = 200,
- },
- ["minecraft:log:1"] = { -- spruce == tiny
- ingredients = {
- ["minecraft:ender_pearl:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 26,
- },
- handler = makeSmallMachine(nil),
- durationInTicks = 400,
- },
- ["minecraft:log:2"] = { -- birch == small
- ingredients = {
- ["minecraft:ender_pearl:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 26,
- ["minecraft:iron_block:0"] = 1,
- },
- handler = makeSmallMachine("minecraft:iron_block:0"),
- durationInTicks = 440,
- },
- ["minecraft:log:3"] = { -- jungle == normal
- ingredients = {
- ["minecraft:ender_pearl:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 26,
- ["minecraft:gold_block:0"] = 1,
- },
- handler = makeSmallMachine("minecraft:gold_block:0"),
- durationInTicks = 480,
- },
- ["minecraft:log2:0"] = { -- acacia == large
- ingredients = {
- ["minecraft:ender_pearl:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 98,
- },
- handler = makeLargeMachine(nil),
- durationInTicks = 520,
- },
- ["minecraft:log2:1"] = { -- dark == giant
- ingredients = {
- ["minecraft:ender_pearl:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 98,
- ["minecraft:diamond_block:0"] = 1,
- },
- handler = makeLargeMachine("minecraft:diamond_block:0"),
- durationInTicks = 560,
- },
- ["minecraft:leaves:0"] = { -- oak leaves == maximum
- ingredients = {
- ["minecraft:ender_pearl:0"] = 1,
- ["compactmachines3:wallbreakable:0"] = 98,
- ["minecraft:emerald_block:0"] = 1,
- },
- handler = makeLargeMachine("minecraft:emerald_block:0"),
- durationInTicks = 600,
- },
- }
- local function getCountOf(name)
- local n = 0
- for i=1,16 do
- local detail = turtle.getItemDetail(i)
- if detail then
- local nameInSlot = detail.name .. ":" .. detail.damage
- if name == nameInSlot then
- n = n + detail.count
- end
- end
- end
- return n
- end
- local function waitForIngredients(recipe, factor)
- print("waiting for ingredients...")
- while true do
- if turtle.suck() then
- local done = true
- for ingredient, count in pairs(recipe.ingredients) do
- local have = getCountOf(ingredient)
- if have < count * factor then
- print("still missing " .. ingredient ..
- " (need " .. (count * factor) .. ", have " .. have .. ")")
- done = false
- break
- end
- end
- if done then
- return
- end
- end
- end
- end
- local function depositToken(name)
- print("depositing token...")
- turtle.select(getSlot(name))
- tscript("rfflDlffr")
- end
- local function dumpInventory()
- for i=1,16 do
- turtle.select(i)
- turtle.drop()
- end
- end
- print("Compression crafter online.")
- while true do
- if turtle.suck() then
- print("Got an ingredient!")
- for token, recipe in pairs(recipes) do
- local slot = getSlot(token)
- if slot then
- local count = turtle.getItemDetail(slot).count
- print("got " .. count .. " of token " .. token .. ".")
- refuel()
- depositToken(token)
- waitForIngredients(recipe, count)
- defragment()
- print("making recipe for " .. token .. "...")
- for i=1,count do
- print("\t"..i.."...")
- recipe.handler()
- os.sleep(recipe.durationInTicks / 20)
- end
- print("done!")
- dumpInventory()
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment