Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --this boy will mine forever and forever
- --please give me enderchest :D
- local tunnelLength = 400
- local tunnelSpacing = 3
- local sortInvInterval = 20
- local twoBlockTall = true --if false tunnels will be 1 block tall, this prevents mob spawns.
- local goodBlocks = {
- ["minecraft:iron_ore"] = true,
- ["minecraft:gold_ore"] = true,
- ["minecraft:redstone_ore"] = true,
- ["minecraft:lapis_ore"] = true,
- ["minecraft:diamond_ore"] = true,
- ["minecraft:coal_ore"] = true,
- ["minecraft:emerald_ore"] = true
- }
- local garbage = {
- ["minecraft:cobblestone"] = true,
- ["minecraft:andesite"] = true,
- ["minecraft:gravel"] = true,
- ["minecraft:dirt"] = true,
- ["minecraft:granite"] = true,
- ["minecraft:diorite"] = true,
- ["minecraft:sand"] = true
- }
- local enderChestName = "ender_chest"
- local fileName = "miningData"
- local startDelay = 5
- local savedData = {pos = {x = 0, y = 0, z = 0, dir = 0}, lastPos = nil}
- local turtlePos = savedData.pos
- function init()
- term.clear()
- term.setCursorPos(1,1)
- print("Locating Ender Chest...")
- findEnderChest()
- print("press any key if this is a fresh start... waiting".. startDelay .. "seconds")
- --wait for the user to either press key or for the timer to expire
- os.startTimer(startDelay)
- local event = os.pullEvent()
- if event == "timer" then
- checkFuel()
- if fs.exists(fileName) then
- local f = fs.open(fileName,"r")
- local d = f.readAll()
- savedData = textutils.unserialize(d)
- else
- saveFile(fileName,savedData)
- end
- else
- if not checkFuel() then
- print("put fuel in and press any key")
- local event = os.pullEvent()
- if event == "key" then
- checkFuel()
- end
- saveFile(filename,savedData)
- end
- --go back to main tunnel if out of line
- if savedData.lastPos then
- local lastP= savedData.lastPos
- navigate(lastP.x, lastP.y, lastP.z, lastP.dir)
- savedData.lastPos = nil
- end
- main()
- end
- function saveFile(file, data)
- local f = fs.open(file,"w")
- f.write(textutils.serialize(data))
- f.close()
- end
- --all movement functions. Makes it look better
- function right()
- turtle.turnRight()
- turtlePos.dir = (turtlePos.dir + 1)
- if turtlePos.dir > 3 then
- turtlePos.dir = 0
- end
- savedData.pos = turtlePos
- saveFile(fileName,savedData)
- return true
- end
- function left()
- turtle.turnLeft()
- turtlePos.dir = (turtlePos.dir - 1)
- if turtlePos.dir < 0 then
- turtlePos.dir = 3
- end
- savedData.pos = turtlePos
- saveFile(fileName,savedData)
- return true
- end
- function forward()
- repeat turtle.dig() until turtle.forward()
- if turtlePos.dir == 0 then
- turtlePos.z = turtlePos.z + 1
- elseif turtlePos.dir == 1 then
- turtlePos.x = turtlePos.x + 1
- elseif turtlePos.dir == 2 then
- turtlePos.z = turtlePos.z - 1
- elseif turtlePos.dir == 3 then
- turtlePos.x = turtlePos.x - 1
- end
- savedData.pos = turtlePos
- saveFile(fileName,savedData)
- return true
- end
- function back()
- if not turtle.back() then
- right()
- right()
- forward()
- left()
- left()
- end
- if turtlePos.dir == 0 then
- turtlePos.z = turtlePos.z - 1
- elseif turtlePos.dir == 1 then
- turtlePos.x = turtlePos.x - 1
- elseif turtlePos.dir == 2 then
- turtlePos.z = turtlePos.z + 1
- elseif turtlePos.dir == 3 then
- turtlePos.x = turtlePos.x + 1
- end
- savedData.pos = turtlePos
- saveFile(fileName,savedData)
- return true
- end
- function up()
- repeat turtle.digUp() until turtle.up()
- turtlePos.y = turtlePos.y + 1
- savedData.pos = turtlePos
- saveFile(fileName,savedData)
- return true
- end
- function down()
- repeat turtle.digDown() until turtle.down()
- turtlePos.y = turtlePos.y - 1
- savedData.pos = turtlePos
- saveFile(fileName,savedData)
- end
- --set the direction of the turtle
- function setDir(dir)
- while dir > turtlePos.dir do
- turnRight()
- end
- while dir < turtlePos.dir do
- turnLeft()
- end
- end
- ---naviate to a specific spot
- function navigate(x,y,z,dir)
- if x < turtlePos.x then
- setDir(3)
- while x < turtlePos.x do
- forward()
- end
- elseif x > turtlePos.x then
- setDir(1)
- while x > turtlePos.x do
- forward()
- end
- elseif z < turtlePos.z then
- setDir(2)
- while z < turtlePos.z do
- forward()
- end
- elseif z > turtlePos.z then
- setDir(0)
- while z > turtlePos.z do
- forward()
- end
- end
- setDir(dir)
- end
- --scan function
- --this function checks the block and gives info
- function inspect(side)
- local worked, data = false, {}
- if not side then
- worked, data = turtle.inspect()
- elseif side == 1 then
- worked, data = turtle.inspectUp()
- elseif side == 2 then
- worked, data = turtle.inspectDown()
- end
- if worked then
- if goodBlocks[data.name] then
- return data.name
- else
- return false
- end
- end
- end
- function scan( nTry )
- if not nTry then
- nTry = 1
- savedData.lastPos = turtlePos
- saveFile(fileName,savedData)
- elseif nTry > 180 then
- return
- end
- --check to the right--
- right()
- if inspect() then
- forward()
- scan(nTry+1)
- back()
- end
- left()
- --check to the left--
- left()
- if inspect() then
- forward()
- scan(nTry+1)
- back()
- end
- right()
- --check in front--
- if inspect() then
- forward()
- scan(nTry+1)
- back()
- end
- --check up--
- if inspect(1) then
- up()
- scan(nTry+1)
- down()
- end
- --check down--
- if inspect(2) then
- down()
- scan(nTry+1)
- up()
- end
- end
- function tunnelOneBlock()
- if twoBlockTall then
- forward()
- scan()
- up()
- scan()
- down()
- else
- forward()
- scan()
- end
- print("X: ".. turtlePos.x .. " Y: " .. turtlePos.y .. " Z: " .. turtlePos.z .. " Dir: " .. turtlePos.dir )
- end
- function findEnderChest()
- for i=1,16 do
- local data = turtle.getItemDetails(i)
- if data then
- if data.name == enderChestName then
- print("ender chest found in slot ".. i)
- return true
- end
- else
- turtle.select(i)
- end
- end
- local name = inspect(1)
- if name then
- if name == enderChestName then
- turtle.digUp()
- return true
- end
- end
- print"ender chest lost. going home")
- navigate(0,0,0,0)
- error("Ender Chest lost")
- end
- function checkFuel()
- if turtle.getFuelLevel() < 500 then
- print("fuel low attempting refuel")
- for i=1,16 do
- local data = turtle.getItemDetail(i)
- if data then
- if data.name == "minecraft:coal" then
- turtle.refuel()
- print("Refuel Success: ".. turtle.getFuelLevel())
- return true
- end
- end
- end
- print("no fuel found. say a prayer")
- else
- return true
- end
- end
- function cleanInv()
- local items = {}
- for i = 1,16 do
- local data = turtle.getItemDetails(i)
- if data then
- items[data.name] = i
- print(data.name .. ": " ..items[data.name])
- end
- end
- if items[enderChestName] then
- turtle.select(items[enderChestName])
- end
- repeat turtle.digUp() until turtle.placeUp()
- for name, slot in pairs(items)
- turtle.select(slot)
- if garbage[name] then
- turtle.drop()
- elseif name == "minecraft:coal" then
- turtle.refuel()
- else
- turtle.dropUp()
- end
- end
- findEnderChest()
- print("Fuel Level: " .. turtle.getFuelLevel())
- end
- function main()
- while true do
- if turtlePos.dir == 0 then
- -- dig main tunnel
- for i=1,(tunnelLength - turtlePos.z) do
- tunnelOneBlock()
- if turtlePos.z % sortInvInterval == 0 then
- cleanInv()
- end
- end
- elseif turtlePos.dir == 2 then
- for i=1,(turtlePos.z - tunnelLength) do
- tunnelOneBlock()
- if turtlePos.z % sortInvInterval == 0 then
- cleanInv()
- end
- end
- end
- --dig to the side
- setDir(1)
- for i=1, (tunnelSpacing - (turtlePos.x % tunnelSpacing)) do
- tunnelOneBlock()
- if turtlePos.z < 10 then
- setDir(0)
- else
- setDir(2)
- end
- end
- end
- end
- init()
Add Comment
Please, Sign In to add comment