Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ores
- -- Mines specifically for ores, every third level within specified range
- -- Turtle returns to its starting point when mission is completed or fuel runs low
- -- Written by HarvDad, March 2014
- args = {...}
- nArgs = #args
- version = "ores: Rev 3.0"
- mission = "Mine specifically for ores, every third level"
- instructions = "The first 3 slots must contain blocks to be ignored.."
- usage = "ores <length> <width> [level]"
- x = 0
- y = 0
- z = 0
- face = 0
- minimumFuel = 100
- missionMessage = "Mission complete."
- abort = false
- maxLevel = 0
- local currentFuelLevel = turtle.getFuelLevel()
- -- The following 'face' directions are relative to the starting position of the turtle in this program
- north = 0
- west = 1
- south = 2
- east = 3
- if nArgs == 0 or (nArgs == 1 and args[1]== "help") then
- print(version)
- print(mission)
- print(instructions)
- print(usage)
- return
- end
- if nArgs < 2 or nArgs > 3 then
- print(usage)
- return
- end
- length = tonumber(args[1])
- if length == nil then
- print("\"", args[1], "\" is not a valid length")
- return
- end
- if length < 1 then
- print("length must be a positive number greater than zero")
- end
- width = tonumber(args[2])
- if width == nil then
- print("\"", args[2], "\" is not a valid width")
- return
- end
- if width < 1 then
- print("width must be a positive number greater than zero")
- end
- if nArgs == 3 then
- maxLevel = ((math.floor(tonumber(args[3]) / 3)) * 3) + 1
- if maxLevel == nil then
- print("\"", args[3], "\" is not a valid start level")
- return
- end
- end
- targetArea = length * width
- areaCovered = 1
- currentSlot = 2
- chestSlot = 16
- garbageSlot = 3
- maxSlot = 16
- nextTurn = "left"
- local clock = os.clock
- function sleep(n) -- seconds
- local t0 = clock()
- while clock() - t0 <= n do end
- end
- function left()
- if face == 0 then face = 1 turtle.turnLeft() return end
- if face == 1 then face = 2 turtle.turnLeft() return end
- if face == 2 then face = 3 turtle.turnLeft() return end
- if face == 3 then face = 0 turtle.turnLeft() return end
- print("function left\(\): Bad face value: ", face)
- end
- function right()
- if face == 0 then face = 3 turtle.turnRight() return end
- if face == 1 then face = 0 turtle.turnRight() return end
- if face == 2 then face = 1 turtle.turnRight() return end
- if face == 3 then face = 2 turtle.turnRight() return end
- print("function right\(\): Bad face value: ", face)
- end
- function up()
- for i=1,10 do
- if not turtle.up() then
- if turtle.detectUp() then
- digUp()
- else
- turtle.attackUp()
- sleep(2)
- end
- else
- break
- end
- end
- y = y+1
- end
- function rise(nBlocks)
- local i
- for i=1,nBlocks do
- up()
- end
- end
- function down()
- for i=1,10 do
- if not turtle.down() then
- if turtle.detectDown() then
- digDown()
- else
- turtle.attackDown()
- sleep(2)
- end
- else
- break
- end
- end
- y = y-1
- end
- function turn()
- if nextTurn == "left" then
- left()
- else
- right()
- end
- chomp()
- forward()
- if nextTurn == "left" then
- left()
- nextTurn = "right"
- else
- right()
- nextTurn = "left"
- end
- areaCovered = areaCovered + 1
- end
- function forward(keepTrackOfArea)
- if keepTrackOfArea == nil then
- keepTrackOfArea = true
- end
- while turtle.detect() do -- This loop added in case of falling sand or whatever
- dig()
- end
- for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way
- if not turtle.forward() then
- if turtle.detect() then
- dig()
- else
- turtle.attack()
- sleep(2)
- end
- else
- break
- end
- end
- if keepTrackOfArea then
- areaCovered = areaCovered + 1
- end
- if face == 0 then z = z+1 return end
- if face == 1 then x = x-1 return end
- if face == 2 then z = z-1 return end
- if face == 3 then x = x+1 return end
- end
- function dig()
- if noMoreEmptySlots() then
- jettisonGarbage()
- goEmptyInventoryToChestAndReturn()
- end
- turtle.dig()
- end
- function digUp()
- if noMoreEmptySlots() then
- jettisonGarbage()
- goEmptyInventoryToChestAndReturn()
- end
- turtle.digUp()
- end
- function digDown()
- if noMoreEmptySlots() then
- jettisonGarbage()
- goEmptyInventoryToChestAndReturn()
- end
- turtle.digDown()
- end
- function setFace(f)
- if f == 0 then
- if face == 0 then return end
- if face == 1 then right() return end
- if face == 2 then right() right() return end
- if face == 3 then left() return end
- end
- if f == 1 then
- if face == 0 then left() return end
- if face == 1 then return end
- if face == 2 then right() return end
- if face == 3 then right() right() return end
- end
- if f == 2 then
- if face == 0 then left() left() return end
- if face == 1 then left() return end
- if face == 2 then return end
- if face == 3 then right() return end
- end
- if f == 3 then
- if face == 0 then right() return end
- if face == 1 then left() left() return end
- if face == 2 then left() return end
- if face == 3 then return end
- end
- end
- function home(homeFace)
- if x < 0 then
- setFace(east)
- while x < 0 do
- forward()
- end
- else
- if x > 0 then
- setFace(west)
- while x > 0 do
- forward()
- end
- end
- end
- if z < 0 then
- setFace(north)
- while z < 0 do
- forward()
- end
- else
- if z > 0 then
- setFace(south)
- while z > 0 do
- forward()
- end
- end
- end
- if y > 0 then
- while y > 0 do
- down()
- end
- end
- if homeFace ~= nil then
- setFace(homeFace)
- end
- end
- function returnToMark()
- if markZ < 0 then
- setFace(south)
- while z > markZ do
- forward(false)
- end
- else
- if markZ > 0 then
- setFace(north)
- while z < markZ do
- forward(false)
- end
- end
- end
- if markX < 0 then
- setFace(west)
- while x > markX do
- forward(false)
- end
- else
- if markX > 0 then
- setFace(east)
- while x < markX do
- forward(false)
- end
- end
- end
- setFace(markFace)
- end
- function ensureMaterial()
- if turtle.getItemCount(materialSlot) < 3 then
- organizeMaterial()
- end
- if turtle.getItemCount(materialSlot) < 3 then
- print("No more material")
- return false
- end
- return true
- end
- function organizeMaterial()
- local i
- materialCount = turtle.getItemCount(materialSlot)
- if materialCount < 3 then
- print("Attempting to refill slot ", materialSlot)
- for i=2,16 do
- turtle.select(i)
- if turtle.compareTo(materialSlot) then
- turtle.transferTo(materialSlot)
- end
- end
- end
- turtle.select(materialSlot)
- end
- function ignoreUp()
- for slot=1,3 do
- turtle.select(slot)
- if turtle.compareUp() then
- return true
- end
- end
- return false
- end
- function ignoreDown()
- for slot=1,3 do
- turtle.select(slot)
- if turtle.compareDown() then
- return true
- end
- end
- return false
- end
- function mineUp()
- while turtle.detectUp() do
- digUp()
- end
- end
- function mineDown()
- if turtle.detectDown() then
- digDown()
- end
- end
- function mineAtLevel()
- end
- function layBlock()
- turtle.select(materialSlot)
- if maxLevel > 2 then
- if turtle.detectUp() then
- if turtle.compareUp() then
- return
- else
- digUp()
- end
- end
- if ensureMaterial() then
- turtle.placeUp()
- end
- else
- if turtle.detectDown() then
- if turtle.compareDown() then
- return
- else
- digDown()
- end
- end
- if ensureMaterial() then
- turtle.placeDown()
- end
- end
- end
- function checkFuel()
- if currentFuelLevel == "unlimited" then
- return true
- end
- if currentFuelLevel < minimumFuel then
- if not turtle.refuel() then
- areaCovered = targetArea
- missionMessage = "Mission aborted due to low fuel."
- abort = true
- return false
- end
- end
- return true
- end
- -- MAIN PROGRAM
- turtle.select(1)
- if currentFuelLevel ~= "unlimited" then
- if currentFuelLevel < minimumFuel then
- if not turtle.refuel() then
- print("No fuel")
- return
- end
- end
- end
- function mineLoop()
- while areaCovered < targetArea do
- if abort then
- break
- end
- for w=1,width do
- if abort then
- break
- end
- for z=1,length do
- if abort then
- break
- end
- if not ignoreUp() then
- mineUp()
- end
- if not ignoreDown() then
- mineDown()
- end
- if z < length then
- forward()
- end
- end
- if nextTurn == "left" then
- if areaCovered < targetArea then
- left()
- forward()
- left()
- nextTurn = "right"
- end
- else
- if areaCovered < targetArea then
- right()
- forward()
- right()
- nextTurn = "left"
- end
- end
- end
- end
- end
- function inventoryGettingFull()
- return ((turtle.getItemCount(14) > 0) or (turtle.getItemCount(15) > 0))
- end
- function noMoreEmptySlots()
- return (turtle.getItemCount(15) > 0)
- end
- markX = 0
- markY = 0
- markZ = 0
- markFace = nil
- function goEmptyInventoryToChestAndReturn()
- saveAreaCovered = areaCovered
- markX = x
- markY = y
- markZ = z
- markFace = face
- home()
- setFace(east)
- while y > 0 do
- down()
- end
- dump()
- while y < markY do
- up()
- end
- returnToMark()
- areaCovered = saveAreaCovered
- end
- jettisonCount = 0
- function jettisonGarbage()
- jettisonCount = jettisonCount + 1
- -- print("Jettison count ", jettisonCount)
- turtle.select(garbageSlot)
- for i=5,15 do
- turtle.select(i)
- if turtle.compareTo(garbageSlot) then
- turtle.dropDown()
- end
- end
- if turtle.getItemCount(15) > 0 then
- turtle.select(15)
- for i=5,13 do
- if turtle.getItemCount(i) == 0 then
- turtle.transferTo(i)
- end
- end
- end
- turtle.select(1)
- end
- purgeCount = 0
- function purgeGarbage()
- purgeCount = purgeCount + 1
- -- print("Purge garbage ", purgeCount)
- if turtle.detectDown() then
- turtle.digDown()
- end
- turtle.select(garbageSlot)
- for i=5,15 do
- turtle.select(i)
- if turtle.compareTo(garbageSlot) then
- turtle.dropDown()
- end
- end
- if turtle.getItemCount(14) > 0 then
- turtle.select(14)
- for i=5,13 do
- if turtle.getItemCount(i) == 0 then
- turtle.transferTo(i)
- end
- end
- end
- if turtle.getItemCount(15) > 0 then
- turtle.select(15)
- for i=5,13 do
- if turtle.getItemCount(i) == 0 then
- turtle.transferTo(i)
- end
- end
- end
- turtle.select(1)
- end
- function collapseInventory()
- turtle.select(15)
- for i=5,15 do
- if turtle.getItemCount(i) == 0 then
- turtle.transferTo(i)
- end
- end
- end
- function dump()
- -- setFace(east)
- --[[ turtle.select(chestSlot)
- if not turtle.compare() then
- plantChest()
- end
- --]]
- for i=1,3 do
- turtle.select(i)
- itemCount = turtle.getItemCount(i)
- if itemCount > 0 then
- turtle.drop(itemCount-1)
- end
- end
- for i=5,15 do
- turtle.select(i)
- if turtle.getItemCount(i) > 0 then
- if not turtle.drop() then
- print("Dump failed. Chest is full.")
- return
- end
- end
- end
- turtle.select(1)
- setFace(north)
- end
- function plantChest()
- turtle.select(chestSlot)
- setFace(east)
- forward()
- mineUp()
- left()
- forward()
- mineUp()
- left()
- forward()
- left()
- left()
- turtle.place()
- right()
- forward()
- left()
- turtle.place()
- setFace(east)
- turtle.select(1)
- end
- function sealItOff()
- turtle.select(3)
- turtle.up()
- turtle.placeUp()
- turtle.down()
- turtle.placeUp()
- turtle.place()
- turtle.turnLeft()
- turtle.place()
- turtle.turnRight()
- end
- y = 0
- --up()
- mineLevel = 1
- saveY = y
- plantChest()
- setFace(north)
- while mineLevel <= maxLevel do
- areaCovered = 1
- nextTurn = "left"
- mineLoop()
- home()
- while y > 0 do
- down()
- end
- setFace(east)
- dump()
- if mineLevel < maxLevel then
- mineLevel = mineLevel + 3
- while y < mineLevel-1 do
- up()
- end
- else
- break
- end
- end
- print(missionMessage)
- print(" Current fuel level is ", turtle.getFuelLevel())
- home(north)
- sealItOff()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement