kovakovi2000

CC: P++ Advanced Ex With Monitor

Apr 9th, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.53 KB | None | 0 0
  1. os.loadAPI("ldb2")
  2. os.loadAPI("rnc")
  3.  
  4.  
  5. local db = "ex"
  6.  
  7. if os.getComputerLabel() == nil then
  8.     os.setComputerLabel("T" .. os.getComputerID())
  9. end
  10. shell.run("bg", "rser")
  11. local msg = {}
  12. msg.name = os.getComputerLabel()
  13. msg.depth = 0
  14. msg.size = ldb2.get(db, "size")
  15. msg.state = "starting"
  16. msg.detail = "none"
  17.  
  18. local function fm_msg(vname, vdepth, vstate, vdetail)
  19.     if vname ~= nil then
  20.         msg.name = vname
  21.     end
  22.    
  23.     if vdepth ~= nil then
  24.         msg.depth = vdepth
  25.     end
  26.    
  27.     if msg.size == nil then
  28.         msg.state = 0
  29.     end
  30.    
  31.     if vstate == nil then
  32.         msg.state = "unk"
  33.     else
  34.         msg.state = vstate
  35.     end
  36.    
  37.     if vdetail ~= nil then
  38.         msg.detail = vdetail
  39.     else
  40.         msg.detail = "none"
  41.     end
  42.    
  43.     rnc.send(msg)
  44. end
  45.  
  46. local depth = 0
  47.  
  48. local unloaded = 0
  49. if ldb2.is(db, "unloaded") == false then
  50.     ldb2.set(db, "unloaded", unloaded)
  51. else
  52.     unloaded = ldb2.get(db, "unloaded")
  53. end
  54.  
  55. local collected = 0
  56. if ldb2.is(db, "collected") == false then
  57.     ldb2.set(db, "collected", collected)
  58. else
  59.     collected = ldb2.get(db, "collected")
  60. end
  61.  
  62. if ldb2.get(db, "done") == 1 then
  63.     fm_msg(nil, ldb2.get(db, "depth"), "Work done!", "TC: " .. collected + unloaded)
  64. end
  65.  
  66. local xPos,zPos = 0,0
  67. local xDir,zDir = 0,1
  68.  
  69. local tArgs = { ... }
  70. if #tArgs ~= 1 then
  71.     fm_msg(nil, ldb2.get(db, "depth"), "Rebooting", "returning home")
  72.     for i = 1, ldb2.get(db, "depth") do
  73.         turtle.up()
  74.     end
  75.     if shell.run("goto","ex_home") == false then
  76.         fm_msg(nil, ldb2.get(db, "depth"), "Stuck!", "OHHHH NOOO")
  77.         error("stock")
  78.     end
  79.     xDir = 1
  80.     zDir = 0
  81. end
  82.  
  83. if ldb2.is(db, "depth") == false then
  84.     ldb2.set(db, "depth", 0)
  85. end
  86.  
  87. size = 0
  88. if ldb2.is(db, "size") == false then
  89.     size = tonumber( tArgs[1] )
  90.     ldb2.set(db, "size", size)
  91.     msg.size = size
  92. else
  93.     size = ldb2.get(db, "size")
  94.     msg.size = size
  95. end
  96.  
  97. local depthFrom = ldb2.get(db, "depth")
  98. if size < 0 then
  99.     print( "Excavate diameter must be positive" )
  100.     return
  101. end
  102.  
  103.  
  104.  
  105. local goTo -- Filled in further down
  106. local refuel -- Filled in further down
  107.  
  108. local function unload( _bKeepOneFuelStack )
  109.     print( "Unloading items..." )
  110.     fm_msg(nil, ldb2.get(db, "depth"), "Unloading", nil)
  111.     goTo( 0,0,0,0,-1 )
  112.     for n=1,16 do
  113.         local nCount = turtle.getItemCount(n)
  114.         if nCount > 0 then
  115.             turtle.select(n)          
  116.             local bDrop = true
  117.             if _bKeepOneFuelStack and turtle.refuel(0) then
  118.                 bDrop = false
  119.                 _bKeepOneFuelStack = false
  120.             end        
  121.             if bDrop then
  122.                 turtle.drop()
  123.                 unloaded = unloaded + nCount
  124.                 ldb2.set(db, "unloaded", unloaded)
  125.             end
  126.         end
  127.     end
  128.     collected = 0
  129.     ldb2.set(db, "collected", collected)
  130.     turtle.select(1)
  131.     fm_msg(nil, ldb2.get(db, "depth"), "Collected item:", ldb2.get(db, "collected"))
  132. end
  133.  
  134. local function RefuelFromRF()
  135.     fm_msg(nil, ldb2.get(db, "depth"), "Start refueling...", nil)
  136.     goTo(0,0,0,-1,0)
  137.     sleep(1)
  138.     turtle.up()
  139.     sleep(1)
  140.     print("Refueling...")
  141.     local fuelLevel = turtle.getFuelLevel()
  142.     local flmx = turtle.getFuelLimit()
  143.     local TestCount = 0
  144.     while fuelLevel ~= flmx do
  145.         TestCount = TestCount + 1
  146.         if TestCount > 1000 then
  147.             os.reboot()
  148.         end
  149.         fuelLevel = turtle.getFuelLevel()
  150.         oldxc, oldyc = term.getCursorPos()
  151.         term.setCursorPos(1,oldyc-1)
  152.         print("Refueled: " .. fuelLevel)
  153.         fm_msg(nil, ldb2.get(db, "depth"), "Refueling...", "FL:" .. fuelLevel)
  154.         sleep(1)
  155.     end
  156.     print("Refueled: " .. fuelLevel)
  157.     sleep(1)
  158.     turtle.down()
  159.     sleep(1)
  160.     goTo( 0,0,0,0,1 )
  161. end
  162.  
  163. local function returnSupplies()
  164.     local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  165.     print( "Returning to surface..." )
  166.     fm_msg(nil, ldb2.get(db, "depth"), "Returning to surface...", nil)
  167.     goTo( 0,0,0,0,-1 )
  168.     unload( false )
  169.     RefuelFromRF()
  170.     print( "Resuming mining..." )
  171.     fm_msg(nil, ldb2.get(db, "depth"), "Returning to mining...", nil)
  172.     goTo( x,y,z,xd,zd )
  173. end
  174.  
  175. local function collect()  
  176.     local bFull = true
  177.     local nTotalItems = 0
  178.     for n=1,16 do
  179.         local nCount = turtle.getItemCount(n)
  180.         if nCount == 0 then
  181.             bFull = false
  182.         end
  183.         nTotalItems = nTotalItems + nCount
  184.     end
  185.    
  186.     if nTotalItems > collected then
  187.         collected = nTotalItems
  188.         ldb2.set(db, "collected", collected)
  189.         if math.fmod(collected + unloaded, 50) == 0 then
  190.             print( "Mined "..(collected + unloaded).." items." )
  191.         end
  192.     end
  193.    
  194.     if bFull then
  195.         print( "No empty slots left." )
  196.         return false
  197.     end
  198.     return true
  199. end
  200.  
  201. function refuel( ammount )
  202.     local fuelLevel = turtle.getFuelLevel()
  203.     if fuelLevel == "unlimited" then
  204.         return true
  205.     end
  206.    
  207.     local needed = ammount or (xPos + zPos + depth + 2)
  208.     if turtle.getFuelLevel() < needed then
  209.         local fueled = false
  210.         for n=1,16 do
  211.             if turtle.getItemCount(n) > 0 then
  212.                 turtle.select(n)
  213.                 if turtle.refuel(1) then
  214.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  215.                         turtle.refuel(1)
  216.                     end
  217.                     if turtle.getFuelLevel() >= needed then
  218.                         turtle.select(1)
  219.                         return true
  220.                     end
  221.                 end
  222.             end
  223.         end
  224.         turtle.select(1)
  225.         return false
  226.     end
  227.    
  228.     return true
  229. end
  230.  
  231. local function tryForwards()
  232.     if not refuel() then
  233.         print( "Not enough Fuel" )
  234.         returnSupplies()
  235.     end
  236.    
  237.     while not turtle.forward() do
  238.         if turtle.detect() then
  239.             if turtle.dig() then
  240.                 if not collect() then
  241.                     returnSupplies()
  242.                 end
  243.             else
  244.                 return false
  245.             end
  246.         elseif turtle.attack() then
  247.             if not collect() then
  248.                 returnSupplies()
  249.             end
  250.         else
  251.             sleep( 0.5 )
  252.         end
  253.     end
  254.    
  255.     xPos = xPos + xDir
  256.     zPos = zPos + zDir
  257.     fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  258.     return true
  259. end
  260.  
  261. local function tryDown()
  262.     if not refuel() then
  263.         print( "Not enough Fuel" )
  264.         returnSupplies()
  265.     end
  266.    
  267.     while not turtle.down() do
  268.         if turtle.detectDown() then
  269.             if turtle.digDown() then
  270.                 if not collect() then
  271.                     returnSupplies()
  272.                 end
  273.             else
  274.                 return false
  275.             end
  276.         elseif turtle.attackDown() then
  277.             if not collect() then
  278.                 returnSupplies()
  279.             end
  280.         else
  281.             sleep( 0.5 )
  282.         end
  283.     end
  284.  
  285.     depth = depth + 1
  286.     ldb2.set(db, "depth", depth)
  287.     fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  288.     if math.fmod( depth, 10 ) == 0 then
  289.         print( "Descended "..depth.." metres." )
  290.     end
  291.  
  292.     return true
  293. end
  294.  
  295. local function turnLeft()
  296.     turtle.turnLeft()
  297.     xDir, zDir = -zDir, xDir
  298.     fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  299. end
  300.  
  301. local function turnRight()
  302.     turtle.turnRight()
  303.     xDir, zDir = zDir, -xDir
  304.     fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  305. end
  306.  
  307. function goTo( x, y, z, xd, zd )
  308.     while depth > y do
  309.         if turtle.up() then
  310.             depth = depth - 1
  311.         elseif turtle.digUp() or turtle.attackUp() then
  312.             collect()
  313.         else
  314.             sleep( 0.5 )
  315.         end
  316.     end
  317.  
  318.     if xPos > x then
  319.         while xDir ~= -1 do
  320.             turnLeft()
  321.         end
  322.         while xPos > x do
  323.             if turtle.forward() then
  324.                 xPos = xPos - 1
  325.                 fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  326.             elseif turtle.dig() or turtle.attack() then
  327.                 collect()
  328.             else
  329.                 sleep( 0.5 )
  330.             end
  331.         end
  332.     elseif xPos < x then
  333.         while xDir ~= 1 do
  334.             turnLeft()
  335.         end
  336.         while xPos < x do
  337.             if turtle.forward() then
  338.                 xPos = xPos + 1
  339.                 fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  340.             elseif turtle.dig() or turtle.attack() then
  341.                 collect()
  342.             else
  343.                 sleep( 0.5 )
  344.             end
  345.         end
  346.     end
  347.    
  348.     if zPos > z then
  349.         while zDir ~= -1 do
  350.             turnLeft()
  351.         end
  352.         while zPos > z do
  353.             if turtle.forward() then
  354.                 zPos = zPos - 1
  355.                 fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  356.             elseif turtle.dig() or turtle.attack() then
  357.                 collect()
  358.             else
  359.                 sleep( 0.5 )
  360.             end
  361.         end
  362.     elseif zPos < z then
  363.         while zDir ~= 1 do
  364.             turnLeft()
  365.         end
  366.         while zPos < z do
  367.             if turtle.forward() then
  368.                 zPos = zPos + 1
  369.                 fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  370.             elseif turtle.dig() or turtle.attack() then
  371.                 collect()
  372.             else
  373.                 sleep( 0.5 )
  374.             end
  375.         end
  376.     end
  377.    
  378.     while depth < y do
  379.         if turtle.down() then
  380.             depth = depth + 1
  381.         elseif turtle.digDown() or turtle.attackDown() then
  382.             collect()
  383.         else
  384.             sleep( 0.5 )
  385.         end
  386.     end
  387.    
  388.     while zDir ~= zd or xDir ~= xd do
  389.         turnLeft()
  390.     end
  391. end
  392.  
  393. RefuelFromRF()
  394. print( "Excavating..." )
  395. fm_msg(nil, ldb2.get(db, "depth"), "Excavating...", "S:" .. size .. " X-" .. xPos .. " Z-" .. zPos)
  396. for n=1, depthFrom do
  397.     tryDown()
  398. end
  399.  
  400. local reseal = false
  401. turtle.select(1)
  402. if turtle.digDown() then
  403.     reseal = true
  404. end
  405.  
  406. local alternate = 0
  407. local done = false
  408. while not done do
  409.     for n=1,size do
  410.         for m=1,size-1 do
  411.             if not tryForwards() then
  412.                 done = true
  413.                 break
  414.             end
  415.         end
  416.         if done then
  417.             break
  418.         end
  419.         if n<size then
  420.             if math.fmod(n + alternate,2) == 0 then
  421.                 turnLeft()
  422.                 if not tryForwards() then
  423.                     done = true
  424.                     break
  425.                 end
  426.                 turnLeft()
  427.             else
  428.                 turnRight()
  429.                 if not tryForwards() then
  430.                     done = true
  431.                     break
  432.                 end
  433.                 turnRight()
  434.             end
  435.         end
  436.     end
  437.     if done then
  438.         break
  439.     end
  440.    
  441.     if size > 1 then
  442.         if math.fmod(size,2) == 0 then
  443.             turnRight()
  444.         else
  445.             if alternate == 0 then
  446.                 turnLeft()
  447.             else
  448.                 turnRight()
  449.             end
  450.             alternate = 1 - alternate
  451.         end
  452.     end
  453.    
  454.     if not tryDown() then
  455.         done = true
  456.         break
  457.     end
  458. end
  459.  
  460. print( "Returning to surface..." )
  461. fm_msg(nil, ldb2.get(db, "depth"), "Returning to surface...", nil)
  462. -- Return to where we started
  463. goTo( 0,0,0,0,-1 )
  464. unload( false )
  465. RefuelFromRF()
  466. goTo( 0,0,0,0,1 )
  467.  
  468.  
  469. -- Seal the hole
  470. if reseal then
  471.     turtle.placeDown()
  472. end
  473.  
  474. print( "Mined "..(collected + unloaded).." items total." )
  475. fm_msg(nil, ldb2.get(db, "depth"), "Work done!", "TC: " .. collected + unloaded)
  476. ldb2.set(db, "done", 1)
Add Comment
Please, Sign In to add comment