Advertisement
Taruu

mine.lua

Mar 8th, 2018
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --pastebin get -f 0CpP3Jzy mine.lua
  2. local robot=require("robot")
  3. local component=require("component")
  4. local computer=require("computer")
  5. local ic = component.inventory_controller
  6. local a = {...}
  7. local xLength=tonumber(a[1]) or 48
  8. local yLength=tonumber(a[2]) or 48
  9. local zDepth=tonumber(a[3]) or 7
  10. local dLayer=tonumber(a[4]) or 3
  11. local nStart=5
  12. local tDumpster ={
  13. "minecraft:cobblestone",
  14. "minecraft:dirt",
  15. "minecraft:gravel",
  16. "chisel:granite",
  17. "chisel:limestone",
  18. "chisel:andesite",
  19. "chisel:diorite"
  20.                  }
  21. if component.isAvailable("chunkloader")
  22.     then
  23.     component.chunkloader.setActive(true)
  24. end
  25. -- Добыча 1 столба
  26. local function prey()
  27. while not robot.forward() do robot.swing() os.sleep(0,5) end
  28. while robot.swingUp() do os.sleep(0,5) end
  29. robot.swingDown()
  30. end
  31. -- Спуск на заданную глубину
  32. local function preyDown(dLL)
  33. for dLLL=1,dLL do
  34. while not robot.down() do robot.swingDown() end
  35. end
  36. end
  37. -- Добыча 1 траншеи
  38. local function trench(ll)
  39. for lll=1,ll do
  40. prey()
  41. -- while robot.durability()*1000000<100 do os.sleep(180) end
  42. end
  43. end
  44. -- Перемещение на заданное расстояние
  45. local function moveLine(ll)
  46. while ll>1 do while not robot.forward() do robot.swing() os.sleep(0,5) end ll=ll-1 end
  47. end
  48. -- 1 слот - кирка
  49. local nKir=1
  50. -- 2 слот - рычаг
  51. local nRyc=2
  52. -- 3 слот - зарядник
  53. local nZar=3
  54. -- 4 слот - трансивер
  55. local nTra=4
  56. local function goForward()
  57. while not robot.forward() do robot.swing() os.sleep(0,5) end
  58. robot.suck()
  59. return true
  60. end
  61. local function goUp()
  62. while not robot.up() do robot.swingUp() end
  63. end
  64. local function goDown()
  65. while not robot.down() do robot.swingDown() end
  66. end
  67. local function goBack()
  68. if not robot.back() then robot.turnAround() goForward() robot.turnAround() end
  69. end
  70. local function doPlace(nSlot)
  71. robot.select(nSlot)
  72. while not robot.place() do robot.select(nStart) goForward() goBack() robot.select(nSlot) end
  73. robot.select(nStart)
  74. end
  75. local function suckDrill()
  76. ll=false
  77. for jj=9,16 do if ic.getStackInSlot(3,jj) ~= nil then if ic.getStackInSlot(3,jj).label=="bamik_drill" then ic.suckFromSlot(3,jj) ll=true end end end
  78. return ll
  79. end
  80. -- Проверка на мусор
  81. local function dumpster(sNN)
  82. local log=false
  83. local i,j=1,#tDumpster
  84. repeat
  85. if sNN==tDumpster[i] then log=true end
  86. i=i+1
  87. until log or i>j
  88. return log
  89. end
  90. -- Выгрузка инвентаря в указанную сторону. Если нет сундука, то выброс мусора и уплотнение.
  91. -- Слоты до указанного не трогаются.
  92. local function drop()
  93.   if ic.getInventorySize(3) ~= nil then
  94.     for i = robot.inventorySize(), nStart, -1 do
  95.     robot.select(i)
  96.     while robot.count()>0 do robot.drop() end
  97.     end
  98.   else
  99.     local i,j=nStart, robot.inventorySize()
  100.     while i ~= j do
  101.     robot.select(j)
  102.     local t = ic.getStackInInternalSlot(j)
  103.     if t ~= nil then
  104.     local sN = t.name
  105.       if dumpster(sN)   then robot.drop() j=j-1
  106.       else robot.transferTo(i) i=i+1
  107.       end
  108.     else
  109.       j=j-1
  110.     end
  111.     end
  112.   end
  113. end
  114. local function zaryad()
  115. goForward()
  116. -- Устанавливаем трансивер
  117. doPlace(nTra)
  118. -- Заряжаем лазер или бур
  119. robot.select(nKir) ic.equip() robot.drop() drop() robot.select(nKir) os.sleep(120) ic.equip() robot.select(nStart)
  120. -- Устанавливаем зарядник
  121. goUp() doPlace(nZar)
  122. -- Устанавливаем рычаг и включаем его
  123. goUp() robot.select(nRyc) robot.placeDown(3) ic.equip() robot.useDown(3) ic.equip() robot.select(nStart)
  124. -- Встаем на зарядку
  125. goForward() while computer.energy()<0.99* computer.maxEnergy() do os.sleep(15) end
  126. -- Снимаем
  127. robot.select(nKir)
  128. goBack() goDown() goForward()
  129. goBack() goDown() goForward()
  130. goBack() goBack() robot.select(nStart)
  131. end
  132. local function servicing()
  133. -- Если инвентарь заполнился, то выброс мусора.
  134. -- Свободного места до переполнения, должно хватить от проверки до проверки. Оставляем 5 слотов.
  135. -- Для добычи в ваниле, можно оставить 2.
  136. robot.select(1) ic.equip()
  137. local tL=ic.getStackInInternalSlot(1)
  138. ic.equip()
  139. local robEn=computer.energy()/computer.maxEnergy()
  140. local lasDm=tL.damage/tL.maxDamage
  141. -- Если разрядился робот, бур или заполнился инвентарь, то проводим обслуживание.
  142. if (robot.count(robot.inventorySize()-5)>0) or (robEn<0.1) or (lasDm>0.9) then zaryad() end
  143. end
  144. -- Тело программы
  145. -- Текущая глубина копания
  146. local zD=zDepth
  147. -- Текущая толщина слоя копания
  148. local dL=dLayer
  149. repeat
  150. print(zD,dL)  
  151. xL=xLength
  152. yL=yLength-1
  153. repeat
  154. trench(xL)
  155. xL=xL-1
  156. servicing()
  157. robot.turnRight()
  158. trench(yL)
  159. yL=yL-1
  160. servicing()
  161. robot.turnRight()
  162. until xL<1 or yL<0
  163. -- Очищаемся от мусора перед возвратом в исходную позицию.
  164. -- drop()
  165. -- Вычисление длины "обратного" хода
  166. local xyBack=math.ceil((math.min(xLength, yLength)-1)/2)+1
  167. if math.min(xLength, yLength)%2 == 0 then
  168. yBack=xyBack
  169. xBack=yBack
  170. else
  171. robot.turnAround()
  172. if xLength-yLength<=0 then
  173. yBack=yLength-xyBack+1
  174. xBack=xyBack+1
  175. else
  176. xBack=xLength-xyBack+2
  177. yBack=xyBack
  178. end
  179. end
  180. robot.turnLeft()
  181. moveLine(yBack)
  182. robot.turnLeft()
  183. moveLine(xBack)
  184. robot.turnAround()
  185.  
  186. zD=zD-dL
  187. dL=math.min(zD,dL)
  188. preyDown(dL)
  189. until dL<1
  190. for k=1,zDepth do goUp() end
  191. zaryad()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement