Advertisement
bob558

тунель -1х3

Nov 9th, 2016
104
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[ opencomputers tunnel by serafim
  2.  
  3. Копает тунель 1х3 змейкой ряд за рядом,
  4. В 13 слот ложим запасную кирку,
  5. В 14 слот факелы,
  6. В 15 слот уголь,
  7. В 16 слот эндер-сундук.
  8.  
  9. требования:
  10. инвентарь,контроллер инвентаря,
  11. генератор,улучшение парение.
  12.  
  13. связанная карта и чанк лоадер если нужно.
  14.  
  15. пример запуска:
  16. tunnel 30  -- 30 ширина тунеля
  17. ]]--
  18.  
  19. local com = require('component')
  20. local computer = require("computer")
  21.  
  22. local a = {...}
  23. local width = tonumber(a[1]) or 30
  24. local width2 = width
  25. local svet, tru, moves = 0, 0, 0
  26. local chest_pickaxe = true
  27.  
  28. enderchest = true --поставить false для работоты с обычными сундуками
  29.  
  30. --список мусорных блоков
  31. local scrap = {
  32.   "minecraft:cobblestone",
  33.   "minecraft:dirt",
  34.   "minecraft:gravel",
  35.   "minecraft:flint",
  36.   "minecraft:sand",
  37.   "chisel:andesite",
  38.   "chisel:diorite",
  39.   "chisel:granite",
  40.   "chisel:limestone",
  41.   "minecraft:netherrack"
  42. }
  43.  
  44. --список кирок, которые робот может брать из сундука
  45. local pickaxe_list = {
  46.   "minecraft:diamond_pickaxe",
  47.   "minecraft:iron_pickaxe",
  48.   "minecraft:stone_pickaxe",
  49.   "EnderIO:item.darkSteel_pickaxe"
  50.   }
  51.  
  52. if not com.isAvailable("robot") then
  53.   print("только роботы могут использовать эту программу")
  54.   os.exit()
  55. end
  56. local r = require("robot")
  57.  
  58. if not com.isAvailable("inventory_controller") then
  59.   print("для работы нужен контроллер инвентаря")
  60.   os.exit()
  61. end
  62. local i_c = com.inventory_controller
  63.  
  64. if not com.isAvailable("generator") then
  65.   print("для работы нужен генератор")
  66.   os.exit()
  67. end
  68. local gen = com.generator
  69.  
  70. if width > 100 or width < 10 then
  71.   print(" ")
  72.   print("     ширина тунеля    ")
  73.   print("должна быть от 10 do 100")
  74.   print(" ")
  75.   os.exit()
  76. end
  77. print("ширина тунеля = "..width)
  78.  
  79. if com.isAvailable("chunkloader") then
  80.   cloader = com.chunkloader
  81.   cloader.setActive(true)
  82.   print("чанк лоадер активен")
  83. end
  84.  
  85. if com.isAvailable("tunnel") then
  86.   print("связанная карта доступна")
  87.   warp = true
  88. end
  89.  
  90. -- отправка сообщения через тунель
  91. local function sendSt(message)
  92.   print(message)
  93.   if warp then
  94.     pcall(com.tunnel.send(r.name().." "..message))
  95.   end
  96. end
  97.  
  98. --выключить робота
  99. local function off(message)
  100.   sendSt("!!!")
  101.   sendSt(message)
  102.   computer.beep(2000, 5)
  103.   gen.remove()
  104.   sendSt("выключен")
  105.   sendSt("!!!")
  106.   computer.shutdown()
  107. end
  108.  
  109. --копать в низ
  110. local function dig_down()
  111.   while r.detectDown() do
  112.     r.swingDown()
  113.   end
  114. end
  115.  
  116. --поиск кирки в сундуке
  117. local function finditem(side, name)
  118.   local inv, item = i_c.getInventorySize(side)
  119.   if inv then
  120.     for slot = 1, inv do
  121.       for j, name in pairs(pickaxe_list) do
  122.         local item = i_c.getStackInSlot(side, slot)
  123.         if item and item.name == name then
  124.           return slot
  125.         end
  126.       end
  127.     end
  128.   end
  129.   return nil
  130. end
  131.  
  132. --проверяем в слоте кирку
  133. local function ifpickaxe()
  134.   for j, name in pairs(pickaxe_list) do
  135.   local slot = i_c.getStackInInternalSlot(13)
  136.     if slot["name"] == name then
  137.       return true
  138.     end
  139.   end
  140.   r.select(13)
  141.   r.dropDown()
  142.   r.select(1)
  143.   return false
  144. end
  145.  
  146. --берем запасную кирку
  147. local function pickaxe()
  148.   if r.durability() == nil then
  149.     if r.count(13) > 0 and ifpickaxe() then
  150.       r.select(13)
  151.       i_c.equip()
  152.       r.select(1)
  153.       sendSt("взял запасную кирку")
  154.     else
  155.       off("нет кирки :(")
  156.     end
  157.   else
  158.     if r.durability() < 0.05 then
  159.       if r.count(13) > 0 and ifpickaxe() then
  160.         r.select(13)
  161.         i_c.equip()
  162.         r.dropDown()
  163.         r.select(1)
  164.         sendSt("взял запасную кирку")
  165.       else
  166.         if enderchest and chest_pickaxe then
  167.           sendSt("ищу запастную кирку в сундуке")
  168.           r.select(1)
  169.           dig_down()
  170.           r.select(16)
  171.           r.placeDown()
  172.           r.select(13)
  173.           local i = finditem(0)
  174.           if i then
  175.             i_c.suckFromSlot(0, i)
  176.             sendSt("взял запасную кирку из сундука")
  177.             r.select(16)
  178.             dig_down()
  179.             r.select(1)
  180.           else
  181.             sendSt("нет запасной кирки в сундуке :(")
  182.             chest_pickaxe = false
  183.             r.select(16)
  184.             dig_down()
  185.             r.select(1)
  186.           end
  187.         end
  188.       end
  189.     end
  190.   end
  191. end
  192.  
  193. -- проверка предмета, является ли он мусором
  194. local function isScrap(name)
  195.   for i, nm in pairs(scrap) do
  196.     if name == nm then  
  197.       return true
  198.     end
  199.   end
  200.   return false
  201. end
  202.  
  203. --складываем лут в сундук
  204. local function lut()
  205.   if r.count(16) == 0 then
  206.     off("нет сундуков :(")
  207.   else
  208.     dig_down()
  209.     r.select(16)
  210.     if not r.placeDown() then
  211.       sendSt("не могу поставить сундук")
  212.     else
  213.       sendSt("складываю лут в сундук")
  214.       for i=1, 12 do  
  215.       local slot = i_c.getStackInInternalSlot(i)
  216.         if slot ~= nil then  
  217.           r.select(i)
  218.           if not r.dropDown() then
  219.             off("в сундуке нет места :(")
  220.           end
  221.         end
  222.       end
  223.     end
  224.   end
  225.   if enderchest then
  226.     r.select(16)
  227.     pickaxe()
  228.     dig_down()
  229.   end
  230.   r.select(1)
  231. end
  232.  
  233. --сортируем лут
  234. local function sort_lut()
  235.   if r.count(12) > 0 then
  236.     sendSt("дропаю мусор")
  237.     local free_slot = 2
  238.       for i=1, 12 do  
  239.         local slot = i_c.getStackInInternalSlot(i)
  240.         if slot ~= nil then  
  241.           if isScrap(slot.name) then
  242.             r.select(i)
  243.               if r.dropDown() then
  244.                 free_slot = free_slot - 1
  245.               end
  246.           end
  247.         end
  248.       end
  249.   end
  250.   if free_slot == 0 then
  251.     lut()
  252.   end
  253.   if r.count(12) > 0 then
  254.     lut()
  255.   end
  256.   r.select(1)
  257. end
  258.  
  259. --стоим и заряжаемся, если генератор не справляется
  260. local function checkenergy()
  261.   if computer.energy() < 1000 then
  262.     if gen.count() >= 2 then
  263.       sendSt("мало энергии заряжаюсь до 2000")
  264.       while true do
  265.         os.sleep(30)
  266.         if computer.energy() >= 2000 then
  267.           sendSt("зарядился :)")
  268.           break
  269.         end
  270.         if gen.count() == 0 then
  271.           off("закончилось топливо :(")
  272.         end
  273.       end
  274.     else
  275.       off("закончилось топливо :(")  
  276.     end
  277.   end
  278. end
  279.  
  280. --дозоправка углём из инвентая
  281. local function checkfuel()
  282.   sendSt("топлива в генераторе = "..gen.count())
  283.   if gen.count() == 0 then
  284.     for i = 1,15 do
  285.     local slot = i_c.getStackInInternalSlot(i)
  286.       if slot ~= nil then
  287.         r.select(i)
  288.         gen.insert(32)
  289.         if gen.count() >= 32 then
  290.           sendSt("заправка зевершена")
  291.           sendSt("топлива в генераторе = "..gen.count())
  292.           return false
  293.         end
  294.       end
  295.     end
  296.      if gen.count() >= 1 then
  297.       sendSt("заправка зевершена")
  298.       sendSt("топлива в генераторе = "..gen.count())
  299.      else
  300.       sendSt("нет топлива в инвентаре робота !!!")
  301.      end
  302.   end
  303. end
  304.  
  305. --ставим факел через 15 шагов
  306. local function torch()
  307.   if svet >= 15 then
  308.     if r.count(14) > 1 then
  309.       r.select(14)
  310.       if r.placeDown() then
  311.         sendSt("ставлю факел")
  312.       end
  313.       r.select(1)
  314.       svet = 0
  315.     end
  316.   end
  317. end
  318.  
  319. --копаем
  320. local function dig()
  321.   r.select(1)
  322.   for i = 1,width do
  323.     pickaxe()
  324.     tru = 0
  325.     while r.detectUp() do
  326.       r.swingUp()
  327.       tru = tru + 1
  328.       if tru >= 50 then
  329.         break
  330.       end
  331.     end
  332.     tru = 0
  333.     while r.detect() do
  334.       r.swing()
  335.       tru = tru + 1
  336.       if tru >= 10 then
  337.         pickaxe()
  338.       end
  339.       if tru >= 200 then
  340.         off("непреодолимое препятствие :(")
  341.       end
  342.     end
  343.     tru = 0
  344.     while r.detectDown() do
  345.       r.swingDown()
  346.       tru = tru + 1
  347.       if tru >= 50 then
  348.         break
  349.       end
  350.     end
  351.     tru = 0
  352.     sort_lut()
  353.     moves = moves + 1
  354.     svet = svet + 1
  355.     torch()
  356.     while not r.forward() do
  357.       r.swing()
  358.     end
  359.   end
  360. end
  361.  
  362. --цикл выполнения программы
  363. while true do
  364.   checkfuel()
  365.   checkenergy()
  366.   dig()
  367.   r.turnRight()
  368.   width = 1
  369.   dig()
  370.   r.turnRight()
  371.   width = width2
  372.   sendSt("пройдено блоков = "..moves)
  373.   checkfuel()
  374.   checkenergy()
  375.   dig()
  376.   r.turnLeft()
  377.   width = 1
  378.   dig()
  379.   r.turnLeft()
  380.   width = width2
  381. end
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement