Advertisement
Blazuno

veinmine v2

Dec 21st, 2024 (edited)
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.35 KB | None | 0 0
  1. local blacklist = {
  2.     "minecraft:stone",
  3.     "minecraft:dirt",
  4.     "minecraft:diorite",
  5.     "minecraft:andesite",
  6.     "minecraft:granite",
  7.     "minecraft:gravel",
  8.     "quark:slate"
  9. }
  10. local function veinmine()
  11.     local tx,ty,tz = 0,0,1
  12.     local rot = 0
  13.    
  14.     local ores = {}
  15.     local non_ores = {}
  16.     local air = {{0,0,1}}
  17.  
  18.     local function compare_tables(t1, t2)
  19.         if not t1 or not t2 then return false end
  20.         for i = 1, #t1 do
  21.             if t1[i] ~= t2[i] then return false end
  22.         end
  23.         return true
  24.     end
  25.  
  26.     local function find_in_table(t, val)
  27.         for _, v in pairs(t) do
  28.             if compare_tables(v, val) then return _ end
  29.         end
  30.         return false
  31.     end
  32.  
  33.     local function check_ore(direction)
  34.         if direction == "up" then
  35.             _, j = turtle.inspectUp()
  36.             if not _ then return "air" end
  37.             for i,v in pairs(blacklist) do
  38.                 if j.name == v then
  39.                     return false
  40.                 end
  41.             end
  42.             return true
  43.         elseif direction == "down" then
  44.             _, j = turtle.inspectDown()
  45.             if not _ then return "air" end
  46.             for i,v in pairs(blacklist) do
  47.                 if _ and j.name == v then
  48.                     return false
  49.                 end
  50.             end
  51.             return true
  52.         elseif direction == "forward" then
  53.             _, j = turtle.inspect()
  54.             if not _ then return "air" end
  55.             for i,v in pairs(blacklist) do
  56.                 if _ and j.name == v then
  57.                     return false
  58.                 end
  59.             end
  60.             return true
  61.         end
  62.     end
  63.  
  64.  
  65.     local function find_path(pos)
  66.         local path = {
  67.             {tx,ty,tz}
  68.         }
  69.         local x,y,z = pos[1], pos[2], pos[3]
  70.         while not compare_tables(path[#path], {x,y,z}) do
  71.             if tx < x then
  72.                 for i = 1, x-tx do
  73.                     if find_in_table(air, {tx+i, ty, tz}) or compare_tables({tx+i, ty, tz}, pos) then
  74.                         table.insert(path, {tx+i, ty, tz})
  75.                     else
  76.                         break
  77.                     end
  78.                 end
  79.             elseif tx > x then
  80.                 for i = 1, tx-x do
  81.                     if find_in_table(air, {tx-i, ty, tz}) or compare_tables({tx-i, ty, tz}, pos) then
  82.                         table.insert(path, {tx-i, ty, tz})
  83.                     else
  84.                         break
  85.                     end
  86.                 end
  87.             end
  88.             if ty < y then
  89.                 for i = 1, y-ty do
  90.                     if find_in_table(air,{tx, ty+i, tz}) or compare_tables({tx, ty+1, tz}, pos) then
  91.                         table.insert(path, {tx, ty+i, tz})
  92.                     else
  93.                         break
  94.                     end
  95.                 end
  96.             elseif ty > y then
  97.                 for i = 1, ty-y do
  98.                     if find_in_table(air,{tx, ty-1, tz}) or compare_tables({tx, ty-1, tz}, pos) then
  99.                         table.insert(path, {tx, ty-1, tz})
  100.                     else
  101.                         break
  102.                     end
  103.                 end
  104.             end
  105.             if tz < z then
  106.                 for i = 1, z-tz do
  107.                     if find_in_table(air,{tx, ty, tz+i}) or compare_tables({tx, ty, tz+1}, pos) then
  108.                         table.insert(path, {tx, ty, tz+i})
  109.                     else
  110.                         break
  111.                     end
  112.                 end
  113.             elseif tz > z then
  114.                 for i = 1, tz-z do
  115.                     if find_in_table(air,{tx, ty, tz-1}) or compare_tables({tx, ty, tz-1}, pos) then
  116.                         table.insert(path, {tx, ty, tz-1})
  117.                     else
  118.                         break
  119.                     end
  120.                 end
  121.             end
  122.         end
  123.         print("Generated path:")
  124.         for i,v in pairs(path) do
  125.             print(v[1],  v[2], v[3])
  126.         end
  127.         return path
  128.     end
  129.  
  130.  
  131.     local function destroy(pos)
  132.         if tx < pos[1] then
  133.             if rot == 0 then
  134.                 turtle.turnRight()
  135.                 rot = 1
  136.             elseif rot > 1 then
  137.                 for i = 1, rot - 1 do
  138.                     turtle.turnLeft()
  139.                 end
  140.                 rot = 1
  141.             end
  142.             while not turtle.forward() do
  143.                 turtle.attack()
  144.                 turtle.dig()
  145.             end
  146.         elseif tx > pos[1] then
  147.             if rot == 0 then
  148.                 turtle.turnLeft()
  149.                 rot = 3
  150.             elseif rot < 3 then
  151.                 for i = 1, 3 - rot do
  152.                     turtle.turnRight()
  153.                 end
  154.                 rot = 3
  155.             end
  156.             while not turtle.forward() do
  157.                 turtle.attack()
  158.                 turtle.dig()
  159.             end
  160.         end
  161.         if rot == 1 then
  162.             tx = tx + 1
  163.         elseif rot == 3 then
  164.             tx = tx - 1
  165.         end
  166.         if tx == pos[1] and ty == pos[2] and tz == pos[3] then return end
  167.  
  168.         if tz < pos[3] then
  169.             if rot == 3 then
  170.                 turtle.turnRight()
  171.                 rot = 0
  172.             elseif rot < 3 then
  173.                 for i = 1, rot do
  174.                     turtle.turnLeft()
  175.                 end
  176.                 rot = 0
  177.             end
  178.             while not turtle.forward() do
  179.                 turtle.attack()
  180.                 turtle.dig()
  181.             end
  182.         elseif tz > pos[3] then
  183.             if rot == 3 then
  184.                 turtle.turnLeft()
  185.                 rot = 2
  186.             elseif rot < 2 then
  187.                 for i = 1, 2 - rot do
  188.                     turtle.turnRight()
  189.                 end
  190.                 rot = 2
  191.             end
  192.             while not turtle.forward() do
  193.                 turtle.attack()
  194.                 turtle.dig()
  195.             end
  196.         end
  197.         if rot == 0 then
  198.             tz = tz + 1
  199.         elseif rot == 2 then
  200.             tz = tz - 1
  201.         end
  202.         if tx == pos[1] and ty == pos[2] and tz == pos[3] then return end
  203.         if ty < pos[2] then
  204.             while not turtle.up() do
  205.                 turtle.digUp()
  206.                 turtle.attackUp()
  207.             end
  208.             ty = ty + 1
  209.             if tx == pos[1] and ty == pos[2] and tz == pos[3] then return end
  210.         elseif ty > pos[2] then
  211.             while not turtle.down() do
  212.                 turtle.digDown()
  213.                 turtle.attackDown()
  214.             end
  215.             ty = ty - 1
  216.             if tx == pos[1] and ty == pos[2] and tz == pos[3] then return end
  217.         end
  218.     end
  219.  
  220.     local function look_around()
  221.         print("c1")
  222.         checks = {
  223.             {tx+1,ty,tz},
  224.             {tx-1,ty,tz},
  225.             {tx,ty+1,tz},
  226.             {tx,ty-1,tz},
  227.             {tx,ty,tz+1},
  228.             {tx,ty,tz-1}
  229.         }
  230.         for i,v in pairs(air) do
  231.             if find_in_table(checks, v) then
  232.                 table.remove(checks, find_in_table(checks, v))
  233.             end
  234.         end
  235.         print("c2", #checks)
  236.         for i,v in pairs(checks) do
  237.             print("recursing")
  238.             if tx < v[1] then
  239.                 if rot == 0 then
  240.                     turtle.turnRight()
  241.                     rot = 1
  242.                 elseif rot > 1 then
  243.                     for i = 1, rot - 1 do
  244.                         turtle.turnLeft()
  245.                     end
  246.                     rot = 1
  247.                 end
  248.                 local result = check_ore("forward")
  249.                 if result == "air" then
  250.                     table.insert(air, v)
  251.                 elseif result == true then
  252.                     table.insert(ores, v)
  253.                 end
  254.             elseif tx > v[1] then
  255.                 if rot == 0 then
  256.                     turtle.turnLeft()
  257.                     rot = 3
  258.                 elseif rot < 3 then
  259.                     for i = 1, 3 - rot do
  260.                         turtle.turnRight()
  261.                     end
  262.                     rot = 3
  263.                 end
  264.                 local result = check_ore("forward")
  265.                 if result == "air" then
  266.                     table.insert(air, v)
  267.                 elseif result == true then
  268.                     table.insert(ores, v)
  269.                 end
  270.             end
  271.             if tz < v[3] then
  272.                 if rot == 3 then
  273.                     turtle.turnRight()
  274.                     rot = 0
  275.                 elseif rot < 3 then
  276.                     for i = 1, rot do
  277.                         turtle.turnLeft()
  278.                     end
  279.                     rot = 0
  280.                 end
  281.                 local result = check_ore("forward")
  282.                 if result == "air" then
  283.                     table.insert(air, v)
  284.                 elseif result == true then
  285.                     table.insert(ores, v)
  286.                 end
  287.             elseif tz > v[3] then
  288.                 if rot == 3 then
  289.                     turtle.turnLeft()
  290.                     rot = 2
  291.                 elseif rot < 2 then
  292.                     for i = 1, 2 - rot do
  293.                         turtle.turnRight()
  294.                     end
  295.                     rot = 2
  296.                 end
  297.                 local result = check_ore("forward")
  298.                 if result == "air" then
  299.                     table.insert(air, v)
  300.                 elseif not result then
  301.                     table.insert(non_ores, v)
  302.                 elseif result == true then
  303.                     table.insert(ores, v)
  304.                 end
  305.             end
  306.             if ty < v[2] then
  307.                 local result = check_ore("up")
  308.                 if result == "air" then
  309.                     table.insert(air, v)
  310.                 elseif not result then
  311.                     table.insert(non_ores, v)
  312.                 elseif result == true then
  313.                     table.insert(ores, v)
  314.                 end
  315.             elseif ty > v[2] then
  316.                 local result = check_ore("down")
  317.                 if result == "air" then
  318.                     table.insert(air, v)
  319.                 elseif not result then
  320.                     table.insert(non_ores, v)
  321.                 elseif result == true then
  322.                     table.insert(ores, v)
  323.                 end
  324.             end
  325.         end
  326.     end
  327.  
  328.     local function find_closest_ore()
  329.         local closest
  330.         local distance
  331.         for i,v in pairs(ores) do
  332.             if not closest then
  333.                 closest = v
  334.                 distance = math.sqrt((v[1]-tx)^2 + (v[2]-ty)^2 + (v[3]-tz)^2)
  335.             else
  336.                 if math.sqrt((v[1]-tx)^2 + (v[2]-ty)^2 + (v[3]-tz)^2) < distance then
  337.                     distance = math.sqrt((v[1]-tx)^2 + (v[2]-ty)^2 + (v[3]-tz)^2)
  338.                     closest = v
  339.                 end
  340.             end
  341.         end
  342.         print("Closest ore position:", closest[1], closest[2], closest[3])
  343.         return closest
  344.     end
  345.  
  346.     turtle.dig()
  347.     turtle.forward()
  348.     look_around()
  349.     while #ores ~= 0 do
  350.         print("check 1")
  351.         local ore = find_closest_ore()
  352.         print("check 2")
  353.         local path = find_path(ore)
  354.         for i,v in pairs(path) do
  355.             print("Current position:", tx, ty, tz, rot)
  356.             destroy(v)
  357.         end
  358.         print("check 3")
  359.         look_around()
  360.     end
  361.        
  362. end
  363.  
  364. veinmine()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement