solidity

Untitled

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