Advertisement
Ignius12

adv_quarry

Jul 14th, 2021 (edited)
639
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.86 KB | None | 0 0
  1. DIR = 1
  2. startDIR = 1
  3. prevDiff = 0
  4. status = "Inactive"
  5. pos = vector.new(gps.locate())
  6. host = 5
  7. doResume, tarX, tarY, tarZ= ...
  8. function getOrientation()
  9.     loc1 = vector.new(gps.locate(2, false))
  10.     if not turtle.forward() then
  11.         for j=1,6 do
  12.             if not turtle.forward() then
  13.                 turtle.dig()
  14.          else break end
  15.         end
  16.     end
  17.     loc2 = vector.new(gps.locate(2, false))
  18.     heading = loc2 - loc1
  19.     return ((heading.x + math.abs(heading.x) * 2) + (heading.z + math.abs(heading.z) * 3))
  20. end
  21.  
  22. function left()
  23.     if turtle then turtle.turnLeft() end
  24.     DIR = DIR - 1
  25.     if DIR < 1 then DIR = DIR + 4 end
  26. end
  27.  
  28. function right()
  29.     if turtle then turtle.turnRight() end
  30.     DIR = DIR + 1
  31.     if DIR > 4 then DIR = DIR - 4 end
  32. end
  33.  
  34. function face(target)
  35.     if(DIR == target) then return end
  36.  
  37.     if(target == 5) then target = 1 else
  38.         if(target == 6) then target = 2 else
  39.             if(target == 7) then target = 3 else
  40.                 if(target == 8) then target = 4 end
  41.             end
  42.         end
  43.     end
  44.                
  45.     diff = DIR - target
  46.    
  47.     if(diff == 1 or diff == -3) then left()
  48.         else
  49.             if(math.abs(diff) == 2) then right() right()
  50.             else right() end
  51.     end
  52. end
  53.  
  54. function unload(start, startDIR)
  55.     status = "Unloading "
  56.     local pause = vector.new(gps.locate())
  57.     local pauseDIR = DIR
  58.     pos = vector.new(gps.locate())
  59.     while(pos.y < start.y) do
  60.         if not turtle.up() then
  61.             turtle.digUp()
  62.         end
  63.         pos = vector.new(gps.locate())
  64.     end
  65.                
  66.     pos = vector.new(gps.locate())
  67.    
  68.     if(start.x ~= pos.x) then          
  69.         if(start.x > pos.x) then
  70.             face(3)
  71.         else
  72.             face(1)
  73.         end
  74.         diff = start - pos
  75.         while(math.abs(diff.x) > 0) do
  76.             if not turtle.forward() then
  77.                 turtle.dig()
  78.                 turtle.attack()
  79.             end
  80.             pos = vector.new(gps.locate())
  81.             diff = start - pos
  82.  
  83.             if(turtle.getFuelLevel() < 300) then
  84.                 for i=1, 16 do
  85.                     turtle.select(i)
  86.                     turtle.refuel()
  87.                 end
  88.                 turtle.select(1)
  89.             end
  90.  
  91.         end
  92.     end
  93.  
  94.     pos = vector.new(gps.locate())
  95.    
  96.     if(start.z ~= pos.z) then          
  97.         if(start.z > pos.z) then
  98.             face(4)
  99.         else
  100.             face(2)
  101.         end
  102.         diff = start - pos
  103.         while(math.abs(diff.z) > 0) do
  104.             if not turtle.forward() then
  105.                 turtle.dig()
  106.                 turtle.attack()
  107.             end
  108.             pos = vector.new(gps.locate())
  109.             diff = start - pos
  110.  
  111.             if(turtle.getFuelLevel() < 300) then
  112.                 for i=1, 16 do
  113.                     turtle.select(i)
  114.                     turtle.refuel()
  115.                 end
  116.                 turtle.select(1)
  117.             end
  118.  
  119.         end
  120.     end
  121.     face(startDIR + 2)
  122.  
  123.     turtle.forward()
  124.  
  125.     for I = 1,16 do
  126.         turtle.select(I)
  127.         if(turtle.refuel(0) == false) then
  128.             turtle.drop()
  129.         end
  130.     end
  131.     turtle.select(1)
  132.  
  133.     right()
  134.     right()
  135.  
  136.     turtle.forward()
  137.  
  138.     status = "Resuming  "
  139.     pos = vector.new(gps.locate())
  140.  
  141.     if(pause.z > pos.z) then
  142.         face(4)
  143.     else
  144.         face(2)
  145.     end
  146.     diff = pause - pos
  147.     while(math.abs(diff.z) > 0) do
  148.         if not turtle.forward() then
  149.             turtle.dig()
  150.             turtle.attack()
  151.         end
  152.         pos = vector.new(gps.locate())
  153.         diff = pause - pos
  154.  
  155.         if(turtle.getFuelLevel() < 300) then
  156.             for i=1, 16 do
  157.                 turtle.select(i)
  158.                 turtle.refuel()
  159.             end
  160.             turtle.select(1)
  161.         end
  162.  
  163.     end
  164.  
  165.     pos = vector.new(gps.locate())
  166.                
  167.     if(pause.x > pos.x) then
  168.         face(3)
  169.     else
  170.         face(1)
  171.     end
  172.     diff = pause - pos
  173.     while(math.abs(diff.x) > 0) do
  174.         if not turtle.forward() then
  175.             turtle.dig()
  176.             turtle.attack()
  177.         end
  178.         pos = vector.new(gps.locate())
  179.         diff = pause - pos
  180.  
  181.         if(turtle.getFuelLevel() < 300) then
  182.             for i=1, 16 do
  183.                 turtle.select(i)
  184.                 turtle.refuel()
  185.             end
  186.             turtle.select(1)
  187.        end
  188.  
  189.     end
  190.  
  191.     pos = vector.new(gps.locate())
  192.  
  193.     while(pos.y > pause.y) do
  194.         if not turtle.down() then
  195.             turtle.digDown()
  196.             turtle.attackDown()
  197.         end
  198.         pos = vector.new(gps.locate())
  199.  
  200.         if(turtle.getFuelLevel() < 300) then
  201.             for i=1, 16 do
  202.                 turtle.select(i)
  203.                 turtle.refuel()
  204.             end
  205.             turtle.select(1)
  206.        end
  207.  
  208.     end
  209.  
  210.     face(pauseDIR)
  211. end
  212.  
  213. function save_config()
  214.   sw = fs.open("config.txt", "w")  
  215.   sw.writeLine(pos.x)
  216.   sw.writeLine(pos.y)
  217.   sw.writeLine(pos.z)
  218.   sw.writeLine(DIR)
  219.   sw.writeLine(start.x)
  220.   sw.writeLine(start.y)
  221.   sw.writeLine(start.z)
  222.   sw.writeLine(startDIR)
  223.   sw.writeLine(layerCount)
  224.   sw.writeLine(rowCount)
  225.   sw.close()
  226. end
  227.  
  228. function load_config()
  229.   sr = fs.open("config.txt", "r")
  230.   resumePos.x = tonumber(sr.readLine())
  231.   resumePos.y = tonumber(sr.readLine())
  232.   resumePos.z = tonumber(sr.readLine())
  233.   resumeDIR = tonumber(sr.readLine())
  234.   start.x = tonumber(sr.readLine())
  235.   start.y = tonumber(sr.readLine())
  236.   start.z = tonumber(sr.readLine())
  237.   startDIR = tonumber(sr.readLine())
  238.   layerCount = tonumber(sr.readLine())
  239.   rowCount = tonumber(sr.readLine())
  240.   sr.close()
  241. end
  242.  
  243. function resume()
  244.  
  245.     pos = vector.new(gps.locate())
  246.  
  247.     if(resumePos.z > pos.z) then
  248.         face(4)
  249.     else
  250.         face(2)
  251.     end
  252.     diff = resumePos - pos
  253.     if(resumePos.z ~= pos.z) then
  254.         while(math.abs(diff.z) > 0) do
  255.             if not turtle.forward() then
  256.                 turtle.dig()
  257.                 turtle.attack()
  258.             end
  259.             pos = vector.new(gps.locate())
  260.             diff = resumePos - pos
  261.  
  262.             if(turtle.getFuelLevel() < 300) then
  263.                 for i=1, 16 do
  264.                     turtle.select(i)
  265.                     turtle.refuel()
  266.                 end
  267.                 turtle.select(1)
  268.             end
  269.         end
  270.     end
  271.  
  272.     pos = vector.new(gps.locate())
  273.                
  274.     if(resumePos.x > pos.x) then
  275.         face(3)
  276.     else
  277.         face(1)
  278.     end
  279.     diff = resumePos - pos
  280.     while(math.abs(diff.x) > 0) do
  281.         if not turtle.forward() then
  282.             turtle.dig()
  283.             turtle.attack()
  284.         end
  285.         pos = vector.new(gps.locate())
  286.         diff = resumePos - pos
  287.  
  288.         if(turtle.getFuelLevel() < 300) then
  289.             for i=1, 16 do
  290.                 turtle.select(i)
  291.                 turtle.refuel()
  292.             end
  293.             turtle.select(1)
  294.        end
  295.  
  296.     end
  297.  
  298.     pos = vector.new(gps.locate())
  299.  
  300.     if(pos.y > resumePos.y) then
  301.         while(pos.y > resumePos.y) do
  302.             if not turtle.down() then
  303.                 turtle.digDown()
  304.                 turtle.attackDown()
  305.             end
  306.             pos = vector.new(gps.locate())
  307.  
  308.             if(turtle.getFuelLevel() < 300) then
  309.                 for i=1, 16 do
  310.                     turtle.select(i)
  311.                     turtle.refuel()
  312.                 end
  313.                 turtle.select(1)
  314.             end
  315.         end
  316.     else
  317.         while(pos.y < resumePos.y) do
  318.             if not turtle.up() then
  319.                 turtle.digUp()
  320.                 turtle.attackUp()
  321.             end
  322.             pos = vector.new(gps.locate())
  323.  
  324.             if(turtle.getFuelLevel() < 300) then
  325.                 for i=1, 16 do
  326.                     turtle.select(i)
  327.                     turtle.refuel()
  328.                 end
  329.                 turtle.select(1)
  330.             end
  331.         end
  332.     end
  333.     face(resumeDIR)
  334. end
  335.  
  336. function quarry()
  337. local modem = peripheral.find("modem")
  338. rednet.open("left")
  339.  
  340. pos = vector.new(gps.locate())
  341.  
  342.  
  343. DIR = getOrientation()
  344. startDIR = DIR
  345. resumeDIR = 1
  346. start = vector.new(gps.locate())
  347. resumePos = vector.new(0,0,0)
  348. target = vector.new(tarX, tarY, tarZ)
  349. print(target)
  350. print(startDIR)
  351. print("|" .. doResume .. "|")
  352. status = "Mining"
  353.  
  354. rowCount = 1
  355. layerCount = 1
  356. local diff = 0
  357. layerDone = false
  358.  
  359. if(doResume == "Y") then
  360.     load_config()
  361.     print("RESUMING")
  362.     resume()
  363. end
  364.  
  365. while(pos.y ~= target.y - 1) do
  366.     layerDone= false
  367.     if(layerCount % 2 == 1) then diff = target - pos else diff = start - pos end
  368.     while(layerDone == false) do
  369.         if(layerCount % 2 == 1) then diff = target - pos else diff = start - pos end
  370.        
  371.         if(math.abs(diff.z) > 0) then
  372.             layerDone = false
  373.         else
  374.             layerDone = true
  375.         end
  376.        
  377.         if(rowCount % 2 == 1) then diff = target - pos else diff = start - pos end
  378. --1 = W, 3 = E     
  379.         if(rowCount % 2 == 1) then
  380.             if(target.x > pos.x) then
  381.                 face(3)
  382.             else
  383.                 face(1)
  384.             end
  385.         else
  386.             if(start.x > pos.x) then
  387.                 face(3)
  388.             else
  389.                 face(1)
  390.             end
  391.         end
  392.         while(math.abs(diff.x) > 0) do
  393.             prevDiff = diff
  394.             turtle.dig()
  395.             if not turtle.forward() then
  396.                 turtle.dig()
  397.                 turtle.attack()
  398.             end
  399.             pos = vector.new(gps.locate())
  400.  
  401.             if(rowCount % 2 == 1) then diff = target - pos else diff = start - pos end
  402.            
  403.             if(math.abs(prevDiff.x) < math.abs(diff.x)) then
  404.                 break
  405.             end
  406.        
  407.             if(turtle.getFuelLevel() < 300) then
  408.                 for i=1, 16 do
  409.                     turtle.select(i)
  410.                     turtle.refuel()
  411.                 end
  412.                 turtle.select(1)
  413.             end
  414.  
  415.             if(turtle.getItemCount(16) > 0) then
  416.                 unload(start, startDIR)
  417.                 status = "Mining"
  418.             end
  419.             save_config()  
  420.         end
  421.         rowCount = rowCount + 1
  422. --4 = N, 2 = S
  423.         if(layerCount % 2 == 1) then
  424.             if(target.z > pos.z) then
  425.                 face(4)
  426.             else
  427.                 face(2)
  428.             end
  429.         else if(start.z > pos.z) then
  430.                 face(4)
  431.             else
  432.                 face(2)
  433.             end
  434.         end
  435.  
  436.         if(layerDone == false) then
  437.             turtle.dig()
  438.             if not turtle.forward() then
  439.                 turtle.dig()
  440.                 turtle.attack()
  441.             end
  442.         end
  443.  
  444.         pos = vector.new(gps.locate())
  445.         save_config()  
  446.         if(layerCount % 2 == 1) then diff = target - pos else diff = start - pos end
  447.     end
  448.  
  449.     turtle.digDown()
  450.     if not turtle.down() then
  451.         turtle.digDown()
  452.         turtle.attackDown()
  453.     end
  454.  
  455.     layerCount = layerCount + 1
  456.     if(rowCount % 2 == 1) then
  457.         rowCount = 1
  458.     else
  459.         rowCount = 2
  460.     end
  461.  
  462.     pos = vector.new(gps.locate())
  463.     save_config()  
  464. end
  465. print("Done!")
  466. status = "Complete"
  467.  
  468. end
  469.  
  470. function rangeCheck()
  471.     while true do
  472.     local sender2, message2, protocol2 = rednet.receive("failsafe", 10)
  473.         print(message2)
  474.         if (message2) == null then
  475.             rednet.send(host, os.getComputerLabel() .. " " .. turtle.getFuelLevel() .. " " .. pos.x .. " " .. pos.y .." " .. pos.z .. " " .. status, "miners")
  476.             print("Failsafe tripped!") 
  477.             return
  478.         end
  479.         sleep(1)
  480.     end
  481. end
  482. function transmit()
  483.     while(true) do
  484.     local sender, message, protocol = rednet.receive("ping")
  485.         if(message ~= nil and message == "send") then
  486.             print("Sending")
  487.             rednet.send(host, os.getComputerLabel() .. " " .. turtle.getFuelLevel() .. " " .. pos.x .. " " .. pos.y .." " .. pos.z .. " " .. status, "miners")
  488.             sleep(0.5)
  489.         end
  490.     end
  491. end
  492. parallel.waitForAny(quarry, rangeCheck, transmit)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement