Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --SETTINGS DEFAULTS
- local stop=false
- local settings={}
- settings["miningTime"]=3
- settings["digDelay"]=1
- settings["reserveFuelLevel"]=10
- settings["chargeTime"]=30
- settings["debug"]=false
- settings["blocksToTravel"]=0
- settings["blocksTraveled"]=0
- settings["rowsToTravel"]=0
- settings["rowsTraveled"]=0
- settings["blocksMined"]=0
- local nextStep=nil
- settings["turning"]="left"
- settings["midTurn"]=false
- --CONSTANTS
- local cNone=0
- local cLeft=1
- local cYes=2
- local cNo=3
- local cPowerDown=4
- local cPowerUp=5
- local cForward=6
- local cReadyCharge=7
- local cComplete=8
- local cGoHome=9
- local cRight=10
- local cReboot=11
- local cShutdown=12
- local cClearSettings=13
- local cNeedFuel=14
- local cPairing=15
- function loadSettings()
- local file = fs.open("SnapBoxSettings","r")
- local data = file.readAll()
- file.close()
- settings=textutils.unserialize(data)
- end
- function saveSettings()
- local file = fs.open("SnapBoxSettings","w")
- file.write(textutils.serialize(settings))
- file.close()
- end
- function checkStatus()
- if turtle.getItemCount(1)>0 then
- print("Ender Chest OK")
- else
- print("Please insert an Ender Chest into slot 1")
- while turtle.getItemCount(1)==0 do
- turtle.select(1)
- sleep(0.1)
- end
- end
- if turtle.getItemCount(2)>0 then
- print("Mining Well OK")
- else
- print("Please insert Mining Well into slot 2")
- while turtle.getItemCount(2)==0 do
- turtle.select(2)
- sleep(0.1)
- end
- end
- if turtle.getFuelLevel()~="unlimited" then
- if turtle.getItemCount(3)>0 then
- print("Charge Station OK")
- else
- print("Please insert Advanced Charge Station (or higher) into slot 3")
- while turtle.getItemCount(3)==0 do
- turtle.select(3)
- sleep(0.1)
- end
- end
- end
- if needsFuel() then
- if turtle.getItemCount(16)>0 then
- print("Fuel Level OK")
- else
- print("Please insert fuel in slot 16")
- while turtle.getItemCount(16)==0 do
- turtle.select(16)
- sleep(0.1)
- end
- end
- end
- end
- function needsFuel()
- local level=turtle.getFuelLevel()
- if level=="unlimited" or level>settings["reserveFuelLevel"] then
- return false
- else
- return true
- end
- end
- function waitForPartner()
- print("Waiting for Snap")
- sendMessageToPartner(cPairing)
- waitForMessageFromPartner(cPairing)
- sendMessageToPartner(cPairing)
- print("Off we go")
- end
- function sendMessageToPartner(message)
- if settings["debug"]==true then
- print("sending "..message)
- end
- redstone.setAnalogOutput("back",message)
- sleep(0.1)
- redstone.setAnalogOutput("back",cNone)
- end
- function waitForMessageFromPartner(message)
- if settings["debug"]==true then
- print("waiting for "..message)
- end
- local input=nil
- while input~=message do
- event = os.pullEvent("redstone")
- input=redstone.getAnalogInput("back")
- end
- end
- function moveForward()
- while turtle.detect() do
- turtle.dig()
- sleep(settings["digDelay"])
- end
- while turtle.forward()==false do
- turtle.dig()
- sleep(settings["digDelay"])
- turtle.attack()
- end
- end
- function topOff()
- --make sure we're not turning soon
- if settings["blocksTraveled"]<settings["blocksToTravel"] and settings["blocksTraveled"]>1 then
- if needsFuel() or partnerNeedsFuel()==true then
- setNextStep("chargepowerdown")
- else
- setNextStep("placeminingwell")
- end
- else
- setNextStep("placeminingwell")
- end
- end
- function partnerNeedsFuel()
- sendMessageToPartner(cNeedFuel)
- os.pullEvent("redstone")
- if redstone.getAnalogInput("back")==cYes then
- return true
- else
- return false
- end
- end
- function placeCharge()
- turtle.select(3)
- while turtle.place()==false do
- turtle.attack()
- end
- end
- function digCharge()
- turtle.select(3)
- turtle.dig()
- end
- function placeChest()
- turtle.select(1)
- while turtle.placeUp()==false do
- turtle.attackUp()
- turtle.digUp()
- sleep(settings["digDelay"])
- end
- end
- function digChest()
- turtle.select(1)
- if turtle.getItemCount(1) > 0 then
- turtle.drop()
- end
- turtle.digUp()
- end
- function placeMiningWell()
- turtle.select(2)
- while turtle.placeDown()==false do
- turtle.digDown()
- sleep(settings["digDelay"])
- turtle.attackDown()
- end
- end
- function digMiningWell()
- turtle.select(2)
- if turtle.getItemCount(2) > 0 then
- turtle.drop()
- end
- turtle.digDown()
- end
- function emptyInventory()
- for i=1,16 do
- if turtle.getItemCount(i)>0 then
- if i~=3 and turtle.getFuelLevel()~="unlimited" then
- --dont empty charge station slot unless no fuel needed
- while turtle.getItemCount(i)>0 do
- turtle.select(i)
- turtle.dropUp()
- end
- end
- if turtle.getFuelLevel()=="unlimited" then
- while turtle.getItemCount(i)>0 do
- turtle.select(i)
- turtle.dropUp()
- end
- end
- end
- end
- end
- function setNextStep(next)
- if settings["debug"]==true then
- print("Set next step "..next)
- end
- local file=nil
- while file==nil do
- file=fs.open("SnapBoxStepTracker","w")
- end
- file.write(next)
- file.close()
- nextStep=next
- end
- function getNextStep()
- local file=fs.open("SnapBoxStepTracker","r")
- if file==nil then
- setNextStep("topoff")
- else
- local returnValue=file.readAll()
- file.close()
- setNextStep(returnValue)
- end
- end
- function incrementBlockCounter()
- settings["blocksTraveled"]=settings["blocksTraveled"]+1
- saveSettings()
- end
- function incrementRowCounter()
- settings["rowsTraveled"]=settings["rowsTraveled"]+1
- saveSettings()
- end
- function checkReturn()
- if settings["rowsTraveled"]>=settings["rowsToTravel"] and settings["rowsToTravel"]~=0 then
- return true
- else
- return false
- end
- end
- function checkRow()
- if settings["midTurn"]==true then
- turn()
- settings["midTurn"]=false
- settings["blocksTraveled"]=1
- if settings["turning"]=="left" then
- settings["turning"]="right"
- else
- settings["turning"]="left"
- end
- saveSettings()
- end
- if settings["blocksTraveled"]>=settings["blocksToTravel"] and settings["blocksToTravel"]~=0 then
- incrementRowCounter()
- turn()
- settings["midTurn"]=true
- saveSettings()
- end
- end
- function partnerRight()
- if settings["blocksTraveled"]>=settings["blocksToTravel"] and settings["blocksToTravel"]~=0 and settings["turning"]=="right" then
- sendMessageToPartner(cRight)
- waitForMessageFromPartner(cRight)
- end
- end
- function partnerLeft()
- if settings["blocksTraveled"]>=settings["blocksToTravel"] and settings["blocksToTravel"]~=0 and settings["turning"]=="left" then
- sendMessageToPartner(cLeft)
- waitForMessageFromPartner(cLeft)
- end
- end
- function turn()
- if settings["turning"]=="left" then
- turtle.turnLeft()
- else
- turtle.turnRight()
- end
- end
- function checkResume()
- local file=fs.open("SnapBoxStepTracker","r")
- if file==nil then
- return false
- else
- file.close()
- return true
- end
- end
- function doNextStep()
- --is there a better way to do this?
- if nextStep=="topoff" then
- topOff()
- elseif nextStep=="chargepowerdown" then
- sendMessageToPartner(cPowerDown)
- waitForMessageFromPartner(cPowerDown)
- setNextStep("chargepartnerreadycharge")
- elseif nextStep=="chargepartnerreadycharge" then
- sendMessageToPartner(cReadyCharge)
- waitForMessageFromPartner(cReadyCharge)
- setNextStep("chargeturnleft1")
- elseif nextStep=="chargeturnleft1" then
- turtle.turnLeft()
- setNextStep("chargeturnleft2")
- elseif nextStep=="chargeturnleft2" then
- turtle.turnLeft()
- setNextStep("chargeplacecharge")
- elseif nextStep=="chargeplacecharge" then
- placeCharge()
- setNextStep("chargewaitforrefuel")
- elseif nextStep=="chargewaitforrefuel" then
- sleep(settings["chargeTime"])
- setNextStep("chargedigcharge")
- elseif nextStep=="chargedigcharge" then
- digCharge()
- setNextStep("chargeturnleft3")
- elseif nextStep=="chargeturnleft3" then
- turtle.turnLeft()
- setNextStep("chargeturnleft4")
- elseif nextStep=="chargeturnleft4" then
- turtle.turnLeft()
- setNextStep("chargeforward")
- elseif nextStep=="chargeforward" then
- waitForMessageFromPartner(cComplete)
- setNextStep("chargepowerup")
- elseif nextStep=="chargepowerup" then
- sendMessageToPartner(cPowerUp)
- waitForMessageFromPartner(cPowerUp)
- setNextStep("placeminingwell")
- elseif nextStep=="placeminingwell" then
- placeMiningWell()
- setNextStep("placechest")
- elseif nextStep=="placechest" then
- placeChest()
- setNextStep("partnerpowerdown")
- elseif nextStep=="partnerpowerdown" then
- sendMessageToPartner(cPowerDown)
- waitForMessageFromPartner(cPowerDown)
- incrementBlockCounter()
- setNextStep("partnerpowerup")
- --waitForMining()
- sleep(settings["miningTime"])
- elseif nextStep=="partnerpowerup" then
- sendMessageToPartner(cPowerUp)
- waitForMessageFromPartner(cPowerUp)
- setNextStep("emptyinventory")
- elseif nextStep=="emptyinventory" then
- emptyInventory()
- setNextStep("digchest")
- elseif nextStep=="digchest" then
- digChest()
- setNextStep("digminingwell")
- elseif nextStep=="digminingwell" then
- digMiningWell()
- setNextStep("partnerturn")
- elseif nextStep=="partnerturn" then
- partnerRight()
- partnerLeft()
- setNextStep("partnerforward")
- elseif nextStep=="partnerforward" then
- sendMessageToPartner(cForward)
- waitForMessageFromPartner(cForward)
- setNextStep("checkrow")
- elseif nextStep=="checkrow" then
- checkRow()
- setNextStep("moveforward")
- elseif nextStep=="moveforward" then
- moveForward()
- setNextStep("checkreturn")
- elseif nextStep=="checkreturn" then
- if checkReturn()==true then
- print("Done")
- setNextStep("gohome")
- else
- setNextStep("topoff")
- end
- elseif nextStep=="gohome" then
- sendMessageToPartner(cClearSettings)
- sendMessageToPartner(cShutdown)
- shell.run("clearsettings")
- stop=true
- else
- print("Unknown Step - Something Went Wrong. Giving Up "..nextStep)
- end
- end
- function clearScreen()
- term.clear()
- term.setCursorPos(1,1)
- end
- function getInventoryCount()
- local count=0
- for i=1,16 do
- count = count +turtle.getItemCount(i)
- end
- return count
- end
- function waitForMining()
- local count = getInventoryCount()
- sleep(settings["miningTime"])
- while (count ~= getInventoryCount()) do
- count = getInventoryCount()
- sleep(2)
- end
- end
- --------MAIN PROGRAM
- clearScreen()
- if checkResume()==false then
- --check to make sure it has all the items it needs
- checkStatus()
- print("Enter the number (greater than 2) of blocks to travel before the next row (0 or blank for never)")
- local input=io.read()
- if input~="" then
- settings["blocksToTravel"]=tonumber(input)
- end
- print("Enter the number of rows to travel before stopping (0 or blank for never)")
- input=io.read()
- if input~="" then
- settings["rowsToTravel"]=tonumber(input)
- end
- --initial refuel
- turtle.select(16)
- turtle.refuel()
- turtle.select(1)
- --wait to find partner
- waitForPartner()
- nextStep="topoff"
- saveSettings()
- else
- loadSettings()
- getNextStep()
- --this sleep allows snap to wake up before box
- sleep(5)
- end
- --main loop
- while stop==false do
- doNextStep()
- sleep(0.2)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement