CoderPuppy

[CC] obsidian.lua

Jan 7th, 2019
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.70 KB | None | 0 0
  1. local slots = {
  2.     fuel = 1;
  3.     water = 2;
  4. }
  5. local log_comp = 8302
  6.  
  7. if peripheral and rednet then
  8.     peripheral.find('modem', rednet.open)
  9. end
  10. local function log(...)
  11.     print(...)
  12.     if rednet then
  13.         rednet.send(log_comp, table.pack(...), 'cpup/log1')
  14.     end
  15. end
  16.  
  17. if not turtle then
  18.     turtle = {
  19.         getSelectedSlot = function() return 1 end;
  20.         getFuelLevel = function() return 'unlimited' end;
  21.         getItemDetail = function() end;
  22.         dig = function() return false end;
  23.         digUp = function() return false end;
  24.         digDown = function() return false end;
  25.     }
  26.     for _, name in ipairs{'up', 'down', 'forward', 'back', 'turnLeft', 'turnRight', 'place', 'placeUp', 'placeDown', 'select', 'refuel'} do
  27.         turtle[name] = function() return true end
  28.     end
  29. end
  30.  
  31. local function checkInvSpace()
  32.     for i = 1, 16 do
  33.         if not turtle.getItemDetail(i) then
  34.             return true
  35.         end
  36.     end
  37.     return false
  38. end
  39. local function assertInvSpace()
  40.     if not checkInvSpace() then
  41.         error 'no inventory space'
  42.     end
  43. end
  44.  
  45. local function digger(f) return function()
  46.     assertInvSpace()
  47.     local s = turtle.getSelectedSlot()
  48.     turtle.select(1)
  49.     while f() do
  50.     end
  51.     turtle.select(s)
  52. end end
  53. local dig = digger(turtle.dig)
  54. local digUp = digger(turtle.digUp)
  55. local digDown = digger(turtle.digDown)
  56.  
  57. local function refuel()
  58.     if turtle.getFuelLevel() == 0 then
  59.         local s = turtle.getSelectedSlot()
  60.         turtle.select(slots.fuel)
  61.         turtle.refuel(1)
  62.         turtle.select(s)
  63.     end
  64. end
  65.  
  66. local cur_pos = {0, 0, 0}
  67. local cur_rot = 0
  68.  
  69. local function pos_add(...)
  70.     local pos = {0, 0, 0}
  71.     for i = 1, select('#', ...) do
  72.         local p = select(i, ...)
  73.         pos[1] = pos[1] + p[1]
  74.         pos[2] = pos[2] + p[2]
  75.         pos[3] = pos[3] + p[3]
  76.     end
  77.     return pos
  78. end
  79. local function pos_scale(n, pos)
  80.     return {n * pos[1], n * pos[2], n * pos[3]}
  81. end
  82. local function rot_rel_pos(rot)
  83.     local pos = {0, 0, 0}
  84.     pos[rot % 2 + 1] = math.ceil(rot / 2) == 0 and 1 or -1
  85.     return pos
  86. end
  87. local function pos_str(pos)
  88.     return table.concat(pos, ',')
  89. end
  90.  
  91. local function mover(f, fb, ud) return function()
  92.     refuel()
  93.     if not f() then
  94.         error('couldn\'t move')
  95.     end
  96.         cur_pos = pos_add(cur_pos, {0, 0, ud}, pos_scale(fb, rot_rel_pos(cur_rot)))
  97. end end
  98. local down = mover(turtle.down, 0, -1)
  99. local up = mover(turtle.up, 0, 1)
  100. local forward = mover(turtle.forward, 1, 0)
  101. local back = mover(turtle.back, -1, 0)
  102.  
  103. local function turner(f, r) return function()
  104.     cur_rot = (cur_rot + r) % 4
  105.     f()
  106. end end
  107. local turnLeft = turner(turtle.turnLeft, 1)
  108. local turnRight = turner(turtle.turnRight, -1)
  109.  
  110. local function turnTo(dir)
  111.     local rel = (dir - cur_rot) % 4
  112.     if rel == 0 then
  113.     elseif rel == 1 then
  114.         turnLeft()
  115.     elseif rel == 2 then
  116.         turnLeft()
  117.         turnLeft()
  118.     elseif rel == 3 then
  119.         turnRight()
  120.     end
  121. end
  122.  
  123. local function placer(f) return function(slot)
  124.     local s = turtle.getSelectedSlot()
  125.     turtle.select(slot)
  126.     f()
  127.     turtle.select(s)
  128. end end
  129. local place = placer(turtle.place)
  130. local placeDown = placer(turtle.placeDown)
  131. local placeUp = placer(turtle.placeUp)
  132.  
  133. local function vertical()
  134.     -- return 1
  135.     local level = 0
  136.     while true do
  137.             local is, id = turtle.inspectDown()
  138.             if is and id.name == 'minecraft:lava' then
  139.                     digUp()
  140.                     up()
  141.                     placeDown(slots.water)
  142.                     placeDown(slots.water)
  143.                     down()
  144.             elseif is and id.name == 'minecraft:obsidian' then
  145.                     digDown()
  146.                     down()
  147.                     level = level + 1
  148.             else
  149.                     for i = 1, level do
  150.                             up()
  151.                     end
  152.                     return level
  153.             end
  154.     end
  155. end
  156.  
  157. forward()
  158.  
  159. local pos_states = {[pos_str(cur_pos)] = 'todo';}
  160. local dir = 0
  161. local history = {}
  162. local backtracked = false
  163. while true do
  164.     local backtracking = false
  165.  
  166.     local n
  167.     if not backtracked then
  168.         n = vertical()
  169.         pos_states[pos_str(cur_pos)] = 'done'
  170.     end
  171.  
  172.     local chosen_dir
  173.     if backtracked or n > 0 then -- dug some obsidian so look for more
  174.         for _, rel_dir in ipairs{-1, 0, 1, 2} do
  175.             local dir_ = (dir + rel_dir) % 4
  176.             local pos = pos_add(cur_pos, rot_rel_pos(dir_))
  177.             local st = pos_states[pos_str(pos)]
  178.  
  179.             log('dir', dir_)
  180.             log('pos', pos_str(pos))
  181.             log('st', st)
  182.  
  183.             if st == nil then
  184.                 st = 'todo'
  185.                 pos_states[pos_str(pos)] = 'todo'
  186.             end
  187.             if not chosen_dir and st == 'todo' then
  188.                 chosen_dir = dir_
  189.             end
  190.         end
  191.     end
  192.     if chosen_dir then -- if we chose a direction, go there
  193.         log('chosen_dir', chosen_dir, pos_str(pos_add(cur_pos, rot_rel_pos(chosen_dir))))
  194.         history[#history + 1] = {
  195.             went = chosen_dir;
  196.             was = dir;
  197.         }
  198.         turnTo(chosen_dir)
  199.         dig()
  200.         forward()
  201.     else -- otherwise backtrack
  202.         log 'backtracking'
  203.         local h = history[#history]
  204.         history[#history] = nil
  205.         turnTo(h.went)
  206.         back()
  207.         dir = h.was
  208.         backtracking = true
  209.     end
  210.  
  211.     backtracked = backtracking
  212.     -- break
  213. end
Advertisement
Add Comment
Please, Sign In to add comment