Kaerius

avtoshahtjor

Oct 30th, 2012
443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.29 KB | None | 0 0
  1. -- "Черепаха-автошахтёр" версии 2.1
  2. --hmax - высота поверхности, на которой изначально стоит черепаха (координата y)
  3. --hdig - координата y, на которой будет работать черепаха
  4. --hcarry - высота шахты, которую будет копать черепаха. Откладывается вниз от hdig, то есть если вы настроите hdig=20 и hcarry=7, черепаха будет копать на глубине от 13 до 20
  5. --powersaving - измените на true если не хотите чтобы питающий трубу двигатель работал постоянно. При разгрузке черепаха будет подавать редстоун сигнал на все свои боковые стороны.
  6. --Сундук для добычи ставим перед черепахой
  7. --Сундук для топлива СЛЕВА
  8. tArgs[5]=nLimit
  9. hmax=65
  10. hdig=17
  11. hcarry=8
  12. powersaving=false
  13. nLimit=1
  14. local tArgs = { ... }
  15. tArgs[1]=hmax
  16. tArgs[2]=hdig
  17. tArgs[3]=hcarry
  18. if tArgs[4] = 1 then powersavin=true end
  19. -- Функция спуска в шахту. Опускаемся вниз до тех пор пока текущая глубина h не станет равной глубине hdig:
  20. dwn=function()
  21.    h=hmax
  22.    while h>hdig do
  23.       if turtle.detectDown then turtle.digDown() end
  24.       turtle.down()
  25.       h=h-1  
  26.    end
  27. end
  28.  
  29. --Функция подъема из шахты:
  30. up2freedom=function()
  31.    h=hdig
  32.    while h<hmax do
  33.       turtle.up()
  34.       h=h+1
  35.    end
  36. end
  37.  
  38. -- Заправка, из всех слотов(Kaerius):
  39. refuel=function()    
  40.         if turtle.getFuelLevel() ~= "unlimited" then
  41.                 for n=1,16 do
  42.                         nCount = turtle.getItemCount(n)
  43.                         if nCount > 0 then
  44.                                 turtle.select( n )
  45.                                 if nCount >= nLimit then
  46.                                         if turtle.refuel( nLimit ) then
  47.                                                 break
  48.                                         end
  49.                                 else
  50.                                         if turtle.refuel( nCount ) then
  51.                                                 nLimit = nLimit - nCount
  52.                                         end
  53.                                 end
  54.                         end
  55.                 end
  56.         end
  57.        
  58. end
  59.  
  60. -- Функция перемещения в заданную точку. Используется в двух случаях: 1. с параметрами 0,0,0,1 для перемещения к вертикальному "лифту" и последующего подъема на поверхность. 2. С передачей к этой функции запомненных координат предыдущего спуска, чтобы черепашка могла вернуться к работе с того места где она закончила. x, y, z, vec - текущие координаты черепахи. xde, yde ... - координаты места куда должна переместиться черепаха при помощи этой функции. xrem, yrem ... - запомненные координаты предыдущего спуска. Координата vec - условное направление, в котором смотрит черепаха. 1 - вперед, 2 - лево, 3 - назад, 4 - вправо
  61. back2pos=function(xde,yde,zde, vecde)
  62.    
  63.    if z>zde then
  64.       while z>zde do
  65.          if turtle.detectUp() then turtle.digUp() end
  66.          turtle.up()
  67.          z=z-1
  68.       end
  69.  
  70.    else
  71.       while z<zde do
  72.          if turtle.detectDown() then turtle.digDown() end
  73.          turtle.down()
  74.          z=z+1
  75.       end
  76.    end
  77.  
  78.    if x>xde then
  79.      
  80.       while vec~=3 do
  81.          turtle.turnLeft()
  82.          vec=vec+1
  83.          if vec>4 then vec=1 end
  84.       end
  85.      
  86.       while x>xde do
  87.      
  88.          -- Фикс на падающие блоки типа песка и гравия - ждем пол секунды и проверяем, не свалилось ли чего с потолка:
  89.          while turtle.detect() do
  90.             turtle.dig()
  91.             sleep(0.5)
  92.          end
  93.          turtle.forward()
  94.          x=x-1
  95.       end
  96.    
  97.    else
  98.    
  99.       while vec~=1 do
  100.          turtle.turnLeft()
  101.          vec=vec+1
  102.          if vec>4 then vec=1 end
  103.       end
  104.      
  105.       while x<xde do
  106.          while turtle.detect() do
  107.             turtle.dig()
  108.             sleep(0.5)
  109.          end
  110.          turtle.forward()
  111.          x=x+1
  112.       end
  113.    
  114.    end
  115.  
  116.    
  117.    if y>yde then
  118.      
  119.       while vec~=2 do
  120.          turtle.turnLeft()
  121.          vec=vec+1
  122.          if vec>4 then vec=1 end
  123.       end
  124.      
  125.       while y>yde do
  126.          while turtle.detect() do
  127.             turtle.dig()
  128.             sleep(0.5)
  129.          end
  130.          turtle.forward()
  131.          y=y-1
  132.       end
  133.    
  134.    else
  135.    
  136.       while vec~=4 do
  137.          turtle.turnLeft()
  138.          vec=vec+1
  139.          if vec>4 then vec=1 end
  140.       end
  141.      
  142.       while y<yde do
  143.          while turtle.detect() do
  144.          turtle.dig()
  145.          sleep(0.5)
  146.          end
  147.          turtle.forward()
  148.          y=y+1
  149.       end
  150.    
  151.    end
  152.  
  153.    while vec~=vecde do
  154.       turtle.turnLeft()
  155.       vec=vec+1
  156.       if vec>4 then vec=1 end
  157.    end
  158.    
  159. end
  160.  
  161. -- По факту программа стартует отсюда, сверху были описания функций, которые будут активироваться по мере надобности
  162. -- Координаты на которых остановилась черепаха во время прошлого спуска. Обычно считываются из файла либо хранятся с предыдущего спуска. Но так как это может быть первым спуском черепахи то их необходимо задать, тем самым заодно установив удобное месторасположение для старта выкапывания карьера:
  163. xrem=1
  164. yrem=0
  165. zrem=0
  166. vecrem=2
  167.  
  168. -- Сбрасываем текущие координаты на стандартные. Именно с ними (0,0,0,1) черепаха всегда перемещается вверх-вниз по лифту
  169. x=0
  170. y=0
  171. z=0
  172. vec=1
  173.  
  174. -- Уменьшаем заданное пользователем значение высоты на 1, так как в системе координат черепахи z начинается с нуля:
  175. hcarry=hcarry-1
  176.  
  177. -- Нам необходимо сохранять координаты предыдущего спуска даже между выключениями клиента игры, чтобы бедная черепаха не начинала каждый раз рыть с нуля. Поэтому создаем если он еще не создан файл для их хранения:
  178. file = io.open("miner.lua", "a")
  179. file:close()
  180.  
  181. -- Открываем файл на чтение:
  182. file = io.open("miner.lua", "r")
  183.       -- Читаем первое значение из файла:
  184.       test=file:read()
  185.       -- Если оно не равно null значит файл уже существовал и можно спокойно прочитать оттуда координаты:
  186.       if test~=nil then
  187.          xrem=test
  188.          yrem=file:read()
  189.          zrem=file:read()
  190.          vecrem=file:read()
  191.          
  192.          -- Необходимо перевести строковой тип переменных, который им присвоился при чтении из файлов обратно в числовой:
  193.          xrem=tonumber(xrem)
  194.          yrem=tonumber(yrem)
  195.          zrem=tonumber(zrem)
  196.          vecrem=tonumber(vecrem)
  197.       end
  198.    
  199. file:close()
  200.  
  201. while true do
  202.  
  203. -- Модуль разгрузки. Нужно поставить его до спуска черепахи чтобы она не ушла в шахту с полным инвентарем. Это опасно не только потерей времени но и сбоем системы координат, так как черепаха закончит свою работу и сохранит координаты окончания работ до того как подойдет к стене:
  204.  
  205. -- Проверка активности энергосберегающего режима, отправка сигналов редстоуна если активен:
  206.    if powersaving==true then
  207.       rs.setOutput("left",true)
  208.       rs.setOutput("right",true)
  209.       rs.setOutput("front",true)
  210.       rs.setOutput("back",true)
  211.    end
  212.    
  213.    -- Ждем пока полностью освободится инвентарь, сундук перед черепахой:
  214.         while turtle.getItemCount(16)~=0 do
  215.         sleep(1)
  216.                 for n=1,16 do
  217.                         if n ~= nCount then
  218.                         turtle.select( n )
  219.                         turtle.drop()
  220.                         end
  221.                 end
  222.         end
  223.     -- Из сундука что стоит слева, берем ТОПЛИВО.
  224.         turtle.turnLeft ()
  225.         turtle.suck ()  -- По скольку забирает?
  226.         turtle.turnRight ()
  227.    
  228.    if powersaving==true then
  229.       rs.setOutput("left",false)
  230.       rs.setOutput("right",false)
  231.       rs.setOutput("front",false)
  232.       rs.setOutput("back",false)
  233.    end
  234.    
  235.         --Проверка топлива на спуск.
  236.         local cpusk = hmax + hcarry
  237.         while cpusk > turtle.getFuelLevel() do refuel() end
  238.        
  239.        
  240.    -- Вызываем функцию спуска в шахту:
  241.    dwn()
  242.    -- Перемещаемся к месту где мы закончили благодаря функции back2pos:
  243.    back2pos(xrem,yrem,zrem,vecrem)
  244.  
  245.    -- Копаем до тех пор пока в инвентаре есть хотя бы одна свободная ячейка:
  246.    while turtle.getItemCount(16)==0 do
  247.    
  248.       -- Если черепаха находится наверху шахты (z=hcarry), то продвигаемся на блок вперед и начинаем спуск вниз. Если черепаха находится где-то посередине продолжаем спуск вниз, разрушая блоки перед собой. Если черепаха достигла низа, то перемещаемся к верху шахты:
  249.       if z~=hcarry then
  250.          if turtle.detect() then turtle.dig() end
  251.          if turtle.detectDown() then turtle.digDown() end
  252.                  if turtle.getFuelLevel() < 2 then refuel() end
  253.          turtle.down()
  254.          z=z+1
  255.       else
  256.          while turtle.detect() do
  257.          turtle.dig()
  258.          sleep(0.5)
  259.          end
  260.          
  261.          while z~=0 do
  262.                         if turtle.getFuelLevel() < 2 then refuel() end
  263.             turtle.up()
  264.             z=z-1
  265.          end
  266.                  
  267.          if turtle.getFuelLevel() < 2 then refuel() end
  268.          turtle.forward()
  269.          -- Черепаха переместилась, меняем текущие координаты в зависимости от стороны куда она смотрит:
  270.          if vec==1 then x=x+1 end
  271.          if vec==2 then y=y-1 end
  272.          if vec==3 then x=x-1 end
  273.          if vec==4 then y=y+1 end
  274.          
  275.  
  276.                  
  277.          -- Если модуль х равно модулю у это значит что черепаха находится в углу шахты и пора повернуть налево:
  278.          if math.abs(x)==math.abs(y) then
  279.             turtle.turnLeft()
  280.             vec=vec+1
  281.             if vec>4 then vec=1 end
  282.          end
  283.          
  284.          -- При у=1 и х>0 происходит увеличение "радиуса" квадрата, по которому крутится черепаха:
  285.          if y==1 and x>0 then
  286.             turtle.turnRight()
  287.             while turtle.detect() do
  288.             turtle.dig()
  289.             sleep(0.5)
  290.             end
  291.                         if turtle.getFuelLevel() < 2 then refuel() end
  292.             turtle.forward()
  293.             turtle.turnLeft()
  294.             x=x+1
  295.          end
  296.       end
  297.      
  298.                  --Проверка топлива на возврат.
  299.                  local vozvrat = y + x + z
  300.          while vozvrat > turtle.getFuelLevel() do refuel() end
  301.    end
  302.  
  303.    -- Добычу ресурсов закончили, теперь запоминаем наши текущие координаты и заодно пишем их в файл:
  304.    xrem=x
  305.    yrem=y
  306.    zrem=z
  307.    vecrem=vec
  308.    
  309.    file = io.open("miner.lua", "w")
  310.       file:write(xrem.."\n")
  311.       file:write(yrem.."\n")
  312.       file:write(zrem.."\n")
  313.       file:write(vecrem.."\n")
  314.    file:close()
  315.  
  316.    -- Возвращаемся к лифту:
  317.    back2pos(0,0,0,1)
  318.    -- Поднимаемся на поверхность:
  319.    up2freedom()
  320.  
  321. end
Advertisement
Add Comment
Please, Sign In to add comment