iconmaster

compression-crafting.lua

Aug 10th, 2019
371
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.95 KB | None | 0 0
  1. local function getSlot(name)
  2.     for i=1,16 do
  3.         local detail = turtle.getItemDetail(i)
  4.         if detail then
  5.             local nameInSlot = detail.name .. ":" .. detail.damage
  6.             if name == nameInSlot then
  7.                 return i
  8.             end
  9.         end
  10.     end
  11. end
  12.  
  13. local function tscript(s)
  14.     for i=1, #s do
  15.         local c = s:sub(i, i)
  16.         if c == "f" then
  17.             turtle.forward()
  18.         elseif c == "d" then
  19.             turtle.down()
  20.         elseif c == "b" then
  21.             turtle.back()
  22.         elseif c == "u" then
  23.             turtle.up()
  24.         elseif c == "l" then
  25.             turtle.turnLeft()
  26.         elseif c == "r" then
  27.             turtle.turnRight()
  28.         elseif c == "P" then
  29.             local detail =  turtle.getItemDetail()
  30.             local nameInSlot = detail.name .. ":" .. detail.damage
  31.             turtle.place()
  32.             local slot = getSlot(nameInSlot)
  33.             if slot then turtle.select(slot) end
  34.         elseif c == "D" then
  35.             turtle.drop()
  36.         elseif c == "S" then
  37.             turtle.suck()
  38.         end
  39.     end
  40. end
  41.  
  42. local function defragment()
  43.     print("defragmenting inventory...")
  44.     local nameToSlot = {}
  45.     for i=1,16 do
  46.         local detail = turtle.getItemDetail(i)
  47.         if detail then
  48.             local nameInSlot = detail.name .. ":" .. detail.damage
  49.             if nameToSlot[nameInSlot] then
  50.                 turtle.select(i)
  51.                 turtle.transferTo(nameToSlot[nameInSlot])
  52.             else
  53.                 nameToSlot[nameInSlot] = i
  54.             end
  55.         end
  56.     end
  57. end
  58.  
  59. local function firstEmptySlot()
  60.     for i=1,16 do
  61.         local detail = turtle.getItemDetail(i)
  62.         if not detail then
  63.             return i
  64.         end
  65.     end
  66. end
  67.  
  68. local refuel
  69. refuel = function()
  70.     if turtle.getFuelLevel() > 100 then return end
  71.     print("refueling...")
  72.     local coalSlot = getSlot("minecraft:coal:0")
  73.     if coalSlot then
  74.         print("found coal.")
  75.         turtle.select(coalSlot)
  76.         turtle.refuel()
  77.     else
  78.         print("finding coal...")
  79.         tscript("rflSlfr")
  80.         refuel()
  81.     end
  82. end
  83.  
  84. local function makeWall()
  85.     turtle.select(getSlot("minecraft:iron_block:0"))
  86.     tscript("rfrfP")
  87.     turtle.select(getSlot("minecraft:redstone:0"))
  88.     tscript("uPb")
  89.     turtle.drop(1)
  90.     tscript("dlbl")
  91. end
  92.  
  93. local function makeTunnel()
  94.     turtle.select(getSlot("compactmachines3:wallbreakable:0"))
  95.     tscript("rrfddfP")
  96.     turtle.select(getSlot("minecraft:hopper:0"))
  97.     tscript("uPdb")
  98.     turtle.select(getSlot("minecraft:redstone:0"))
  99.     tscript("PrflPrflfflPrflPrflfflPrflPrflfflPrflPrflffluub")
  100.     turtle.drop(1)
  101.     tscript("rr")
  102. end
  103.  
  104. local function makeSmallMachine(center) return function()
  105.     turtle.select(getSlot("compactmachines3:wallbreakable:0"))
  106.     tscript("rrfddf")
  107.     -- first layer
  108.     tscript("ffPbPbPlfrffPbPbPlfrffPbPbPurffl")
  109.     -- second layer
  110.     tscript("ffPbPbPlfrffPb")
  111.     if center then
  112.         turtle.select(getSlot(center))
  113.         turtle.place()
  114.         turtle.select(getSlot("compactmachines3:wallbreakable:0"))
  115.     end
  116.     tscript("bPlfrffPbPbPurffl")
  117.     -- third layer
  118.     tscript("ffPbPbPlfrffPbPbPlfrffPbPbPrflbb")
  119.     turtle.select(getSlot("minecraft:ender_pearl:0"))
  120.     turtle.drop(1)
  121.     tscript("rfr")
  122. end end
  123.  
  124. local function makeLargeMachine(center) return function()
  125.     tscript("lflfdd")
  126.     -- layer 1
  127.     for i=1,5 do
  128.         tscript("ffffPbPbPbPbPlfr")
  129.     end
  130.     tscript("urfffffl")
  131.     -- layer 2
  132.     tscript("ffffPbPbPbPbPlfr")
  133.     for i=1,3 do
  134.         tscript("ffffPbbbbPlfr")
  135.     end
  136.     tscript("ffffPbPbPbPbPlfr")
  137.     tscript("urfffffl")
  138.     -- layer 3
  139.     tscript("ffffPbPbPbPbPlfr")
  140.     tscript("ffffPbbbbPlfr")
  141.     tscript("ffffPbb")
  142.     if center then
  143.         turtle.select(getSlot(center))
  144.         turtle.place()
  145.         turtle.select(getSlot("compactmachines3:wallbreakable:0"))
  146.     end
  147.     tscript("bbPlfr")
  148.     tscript("ffffPbbbbPlfr")
  149.     tscript("ffffPbPbPbPbPlfr")
  150.     tscript("urfffffl")
  151.     -- layer 4
  152.     tscript("ffffPbPbPbPbPlfr")
  153.     for i=1,3 do
  154.         tscript("ffffPbbbbPlfr")
  155.     end
  156.     tscript("ffffPbPbPbPbPlfr")
  157.     tscript("urfffffl")
  158.     -- layer 5
  159.     for i=1,5 do
  160.         tscript("ffffPbPbPbPbPlfr")
  161.     end
  162.     -- done
  163.     tscript("rffflddb")
  164.     turtle.select(getSlot("minecraft:ender_pearl:0"))
  165.     turtle.drop(1)
  166.     tscript("rrlfr")
  167. end end
  168.  
  169. local recipes = {
  170.     ["minecraft:stick:0"] = { -- stick == compact wall
  171.         ingredients = {
  172.             ["minecraft:iron_block:0"] = 1,
  173.             ["minecraft:redstone:0"] = 2,
  174.         },
  175.         handler = makeWall,
  176.         durationInTicks = 100,
  177.     },
  178.     ["minecraft:log:0"] = { -- oak == tunnel
  179.         ingredients = {
  180.             ["minecraft:redstone:0"] = 9,
  181.             ["minecraft:hopper:0"] = 1,
  182.             ["compactmachines3:wallbreakable:0"] = 1,
  183.         },
  184.         handler = makeTunnel,
  185.         durationInTicks = 200,
  186.     },
  187.     ["minecraft:log:1"] = { -- spruce == tiny
  188.         ingredients = {
  189.             ["minecraft:ender_pearl:0"] = 1,
  190.             ["compactmachines3:wallbreakable:0"] = 26,
  191.         },
  192.         handler = makeSmallMachine(nil),
  193.         durationInTicks = 400,
  194.     },
  195.     ["minecraft:log:2"] = { -- birch == small
  196.         ingredients = {
  197.             ["minecraft:ender_pearl:0"] = 1,
  198.             ["compactmachines3:wallbreakable:0"] = 26,
  199.             ["minecraft:iron_block:0"] = 1,
  200.         },
  201.         handler = makeSmallMachine("minecraft:iron_block:0"),
  202.         durationInTicks = 440,
  203.     },
  204.     ["minecraft:log:3"] = { -- jungle == normal
  205.         ingredients = {
  206.             ["minecraft:ender_pearl:0"] = 1,
  207.             ["compactmachines3:wallbreakable:0"] = 26,
  208.             ["minecraft:gold_block:0"] = 1,
  209.         },
  210.         handler = makeSmallMachine("minecraft:gold_block:0"),
  211.         durationInTicks = 480,
  212.     },
  213.     ["minecraft:log2:0"] = { -- acacia == large
  214.         ingredients = {
  215.             ["minecraft:ender_pearl:0"] = 1,
  216.             ["compactmachines3:wallbreakable:0"] = 98,
  217.         },
  218.         handler = makeLargeMachine(nil),
  219.         durationInTicks = 520,
  220.     },
  221.     ["minecraft:log2:1"] = { -- dark == giant
  222.         ingredients = {
  223.             ["minecraft:ender_pearl:0"] = 1,
  224.             ["compactmachines3:wallbreakable:0"] = 98,
  225.             ["minecraft:diamond_block:0"] = 1,
  226.         },
  227.         handler = makeLargeMachine("minecraft:diamond_block:0"),
  228.         durationInTicks = 560,
  229.     },
  230.     ["minecraft:leaves:0"] = { -- oak leaves == maximum
  231.         ingredients = {
  232.             ["minecraft:ender_pearl:0"] = 1,
  233.             ["compactmachines3:wallbreakable:0"] = 98,
  234.             ["minecraft:emerald_block:0"] = 1,
  235.         },
  236.         handler = makeLargeMachine("minecraft:emerald_block:0"),
  237.         durationInTicks = 600,
  238.     },
  239. }
  240.  
  241. local function getCountOf(name)
  242.     local n = 0
  243.     for i=1,16 do
  244.         local detail = turtle.getItemDetail(i)
  245.         if detail then
  246.             local nameInSlot = detail.name .. ":" .. detail.damage
  247.             if name == nameInSlot then
  248.                 n = n + detail.count
  249.             end
  250.         end
  251.     end
  252.     return n
  253. end
  254.  
  255. local function waitForIngredients(recipe, factor)
  256.     print("waiting for ingredients...")
  257.     while true do
  258.         if turtle.suck() then
  259.             local done = true
  260.             for ingredient, count in pairs(recipe.ingredients) do
  261.                 local have = getCountOf(ingredient)
  262.                 if have < count * factor then
  263.                     print("still missing " .. ingredient ..
  264.                         " (need " .. (count * factor) .. ", have " .. have .. ")")
  265.                     done = false
  266.                     break
  267.                 end
  268.             end
  269.             if done then
  270.                 return
  271.             end
  272.         end
  273.     end
  274. end
  275.  
  276. local function depositToken(name)
  277.     print("depositing token...")
  278.     turtle.select(getSlot(name))
  279.     tscript("rfflDlffr")
  280. end
  281.  
  282. local function dumpInventory()
  283.     for i=1,16 do
  284.         turtle.select(i)
  285.         turtle.drop()
  286.     end
  287. end
  288.  
  289. print("Compression crafter online.")
  290.  
  291. while true do
  292.     if turtle.suck() then
  293.         print("Got an ingredient!")
  294.         for token, recipe in pairs(recipes) do
  295.             local slot = getSlot(token)
  296.             if slot then
  297.                 local count = turtle.getItemDetail(slot).count
  298.                 print("got " .. count .. " of token " .. token .. ".")
  299.                 refuel()
  300.                 depositToken(token)
  301.                 waitForIngredients(recipe, count)
  302.                 defragment()
  303.                 print("making recipe for " .. token .. "...")
  304.                 for i=1,count do
  305.                     print("\t"..i.."...")
  306.                     recipe.handler()
  307.                     os.sleep(recipe.durationInTicks / 20)
  308.                 end
  309.                 print("done!")
  310.                 dumpInventory()
  311.             end
  312.         end
  313.     end
  314. end
Advertisement
Add Comment
Please, Sign In to add comment