Advertisement
bob558

Карьер для робота

Jul 4th, 2015
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.67 KB | None | 0 0
  1. --Работает даже на роботе с минимальными комплектующими,однако нужен апгрейд инвентаря
  2. --(но с двумя вставками памяти, не тестировал на роботе с одной вставкой). ОБНОВЛЕНИЕ
  3. -- Добавлена функция подзарядки робота через генератор, используя топлива, котое робот
  4. -- выкапывает в процессе работы. Программа сама определяет наличие генератора, если его
  5. -- нету, то работает как предыдущая версия. Инструкция: поставить робота, дать ему
  6. -- инструмент, поставить сзади него сундук запустить с 3 аргументами из командной строки
  7. --( если сохранили как minequarry, то надо вводить "minequarry x y z", где x,y и z - значения,
  8. -- выбранные вами) первый аргумент определяет ширину второй аргумент - длину третий - глубину
  9. -- робот копает вперед-впрaаво-вниз ( то есть стоит над верхним левом ближнем углу рабочей зоны
  10. -- (параллелепипеда , который будет выкапывать)), всегда рабочая зона начинается с блока под
  11. -- роботом включительно. Для предотвращения потери ценных ресурсов робот копает в штатном режиме,
  12. -- пока последние 2 слота инвентаря не заполнены, однако, это можно изменить(slotstocheck
  13. -- отвечает за это, находится в начале программы). Проверяются 2 слота вместо одного, так как
  14. -- из некоторых блоков может выпадать по 2 вида ресурса(как из блока кварца кристаллы оного и
  15. -- пыль). Как только в них появляется хоть 1 предмет, робот возвращается в начальную позицию и
  16. -- выгружает весь инвентарь в сундук. Также, в конце работы робот возвращается в исходное
  17. -- положение и выгружает предметы Плюсы: программа неприхотлива, работает даже на простых
  18. -- роботах минимум настроек, точная отработка, эффективность( ну уж получше excavate из CC)
  19. -- робот не остановится, пока не выкопает каждый блок или не разрядится робот будет убивать
  20. -- мобов, на которых наткнется Минусы: Если неправильно задать координаты, и робот врежется
  21. -- в нерушимый блок, он в него упрется и не будет продолжать работу робот может разрядиться,
  22. -- если его не заряжать у сундука, в который будет помещаться выкопанное роботом, робот
  23. -- не умеет менять инструменты
  24. -- http://computercraft.ru/topic/106-karer-dlia-opencomputers-robota/
  25.  
  26. if require("component").isAvailable("generator")
  27.     then
  28.     generator=require("component").generator
  29. end
  30. withg=(generator~=nil)
  31. slots=32 -- количество слотов для руды
  32. slotstocheck=1
  33. robot=require("robot")
  34. coords={x=0,y=0,z=0,side=1}
  35. extcoords={x=0,y=0,z=0,side=1}
  36. sx={0,1,0,-1}
  37. sy={1,0,-1,0}
  38. falsemode=false
  39. counter=0
  40. tocount=0
  41. --1,2,3,4
  42. --tl  --  coords.side = (coords.side + 3)%4
  43. --tr  --  coords.side = (coords.side + 1)%4
  44. --ta  --  coords.side = (coords.side + 2)%4
  45. --all --  if coords.side == 0 then coords.side =4 end
  46.  
  47. function save()
  48.     file = io.open("quarryrest","w")
  49.     file:write(coords.x.."\n"..coords.y.."\n"..coords.z.."\n"..coords.side.."\n"..counter.."\n"..x.."\n"..y.."\n"..z.."\n")
  50.     file:close()
  51. end
  52. function restore()
  53.     local file = io.open("quarryrest","r")
  54.     extcoords.x=file:read()+0
  55.     extcoords.y=file:read()+0
  56.     extcoords.z=file:read()+0
  57.     extcoords.side=file:read()+0
  58.     back()
  59.     tocount=file:read()+0
  60.     x=file:read()+0
  61.     y=file:read()+0
  62.     z=file:read()+0
  63.     falsemode=true
  64. end
  65. function checkfalse()
  66.     if counter>=tocount then falsemode=false end
  67. end
  68.  
  69. function sgo() while not robot.forward() do robot.swing() os.sleep(0,5) end coords.x=coords.x + sx[coords.side];coords.y = coords.y + sy[coords.side]  end
  70. function sgodown() while not robot.down() do robot.swingDown() os.sleep(0,5) end coords.z = coords.z - 1 end
  71.  
  72. function sgoup() -- подняться на верх
  73.   while not robot.up() do
  74.     robot.swingUp() os.sleep(0,5)
  75.     end
  76.   coords.z = coords.z + 1
  77.   end
  78. function sturnLeft() robot.turnLeft(); coords.side = (coords.side + 3)%4;if coords.side == 0 then coords.side =4 end; end
  79.  
  80. function sturnRight()
  81.   robot.turnRight();
  82.   coords.side = (coords.side + 1)%4;
  83.     if coords.side == 0 then
  84.     coords.side =4
  85.     end;
  86.   end
  87.  
  88.  
  89. function go() --копать вперед
  90.   if not falsemode then
  91.     while not robot.forward() do
  92.       robot.swing() os.sleep(0,5)
  93.       end
  94.    coords.x=coords.x + sx[coords.side];
  95.    coords.y = coords.y + sy[coords.side]
  96.    end
  97.  counter=counter+1;
  98.  save();
  99.  checkfalse();
  100.  end
  101.  
  102. function godown()  -- прокопать на один блок вниз
  103.   if not falsemode then
  104.       while not robot.down() do -- вниз если свободно
  105.       robot.swingDown() os.sleep(0,5)  -- копать вниз
  106.       end
  107.      coords.z = coords.z - 1
  108.     end
  109. counter=counter+1; save();checkfalse();
  110. end
  111.  
  112. function goup()  if not falsemode then while not robot.up() do robot.swingUp() os.sleep(0,5) end coords.z = coords.z + 1 end counter=counter+1; save();checkfalse(); end
  113.  
  114. function check()  -- последний слот пустой?
  115.   return robot.count(slots-(slotstocheck-1)) > 0
  116.   end
  117.  
  118. function turnLeft() if not falsemode then robot.turnLeft(); coords.side = (coords.side + 3)%4;if coords.side == 0 then coords.side =4 end; end counter=counter+1; save();checkfalse(); end
  119. function turnRight() if not falsemode then robot.turnRight(); coords.side = (coords.side + 1)%4; if coords.side == 0 then coords.side =4 end; end counter=counter+1; save();checkfalse(); end
  120.  
  121. function tosurf() -- вернуться к сундуку
  122.     extcoords.x=coords.x
  123.     extcoords.y=coords.y
  124.     extcoords.z=coords.z
  125.     extcoords.side=coords.side
  126.     while coords.z ~= 0 do sgoup() end -- подняться,пока высота е будет 0
  127.     while coords.side ~= 3 do sturnRight() end
  128.     while coords.y ~= 0 do sgo() end
  129.     sturnRight();
  130.     while coords.x ~= 0 do sgo() end
  131.     sturnLeft();
  132. end
  133. function back()
  134.     while coords.z ~= extcoords.z do sgodown() end
  135.     while coords.side~= 1 do sturnRight() end
  136.     while coords.y ~= extcoords.y do sgo() end
  137.     sturnRight();
  138.     while coords.x ~= extcoords.x do sgo() end
  139.     while coords.side ~= extcoords.side do sturnRight() end
  140. end
  141. function clearinv() -- выгрузка добра
  142.     alreadyhave=false
  143.     for invcounter=1,slots do
  144.         robot.select(invcounter)
  145.         if withg then
  146.             suc,error=generator.insert()
  147.             if (error=="selected slot does not contain fuel" or alreadyhave) then robot.drop() else alreadyhave=true end
  148.         else
  149.             robot.drop()
  150.         end
  151.     end
  152.     robot.select(1)
  153.     sort()
  154. end
  155. function sort() -- выгрузка добра
  156.     curs=1
  157.     for q=1,slots do
  158.         if robot.count(q) > 0 then robot.select(q);robot.transferTo(curs);curs=curs+1 end
  159.     end
  160.     robot.select(1)
  161. end
  162. function prevent()
  163.     if check() then  -- последний слот пустой?
  164.         tosurf() -- если нет - вернуться к сундуку
  165.         clearinv()-- выгрузка добра - загрузка генератора
  166.         back()
  167.     end
  168. end
  169.  
  170. function digrow(n) --копать полосу шириной x
  171.   prevent() -- проверка - полный?
  172.   robot.swingUp(); os.sleep(0,5)
  173.   prevent()
  174.   robot.swingDown(); os.sleep(0,5)
  175.     for k=1,n do
  176.       prevent()
  177.       go() --копать вперед
  178.       prevent()
  179.       robot.swingUp(); os.sleep(0,5)
  180.       prevent()
  181.       robot.swingDown(); os.sleep(0,5)
  182.     end
  183. end
  184. function digdim(x,y) -- копать горизонтальный пласт x и y
  185.   godown() -- прокопать на один блок вниз
  186.   godown()
  187.     for n=1,y do
  188.       if tl then turnLeft() else turnRight() end
  189.     digrow(ex) --
  190.       if tl then turnRight() else turnLeft() end
  191.     tl = not tl
  192.       if n==y then print("ok") else go() end
  193.     end
  194.   turnRight();
  195.   turnRight();
  196.   tl= not tl
  197. end
  198.  -------===== Тело программы ====--------
  199. x,y,z=...
  200. print("[INFO] Запуск. Ширина: "..x..". Длинна: "..y..". Глубина: "..z)
  201. if x=="-restore" then
  202.     restore()
  203. end
  204.  
  205. tl=false
  206. x=x+0
  207. y=y+0
  208. z=z+0
  209. ex=x-1
  210. fullz=(z-z%3)/3  -- уровни копки по 3
  211. print("Fullz = " .. fullz)
  212.  
  213. for i=1,fullz do
  214.   digdim(x,y)
  215.   godown()
  216. end
  217.  
  218. if fullz*3==z then
  219.   elseif fullz*3+1==z then
  220.   goup();goup();digdim(tl,x,y)
  221.   else goup();digdim(tl,x,y)
  222.   end
  223. tosurf()
  224. clearinv()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement