Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[ opencomputers tunnel by serafim
- Копает тунель 1х3 змейкой ряд за рядом,
- В 13 слот ложим запасную кирку,
- В 14 слот факелы,
- В 15 слот уголь,
- В 16 слот эндер-сундук.
- требования:
- инвентарь,контроллер инвентаря,
- генератор,улучшение парение.
- связанная карта и чанк лоадер если нужно.
- пример запуска:
- tunnel 30 -- 30 ширина тунеля
- ]]--
- local com = require('component')
- local computer = require("computer")
- local a = {...}
- local width = tonumber(a[1]) or 30
- local width2 = width
- local svet, tru, moves = 0, 0, 0
- local chest_pickaxe = true
- enderchest = true --поставить false для работоты с обычными сундуками
- --список мусорных блоков
- local scrap = {
- "minecraft:cobblestone",
- "minecraft:dirt",
- "minecraft:gravel",
- "minecraft:flint",
- "minecraft:sand",
- "chisel:andesite",
- "chisel:diorite",
- "chisel:granite",
- "chisel:limestone",
- "minecraft:netherrack"
- }
- --список кирок, которые робот может брать из сундука
- local pickaxe_list = {
- "minecraft:diamond_pickaxe",
- "minecraft:iron_pickaxe",
- "minecraft:stone_pickaxe",
- "EnderIO:item.darkSteel_pickaxe"
- }
- if not com.isAvailable("robot") then
- print("только роботы могут использовать эту программу")
- os.exit()
- end
- local r = require("robot")
- if not com.isAvailable("inventory_controller") then
- print("для работы нужен контроллер инвентаря")
- os.exit()
- end
- local i_c = com.inventory_controller
- if not com.isAvailable("generator") then
- print("для работы нужен генератор")
- os.exit()
- end
- local gen = com.generator
- if width > 100 or width < 10 then
- print(" ")
- print(" ширина тунеля ")
- print("должна быть от 10 do 100")
- print(" ")
- os.exit()
- end
- print("ширина тунеля = "..width)
- if com.isAvailable("chunkloader") then
- cloader = com.chunkloader
- cloader.setActive(true)
- print("чанк лоадер активен")
- end
- if com.isAvailable("tunnel") then
- print("связанная карта доступна")
- warp = true
- end
- -- отправка сообщения через тунель
- local function sendSt(message)
- print(message)
- if warp then
- pcall(com.tunnel.send(r.name().." "..message))
- end
- end
- --выключить робота
- local function off(message)
- sendSt("!!!")
- sendSt(message)
- computer.beep(2000, 5)
- gen.remove()
- sendSt("выключен")
- sendSt("!!!")
- computer.shutdown()
- end
- --копать в низ
- local function dig_down()
- while r.detectDown() do
- r.swingDown()
- end
- end
- --поиск кирки в сундуке
- local function finditem(side, name)
- local inv, item = i_c.getInventorySize(side)
- if inv then
- for slot = 1, inv do
- for j, name in pairs(pickaxe_list) do
- local item = i_c.getStackInSlot(side, slot)
- if item and item.name == name then
- return slot
- end
- end
- end
- end
- return nil
- end
- --проверяем в слоте кирку
- local function ifpickaxe()
- for j, name in pairs(pickaxe_list) do
- local slot = i_c.getStackInInternalSlot(13)
- if slot["name"] == name then
- return true
- end
- end
- r.select(13)
- r.dropDown()
- r.select(1)
- return false
- end
- --берем запасную кирку
- local function pickaxe()
- if r.durability() == nil then
- if r.count(13) > 0 and ifpickaxe() then
- r.select(13)
- i_c.equip()
- r.select(1)
- sendSt("взял запасную кирку")
- else
- off("нет кирки :(")
- end
- else
- if r.durability() < 0.05 then
- if r.count(13) > 0 and ifpickaxe() then
- r.select(13)
- i_c.equip()
- r.dropDown()
- r.select(1)
- sendSt("взял запасную кирку")
- else
- if enderchest and chest_pickaxe then
- sendSt("ищу запастную кирку в сундуке")
- r.select(1)
- dig_down()
- r.select(16)
- r.placeDown()
- r.select(13)
- local i = finditem(0)
- if i then
- i_c.suckFromSlot(0, i)
- sendSt("взял запасную кирку из сундука")
- r.select(16)
- dig_down()
- r.select(1)
- else
- sendSt("нет запасной кирки в сундуке :(")
- chest_pickaxe = false
- r.select(16)
- dig_down()
- r.select(1)
- end
- end
- end
- end
- end
- end
- -- проверка предмета, является ли он мусором
- local function isScrap(name)
- for i, nm in pairs(scrap) do
- if name == nm then
- return true
- end
- end
- return false
- end
- --складываем лут в сундук
- local function lut()
- if r.count(16) == 0 then
- off("нет сундуков :(")
- else
- dig_down()
- r.select(16)
- if not r.placeDown() then
- sendSt("не могу поставить сундук")
- else
- sendSt("складываю лут в сундук")
- for i=1, 12 do
- local slot = i_c.getStackInInternalSlot(i)
- if slot ~= nil then
- r.select(i)
- if not r.dropDown() then
- off("в сундуке нет места :(")
- end
- end
- end
- end
- end
- if enderchest then
- r.select(16)
- pickaxe()
- dig_down()
- end
- r.select(1)
- end
- --сортируем лут
- local function sort_lut()
- if r.count(12) > 0 then
- sendSt("дропаю мусор")
- local free_slot = 2
- for i=1, 12 do
- local slot = i_c.getStackInInternalSlot(i)
- if slot ~= nil then
- if isScrap(slot.name) then
- r.select(i)
- if r.dropDown() then
- free_slot = free_slot - 1
- end
- end
- end
- end
- end
- if free_slot == 0 then
- lut()
- end
- if r.count(12) > 0 then
- lut()
- end
- r.select(1)
- end
- --стоим и заряжаемся, если генератор не справляется
- local function checkenergy()
- if computer.energy() < 1000 then
- if gen.count() >= 2 then
- sendSt("мало энергии заряжаюсь до 2000")
- while true do
- os.sleep(30)
- if computer.energy() >= 2000 then
- sendSt("зарядился :)")
- break
- end
- if gen.count() == 0 then
- off("закончилось топливо :(")
- end
- end
- else
- off("закончилось топливо :(")
- end
- end
- end
- --дозоправка углём из инвентая
- local function checkfuel()
- sendSt("топлива в генераторе = "..gen.count())
- if gen.count() == 0 then
- for i = 1,15 do
- local slot = i_c.getStackInInternalSlot(i)
- if slot ~= nil then
- r.select(i)
- gen.insert(32)
- if gen.count() >= 32 then
- sendSt("заправка зевершена")
- sendSt("топлива в генераторе = "..gen.count())
- return false
- end
- end
- end
- if gen.count() >= 1 then
- sendSt("заправка зевершена")
- sendSt("топлива в генераторе = "..gen.count())
- else
- sendSt("нет топлива в инвентаре робота !!!")
- end
- end
- end
- --ставим факел через 15 шагов
- local function torch()
- if svet >= 15 then
- if r.count(14) > 1 then
- r.select(14)
- if r.placeDown() then
- sendSt("ставлю факел")
- end
- r.select(1)
- svet = 0
- end
- end
- end
- --копаем
- local function dig()
- r.select(1)
- for i = 1,width do
- pickaxe()
- tru = 0
- while r.detectUp() do
- r.swingUp()
- tru = tru + 1
- if tru >= 50 then
- break
- end
- end
- tru = 0
- while r.detect() do
- r.swing()
- tru = tru + 1
- if tru >= 10 then
- pickaxe()
- end
- if tru >= 200 then
- off("непреодолимое препятствие :(")
- end
- end
- tru = 0
- while r.detectDown() do
- r.swingDown()
- tru = tru + 1
- if tru >= 50 then
- break
- end
- end
- tru = 0
- sort_lut()
- moves = moves + 1
- svet = svet + 1
- torch()
- while not r.forward() do
- r.swing()
- end
- end
- end
- --цикл выполнения программы
- while true do
- checkfuel()
- checkenergy()
- dig()
- r.turnRight()
- width = 1
- dig()
- r.turnRight()
- width = width2
- sendSt("пройдено блоков = "..moves)
- checkfuel()
- checkenergy()
- dig()
- r.turnLeft()
- width = 1
- dig()
- r.turnLeft()
- width = width2
- end
Advertisement
Add Comment
Please, Sign In to add comment