Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Vertical shaft miner 0.1
- Copyleft Blastbot 2012
- Description:
- Digs a vertical shaft.
- To start place it in an area that you would like to mine.
- Type the name of the program, and the turtle will start
- searching forward for the deposit location.
- The deposit location will be where the turtle bumps
- into something. From here he will head back to the "starting tile".
- At the "starting tile" the turtle will start mining down and unload
- at the deposit location if he can't carry anymore.
- It will send a redstone pulse for every item it drops, so any
- transposer or filter can pick it up.
- It will stop when all the tiles have been traversed (from start to deposit).
- ]]--
- local data = {
- params = {...},
- currentDepth = 1,
- currentTile = 1,
- lastTile = 1,
- lastSlot = 9,
- dug = 0,
- unload = false,
- msg = "%s @ %d-%d"
- }
- local function report(msg)
- rednet.broadcast(msg)
- print(msg)
- end
- local function forward()
- if not turtle.forward() then
- return false
- end
- data.currentTile = data.currentTile - 1
- return true
- end
- local function back()
- if not turtle.back() then
- return false
- end
- data.currentTile = data.currentTile + 1
- return true
- end
- local function up()
- if not turtle.up() then
- return false
- end
- data.currentDepth = data.currentDepth - 1
- return true
- end
- local function down()
- if not turtle.down() then
- return false
- end
- data.currentDepth = data.currentDepth + 1
- return true
- end
- local function getCap()
- local capacity = 0
- for i = 1, data.lastSlot do
- capacity = capacity + turtle.getItemSpace(i)
- end
- return capacity
- end
- local function unloadInventory()
- local itemCount = 0
- local slotItemCount = nil
- for i = 1, data.lastSlot do
- slotItemCount = turtle.getItemCount(i)
- if slotItemCount > 0 then
- redstone.setOutput("front", true)
- turtle.select(i)
- turtle.drop()
- sleep(0.2)
- redstone.setOutput("front", false)
- sleep(0.2)
- itemCount = itemCount + slotItemCount
- end
- end
- report("Deposited " .. itemCount .. " items")
- end
- local function canMine()
- local slotsTaken = 0
- for i = 1, data.lastSlot do
- if turtle.getItemCount(i) > 0 then
- turtle.select(i)
- if turtle.compareDown() then
- return true
- else
- slotsTaken = slotsTaken + 1
- end
- end
- end
- turtle.select(1)
- return slotsTaken ~= data.lastSlot
- end
- local function surface()
- while data.currentDepth ~= 1 do
- if not up() then
- return false
- end
- sleep(0.2)
- end
- return true
- end
- local function moveToDeposit()
- if not surface() then
- return false
- end
- while data.currentTile ~= 1 do
- if not forward() then
- return false
- end
- end
- return true
- end
- local function moveToNextTile()
- if not surface() then
- --report("moveToNextTile, could not surface")
- return false
- end
- if forward() then
- data.lastTile = data.lastTile - 1
- else
- --report("moveToNextTile, could not move forward")
- return false
- end
- return true
- end
- local function moveToLastTile()
- if not surface() then
- return false
- end
- while data.currentTile < data.lastTile do
- if not back() then
- return false
- end
- end
- return true
- end
- -- returns busy, full, moveerror or digerror
- local function shaft()
- if 0 == getCap() then
- return "full"
- end
- if turtle.detectDown() then
- if canMine() then
- if not turtle.digDown() then
- return "digerror"
- end
- data.dug = data.dug + 1
- report("Dug " .. data.dug .. " blocks so far")
- return "busy"
- else
- return "full"
- end
- elseif not down() then
- return "moveerror"
- else
- return "busy"
- end
- end
- local function init()
- -- Enable rednet
- rednet.open("right")
- -- Detect params
- if 1 == #data.params then
- data.lastSlot = 16
- end
- -- Find deposit location
- while not turtle.detect() do
- turtle.forward()
- data.lastTile = data.lastTile + 1
- end
- if data.lastTile < 2 then
- report("Invalid mining area")
- return
- end
- report("Found deposit location")
- report("Gathering...")
- -- Go back to the last tile
- if not moveToLastTile() then
- report("Error moving to mining area")
- return
- end
- local status = shaft()
- report(data.msg:format(status, data.currentDepth, data.currentTile))
- -- Work
- while "busy" == status do
- status = shaft()
- report(data.msg:format(status, data.currentDepth, data.currentTile))
- if "full" == status then
- if not moveToDeposit() then
- if not surface() then
- status = "dpfullstuck"
- else
- status = "dpfullsurfaced"
- end
- else
- unloadInventory()
- if not moveToLastTile() then
- if not surface() then
- status = "ltfullstuck"
- else
- status = "ltfullsurfaced"
- end
- else
- status = "busy"
- end
- end
- elseif status ~= "busy" then
- if 1 == data.currentTile then
- if not moveToDeposit() then
- if not surface() then
- status = "!fulldpstuck"
- else
- status = "!fulldpsurfaced"
- end
- else
- status = "done"
- end
- else
- if not moveToNextTile() then
- if not surface() then
- status = "!fullltstuck"
- else
- status = "!fullltsurfaced"
- end
- else
- status = "busy"
- end
- end
- end
- report(data.msg:format(status, data.currentDepth, data.currentTile))
- end
- rednet.close("right")
- end
- init()
Advertisement
Add Comment
Please, Sign In to add comment