Advertisement
peptide

Box - Variable Mining

Oct 4th, 2013
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --SETTINGS DEFAULTS
  2. local stop=false
  3. local settings={}
  4. settings["miningTime"]=3
  5. settings["digDelay"]=1
  6. settings["reserveFuelLevel"]=10
  7. settings["chargeTime"]=30
  8. settings["debug"]=false
  9. settings["blocksToTravel"]=0
  10. settings["blocksTraveled"]=0
  11. settings["rowsToTravel"]=0
  12. settings["rowsTraveled"]=0
  13. settings["blocksMined"]=0
  14. local nextStep=nil
  15. settings["turning"]="left"
  16. settings["midTurn"]=false
  17.  
  18. --CONSTANTS
  19. local cNone=0
  20. local cLeft=1
  21. local cYes=2
  22. local cNo=3
  23. local cPowerDown=4
  24. local cPowerUp=5
  25. local cForward=6
  26. local cReadyCharge=7
  27. local cComplete=8
  28. local cGoHome=9
  29. local cRight=10
  30. local cReboot=11
  31. local cShutdown=12
  32. local cClearSettings=13
  33. local cNeedFuel=14
  34. local cPairing=15
  35.  
  36.  
  37. function loadSettings()
  38.    local file = fs.open("SnapBoxSettings","r")
  39.    local data = file.readAll()
  40.    file.close()
  41.    settings=textutils.unserialize(data)
  42. end
  43.  
  44. function saveSettings()
  45.     local file = fs.open("SnapBoxSettings","w")
  46.     file.write(textutils.serialize(settings))
  47.     file.close()
  48. end
  49.  
  50. function checkStatus()
  51.     if turtle.getItemCount(1)>0 then
  52.         print("Ender Chest OK")
  53.     else
  54.         print("Please insert an Ender Chest into slot 1")
  55.         while turtle.getItemCount(1)==0 do
  56.             turtle.select(1)
  57.             sleep(0.1)
  58.         end
  59.     end
  60.     if turtle.getItemCount(2)>0 then
  61.         print("Mining Well OK")
  62.     else
  63.         print("Please insert Mining Well into slot 2")
  64.         while turtle.getItemCount(2)==0 do
  65.             turtle.select(2)
  66.             sleep(0.1)
  67.         end
  68.     end
  69.     if turtle.getFuelLevel()~="unlimited" then
  70.         if turtle.getItemCount(3)>0 then
  71.             print("Charge Station OK")
  72.         else
  73.             print("Please insert Advanced Charge Station (or higher) into slot 3")
  74.             while turtle.getItemCount(3)==0 do
  75.                 turtle.select(3)
  76.                 sleep(0.1)
  77.             end
  78.         end
  79.     end
  80.     if needsFuel() then
  81.         if turtle.getItemCount(16)>0 then
  82.             print("Fuel Level OK")
  83.         else
  84.             print("Please insert fuel in slot 16")
  85.             while turtle.getItemCount(16)==0 do
  86.                 turtle.select(16)
  87.                 sleep(0.1)
  88.             end
  89.         end
  90.     end
  91.  
  92. end
  93.  
  94. function needsFuel()
  95.     local level=turtle.getFuelLevel()
  96.     if level=="unlimited" or level>settings["reserveFuelLevel"] then
  97.         return false
  98.     else
  99.         return true
  100.     end
  101. end
  102.  
  103. function waitForPartner()
  104.     print("Waiting for Snap")
  105.     sendMessageToPartner(cPairing)
  106.     waitForMessageFromPartner(cPairing)
  107.     sendMessageToPartner(cPairing)
  108.     print("Off we go")
  109. end
  110.  
  111. function sendMessageToPartner(message)
  112.     if settings["debug"]==true then
  113.         print("sending "..message)
  114.     end
  115.     redstone.setAnalogOutput("back",message)
  116.     sleep(0.1)
  117.     redstone.setAnalogOutput("back",cNone)
  118. end
  119.  
  120. function waitForMessageFromPartner(message)
  121.     if settings["debug"]==true then
  122.         print("waiting for "..message)
  123.     end
  124.     local input=nil
  125.     while input~=message do
  126.         event = os.pullEvent("redstone")
  127.         input=redstone.getAnalogInput("back")
  128.     end
  129. end
  130.  
  131. function moveForward()
  132.     while turtle.detect() do
  133.         turtle.dig()
  134.         sleep(settings["digDelay"])
  135.     end
  136.     while turtle.forward()==false do
  137.         turtle.dig()
  138.         sleep(settings["digDelay"])
  139.         turtle.attack()
  140.     end
  141. end
  142.  
  143. function topOff()
  144.     --make sure we're not turning soon
  145.     if settings["blocksTraveled"]<settings["blocksToTravel"] and settings["blocksTraveled"]>1 then
  146.         if needsFuel() or partnerNeedsFuel()==true then
  147.             setNextStep("chargepowerdown")
  148.         else
  149.             setNextStep("placeminingwell")
  150.         end
  151.     else
  152.         setNextStep("placeminingwell")
  153.     end
  154. end
  155.  
  156. function partnerNeedsFuel()
  157.     sendMessageToPartner(cNeedFuel)
  158.     os.pullEvent("redstone")
  159.     if redstone.getAnalogInput("back")==cYes then
  160.         return true
  161.     else
  162.         return false
  163.     end
  164. end
  165.  
  166. function placeCharge()
  167.     turtle.select(3)
  168.     while turtle.place()==false do
  169.         turtle.attack()
  170.     end
  171. end
  172.  
  173. function digCharge()
  174.     turtle.select(3)
  175.     turtle.dig()
  176. end
  177.  
  178. function placeChest()
  179.     turtle.select(1)
  180.     while turtle.placeUp()==false do
  181.         turtle.attackUp()
  182.         turtle.digUp()
  183.         sleep(settings["digDelay"])
  184.     end
  185. end
  186.  
  187. function digChest()
  188.     turtle.select(1)
  189.     if turtle.getItemCount(1) > 0 then
  190.         turtle.drop()
  191.     end
  192.     turtle.digUp()
  193. end
  194.  
  195. function placeMiningWell()
  196.     turtle.select(2)
  197.     while turtle.placeDown()==false do
  198.         turtle.digDown()
  199.         sleep(settings["digDelay"])
  200.         turtle.attackDown()
  201.     end
  202. end
  203.  
  204. function digMiningWell()
  205.     turtle.select(2)
  206.     if turtle.getItemCount(2) > 0 then
  207.         turtle.drop()
  208.     end
  209.     turtle.digDown()
  210. end
  211.  
  212. function emptyInventory()
  213.     for i=1,16 do
  214.         if turtle.getItemCount(i)>0 then
  215.             if i~=3 and turtle.getFuelLevel()~="unlimited" then
  216.                 --dont empty charge station slot unless no fuel needed
  217.                 while turtle.getItemCount(i)>0 do
  218.                     turtle.select(i)
  219.                     turtle.dropUp()
  220.                 end
  221.             end
  222.             if turtle.getFuelLevel()=="unlimited" then
  223.                 while turtle.getItemCount(i)>0 do
  224.                     turtle.select(i)
  225.                     turtle.dropUp()
  226.                 end
  227.             end
  228.         end
  229.     end
  230. end
  231.  
  232. function setNextStep(next)
  233.     if settings["debug"]==true then
  234.         print("Set next step "..next)
  235.     end
  236.     local file=nil
  237.     while file==nil do
  238.        file=fs.open("SnapBoxStepTracker","w")
  239.     end
  240.     file.write(next)
  241.     file.close()
  242.     nextStep=next
  243. end
  244.  
  245. function getNextStep()
  246.     local file=fs.open("SnapBoxStepTracker","r")
  247.     if file==nil then
  248.         setNextStep("topoff")
  249.     else
  250.         local returnValue=file.readAll()
  251.         file.close()
  252.         setNextStep(returnValue)
  253.     end
  254. end
  255.  
  256. function incrementBlockCounter()
  257.     settings["blocksTraveled"]=settings["blocksTraveled"]+1
  258.     saveSettings()
  259. end
  260.  
  261. function incrementRowCounter()
  262.     settings["rowsTraveled"]=settings["rowsTraveled"]+1
  263.     saveSettings()
  264. end
  265.  
  266. function checkReturn()
  267.     if settings["rowsTraveled"]>=settings["rowsToTravel"] and settings["rowsToTravel"]~=0 then
  268.         return true
  269.     else
  270.         return false
  271.     end
  272. end
  273.  
  274. function checkRow()
  275.     if settings["midTurn"]==true then
  276.         turn()
  277.         settings["midTurn"]=false
  278.         settings["blocksTraveled"]=1
  279.         if settings["turning"]=="left" then
  280.             settings["turning"]="right"
  281.         else
  282.             settings["turning"]="left"
  283.         end
  284.         saveSettings()
  285.     end
  286.     if settings["blocksTraveled"]>=settings["blocksToTravel"] and settings["blocksToTravel"]~=0 then
  287.         incrementRowCounter()
  288.         turn()
  289.         settings["midTurn"]=true
  290.         saveSettings()
  291.     end
  292. end
  293.  
  294. function partnerRight()
  295.     if settings["blocksTraveled"]>=settings["blocksToTravel"] and settings["blocksToTravel"]~=0 and settings["turning"]=="right" then
  296.         sendMessageToPartner(cRight)
  297.         waitForMessageFromPartner(cRight)
  298.     end
  299. end
  300.  
  301. function partnerLeft()
  302.     if settings["blocksTraveled"]>=settings["blocksToTravel"] and settings["blocksToTravel"]~=0 and settings["turning"]=="left" then
  303.         sendMessageToPartner(cLeft)
  304.         waitForMessageFromPartner(cLeft)
  305.     end
  306. end
  307.  
  308. function turn()
  309.     if settings["turning"]=="left" then
  310.         turtle.turnLeft()
  311.     else
  312.         turtle.turnRight()
  313.     end
  314. end
  315.  
  316. function checkResume()
  317.     local file=fs.open("SnapBoxStepTracker","r")
  318.     if file==nil then
  319.         return false
  320.     else
  321.         file.close()
  322.         return true
  323.     end
  324. end
  325.  
  326. function doNextStep()
  327. --is there a better way to do this?
  328.     if nextStep=="topoff" then
  329.         topOff()
  330.     elseif nextStep=="chargepowerdown" then
  331.         sendMessageToPartner(cPowerDown)
  332.         waitForMessageFromPartner(cPowerDown)
  333.         setNextStep("chargepartnerreadycharge")
  334.     elseif nextStep=="chargepartnerreadycharge" then
  335.         sendMessageToPartner(cReadyCharge)
  336.         waitForMessageFromPartner(cReadyCharge)
  337.         setNextStep("chargeturnleft1")
  338.     elseif nextStep=="chargeturnleft1" then
  339.         turtle.turnLeft()
  340.         setNextStep("chargeturnleft2")
  341.     elseif nextStep=="chargeturnleft2" then
  342.         turtle.turnLeft()
  343.         setNextStep("chargeplacecharge")
  344.     elseif nextStep=="chargeplacecharge" then
  345.         placeCharge()
  346.         setNextStep("chargewaitforrefuel")
  347.     elseif nextStep=="chargewaitforrefuel" then
  348.         sleep(settings["chargeTime"])
  349.         setNextStep("chargedigcharge")
  350.     elseif nextStep=="chargedigcharge" then
  351.         digCharge()
  352.         setNextStep("chargeturnleft3")
  353.     elseif nextStep=="chargeturnleft3" then
  354.         turtle.turnLeft()
  355.         setNextStep("chargeturnleft4")
  356.     elseif nextStep=="chargeturnleft4" then
  357.         turtle.turnLeft()
  358.         setNextStep("chargeforward")
  359.     elseif nextStep=="chargeforward" then
  360.         waitForMessageFromPartner(cComplete)
  361.         setNextStep("chargepowerup")
  362.     elseif nextStep=="chargepowerup" then
  363.         sendMessageToPartner(cPowerUp)
  364.         waitForMessageFromPartner(cPowerUp)
  365.         setNextStep("placeminingwell")
  366.     elseif nextStep=="placeminingwell" then
  367.         placeMiningWell()
  368.         setNextStep("placechest")
  369.     elseif nextStep=="placechest" then
  370.         placeChest()
  371.         setNextStep("partnerpowerdown")
  372.     elseif nextStep=="partnerpowerdown" then
  373.         sendMessageToPartner(cPowerDown)
  374.         waitForMessageFromPartner(cPowerDown)
  375.         incrementBlockCounter()
  376.         setNextStep("partnerpowerup")
  377.     --waitForMining()
  378.         sleep(settings["miningTime"])
  379.     elseif nextStep=="partnerpowerup" then
  380.         sendMessageToPartner(cPowerUp)
  381.         waitForMessageFromPartner(cPowerUp)
  382.         setNextStep("emptyinventory")
  383.     elseif nextStep=="emptyinventory" then
  384.         emptyInventory()
  385.         setNextStep("digchest")
  386.     elseif nextStep=="digchest" then
  387.         digChest()
  388.         setNextStep("digminingwell")
  389.     elseif nextStep=="digminingwell" then
  390.         digMiningWell()
  391.         setNextStep("partnerturn")
  392.     elseif nextStep=="partnerturn" then
  393.         partnerRight()
  394.         partnerLeft()
  395.         setNextStep("partnerforward")
  396.     elseif nextStep=="partnerforward" then
  397.         sendMessageToPartner(cForward)
  398.         waitForMessageFromPartner(cForward)
  399.         setNextStep("checkrow")
  400.     elseif nextStep=="checkrow" then
  401.         checkRow()
  402.         setNextStep("moveforward")
  403.     elseif nextStep=="moveforward" then
  404.         moveForward()
  405.         setNextStep("checkreturn")
  406.     elseif nextStep=="checkreturn" then
  407.         if checkReturn()==true then
  408.             print("Done")
  409.             setNextStep("gohome")
  410.         else
  411.             setNextStep("topoff")
  412.         end
  413.     elseif nextStep=="gohome" then
  414.         sendMessageToPartner(cClearSettings)
  415.         sendMessageToPartner(cShutdown)
  416.         shell.run("clearsettings")
  417.         stop=true
  418.     else
  419.         print("Unknown Step - Something Went Wrong. Giving Up "..nextStep)
  420.     end
  421. end
  422.  
  423. function clearScreen()
  424.     term.clear()
  425.     term.setCursorPos(1,1)
  426. end
  427.  
  428. function getInventoryCount()
  429.     local count=0
  430.     for i=1,16 do
  431.     count = count +turtle.getItemCount(i)
  432.     end
  433.     return count
  434. end
  435.  
  436. function waitForMining()
  437.     local count = getInventoryCount()
  438.     sleep(settings["miningTime"])
  439.     while (count ~= getInventoryCount()) do
  440.        count = getInventoryCount()
  441.        sleep(2)
  442.     end
  443. end
  444.  
  445. --------MAIN PROGRAM
  446. clearScreen()
  447.  
  448. if checkResume()==false then
  449.     --check to make sure it has all the items it needs
  450.     checkStatus()
  451.  
  452.     print("Enter the number (greater than 2) of blocks to travel before the next row (0 or blank for never)")
  453.     local input=io.read()
  454.     if input~="" then
  455.         settings["blocksToTravel"]=tonumber(input)
  456.     end
  457.  
  458.     print("Enter the number of rows to travel before stopping (0 or blank for never)")
  459.     input=io.read()
  460.     if input~="" then
  461.         settings["rowsToTravel"]=tonumber(input)
  462.     end
  463.  
  464.     --initial refuel
  465.     turtle.select(16)
  466.     turtle.refuel()
  467.     turtle.select(1)
  468.  
  469.     --wait to find partner
  470.     waitForPartner()
  471.     nextStep="topoff"
  472.     saveSettings()
  473. else
  474.     loadSettings()
  475.     getNextStep()
  476.  
  477.     --this sleep allows snap to wake up before box
  478.     sleep(5)
  479. end
  480.  
  481. --main loop
  482. while stop==false do
  483.     doNextStep()
  484.     sleep(0.2)
  485. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement