solidity

mine drone

Dec 19th, 2012
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.74 KB | None | 0 0
  1. -- minimal intrusion miner
  2.  
  3. args = { ... }      -- xdig zdig xdrop ydrop zdrop fdrop
  4.  
  5. if #args ~= 6 then exit() end
  6.  
  7. local digSpots = {{0,0},{-2,1},{-4,2},{-3,4},{-1,3}}
  8. local fuelSlot = 16
  9. local yTravel = 75 -- height to travel at
  10. local dropPos = {tonumber(args[3]), tonumber(args[4]), tonumber(args[5]), tonumber(args[6])}
  11.  
  12. local pos = {0,0,0,1}   -- x,y,z,f
  13.  
  14. local statefile = "state"
  15. local fh = fs.open(statefile,"r")
  16. for i = 1,4 do
  17.     pos[i] = tonumber(fh.readLine())
  18. end
  19. fh.close()
  20.  
  21. -- pos[1], pos[2], pos[3] = gps.locate(1)
  22. -- print("which direction am i facing?")
  23. -- pos[4] = tonumber(read())
  24.  
  25. print(pos[1].." "..pos[2].." "..pos[3].." "..pos[4])
  26.  
  27. local movement = {{0,0,1,0},{-1,0,0,0},{0,0,-1,0},{1,0,0,0},{0,1,0,0},{0,0,0,1}}    -- directions 1-4, up, down, turn left, turn right
  28.  
  29. function matrixOp(a,b,op)
  30.     local c = {}
  31.     if #a == #b then
  32.         for i = 1,#a do
  33.             if op == "+" then
  34.                 c[i] = a[i] + b[i]
  35.             elseif op == "-" then
  36.                 c[i] = a[i] - b[i]
  37.             end
  38.         end
  39.     end
  40.     return c
  41. end
  42.  
  43. function updateState()
  44.     local fh = fs.open(statefile,"w")
  45.     for i = 1,4 do
  46.         fh.writeLine(tostring(pos[i]))
  47.     end
  48.     fh.close()
  49.     print(pos[1].." "..pos[2].." "..pos[3].." "..pos[4])
  50. end
  51.  
  52. function move(direction, attack)
  53.     while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 10) do
  54.         turtle.select(fuelSlot)
  55.         turtle.refuel(1)
  56.     end
  57.     if direction == "f" then
  58.         moved = turtle.forward()
  59.         while not moved do
  60.             print("can't move forward")
  61.             if attack then
  62.                 turtle.attack()
  63.             end
  64.             os.sleep(1)
  65.             moved = turtle.forward()
  66.         end
  67.         if moved then
  68.             pos = matrixOp(pos,movement[pos[4]],"+")
  69.         end    
  70.     elseif direction == "b" then
  71.         moved = turtle.back()
  72.         while not moved do
  73.             print("can't move back")
  74.             os.sleep(1)
  75.             moved = turtle.back()
  76.         end
  77.         if moved then
  78.             pos = matrixOp(pos,movement[pos[4]],"-")
  79.         end
  80.     elseif direction == "u" then
  81.         moved = turtle.up()
  82.         while not moved do
  83.             print("can't move up")
  84.             if attack then
  85.                 turtle.attackUp()
  86.             end
  87.             os.sleep(1)
  88.             moved = turtle.up()
  89.         end
  90.         if moved then
  91.             pos = matrixOp(pos,movement[5],"+")
  92.         end
  93.     elseif direction == "d" then
  94.         moved = turtle.down()
  95.         while not moved do
  96.             print("can't move down")
  97.             if attack then
  98.                 turtle.attackDown()
  99.             end
  100.             os.sleep(1)
  101.             moved = turtle.down()
  102.         end
  103.         if moved then
  104.             pos = matrixOp(pos,movement[5],"-")
  105.         end
  106.     elseif direction == "r" then
  107.         turtle.turnRight()
  108.         pos = matrixOp(pos,movement[6],"+")
  109.         if pos[4] > 4 then
  110.             pos[4] = 1
  111.         end
  112.     elseif direction == "l" then
  113.         turtle.turnLeft()
  114.         pos = matrixOp(pos,movement[6],"-")
  115.         if pos[4] < 1 then
  116.             pos[4] = 4
  117.         end
  118.     end
  119.     updateState()
  120. end
  121.  
  122. function goto(newpos)
  123.     --numberfy the args
  124.     for i = 1,#newpos do
  125.         newpos[i] = tonumber(newpos[i])
  126.     end
  127.     --goto travel height
  128.     if (newpos[1] ~= pos[1]) or (newpos[3] ~= pos[3]) then
  129.         while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[2] - yTravel))) do
  130.             turtle.select(fuelSlot)
  131.             turtle.refuel(1)
  132.         end
  133.         while pos[2] < yTravel do
  134.             move("u", false)
  135.         end
  136.         while pos[2] > yTravel do
  137.             move("d", false)
  138.         end
  139.        
  140.         --goto x
  141.         while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[1] - newpos[1]))) do
  142.             turtle.select(fuelSlot)
  143.             turtle.refuel(1)
  144.         end
  145.         while pos[1] < newpos[1] do
  146.             while pos[4] ~= 4 do
  147.                 move("r", false)
  148.             end
  149.             move("f", false)
  150.         end
  151.         while pos[1] > newpos[1] do
  152.             while pos[4] ~= 2 do
  153.                 move("r", false)
  154.             end
  155.             move("f", false)
  156.         end
  157.        
  158.         --goto z
  159.         while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[3] - newpos[3]))) do
  160.             turtle.select(fuelSlot)
  161.             turtle.refuel(1)
  162.         end
  163.         while pos[3] < newpos[3] do
  164.             while pos[4] ~= 1 do
  165.                 move("r", false)
  166.             end
  167.             move("f", false)
  168.         end
  169.         while pos[3] > newpos[3] do
  170.             while pos[4] ~= 3 do
  171.                 move("r", false)
  172.             end
  173.             move("f", false)
  174.         end
  175.     end
  176.    
  177.     --goto y
  178.     if newpos[2] > 0 then
  179.         while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[2] - newpos[2]))) do
  180.             turtle.select(fuelSlot)
  181.             turtle.refuel(1)
  182.         end
  183.         while pos[2] < newpos[2] do
  184.             move("u", false)
  185.         end
  186.         while pos[2] > newpos[2] do
  187.             move("d", false)
  188.         end
  189.     else        -- y = -1 to go down until you touch ground
  190.         while not turtle.detectDown() do
  191.             if (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 10) then
  192.                 turtle.select(fuelSlot)
  193.                 turtle.refuel(1)
  194.             end
  195.             move("d", false)
  196.         end
  197.     end
  198.    
  199.     --face correctly (if set)
  200.     if #newpos == 4 then
  201.         while pos[4] ~= newpos[4] do
  202.             move("r", false)
  203.         end
  204.     end
  205. end
  206.  
  207. function dropInv()
  208.     goto(dropPos)
  209.     --restock on fuel
  210.     turtle.select(fuelSlot)
  211.     turtle.suckDown()
  212.     for i = 4,15 do
  213.         turtle.select(i)
  214.         turtle.transferTo(fuelSlot)     -- if it's the fuel we use, put it into the fuel slot
  215.         if turtle.getItemCount(i) > 0 then
  216.             while not turtle.drop() do      -- if there's something left, drop it
  217.                 sleep(1)                    -- wait a moment if you can't drop it
  218.             end
  219.         end
  220.     end
  221.     while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 10) do
  222.         turtle.select(fuelSlot)
  223.         turtle.refuel(1)
  224.     end
  225.     turtle.select(1)
  226.     for i = 1,3 do
  227.         move("b", false)
  228.     end
  229. end
  230.  
  231. function digShaft()
  232.     while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(pos[2])) do      -- refuel enough to go to bedrock
  233.         turtle.select(fuelSlot)
  234.         turtle.refuel(1)
  235.     end
  236.     local hitBedrock = false
  237.     while not hitBedrock do
  238.         if turtle.detectDown() then     -- block below
  239.             if not turtle.digDown() then    -- can't dig block below
  240.                 hitBedrock = true
  241.             end
  242.             if turtle.getItemCount(15) > 0 then -- inventory filling up
  243.                 oldpos = pos
  244.                 dropInv()
  245.                 goto(oldpos)
  246.             end
  247.         end
  248.         if hitBedrock then
  249.             break
  250.         end
  251.         move("d", true)
  252.         for k = 1,4 do
  253.             if turtle.detect() then     -- block in front
  254.                 local takeBlock = true  -- assume block is interesting
  255.                 for c = 3,1,-1 do
  256.                     turtle.select(c)
  257.                     if turtle.compare() then    -- if it's in slot 1-3, it's not interesting
  258.                         takeBlock = false
  259.                     end
  260.                 end
  261.                 if takeBlock then       -- block is interesting, dig it up
  262.                     turtle.dig()
  263.                     if turtle.getItemCount(15) > 0 then -- inventory filling up
  264.                         oldpos = pos
  265.                         dropInv()
  266.                         goto(oldpos)
  267.                     end
  268.                 end
  269.             end
  270.             if k < 4 then
  271.                 move("r",false)
  272.             end
  273.         end
  274.     end
  275. end
  276.  
  277. rows = 0
  278. cols = 0
  279. --for rows = 0,5 do
  280. --  for cols = 0,5 do
  281.         for n = 1,#digSpots do
  282.             local dpos = {}
  283.             dpos[1] = tonumber(args[1]) + digSpots[n][1] + 5 * cols
  284.             dpos[2] = -1
  285.             dpos[3] = tonumber(args[2]) + digSpots[n][2] + 5 * rows
  286.             goto(dpos)
  287.             digShaft()
  288.         end
  289. --  end
  290. --end
  291.  
  292. dropInv()
  293. print("done with mining at "..args[1].." "..args[2])
Advertisement
Add Comment
Please, Sign In to add comment