Advertisement
LichtMarv

MiningTurtle

Jan 15th, 2021 (edited)
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.90 KB | None | 0 0
  1. local posX = 1
  2. local posY = 1
  3. local posZ = 1
  4.  
  5. local dirX = 0
  6. local dirZ = 0
  7.  
  8. local homeX = 0
  9. local homeY = 0
  10. local homeZ = 0
  11.  
  12. local allOres = {}
  13.  
  14. local eventQueue = {}
  15. local dataList = {}
  16.  
  17. function checkPos()
  18.     posX,posY,posZ = gps.locate()
  19. end
  20.  
  21. function setup()
  22.     checkPos()
  23.     homeX = posX
  24.     homeY = posY
  25.     homeZ = posZ
  26.     dataList["Pos"] = {posX,posY,posZ}
  27.     turtle.forward()
  28.     newX,newY,newZ = gps.locate()
  29.     turtle.back()
  30.     dirX = newX-posX
  31.     dirZ = newZ-posZ
  32.     print(dirX,dirZ)
  33. end
  34.  
  35. local modem = peripheral.find("modem")
  36. modem.open(10)
  37. setup()
  38.  
  39. function distToHome()
  40.     local diffX = math.abs(posX - homeX)
  41.     local diffY = math.abs(posY - homeY)
  42.     local diffZ = math.abs(posZ - homeZ)
  43.     return diffX+diffY+diffZ
  44. end
  45.  
  46. function checkFuel()
  47.     local fuel = turtle.getFuelLevel()
  48.     if(distToHome() >= fuel) then
  49.         moveTo(homeX,homeY,homeZ)
  50.     end
  51. end
  52.  
  53. function tryUp()
  54.     if(turtle.detectUp()) then
  55.         turtle.digUp()
  56.     end
  57.     turtle.up()
  58.     checkFuel()
  59. end
  60. function tryDown()
  61.     if(turtle.detectDown()) then
  62.         turtle.digDown()
  63.     end
  64.     turtle.down()
  65.     checkFuel()
  66. end
  67. function tryForward()
  68.     if(turtle.detect()) then
  69.         turtle.dig()
  70.     end
  71.     turtle.forward()
  72.     checkFuel()
  73. end
  74.  
  75. function left()
  76.     if(dirX == 1) then
  77.         dirX = 0
  78.         dirZ = -1
  79.     elseif(dirX == -1) then
  80.         dirX = 0
  81.         dirZ = 1
  82.     elseif(dirZ == 1) then
  83.         dirX = 1
  84.         dirZ = 0
  85.     elseif(dirZ == -1) then
  86.         dirX = -1
  87.         dirZ = 0
  88.     end
  89.     turtle.turnLeft()
  90. end
  91. function right()
  92.    
  93. end
  94.  
  95. function turnTo(x,z)
  96.     while(true) do
  97.         if(dirX == x and dirZ == z) then
  98.             break
  99.         end
  100.         left()
  101.     end
  102. end
  103.  
  104. function moveTo(x,y,z)
  105.     checkPos()
  106.     while(posY ~= y) do
  107.         local diff = y-posY
  108.         if(diff > 0) then
  109.             tryUp()
  110.         else
  111.             tryDown()
  112.         end
  113.         checkPos()
  114.     end
  115.     if(x-posX > 0) then
  116.         turnTo(1,0)
  117.     elseif(x-posX < 0) then
  118.         turnTo(-1,0)
  119.     end
  120.     while(posX ~= x) do
  121.         tryForward()
  122.         checkPos()
  123.     end
  124.     if(z-posZ > 0) then
  125.         turnTo(0,1)
  126.     elseif(z-posZ < 0) then
  127.         turnTo(0,-1)
  128.     end
  129.     while(posZ ~= z) do
  130.         tryForward()
  131.         checkPos()
  132.     end
  133.     checkPos()
  134. end
  135.  
  136. function detectOre()
  137.     local bUp,up = turtle.inspectUp()
  138.     local bDown,down = turtle.inspectDown()
  139.     if(bUp and up.tags["forge:ores"]) then
  140.         return up
  141.     end
  142.     if(bDown and down.tags["forge:ores"]) then
  143.         return down
  144.     end
  145.     local b,forward = turtle.inspect()
  146.     if(b and forward.tags["forge:ores"]) then
  147.         return forward
  148.     end
  149.     left()
  150.     b,forward = turtle.inspect()
  151.     if(b and forward.tags["forge:ores"]) then
  152.         left()
  153.         left()
  154.         left()
  155.         return forward
  156.     end
  157.     left()
  158.     left()
  159.     b,forward = turtle.inspect()
  160.     if(b and forward.tags["forge:ores"]) then
  161.         left()
  162.         return forward
  163.     end
  164.     left()
  165.     return nil
  166. end
  167.  
  168. function checkOre()
  169.     local oreList = {}
  170.     local bUp,up = turtle.inspectUp()
  171.     local bDown,down = turtle.inspectDown()
  172.     if(bUp and up.tags["forge:ores"]) then
  173.         table.insert( oreList, {0,1,0,})
  174.         allOres[up.name] = true
  175.     end
  176.     if(bDown and down.tags["forge:ores"]) then
  177.         table.insert( oreList, {0,-1,0})
  178.         allOres[down.name] = true
  179.     end
  180.     local b,forward = turtle.inspect()
  181.     if(b and forward.tags["forge:ores"]) then
  182.         table.insert( oreList, {dirX,0,dirZ})
  183.         allOres[forward.name] = true
  184.     end
  185.     left()
  186.     b,forward = turtle.inspect()
  187.     if(b and forward.tags["forge:ores"]) then
  188.         table.insert( oreList, {dirX,0,dirZ})
  189.         allOres[forward.name] = true
  190.     end
  191.     left()
  192.     b,forward = turtle.inspect()
  193.     if(b and forward.tags["forge:ores"]) then
  194.         table.insert( oreList, {dirX,0,dirZ})
  195.         allOres[forward.name] = true
  196.     end
  197.     left()
  198.     b,forward = turtle.inspect()
  199.     if(b and forward.tags["forge:ores"]) then
  200.         table.insert( oreList, {dirX,0,dirZ})
  201.         allOres[forward.name] = true
  202.     end
  203.     left()
  204.     return oreList
  205. end
  206.  
  207. function cmd(sname,p)
  208.     if(sname == "home") then
  209.         moveTo(homeX,posY,homeZ)
  210.         moveTo(homeX,homeY,homeZ)
  211.         return {"Done"}
  212.     elseif(sname == "moveRP") then
  213.         moveTo(posX + p[1], posY + p[2], posZ + p[3])
  214.         local ore = detectOre()
  215.         if(ore) then
  216.             return {"Value",ore.name}
  217.         end
  218.     elseif(sname == "moveRH") then
  219.         moveTo(homeX + p[1], homeY + p[2], homeZ + p[3])
  220.         local ore = detectOre()
  221.         if(ore) then
  222.             return {"Value",ore.name}
  223.         end
  224.     elseif(sname == "moveA") then
  225.         moveTo(p[1],p[2],p[3])
  226.         local ore = detectOre()
  227.         if(ore) then
  228.             return {"Value",ore.name}
  229.         end
  230.     elseif(sname == "chest") then
  231.         turnTo(1,0,0)
  232.         for i=1,16 do
  233.             local item = turtle.getItemDetail(i)
  234.             if(item and allOres[item.name]) then
  235.                 turtle.select(i)
  236.                 turtle.drop()
  237.             end
  238.         end
  239.         turnTo(-1,0,0)
  240.         for i=1,16 do
  241.             turtle.select(i)
  242.             turtle.drop()
  243.         end
  244.         return("Done")
  245.     elseif(sname == "vein") then
  246.         checkPos()
  247.         local returnX = posX
  248.         local returnY = posY
  249.         local returnZ = posZ
  250.         local oreList = {}
  251.         local minedList = {}
  252.         local tempore = checkOre()
  253.             for k,v in pairs(tempore) do
  254.                 table.insert( oreList, {posX + v[1], posY + v[2], posZ + v[3]} )
  255.                 minedList[table.concat({posX + v[1], posY + v[2], posZ + v[3]})] = true
  256.             end
  257.         while(true) do
  258.             checkPos()
  259.             table.sort(oreList, function (left, right)
  260.                 local dl = (left[1] - posX)^2 + (left[2] - posY)^2 + (left[3] - posZ)^2
  261.                 local dr = (right[1] - posX)^2 + (right[2] - posY)^2 + (right[3] - posZ)^2
  262.                 return dl < dr
  263.             end)
  264.             local ore = table.remove(oreList,1)
  265.             moveTo(ore[1],ore[2],ore[3])
  266.             local tempore = checkOre()
  267.             for k,v in pairs(tempore) do
  268.                 if(minedList[table.concat({posX + v[1], posY + v[2], posZ + v[3]})]) then
  269.                     print("already added earlyer")
  270.                 else
  271.                     minedList[table.concat({posX + v[1], posY + v[2], posZ + v[3]})] = true
  272.                     table.insert( oreList, {posX + v[1], posY + v[2], posZ + v[3]} )
  273.                 end
  274.             end
  275.             if(#oreList == 0) then
  276.                 break
  277.             end
  278.         end
  279.         print("RETURN TO",returnX,returnY,returnZ)
  280.         moveTo(returnX,returnY,returnZ)
  281.     end
  282.     return {"Done"}
  283. end
  284. function listen()
  285.     while(true) do
  286.         local _,side,rc,sc,data = os.pullEvent("modem_message")
  287.         if(sc == 65534) then
  288.            
  289.         elseif(data == "stop") then
  290.             moveTo(homeX,posY,homeZ)
  291.             moveTo(homeX,homeY,homeZ)
  292.         elseif(data == "home") then
  293.             checkPos()
  294.             homeX = posX
  295.             homeY = posY
  296.             homeZ = posZ
  297.         else
  298.             req = data[1]
  299.             sname = data[2]
  300.             p = data[3]
  301.             if(req == "GET") then
  302.                 modem.transmit(sc,0,dataList[sname])
  303.             else
  304.                 table.insert( eventQueue,{sc,sname,p})
  305.             end
  306.         end
  307.     end
  308. end
  309.  
  310.  
  311.  
  312. function main()
  313.     while(true) do
  314.         if(#eventQueue > 0) then
  315.             currentTask = table.remove(eventQueue,1)
  316.             modem.transmit(currentTask[1],0,cmd(currentTask[2],currentTask[3]))
  317.         end
  318.         os.queueEvent("randomEvent")
  319.         os.pullEvent()
  320.     end
  321. end
  322. parallel.waitForAny(listen,main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement