Advertisement
Guest User

oreIdent

a guest
Feb 12th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.32 KB | None | 0 0
  1. logFile = "oreIdent.log"
  2. logH = fs.open(logFile, "w")
  3.  
  4. function log(str)
  5.      logH.write("["..os.day().." "..
  6.       textutils.formatTime(os.time())..
  7.       "] ")
  8.      logH.write(str)
  9.      logH.write("\n")
  10.      logH.flush()
  11. end
  12.  
  13. function lprint(str)
  14.      log(str)
  15.      print(str)
  16. end
  17.  
  18. function lerror(e)
  19.      log("Error: "..tostring(e))
  20.      error(e)
  21. end
  22.  
  23. log("Started script")
  24.  
  25. local tArgs = { ... }
  26. if #tArgs ~= 2 then
  27.      lerror("Usage: oreIdent <length> <height>")
  28. end
  29. length = tonumber(tArgs[1])
  30. height = tonumber(tArgs[2])
  31.  
  32. log("Using length "..length)
  33.  
  34. local f = fs.open("oreData","r")
  35. oreData = "a"
  36. --print(f.readAll())
  37. if f ~= nil then
  38.      oreData = textutils.unserialise(f.readAll())
  39. else
  40.      oreData = {["minecraft:gravel"]="minecraft:gravel"}
  41. end
  42. --print(textutils.serialise(oreData))
  43.  
  44. orePos = {}
  45. ignore = {["minecraft:stone"] = true,
  46.           ["minecraft:flowing_lava"] = true,
  47.           ["minecraft:water"] = true,
  48.           ["minecraft:flowing_water"] = true}
  49. local freePos = 2
  50. local x = 0
  51. local y = 0
  52. local bedrock = false
  53.  
  54. dirInfo = {
  55.  f = {x=1, y=0, next="u"},
  56.  u = {x=0, y=1, next="b"},
  57.  b = {x=-1,y=0, next="d"},
  58.  d = {x=0, y=-1,next="f"} }
  59.  
  60. local function halfTurn()
  61.      turtle.turnLeft()
  62.      turtle.turnLeft()
  63. end
  64.  
  65. local function turn(dir)
  66.   if dir == "l" then
  67.     turtle.turnLeft()
  68.   elseif dir == "r" then
  69.     turtle.turnRight()
  70.   else
  71.     lerror("turn: Unkown direction "..tostring(dir))
  72.   end
  73. end
  74.  
  75. local function place(dir)
  76.      if dir == "f" then
  77.           return turtle.place()
  78.      elseif dir == "u" then
  79.           return turtle.placeUp()
  80.      elseif dir == "d" then
  81.           return turtle.placeDown()
  82.      else
  83.           error("Place: Unknown direction: "..dir)
  84.      end
  85. end
  86.  
  87. local function inspect(dir)
  88.      if dir == "f" then
  89.           return turtle.inspect()
  90.      elseif dir == "u" then
  91.           return turtle.inspectUp()
  92.      elseif dir == "d" then
  93.           return turtle.inspectDown()
  94.      elseif dir == "b" then
  95.           halfTurn()
  96.           a,b = turtle.inspect()
  97.           halfTurn()
  98.           return a,b
  99.      else
  100.           error("Inspect: Unknown direction")
  101.      end
  102. end
  103.  
  104. local function attack(dir)
  105.      if dir == "f" then
  106.           return turtle.attack()
  107.      elseif dir == "u" then
  108.           return turtle.attackUp()
  109.      elseif dir == "d" then
  110.           return turtle.attackDown()
  111.      else
  112.           lerror("attack: Unknown direction: "..dir)
  113.      end
  114. end
  115.  
  116. local function dig(dir)
  117.      if dir == "f" then
  118.           return turtle.dig()
  119.      elseif dir == "u" then
  120.           return turtle.digUp()
  121.      elseif dir == "d" then
  122.           return turtle.digDown()
  123.      elseif dir == "b" then
  124.           halfTurn()
  125.           ok, reason = turtle.dig()
  126.           halfTurn()
  127.           return ok, reason
  128.      else
  129.           lerror("Unknown direction")
  130.      end
  131. end
  132.  
  133. movements = {
  134.  f=turtle.forward,
  135.  u=turtle.up,
  136.  b=turtle.back,
  137.  d=turtle.down}
  138.  
  139. function go2(dir)
  140.      return movements[dir]()
  141. end
  142.  
  143. local function go(dir)
  144.      if dir == "f" then
  145.           return turtle.forward()
  146.      elseif dir == "u" then
  147.           return turtle.up()
  148.      elseif dir == "d" then
  149.           return turtle.down()
  150.      elseif dir == "b" then
  151.           return turtle.back()
  152.      else
  153.           lerror("Unknown direction")
  154.      end
  155. end
  156.  
  157. local function saveOreData()
  158.      local str = textutils.serialise(oreData)
  159.      local f = fs.open("oreData", "w")
  160.      f.write(str)
  161.      f.close()
  162. end
  163.  
  164. local function unload()
  165.      lprint("Unloading...")
  166.      dig("u")
  167.      go("u")
  168.      dig("u")
  169.      turtle.select(1)
  170.      place("d")
  171.      turtle.select(2)
  172.      place("u")
  173.      for i=3,14 do
  174.           turtle.select(i)
  175.           local item = turtle.getItemDetail()
  176.           if item and item.name == "minecraft:cobblestone" then
  177.                turtle.dropUp()
  178.           else
  179.                turtle.dropDown()
  180.           end
  181.      end
  182.      turtle.select(1)
  183.      dig("d")
  184.      turtle.select(2)
  185.      dig("u")
  186.      go("d")
  187.      freePos = 3
  188.      orePos = {}
  189. end
  190.  
  191. local function refuel()
  192.      local fl = turtle.getFuelLevel()
  193.      if fl < 1000 then
  194.           lprint("Low fuel level, refueling...")
  195.           turtle.select(16)
  196.           turtle.refuel(2)
  197.           lprint("Charcoal left: "..turtle.getItemCount())
  198.      end
  199. end
  200.  
  201. -- Get position for an item type
  202. local function getPos(name)
  203.      -- TODO: Also check for old items
  204.      local pos = orePos[name]
  205.      --while pos == nil or pos > 15 do
  206.           if pos == nil then
  207.                turtle.select(1)
  208.                while turtle.getItemCount()>0 and pos ~= 16 do
  209.                     pos = freePos
  210.                     freePos = pos+1
  211.                     orePos[name] = pos
  212.                     turtle.select(pos)
  213.                     -- Save updated array
  214.                end
  215.                lprint("New pos: "..tostring(pos)..
  216.                      " for the ore "..name)
  217.           else
  218.                turtle.select(pos)
  219.                if turtle.getItemSpace() == 0 then
  220.                     orePos[name] = nil
  221.                     return getPos(name)
  222.                end
  223.           end
  224.          
  225.          return pos
  226.     end
  227.    
  228.     --TODO; Handle lava
  229.     local function tryGo(dir)
  230.          refuel()
  231.          local isBlock, data = inspect(dir)
  232.          if isBlock and (data.name == "minecraft:lava"
  233.             or data.name == "minecraft:flowing_lava" and data.metadata == 0) then
  234.           lprint("Drinking lava...")
  235.           turtle.select(15)
  236.           ok, reason = place(dir)
  237.           if not ok then
  238.                lprint("Failed to gather lava, because: "..reason)
  239.           end
  240.           ok, reason = turtle.refuel()
  241.           if not ok then
  242.                lprint("Failed to drink lava, because "..reason)
  243.           end
  244.           fuelLevel = turtle.getFuelLevel()
  245.           lprint("Fuel level; "..fuelLevel)
  246.      elseif isBlock then
  247.           local name = data.name
  248.           local val = oreData[name]
  249.          
  250.           -- Hit bedrock
  251.           if name == "minecraft:bedrock" then
  252.                bedrock = true
  253.                lprint("Found bedrock: "..name)
  254.                return "bedrock"
  255.           end
  256.          
  257.           if val ~= nil and val ~= name
  258.              and not ignore[name] then
  259.            lprint("Skipping ore: "..name.."->"..val)
  260.            return false, name, val
  261.       end
  262.      
  263.       pos = getPos(name)
  264.       if pos == 16 then
  265.            unload(dir)
  266.            pos = getPos(name)
  267.       end
  268.      
  269.       ok, reason = dig(dir)
  270.       if not ok and not ignore[name] then
  271.            lprint("Failed to dig "..dir.." "..name..
  272.            " which becomes "..tostring(val)..
  273.            ", because: "..reason)
  274.            oreData[name] = "unbreakable"
  275.            saveOreData()
  276.            return false, name, "unbreakable"
  277.       end
  278.      
  279.       if val == nil then
  280.            newData = turtle.getItemDetail()
  281.            if newData == nil then
  282.                 val = "No item"
  283.            else
  284.                 val = newData.name
  285.            end
  286.            oreData[name] = val
  287.            lprint("Found new block: "..name
  288.                  .."="..val.."@"..pos)
  289.            saveOreData()
  290.       end
  291.       -- print("Found "..name.."@"..pos)
  292.  end
  293.  
  294.  if not go(dir) then
  295.       if inspect(dir) then
  296.            return tryGo(dir)
  297.       end
  298.       while attack(dir) do
  299.            sleep(0.5)
  300.       end
  301.       sleep(1)
  302.       ok, reason = go(dir)
  303.       if not ok then
  304.            lprint("Failed to go, because: "..tostring(reason))
  305.            return false
  306.       end
  307.  end
  308.  return true, name, val
  309. end
  310.  
  311. local function pathFind(dir)
  312.      local di = dirInfo[dir]
  313.      while not tryGo(dir) do
  314.           pathFind(di["next"])
  315.      end
  316.       x = x + di["x"]
  317.       y = y + di["y"]
  318. end
  319.  
  320. local function newLayer()
  321.      --while not turtle.detectUp() do
  322.          -- go("u")
  323.      --end
  324.      lprint("New layer from "..x.."x"..y)
  325.      y = 1
  326.      y0 = height
  327.      while y < y0 do
  328.           pathFind("u")
  329.           while x < 0 do
  330.                pathFind("f")
  331.           end
  332.      end
  333.      if dx > 0 then
  334.          lprint("Turning right")
  335.          turtle.turnRight()
  336.      else
  337.          lprint("Turning left")
  338.          turtle.turnLeft()
  339.      end
  340.      dig("f")
  341.      go("f")
  342.      if dx > 0 then
  343.           turtle.turnLeft()
  344.      else
  345.           turtle.turnRight()
  346.      end
  347. end
  348.  
  349. y0 = 0
  350. y = 0
  351. x = 0
  352. dx = 1
  353. while true do
  354.     while not bedrock do
  355.       while x < length do
  356.            pathFind("f")
  357.            
  358.            if y~=y0 then          
  359.              lprint("Going back from "..x.."x"..(y-y0))
  360.            end
  361.            while y > y0 do
  362.                 pathFind("d")
  363.            end
  364.       end
  365.       lprint("Done with layer "..y0.." is at "..x.."x"..y)
  366.       pathFind("d")
  367.       y0 = y0 - 1
  368.      
  369.       turtle.turnLeft()
  370.       turtle.turnLeft()
  371.       dx = -dx
  372.       x = length - x
  373.       if dx>0 then
  374.            lprint("Next dir is right")
  375.       else
  376.            lprint("Next dir is left")
  377.       end
  378.     end
  379.     newLayer()
  380.     bedrock = false
  381. end
  382.  
  383. -- Todo: Move to where it updates
  384. -- Also add persitance for movement
  385. -- TODO: Refuel automatiaclly
  386. -- TODO: Handle mobs
  387. -- TODO: Place torches
  388. str = textutils.serialise(oreData)
  389. --print(str)
  390. local f=fs.open("oreData","w")
  391. f.write(str)
  392. f.close()
  393. --print(textutils.serialise(orePos))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement