bcash8

Infinite Mining Turtle v1

Sep 3rd, 2021 (edited)
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.13 KB | None | 0 0
  1. --this boy will mine forever and forever
  2. --please give me enderchest :D
  3.  
  4.  
  5. local tunnelLength = 400
  6. local tunnelSpacing = 3
  7. local sortInvInterval = 20
  8. local twoBlockTall = true --if false tunnels will be 1 block tall, this prevents mob spawns.
  9.  
  10. local goodBlocks = {
  11.   ["minecraft:iron_ore"] = true,
  12.   ["minecraft:gold_ore"] = true,
  13.   ["minecraft:redstone_ore"] = true,
  14.   ["minecraft:lapis_ore"] = true,
  15.   ["minecraft:diamond_ore"] = true,
  16.   ["minecraft:coal_ore"] = true,
  17.   ["minecraft:emerald_ore"] = true
  18. }
  19.  
  20. local garbage = {
  21.   ["minecraft:cobblestone"] = true,
  22.   ["minecraft:andesite"] = true,
  23.   ["minecraft:gravel"] = true,
  24.   ["minecraft:dirt"] = true,
  25.   ["minecraft:granite"] = true,
  26.   ["minecraft:diorite"] = true,
  27.   ["minecraft:sand"] = true
  28. }
  29.  
  30. local enderChestName = "ender_chest"
  31. local fileName = "miningData"
  32. local startDelay = 5
  33. local savedData = {pos = {x = 0, y = 0, z = 0, dir = 0}, lastPos = nil}
  34. local turtlePos = savedData.pos
  35.  
  36. function init()
  37.   term.clear()
  38.   term.setCursorPos(1,1)
  39.   print("Locating Ender Chest...")
  40.   findEnderChest()
  41.  
  42.   print("press any key if this is a fresh start... waiting".. startDelay .. "seconds")
  43.  
  44.   --wait for the user to either press key or for the timer to expire
  45.   os.startTimer(startDelay)
  46.   local event = os.pullEvent()
  47.   if event == "timer" then
  48.     checkFuel()
  49.     if fs.exists(fileName) then
  50.       local f = fs.open(fileName,"r")
  51.       local d = f.readAll()
  52.       savedData = textutils.unserialize(d)
  53.     else
  54.       saveFile(fileName,savedData)
  55.     end
  56.   else
  57.     if not checkFuel() then
  58.       print("put fuel in and press any key")
  59.       local event = os.pullEvent()
  60.       if event == "key" then
  61.         checkFuel()
  62.       end
  63.     saveFile(filename,savedData)
  64.   end
  65.  
  66.   --go back to main tunnel if out of line
  67.  
  68.   if savedData.lastPos then
  69.     local lastP= savedData.lastPos
  70.     navigate(lastP.x, lastP.y, lastP.z, lastP.dir)
  71.     savedData.lastPos = nil
  72.   end
  73.   main()
  74. end
  75.  
  76. function saveFile(file, data)
  77.   local f = fs.open(file,"w")
  78.   f.write(textutils.serialize(data))
  79.   f.close()
  80. end
  81.  
  82. --all movement functions. Makes it look better
  83. function right()
  84.    turtle.turnRight()
  85.    turtlePos.dir = (turtlePos.dir + 1)
  86.    if turtlePos.dir > 3 then
  87.      turtlePos.dir = 0
  88.    end
  89.    savedData.pos = turtlePos
  90.    saveFile(fileName,savedData)
  91.    return true
  92. end
  93.  
  94. function left()
  95.   turtle.turnLeft()
  96.   turtlePos.dir = (turtlePos.dir - 1)
  97.   if turtlePos.dir < 0 then
  98.     turtlePos.dir = 3
  99.   end
  100.   savedData.pos = turtlePos
  101.   saveFile(fileName,savedData)
  102.   return true
  103. end
  104.  
  105. function forward()
  106.   repeat turtle.dig() until turtle.forward()
  107.  
  108.   if turtlePos.dir == 0 then
  109.     turtlePos.z = turtlePos.z + 1
  110.   elseif turtlePos.dir == 1 then
  111.     turtlePos.x = turtlePos.x + 1
  112.   elseif turtlePos.dir == 2 then
  113.     turtlePos.z = turtlePos.z - 1
  114.   elseif turtlePos.dir == 3 then
  115.     turtlePos.x = turtlePos.x - 1
  116.   end
  117.   savedData.pos = turtlePos
  118.   saveFile(fileName,savedData)
  119.   return true
  120. end
  121.  
  122. function back()
  123.   if not turtle.back() then
  124.     right()
  125.     right()
  126.     forward()
  127.     left()
  128.     left()
  129.   end
  130.  
  131.   if turtlePos.dir == 0 then
  132.     turtlePos.z = turtlePos.z - 1
  133.   elseif turtlePos.dir == 1 then
  134.     turtlePos.x = turtlePos.x - 1
  135.   elseif turtlePos.dir == 2 then
  136.     turtlePos.z = turtlePos.z + 1
  137.   elseif turtlePos.dir == 3 then
  138.     turtlePos.x = turtlePos.x + 1
  139.   end
  140.   savedData.pos = turtlePos
  141.   saveFile(fileName,savedData)
  142.   return true
  143. end
  144.  
  145. function up()
  146.   repeat turtle.digUp() until turtle.up()
  147.   turtlePos.y = turtlePos.y + 1
  148.   savedData.pos = turtlePos
  149.   saveFile(fileName,savedData)
  150.   return true
  151. end
  152.  
  153. function down()
  154.   repeat turtle.digDown() until turtle.down()
  155.   turtlePos.y = turtlePos.y - 1
  156.   savedData.pos = turtlePos
  157.   saveFile(fileName,savedData)
  158. end
  159.  
  160. --set the direction of the turtle
  161. function setDir(dir)
  162.   while dir > turtlePos.dir do
  163.     turnRight()
  164.   end
  165.   while dir < turtlePos.dir do
  166.     turnLeft()
  167.   end
  168. end
  169. ---naviate to a specific spot
  170. function navigate(x,y,z,dir)
  171.   if x < turtlePos.x then
  172.     setDir(3)
  173.     while x < turtlePos.x do
  174.       forward()
  175.     end
  176.   elseif x > turtlePos.x then
  177.     setDir(1)
  178.     while x > turtlePos.x do
  179.       forward()
  180.     end
  181.   elseif z < turtlePos.z then
  182.     setDir(2)
  183.     while z < turtlePos.z do
  184.       forward()
  185.     end
  186.   elseif z > turtlePos.z then
  187.     setDir(0)
  188.     while z > turtlePos.z do
  189.       forward()
  190.     end
  191.   end
  192.   setDir(dir)
  193. end
  194. --scan function
  195. --this function checks the block and gives info
  196. function inspect(side)
  197.   local worked, data = false, {}
  198.   if not side then
  199.     worked, data = turtle.inspect()
  200.   elseif side == 1 then
  201.     worked, data = turtle.inspectUp()
  202.   elseif side == 2 then
  203.     worked, data = turtle.inspectDown()
  204.   end
  205.  
  206.   if worked then
  207.     if goodBlocks[data.name] then
  208.       return data.name
  209.     else
  210.       return false
  211.     end
  212.   end
  213. end
  214.  
  215. function scan( nTry )
  216.   if not nTry then
  217.     nTry = 1
  218.     savedData.lastPos = turtlePos
  219.     saveFile(fileName,savedData)
  220.   elseif nTry > 180 then
  221.     return
  222.   end
  223.  
  224. --check to the right--
  225.   right()
  226.   if inspect() then
  227.     forward()
  228.     scan(nTry+1)
  229.     back()
  230.   end
  231.   left()
  232. --check to the left--
  233.   left()
  234.   if inspect() then
  235.     forward()
  236.     scan(nTry+1)
  237.     back()
  238.   end
  239.   right()
  240.  
  241. --check in front--
  242.   if inspect() then
  243.     forward()
  244.     scan(nTry+1)
  245.     back()
  246.   end
  247.  
  248. --check up--
  249.   if inspect(1) then
  250.     up()
  251.     scan(nTry+1)
  252.     down()
  253.   end
  254.  
  255. --check down--
  256.   if inspect(2) then
  257.     down()
  258.     scan(nTry+1)
  259.     up()
  260.   end
  261. end
  262.  
  263. function tunnelOneBlock()
  264.   if twoBlockTall then
  265.     forward()
  266.     scan()
  267.     up()
  268.     scan()
  269.     down()
  270.   else
  271.     forward()
  272.     scan()
  273.   end
  274.  
  275.   print("X: ".. turtlePos.x .. " Y: " .. turtlePos.y .. " Z: " .. turtlePos.z .. " Dir: " .. turtlePos.dir )
  276. end
  277.  
  278. function findEnderChest()
  279.   for i=1,16 do
  280.     local data = turtle.getItemDetails(i)
  281.     if data then
  282.       if data.name == enderChestName then
  283.         print("ender chest found in slot ".. i)
  284.         return true
  285.       end
  286.     else
  287.       turtle.select(i)
  288.     end
  289.   end
  290.  
  291.   local name = inspect(1)
  292.   if name then
  293.     if name == enderChestName then
  294.       turtle.digUp()
  295.       return true
  296.     end
  297.   end
  298.  
  299.   print"ender chest lost. going home")
  300.   navigate(0,0,0,0)
  301.   error("Ender Chest lost")
  302. end
  303.  
  304. function checkFuel()
  305.   if turtle.getFuelLevel() < 500 then
  306.     print("fuel low attempting refuel")
  307.     for i=1,16 do
  308.       local data = turtle.getItemDetail(i)
  309.       if data then
  310.         if data.name == "minecraft:coal" then
  311.           turtle.refuel()
  312.           print("Refuel Success: ".. turtle.getFuelLevel())
  313.           return true
  314.         end
  315.       end
  316.     end
  317.     print("no fuel found. say a prayer")
  318.   else
  319.     return true
  320.   end
  321. end
  322.  
  323. function cleanInv()
  324.   local items = {}
  325.   for i = 1,16 do
  326.     local data = turtle.getItemDetails(i)
  327.     if data then
  328.       items[data.name] = i
  329.       print(data.name .. ": " ..items[data.name])
  330.     end
  331.   end
  332.  
  333.   if items[enderChestName] then
  334.     turtle.select(items[enderChestName])
  335.   end
  336.  
  337.   repeat turtle.digUp() until turtle.placeUp()
  338.  
  339.   for name, slot in pairs(items)
  340.     turtle.select(slot)
  341.     if garbage[name] then
  342.       turtle.drop()
  343.     elseif name == "minecraft:coal" then
  344.       turtle.refuel()
  345.     else
  346.       turtle.dropUp()
  347.     end
  348.   end
  349.  
  350.   findEnderChest()
  351.  
  352.   print("Fuel Level: " .. turtle.getFuelLevel())
  353. end
  354.  
  355. function main()
  356.   while true do
  357.     if turtlePos.dir == 0 then
  358.      -- dig main tunnel
  359.       for i=1,(tunnelLength - turtlePos.z) do
  360.         tunnelOneBlock()
  361.         if turtlePos.z % sortInvInterval == 0 then
  362.           cleanInv()
  363.         end
  364.       end
  365.     elseif turtlePos.dir == 2 then
  366.       for i=1,(turtlePos.z - tunnelLength) do
  367.         tunnelOneBlock()
  368.         if turtlePos.z % sortInvInterval == 0 then
  369.           cleanInv()
  370.         end
  371.       end
  372.     end
  373.     --dig to the side
  374.     setDir(1)
  375.     for i=1, (tunnelSpacing - (turtlePos.x % tunnelSpacing)) do
  376.       tunnelOneBlock()
  377.       if turtlePos.z < 10 then
  378.         setDir(0)
  379.       else
  380.         setDir(2)
  381.       end
  382.     end
  383.   end
  384. end
  385.  
  386. init()
  387.  
Add Comment
Please, Sign In to add comment