ksaw000

prototype4

Apr 4th, 2021 (edited)
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.78 KB | None | 0 0
  1. --[[Program for the turtle to execute on startup]]
  2. FIRST_FREE_SLOT = 4 --marks the first slot in the inventory
  3. -- here is the breakdown of slots : {1:lava,2:empty buckets,3:items chest,4 to 16 : everything else}
  4. TOTAL_SLOTS = 16
  5. TUNNEL_START = {143,70,555}
  6. TUNNEL_END = {143,70,537}
  7. CURRX,CURRY,CURRZ=_,_,_
  8. HEADING = 0          
  9. STEPS = 0  --count for total steps since last refuel
  10.  
  11. VISITED={}
  12.  
  13. function forward()
  14.     checkFuel()
  15.     checkFullInv()
  16.     turtle.forward()
  17.     CURRX,CURRY,CURRZ =  gps.locate()
  18.     STEPS=STEPS+1
  19. end
  20.  
  21. function back()
  22.     checkFuel()
  23.     checkFullInv()
  24.     turtle.back()
  25.     CURRX,CURRY,CURRZ =  gps.locate()
  26.     STEPS=STEPS+1
  27. end
  28.  
  29. function turnLeft()
  30.     HEADING = (HEADING-1)%4
  31.     turtle.turnLeft()
  32.   end
  33.  
  34. function turnRight()
  35.     HEADING = (HEADING+1)%4
  36.     turtle.turnRight()
  37. end
  38.  
  39. function turnAround()
  40.     turnRight()
  41.     turnRight()
  42. end
  43.  
  44. function refuel()
  45.     checkFullInv() --make sure invetory is empty to accept potential items
  46.     while (turtle.detectUp()) do --makes space for chests even if it has to dig mulitiple blocks
  47.         turtle.digUp()
  48.     end
  49.     turtle.select(1) -- select lava enderchest
  50.     turtle.placeUp()
  51.     turtle.select(16) -- last slot specially for fuel
  52.     turtle.suckUp() --get lava bucket
  53.     turtle.refuel()
  54.     turtle.select(1) -- lavachest slot
  55.     turtle.digUp()
  56.     turtle.select(2) -- bucket chest slot
  57.     turtle.placeUp()
  58.     turtle.select(16) --empty bucket
  59.     turtle.dropUp() --puts bucket in enderchest
  60.     turtle.select(2)
  61.     turtle.digUp()
  62. end
  63.  
  64. function checkFuel()
  65.     if turtle.getFuelLevel()==0 then
  66.         refuel()
  67.     end
  68. end
  69.  
  70. function checkFullInv()
  71.     if turtle.getItemDetail(16) ~= nil then
  72.         invDump()
  73.     end    
  74. end
  75.  
  76. function move(value)
  77.     checkFullInv()
  78.     checkFuel()
  79.     for i=value,1,-1 do
  80.         turtle.dig()
  81.         forward()
  82.     end
  83. end
  84.  
  85. function moveVertical(value)
  86.     if value < 0 then
  87.         for i=math.abs(value),1,-1 do
  88.             turtle.digDown()
  89.             turtle.down()
  90.             STEPS=STEPS+1
  91.         end
  92.     else
  93.         for i=value,1,-1 do
  94.             turtle.digUp()
  95.             turtle.up()
  96.             STEPS=STEPS+1
  97.         end
  98.     end
  99. end
  100.  
  101. function makeHeading(target)
  102.     while target ~= HEADING do
  103.         if target>HEADING then
  104.             turnRight()
  105.         elseif target < HEADING then
  106.             turnLeft()
  107.         end
  108.     end
  109. end
  110.  
  111.  
  112. function getOrientation()
  113.     loc1 = vector.new(gps.locate(2, false))
  114.     if not turtle.forward() then
  115.         for j=1,6 do
  116.             if not turtle.forward() then
  117.                 turtle.dig()
  118.             else
  119.                 break
  120.             end
  121.         end
  122.     end
  123.     loc2 = vector.new(gps.locate(2, false))
  124.     local heading = loc2 - loc1
  125.  
  126.     return ((heading.x + math.abs(heading.x) * 2) + (heading.z + math.abs(heading.z) * 3))-1
  127.     end
  128.  
  129.     --[[orientation will be:
  130.     -x = 0  (WEST)
  131.     -z = 1  (NORTH)
  132.     +x = 2  (EAST)
  133.     +z = 3  (SOUTH)
  134.     --]]
  135.  
  136.  
  137.  
  138. function invDump()
  139.     while (turtle.detectUp()) do --makes space for chests even if it has to dig mulitiple blocks
  140.         turtle.digUp()
  141.     end
  142.     turtle.select(3)
  143.     turtle.placeUp()
  144.     for i=TOTAL_SLOTS,FIRST_FREE_SLOT,-1 do
  145.         turtle.select(i)
  146.         turtle.dropUp()
  147.     end
  148.     turtle.select(3)
  149.     turtle.digUp()
  150. end
  151.  
  152. function moveTo(X,Y,Z)
  153.     CURRX,CURRY,CURRZ=gps.locate()
  154.     if(CURRX==X and CURRY==Y and CURRZ==Z) then
  155.         print("Already here!")
  156.         return
  157.  
  158.     else
  159.         --translate in the X direction
  160.         if CURRX~=X then
  161.             if X>CURRX and HEADING ~= 2 then
  162.                 makeHeading(2)
  163.             elseif X<CURRX and HEADING ~=0 then
  164.                 makeHeading(0)
  165.             end
  166.             move(math.abs(X-CURRX))
  167.         end
  168.  
  169.         --translate in the Z direction
  170.         if CURRZ~=Z then
  171.             if Z>CURRZ and HEADING ~= 3 then
  172.                 makeHeading(3)
  173.             elseif Z<CURRZ and HEADING ~=1 then
  174.                 makeHeading(1)
  175.             end
  176.             move(math.abs(Z-CURRZ))
  177.         end
  178.         --translate in the Y direction
  179.         if CURRY~=Y then
  180.             moveVertical(Y-CURRY)
  181.         end
  182.         print("done")
  183.     end
  184. end
  185.  
  186. function inspect(direction)
  187.     local s,data
  188.     if direction=="F" then
  189.         s,data = turtle.inspect()
  190.     elseif direction=="U" then
  191.         s,data = turtle.inspectUp()
  192.     elseif direction=="D" then
  193.         s,data = turtle.inspectDown()
  194.     elseif direction=="L" then
  195.         turnLeft()
  196.         s,data = turtle.inspect()
  197.     elseif direction=="R" then
  198.         turnRight()
  199.         s,data = turtle.inspect()
  200.     elseif direction=="B" then
  201.         turnAround()
  202.         s,data = turtle.inspect()
  203.     end
  204.     if s then
  205.         os.sleep(0.1)
  206.         return isOre(data)
  207.     end
  208. end
  209.  
  210. function dfsMiner(vein_start)
  211.     table.insert( VISITED,{CURRX,CURRY,CURRZ})
  212.     if inspect("F") ~=true then
  213.         if inspect("B") ~=true then
  214.             turnAround()
  215.             if inspect("U") ~= true  then
  216.                 if inspect("D") ~= true then
  217.                     if inspect("L") ~= true then
  218.                         turnRight()
  219.                         if inspect("R") ~= true then
  220.                             turnLeft()
  221.                             moveTo(vein_start[1],vein_start[2],vein_start[3])
  222.                             return
  223.                         else
  224.                             local start = {CURRX,CURRY,CURRZ}      
  225.                             move(1)
  226.                             dfsMiner(start)
  227.                         end
  228.                     else
  229.                         local start = {CURRX,CURRY,CURRZ}      
  230.                         move(1)
  231.                         dfsMiner(start)        
  232.                     end
  233.                 else
  234.                     local start = {CURRX,CURRY,CURRZ}
  235.                     moveVertical(-1)
  236.                     dfsMiner(start)          
  237.                 end
  238.             else
  239.                 local start = {CURRX,CURRY,CURRZ}
  240.                 moveVertical(1)
  241.                 dfsMiner(start)
  242.             end
  243.         else
  244.             local start = {CURRX,CURRY,CURRZ}
  245.             move(1)
  246.             dfsMiner(start)
  247.         end
  248.     else
  249.         local start = {CURRX,CURRY,CURRZ}
  250.         move(1)
  251.         dfsMiner(start)
  252.     end
  253. end
  254.  
  255. function isOre(data)
  256.     local name=data.name
  257.     name=string.lower( name )
  258.     if string.match( name,"ore",-3 ) then
  259.         return true
  260.     else
  261.         return false
  262.     end
  263. end
  264.  
  265. function smartTunnel(heading,dist)
  266.     for i=1,dist do
  267.         makeHeading(heading)
  268.         table.insert( VISITED,{CURRX,CURRY,CURRZ})
  269.         if inspect("U") ~= true  then
  270.             if inspect("D") ~= true then
  271.                 if inspect("L") ~= true then
  272.                     turnRight()
  273.                     if inspect("R") ~= true then
  274.                         turnLeft()
  275.                         move(1)
  276.                     else
  277.                         local initial_pos={CURRX,CURRY,CURRZ}
  278.                         move(1)
  279.                         dfsMiner({CURRX,CURRY,CURRZ})
  280.                         moveTo(initial_pos[1],initial_pos[2],initial_pos[3])
  281.                     end
  282.                 else
  283.                     local initial_pos={CURRX,CURRY,CURRZ}
  284.                     move(1)
  285.                     dfsMiner({CURRX,CURRY,CURRZ})
  286.                     moveTo(initial_pos[1],initial_pos[2],initial_pos[3])          
  287.                 end
  288.             else
  289.                 local initial_pos={CURRX,CURRY,CURRZ}
  290.                 moveVertical(-1)
  291.                 dfsMiner({CURRX,CURRY,CURRZ})
  292.                 moveTo(initial_pos[1],initial_pos[2],initial_pos[3])
  293.             end
  294.         else
  295.             local initial_pos={CURRX,CURRY,CURRZ}
  296.             moveVertical(1)
  297.             dfsMiner({CURRX,CURRY,CURRZ})
  298.             moveTo(initial_pos[1],initial_pos[2],initial_pos[3])  
  299.         end
  300.     end
  301. end
  302.  
  303.  
  304. function selfRemove()
  305.     moveTo(TUNNEL_START[1],TUNNEL_START[2],TUNNEL_START[3])
  306.     moveTo(TUNNEL_END[1],TUNNEL_END[2],TUNNEL_END[3])
  307.     rednet.broadcast("master remove")
  308. end
  309.  
  310. function mine( x1,y1,z1,x2,y2,z2 )
  311.     --cannot dig below y=1 as y=0 is bedrock
  312.     if y1<1 then y1=1
  313.     elseif y2<1 then y2=1
  314.     end
  315.     --move to top-northwest corner and dig to bottom-southwest corner
  316.     moveTo(math.min(x1,x2),math.max(y1,y2),math.min(z1,z2))
  317.  
  318.     local targetX,targetY,targetZ=math.max(x1,x2),math.min(y1,y2),math.max(z1,z2)
  319.  
  320.     --facing SOUTH
  321.     makeHeading(3)
  322.  
  323.     --how much to dig in each direction
  324.     local xdist,ydist,zdist=math.abs(x1-x2),math.abs(y1-y2),math.abs(z1-z2)
  325.     for i = 0 , ydist do
  326.         for j=i , xdist + i do
  327.             move(zdist)
  328.             if j~= xdist + i then
  329.                 if (j+(2*i))%2==1 then
  330.                     turnRight()
  331.                     turtle.dig()
  332.                     forward()
  333.                     turnRight()
  334.                 else
  335.                     turnLeft()
  336.                     turtle.dig()
  337.                     forward()
  338.                     turnLeft()
  339.                 end
  340.             end
  341.         end
  342.         if i ~= ydist then
  343.             turnAround()
  344.             moveVertical(-1)
  345.         end
  346.     end
  347.     moveTo(math.min(x1,x2),math.max(y1,y2)+1,math.min(z1,z2)) --go back to top+1-northwest corner
  348.     invDump()
  349.     selfRemove()
  350. end
  351.  
  352. --[[
  353.     The main loop of the turtle's functionality. It will start and then wait for a command via
  354.     rednet broadcast
  355. ]]
  356.  
  357. turtle.suckDown(1)
  358. turtle.turnRight()
  359. turtle.suck(1)
  360. turtle.turnLeft()
  361. turtle.turnLeft()
  362. turtle.suck(1)
  363. turtle.turnRight()
  364. checkFuel()
  365.  
  366. rednet.open("right") -- open the wireless modem for communication
  367.  
  368. HEADING = getOrientation()
  369. back()
  370.  
  371. rednet.broadcast("added")
  372.  
  373.  
  374. while true do -- puts turtle into a waitloop for a message
  375.     local _,message = rednet.receive()
  376.     command = {}
  377.     for word in message:gmatch("%w+") do table.insert(command, word) end
  378.     if tonumber(command[1])==os.getComputerID() then
  379.         table.remove(command,1)
  380.         if command[1]=="exit" then
  381.             break
  382.         elseif command[1] =="dump" then
  383.             invDump()
  384.         elseif command[1]=="checkFuel" then
  385.             checkFuel()
  386.         elseif command[1]=="moveTo" then
  387.             moveTo(tonumber(command[2]),tonumber(command[3]),tonumber(command[4]))
  388.         elseif command[1]=="mine" then
  389.             mine(tonumber(command[2]),tonumber(command[3]),tonumber(command[4]),tonumber(command[5]),tonumber(command[6]),tonumber(command[7]))
  390.         elseif command[1]=="branch" then
  391.             moveTo(tonumber(command[2]),tonumber(command[3]),tonumber(command[4]))
  392.             smartTunnel(tonumber(command[5]),tonumber(command[6]))
  393.         elseif command[1]=="remove" then
  394.             selfRemove()
  395.         end
  396.     end
  397. end
  398.  
Add Comment
Please, Sign In to add comment