Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- "Черепаха-автошахтёр" версии 2.1
- --hmax - высота поверхности, на которой изначально стоит черепаха (координата y)
- --hdig - координата y, на которой будет работать черепаха
- --hcarry - высота шахты, которую будет копать черепаха. Откладывается вниз от hdig, то есть если вы настроите hdig=20 и hcarry=7, черепаха будет копать на глубине от 13 до 20
- --powersaving - измените на true если не хотите чтобы питающий трубу двигатель работал постоянно. При разгрузке черепаха будет подавать редстоун сигнал на все свои боковые стороны.
- --Сундук для добычи ставим перед черепахой
- --Сундук для топлива СЛЕВА
- tArgs[5]=nLimit
- hmax=65
- hdig=17
- hcarry=8
- powersaving=false
- nLimit=1
- local tArgs = { ... }
- tArgs[1]=hmax
- tArgs[2]=hdig
- tArgs[3]=hcarry
- if tArgs[4] = 1 then powersavin=true end
- -- Функция спуска в шахту. Опускаемся вниз до тех пор пока текущая глубина h не станет равной глубине hdig:
- dwn=function()
- h=hmax
- while h>hdig do
- if turtle.detectDown then turtle.digDown() end
- turtle.down()
- h=h-1
- end
- end
- --Функция подъема из шахты:
- up2freedom=function()
- h=hdig
- while h<hmax do
- turtle.up()
- h=h+1
- end
- end
- -- Заправка, из всех слотов(Kaerius):
- refuel=function()
- if turtle.getFuelLevel() ~= "unlimited" then
- for n=1,16 do
- nCount = turtle.getItemCount(n)
- if nCount > 0 then
- turtle.select( n )
- if nCount >= nLimit then
- if turtle.refuel( nLimit ) then
- break
- end
- else
- if turtle.refuel( nCount ) then
- nLimit = nLimit - nCount
- end
- end
- end
- end
- end
- end
- -- Функция перемещения в заданную точку. Используется в двух случаях: 1. с параметрами 0,0,0,1 для перемещения к вертикальному "лифту" и последующего подъема на поверхность. 2. С передачей к этой функции запомненных координат предыдущего спуска, чтобы черепашка могла вернуться к работе с того места где она закончила. x, y, z, vec - текущие координаты черепахи. xde, yde ... - координаты места куда должна переместиться черепаха при помощи этой функции. xrem, yrem ... - запомненные координаты предыдущего спуска. Координата vec - условное направление, в котором смотрит черепаха. 1 - вперед, 2 - лево, 3 - назад, 4 - вправо
- back2pos=function(xde,yde,zde, vecde)
- if z>zde then
- while z>zde do
- if turtle.detectUp() then turtle.digUp() end
- turtle.up()
- z=z-1
- end
- else
- while z<zde do
- if turtle.detectDown() then turtle.digDown() end
- turtle.down()
- z=z+1
- end
- end
- if x>xde then
- while vec~=3 do
- turtle.turnLeft()
- vec=vec+1
- if vec>4 then vec=1 end
- end
- while x>xde do
- -- Фикс на падающие блоки типа песка и гравия - ждем пол секунды и проверяем, не свалилось ли чего с потолка:
- while turtle.detect() do
- turtle.dig()
- sleep(0.5)
- end
- turtle.forward()
- x=x-1
- end
- else
- while vec~=1 do
- turtle.turnLeft()
- vec=vec+1
- if vec>4 then vec=1 end
- end
- while x<xde do
- while turtle.detect() do
- turtle.dig()
- sleep(0.5)
- end
- turtle.forward()
- x=x+1
- end
- end
- if y>yde then
- while vec~=2 do
- turtle.turnLeft()
- vec=vec+1
- if vec>4 then vec=1 end
- end
- while y>yde do
- while turtle.detect() do
- turtle.dig()
- sleep(0.5)
- end
- turtle.forward()
- y=y-1
- end
- else
- while vec~=4 do
- turtle.turnLeft()
- vec=vec+1
- if vec>4 then vec=1 end
- end
- while y<yde do
- while turtle.detect() do
- turtle.dig()
- sleep(0.5)
- end
- turtle.forward()
- y=y+1
- end
- end
- while vec~=vecde do
- turtle.turnLeft()
- vec=vec+1
- if vec>4 then vec=1 end
- end
- end
- -- По факту программа стартует отсюда, сверху были описания функций, которые будут активироваться по мере надобности
- -- Координаты на которых остановилась черепаха во время прошлого спуска. Обычно считываются из файла либо хранятся с предыдущего спуска. Но так как это может быть первым спуском черепахи то их необходимо задать, тем самым заодно установив удобное месторасположение для старта выкапывания карьера:
- xrem=1
- yrem=0
- zrem=0
- vecrem=2
- -- Сбрасываем текущие координаты на стандартные. Именно с ними (0,0,0,1) черепаха всегда перемещается вверх-вниз по лифту
- x=0
- y=0
- z=0
- vec=1
- -- Уменьшаем заданное пользователем значение высоты на 1, так как в системе координат черепахи z начинается с нуля:
- hcarry=hcarry-1
- -- Нам необходимо сохранять координаты предыдущего спуска даже между выключениями клиента игры, чтобы бедная черепаха не начинала каждый раз рыть с нуля. Поэтому создаем если он еще не создан файл для их хранения:
- file = io.open("miner.lua", "a")
- file:close()
- -- Открываем файл на чтение:
- file = io.open("miner.lua", "r")
- -- Читаем первое значение из файла:
- test=file:read()
- -- Если оно не равно null значит файл уже существовал и можно спокойно прочитать оттуда координаты:
- if test~=nil then
- xrem=test
- yrem=file:read()
- zrem=file:read()
- vecrem=file:read()
- -- Необходимо перевести строковой тип переменных, который им присвоился при чтении из файлов обратно в числовой:
- xrem=tonumber(xrem)
- yrem=tonumber(yrem)
- zrem=tonumber(zrem)
- vecrem=tonumber(vecrem)
- end
- file:close()
- while true do
- -- Модуль разгрузки. Нужно поставить его до спуска черепахи чтобы она не ушла в шахту с полным инвентарем. Это опасно не только потерей времени но и сбоем системы координат, так как черепаха закончит свою работу и сохранит координаты окончания работ до того как подойдет к стене:
- -- Проверка активности энергосберегающего режима, отправка сигналов редстоуна если активен:
- if powersaving==true then
- rs.setOutput("left",true)
- rs.setOutput("right",true)
- rs.setOutput("front",true)
- rs.setOutput("back",true)
- end
- -- Ждем пока полностью освободится инвентарь, сундук перед черепахой:
- while turtle.getItemCount(16)~=0 do
- sleep(1)
- for n=1,16 do
- if n ~= nCount then
- turtle.select( n )
- turtle.drop()
- end
- end
- end
- -- Из сундука что стоит слева, берем ТОПЛИВО.
- turtle.turnLeft ()
- turtle.suck () -- По скольку забирает?
- turtle.turnRight ()
- if powersaving==true then
- rs.setOutput("left",false)
- rs.setOutput("right",false)
- rs.setOutput("front",false)
- rs.setOutput("back",false)
- end
- --Проверка топлива на спуск.
- local cpusk = hmax + hcarry
- while cpusk > turtle.getFuelLevel() do refuel() end
- -- Вызываем функцию спуска в шахту:
- dwn()
- -- Перемещаемся к месту где мы закончили благодаря функции back2pos:
- back2pos(xrem,yrem,zrem,vecrem)
- -- Копаем до тех пор пока в инвентаре есть хотя бы одна свободная ячейка:
- while turtle.getItemCount(16)==0 do
- -- Если черепаха находится наверху шахты (z=hcarry), то продвигаемся на блок вперед и начинаем спуск вниз. Если черепаха находится где-то посередине продолжаем спуск вниз, разрушая блоки перед собой. Если черепаха достигла низа, то перемещаемся к верху шахты:
- if z~=hcarry then
- if turtle.detect() then turtle.dig() end
- if turtle.detectDown() then turtle.digDown() end
- if turtle.getFuelLevel() < 2 then refuel() end
- turtle.down()
- z=z+1
- else
- while turtle.detect() do
- turtle.dig()
- sleep(0.5)
- end
- while z~=0 do
- if turtle.getFuelLevel() < 2 then refuel() end
- turtle.up()
- z=z-1
- end
- if turtle.getFuelLevel() < 2 then refuel() end
- turtle.forward()
- -- Черепаха переместилась, меняем текущие координаты в зависимости от стороны куда она смотрит:
- if vec==1 then x=x+1 end
- if vec==2 then y=y-1 end
- if vec==3 then x=x-1 end
- if vec==4 then y=y+1 end
- -- Если модуль х равно модулю у это значит что черепаха находится в углу шахты и пора повернуть налево:
- if math.abs(x)==math.abs(y) then
- turtle.turnLeft()
- vec=vec+1
- if vec>4 then vec=1 end
- end
- -- При у=1 и х>0 происходит увеличение "радиуса" квадрата, по которому крутится черепаха:
- if y==1 and x>0 then
- turtle.turnRight()
- while turtle.detect() do
- turtle.dig()
- sleep(0.5)
- end
- if turtle.getFuelLevel() < 2 then refuel() end
- turtle.forward()
- turtle.turnLeft()
- x=x+1
- end
- end
- --Проверка топлива на возврат.
- local vozvrat = y + x + z
- while vozvrat > turtle.getFuelLevel() do refuel() end
- end
- -- Добычу ресурсов закончили, теперь запоминаем наши текущие координаты и заодно пишем их в файл:
- xrem=x
- yrem=y
- zrem=z
- vecrem=vec
- file = io.open("miner.lua", "w")
- file:write(xrem.."\n")
- file:write(yrem.."\n")
- file:write(zrem.."\n")
- file:write(vecrem.."\n")
- file:close()
- -- Возвращаемся к лифту:
- back2pos(0,0,0,1)
- -- Поднимаемся на поверхность:
- up2freedom()
- end
Advertisement
Add Comment
Please, Sign In to add comment