Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- startup:
- shell.run("/rom/programs/turtle/dig", "restore")
- shell.run("/dig", "restore")
- ]]
- local stateFileName = "/dig.state"
- local maxDepth = 1000 -- for debug, default=1000
- local ender_chest = "EnderStorage:enderChest"
- local restore = false
- local size = 0
- local xPos,zPos = 0,-1
- local xDir,zDir = 0,1
- local depth = 0
- local function usage()
- print( "Usage: dig <diameter> [max_depth]" )
- print( "Pattern: ")
- print( "###" )
- print( "###" )
- print( "###" )
- print( "^ <-turtle" )
- end
- local function restoreState()
- if not fs.exists(stateFileName) then
- print("Can't find state file")
- return false
- end
- local f = fs.open(stateFileName, "r")
- local state = f.readAll()
- f.close()
- local result = textutils.unserialize( state )
- if type(result) == "table" and #result == 7 then
- size = result[1]
- xPos, zPos = result[2], result[3]
- xDir, zDir = result[4], result[5]
- maxDepth = result[6]
- return true
- else
- print("Incorrect format")
- return false
- end
- end
- local function saveState()
- local f = fs.open(stateFileName, "w")
- local state = textutils.serialize({size, xPos, zPos, xDir, zDir, maxDepth})
- f.write(state)
- f.close()
- end
- local function deleteState()
- fs.delete(stateFileName)
- end
- local function refuel(needed)
- local fuelLevel = turtle.getFuelLevel()
- if fuelLevel == "unlimited" then
- return true
- end
- if fuelLevel < needed then
- for n=1,16 do
- if turtle.getItemCount(n) > 0 then
- turtle.select( n )
- if turtle.refuel(1) then
- while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
- turtle.refuel(1)
- end
- end
- if turtle.getFuelLevel() >= needed then
- turtle.select(1)
- return true
- end
- end
- end
- turtle.select(1)
- return false
- end
- return true
- end
- local nofuel = false
- local function checkFuel(needed)
- local fuelLevel = turtle.getFuelLevel()
- if fuelLevel == "unlimited" then
- nofuel = false
- return true
- end
- if fuelLevel < needed then
- nofuel = true
- else
- nofuel = false
- end
- return not nofuel
- end
- local function hasSlots()
- if turtle.getItemCount(15)==0 then
- return true
- else
- return false
- end
- end
- local function unload()
- while not turtle.up() do
- sleep(0.1)
- end
- turtle.select(16)
- while not turtle.placeDown() do
- sleep(0.1)
- end
- for i=1,15 do
- if turtle.getItemCount(i) > 0 then
- turtle.select(i)
- turtle.dropDown()
- sleep(0.5)
- end
- end
- turtle.select(16)
- turtle.digDown()
- turtle.select(1)
- while not turtle.down() do
- sleep(0.1)
- end
- end
- local function forceDig()
- turtle.select(1)
- if turtle.dig() then
- return true
- else
- return false
- end
- end
- local function tryDig()
- if not hasSlots() then
- return false
- end
- turtle.select(1)
- if turtle.dig() then
- return true
- else
- return false
- end
- end
- local function tryDigDown()
- if not hasSlots() then
- unload()
- end
- if not hasSlots() then
- return false
- end
- turtle.select(1)
- if turtle.digDown() then
- return true
- else
- return false
- end
- end
- local function tryDown()
- if depth>=maxDepth then
- return false
- end
- if not turtle.down() then
- if not tryDigDown() then
- return false
- end
- if not turtle.down() then
- return false
- end
- end
- depth = depth + 1
- return true
- end
- local function tryUp()
- if not turtle.up() then
- if not turtle.digUp() then
- return false
- end
- if not turtle.up() then
- return false
- end
- end
- depth = depth - 1
- return true
- end
- local function makeMine()
- if checkFuel(512)==false then
- return false
- end
- while tryDown() do
- end
- while depth>0 do
- tryUp()
- end
- if hasSlots() then
- return true
- else
- return false
- end
- end
- local function dropResources()
- for i=1,16 do
- if turtle.getItemCount(i)>0 then
- turtle.select(i)
- turtle.drop()
- sleep(0.5)
- end
- end
- end
- local function turnLeft()
- turtle.turnLeft()
- xDir, zDir = -zDir, xDir
- end
- local function turnRight()
- turtle.turnRight()
- xDir, zDir = zDir, -xDir
- end
- local function tryForward()
- tries = 0
- while not turtle.forward() do
- forceDig()
- tries = tries + 1
- if tries > 20 then
- return false
- end
- sleep(0.8)
- end
- xPos = xPos + xDir
- zPos = zPos + zDir
- return true
- end
- local function forceForward()
- while not turtle.forward() do
- forceDig()
- sleep(0.8)
- end
- xPos = xPos + xDir
- zPos = zPos + zDir
- return true
- end
- local function gotoDir(xd, zd)
- while (xDir ~= xd) or (zDir ~= zd) do
- turnLeft()
- end
- end
- local function goto(x, z, xd0, zd0)
- local xd = 0
- if (xPos-x) < 0 then
- xd = 1
- else
- xd = -1
- end
- local zd = 0
- if (zPos-z) < 0 then
- zd = 1
- else
- zd = -1
- end
- gotoDir(xd, 0)
- while xPos ~= x do
- forceForward()
- end
- gotoDir(0, zd)
- while zPos ~= z do
- forceForward()
- end
- gotoDir(xd0, zd0)
- end
- local function goNext()
- local z = zPos + zDir
- if (z>=0) and (z<size) then
- return tryForward()
- end
- if (xPos+1) >= size then
- return false
- end
- local zd = zDir
- if zd==1 then
- turnRight()
- else
- turnLeft()
- end
- if not tryForward() then
- return false
- end
- if zd==1 then
- turnRight()
- else
- turnLeft()
- end
- return true
- end
- local tArgs = { ... }
- if tArgs[1]=="restore" then
- restore = true
- print("restoring state...")
- restoreState()
- elseif tArgs[1]=="autorun" then
- local s = "while turtle.up() do\nend\nturtle.down()\n"
- local f = fs.open("/startup", "w")
- f.write(s)
- f.close()
- return
- else
- if #tArgs < 1 then
- usage()
- return
- end
- size = tonumber( tArgs[1] )
- if #tArgs > 1 then
- maxDepth = tonumber( tArgs[2] )
- end
- end
- if size < 1 then
- print( "Excavate diameter must be positive" )
- return
- end
- -- find ender chest
- local item = turtle.getItemDetail(16)
- if item == nil or item.name ~= ender_chest then
- print("Put ender chest to slot 16!")
- return
- end
- if restore then
- local x,z,xd,zd = xPos,zPos,xDir,zDir
- xPos,zPos,xDir,zDir = 0,-1,0,1
- depth = 0
- goto(x,z,xd,zd)
- else
- goto(0, 0, 0, 1)
- end
- while true do
- saveState()
- while not makeMine() do
- break
- end
- if not goNext() then
- break
- end
- end
- goto(0, -1, 0, 1)
- unload()
- if nofuel then
- print("No enough fuel")
- return
- end
- deleteState()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement