Advertisement
artem211

Untitled

Jun 20th, 2015
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 18.88 KB | None | 0 0
  1.  
  2.  
  3.  
  4. local APIS={}
  5. local inv_size = 16
  6. local inv_side = require("sides").left
  7. local charge_side = require("sides").right
  8. local battery_side = require("sides").bottom
  9. local temp_state = {x=0, y=0, z=0, dr=3}
  10. local scrap = {
  11.     "minecraft:stone",
  12.     "minecraft:cobblestone",
  13.     "minecraft:dirt",
  14.     "minecraft:gravel",
  15.     "minecraft:sand",
  16.     "minecraft:grass"}
  17. local lc = {x=0, y=0, z=0, dr=3}
  18.  
  19. function APIS.charge(charge_side)
  20. --функция зарядки робота от чарджера, т.к. в этом билде ОС он категорически не принимает
  21. --ред сигнал робота, временно переориентировал на рычаг.
  22. comp = require("computer")
  23. while comp.energy() < (comp.maxEnergy()/2) do
  24. --local rs = require("component").redstone
  25. --rs.setOutput(charge_side, 15)
  26. require("term").clear()
  27. APIS.use(charge_side)
  28. print("Зарядка...")
  29. os.sleep(60)
  30. --rs.setOutput(charge_side, 0)
  31. APIS.use(charge_side)
  32. end
  33. print("Батарея заряжена")
  34. return true
  35. end
  36. function APIS.charge_tool(s)
  37. --функция проверки заряда бура в руках робота, передача его на зарядку в батбокс/чарджер
  38. local inv = require("component").inventory_controller
  39. local r = require("robot") 
  40. if r.durability() < 0.2 then
  41. r.select(1)
  42. inv.equip()
  43. if s == 1 then
  44. r.dropUp()
  45. os.sleep(15)
  46. r.suckUp()
  47. elseif s == 2 then
  48. r.turnAround()
  49. r.drop()
  50. os.sleep(15)
  51. r.suck()
  52. r.turnAround()
  53. elseif s == 3 then
  54. r.drop()
  55. os.sleep(15)
  56. r.suck()
  57. elseif s == 4 then
  58. r.turnRight()
  59. r.drop()
  60. os.sleep(15)
  61. r.suck()
  62. r.turnLeft()
  63. elseif s==5 then
  64. r.turnLeft()
  65. r.drop()
  66. os.sleep(15)
  67. r.suck()
  68. r.turnRight()
  69. else
  70. r.dropDown()
  71. os.sleep(15)
  72. r.suckDown()
  73. end
  74. end
  75. end
  76. function APIS.use(s)
  77. --функция юза в заданную сторону.
  78. local r = require("robot")
  79. if s == 1 then r.useUp()
  80. elseif s == 2 then
  81. r.turnAround()
  82. r.use()
  83. r.turnAround()
  84. elseif s == 3 then r.use()
  85. elseif s == 4 then
  86. r.turnRight()
  87. r.use()
  88. r.turnLeft()
  89. elseif s==5 then
  90. r.turnLeft()
  91. r.use()
  92. r.turnRight()
  93. else
  94. r.useDown()
  95. end
  96. end
  97. function APIS.drop()
  98. --функция дропа всего инвентаря в сундук, если таковой стоит перед носом
  99.  local inv = require("component").inventory_controller
  100.  local r= require("robot")
  101.  if r.detect() then
  102.   if inv.getInventorySize(3) ~= nil then
  103.    for i=1,inv_size do
  104.     r.select(i)
  105.     r.drop()
  106.    end
  107.   else
  108.    print("Блок не является сундуком.")
  109.   end
  110.  else
  111.   print("Нет сундука.")
  112.  end
  113.  r.select(1)
  114. end
  115. function APIS.printState()
  116. --используется для отладки движений робота
  117. print("Статус:")
  118. print(lc.x, lc.y, lc.z, lc.dr)
  119. end
  120. function APIS.harvest(count)
  121. --функция для фермера на IC кропсах, аргумент - сколько раз собирать с 1 места
  122.  local r=require("robot")
  123.  for i=1,count do
  124.   r.useDown()
  125.  end
  126. end
  127. function APIS.dig(arg)
  128. --функция целевого копания по стороне-аргументу, скорее всего потру ее, при оптимизации
  129.  r = require("robot")
  130.  event = require("event")
  131.  if arg == 3 then
  132.   r.swing()
  133.  elseif arg == 1 then
  134.   while r.detectUp() do
  135.    r.swingUp()
  136.   end
  137.  elseif arg == 0 then
  138.   r.swingDown()
  139.  end
  140. end
  141. function APIS.isScrap(name)
  142.  --проверка является ли итем по имени мусором.
  143.  for i, nm in pairs(scrap) do
  144.   if name == nm then  
  145.    return true
  146.   end  
  147.  end
  148.  return false
  149. end
  150. function APIS.ore_analyze(arg)
  151.  --метод проверки, является ли блок "немусором"
  152.  if arg ~= nil then
  153.   if require("component").isAvailable("geolyzer") then
  154.    local lyz = require("component").geolyzer
  155.    if APIS.isScrap(lyz.analyze(arg).name) then
  156.     return false
  157.    else
  158.     return true
  159.    end
  160.   else
  161.    print("Геолайзер не обнаружен в системе.")
  162.    return false
  163.   end
  164.  else
  165.   print("Не указан аргумент(сторона проверки).")
  166.  end
  167. end
  168. function APIS.dig_ore()
  169. --метод для копания только руды, в слоеном карьере.
  170.  local r=require("robot")
  171.  if r.detectUp() then
  172.   if APIS.ore_analyze(1) then
  173.    APIS.dig(1)
  174.   end
  175.  end
  176.  if r.detectDown() then
  177.   if APIS.ore_analyze(0) then
  178.    APIS.dig(0)
  179.   end
  180.  end
  181. end
  182. function APIS.turnLeft()
  183. --повертяйка для координатной системы, скорее всего будет удалена
  184. local r = require("robot")
  185. r.turnLeft()
  186. if lc.dr == 3 then
  187. lc.dr = 5
  188. elseif lc.dr == 4 then
  189. lc.dr = 3
  190. elseif lc.dr == 2 then
  191. lc.dr = 4
  192. elseif lc.dr == 5 then
  193. lc.dr = 2
  194. end
  195. end
  196. function APIS.rot(side)
  197. --повертяйка для координатной системы, требует модернизации, для удаления лишних поворотов.
  198.  if (side ~= 1) and (side ~= 0) then
  199.   local sides = require("sides")
  200.   local r = require("robot")  
  201.   while lc.dr ~= side do
  202.    APIS.turnLeft()
  203.   end
  204.  end
  205.  APIS.printState()
  206. end
  207. function APIS.mUp()
  208. --функция движения вверх, сквозь породу.
  209.  local r = require("robot")
  210.  local try = 1
  211.  while not r.up() == true do
  212.   r.swingUp()
  213.   try = try + 1
  214.   if try >= 10 then
  215.    APIS.mTo(lc.x-3,lc.y,lc.z)  
  216.    APIS.back_to_the_future()  
  217.    --APIS.printState()
  218.    return false
  219.   end
  220.  end
  221.  if try < 10 then
  222.   lc.y = lc.y + 1
  223.   APIS.printState()
  224.   return true
  225.  end
  226. end
  227. function APIS.mDown(action, arg)
  228. --функция движения вниз, сквозь породу.
  229. local r = require("robot")
  230. local event = require("event")
  231. local try = 1
  232. while not r.down() == true do
  233.  action(arg)
  234.  r.swingDown()
  235.  try = try + 1
  236.  if try >= 10 then
  237.   --APIS.printState()
  238.   APIS.back_to_the_future()
  239.   return false
  240.  end
  241. end
  242.  if try < 10 then
  243.   lc.y = lc.y - 1
  244.   return true
  245.  end
  246. end
  247. function APIS.mForw(action,arg)
  248. --шаг вперед с действием или безБ сквозь породу, координатные отметки
  249. local r = require("robot")
  250. local event = require("event")
  251. local try = 1
  252. local sides = require("sides")
  253. if action ~= nil then
  254.  action(arg)
  255. end
  256. while not r.forward() do
  257.  r.swing()
  258.  try = try + 1
  259. if try >= 10 then
  260.  APIS.back_to_the_future()
  261.  return false  
  262. end
  263. end
  264. if try < 10 then
  265. if lc.dr==2 then
  266.  lc.x = lc.x - 1
  267. elseif lc.dr==3 then
  268.  lc.x = lc.x + 1
  269. elseif lc.dr==4 then
  270.  lc.z = lc.z + 1
  271. elseif lc.dr==5 then
  272.  lc.z = lc.z - 1
  273. end  
  274.  --APIS.printState()
  275.  return true
  276. end
  277. end
  278. function APIS.mTo(x, y, z, action, arg)
  279. --движение в заданную точку с заданым действием и аргументом действия. Координатное.
  280. local r = require("robot")
  281. local sides = require("sides")
  282.  if lc.x > x then
  283.   APIS.rot(sides.back)
  284.   while lc.x > x do
  285.    APIS.mForw(action,arg)
  286.   end
  287.  end
  288.  if lc.x < x then
  289.   APIS.rot(sides.forward)
  290.   while lc.x < x do
  291.    APIS.mForw(action,arg)
  292.   end
  293.  end
  294.  if lc.z > z then
  295.   APIS.rot(sides.left)
  296.   while lc.z > z do
  297.    APIS.mForw(action,arg)
  298.   end  
  299.  end
  300.  if lc.z < z then
  301.   APIS.rot(sides.right)
  302.   while lc.z < z do
  303.    APIS.mForw(action,arg)
  304.   end
  305.  end
  306.  while lc.y > y do
  307.   APIS.mDown(action,arg)
  308.   --print("едем вниз")
  309.  end
  310.  while lc.y < y do
  311.   APIS.mUp(action,arg)
  312.   --print("едем вверх")
  313.  end
  314. end
  315. function APIS.plane(x, y, z, action, arg, forward)
  316. --проходка горизонтальной плоскости, координатная. Слоеный карьер, фермер.
  317.  local dir = "forward"  
  318.  if forward then
  319.   print("Плоскость вперед")
  320.   for j=0,z do
  321.    if dir == "forward" then
  322.     print("Движение вперед")
  323.     for i=0,x do
  324.      print("шаг вперед")
  325.      APIS.mTo(i,y,j,action,arg)
  326.     end
  327.     APIS.check_state()
  328.     dir = "back"
  329.     print("Поворот назад")
  330.    else
  331.     print("Движение назад")
  332.     for i=x,0,-1 do
  333.      print("шаг назад")
  334.      APIS.mTo(i,y,j,action,arg)
  335.     end
  336.     APIS.check_state()
  337.     dir = "forward"
  338.     print("Поворот вперед")
  339.    end
  340.   end
  341.  else
  342.  if z%2==0 then dir = "back" end
  343.   print("Плоскость обратная")
  344.   for j=z,0,-1 do
  345.    print(dir)
  346.    if dir == "forward" then
  347.     for i=0,x do
  348.      APIS.mTo(i,y,j,action,arg)
  349.     end
  350.     APIS.check_state()
  351.     dir = "back"
  352.    else
  353.     for i=x,0,-1 do
  354.      APIS.mTo(i,y,j,action,arg)
  355.     end
  356.     APIS.check_state()
  357.     dir = "forward"
  358.    end
  359.   end
  360.  end
  361. end
  362. function APIS.home(action,arg)
  363.  --функция возврата к сундуку для очистки инвентаря.
  364.  temp_state = lc
  365.  APIS.mTo(0,0,0, action,arg)
  366.  APIS.rot(2)
  367.  APIS.drop()
  368.  APIS.rot(3)
  369. end
  370. function APIS.back_to_mine(action,arg)
  371.  --возврат на точку останова(после очистки инвентаря) для возобновления работы.
  372.  APIS.mTo(0,temp_state.y,0, action,arg)
  373.  APIS.mTo(temp_state.x,temp_state.y,temp_state.z, action,arg)
  374.  APIS.rot(temp_state.dr)
  375. end
  376. function APIS.back_to_the_future()
  377.  --Завершение программы ввиду непреодолимого препятствия.
  378.  print("Ошибка, препятствие. Возврат робота.")
  379.  APIS.mTo(lc.x, 0, lc.z)
  380.  APIS.home()
  381.  print("Робот на исходной. Завершение программы.")
  382.  os.exit()
  383. end
  384. function APIS.check_inv()
  385. --вычисление величины собственного инвентаря
  386.  local r = require("robot")
  387.  local i = 16
  388.  local count = 16
  389.  while pcall(r.count, i) do
  390.   count = i
  391.   i=i+1
  392.  end
  393.  return count
  394. end
  395. function APIS.inv_sorting()
  396.  --Функция сортировки инвентаря(перекладывание содержимого без пустых ячеек)
  397.  --возвращает процентное заполнение инвентаря в целом
  398.  local inv = require("component").inventory_controller
  399.  local r = require("robot")
  400.  local items_stored = 0
  401.  inv_size = APIS.check_inv()
  402.  --цикл от начала до конца ищет пустые ячейки, когда находит - второй цикл от конца до
  403.  --начала ищет не пустые и перемещает на место пустых(упорядочивает)
  404.  --когда цикл начальный и конечный пересекается - перестает запускаться цикл с конца
  405.  --чтоб не было бесконечного перемешивания. После подсчет % занятого пространства и возврат значений.
  406.  for i=1, inv_size do
  407.   if r.count(i) == 0 then
  408.    for j=inv_size, 1, -1 do
  409.     if r.count(j) > 0 then
  410.      if j<i then
  411.      break
  412.      end
  413.      r.select(j)
  414.      r.transferTo(i)
  415.      break
  416.     end
  417.    end
  418.   end
  419.  end
  420.  for i=1,inv_size do
  421.   if r.count(i) > 0 then
  422.    items_stored = items_stored + 1
  423.   end
  424.  end
  425.  print(items_stored)
  426.  r.select(1)
  427.  return items_stored/inv_size
  428. end
  429. function APIS.check_state()
  430.  --функция проверки состояния инвентаря и заряда батареи робота
  431.  --выбрасывание мусора из карманов и пожирание угля, если требуется
  432.  local r = require("robot")
  433.  local inv = require("component").inventory_controller
  434.  local comp = require("computer")
  435.  local c = require("component")
  436.  local need_fuel = comp.energy() < (comp.maxEnergy()/8)
  437.  if (r.count(inv_size-2) > 0) then
  438.   for i=1, inv_size do  
  439.    local slot = inv.getStackInInternalSlot(i)
  440.    if slot ~= nil then  
  441.     if APIS.isScrap(slot.name) then
  442.      r.select(i)
  443.      r.drop()
  444.     end
  445.    end
  446.   end
  447.    if APIS.inv_sorting() > 0.8 then
  448.     APIS.home()
  449.     APIS.back_to_mine()
  450.    end
  451.  end  
  452.  if need_fuel and c.isAvailable("generator") then
  453.   if inv.getInventorySize(3) ~= nil then
  454.    local iSize = inv.getInventorySize(3)
  455.    for i=1, iSize do
  456.     if c.generator.count() == 0 then
  457.      if inv.getStackInSlot(3, i).name == "minecraft:coal" then   
  458.       inv.suckFromSlot(3, i)
  459.      end
  460.     end
  461.    end
  462.   end  
  463.    local slt = APIS.inv_scaner("minecraft:coal")  
  464.    if slt ~= 0 then
  465.     local gen = require("component").generator
  466.     if gen.count() ~= 0 then
  467.      r.select(slt)
  468.      gen.insert()
  469.     end
  470.    end
  471.  end
  472.  r.select(1)
  473. end
  474. function APIS.quarry(x, z)
  475. --слоистый геокарьер, копает слои 1 через 2, проверяет все блоки, берет только руду.
  476.  inv_size = APIS.check_inv()
  477.  for i=0, -256, -3 do  
  478.   if i%2 == 0 then  
  479.    APIS.plane((x - 1),i,(z - 1), APIS.dig_ore, 3, true)  
  480.   else  
  481.    APIS.plane((x - 1),i,(z - 1), APIS.dig_ore, 3, false)  
  482.   end  
  483.  end
  484.  APIS.home()
  485. end
  486. function APIS.field(x, z, time)
  487. --фермер для кропсов, длинна, ширина, таймер повторения в минутах(время созревания)
  488. --нуждается в модернизации, автоматизированной настройке таймера повторений.
  489.  while true do
  490.   APIS.charge(require("sides").top)
  491.   APIS.plane(x-1, 0, z-1, APIS.harvest, 2, true)
  492.   APIS.use(require("sides").down)
  493.   APIS.use(require("sides").down)
  494.   APIS.home()
  495.   print("Ожидание созревания...", time, "минут.")
  496.   os.sleep(60*time)
  497.  end
  498. end
  499. function APIS.chop_single()
  500. --сырая автолесорубка для 1 дерева, пассивная, магнит апгрейд необходим. Рабочая.
  501.  local inv = require("component").inventory_controller
  502.  local beam = require("component").tractor_beam
  503.  local r = require("robot")
  504.  local function start()
  505.   APIS.rot(inv_side)
  506.   APIS.drop()
  507.   inv.suckFromSlot(3, APIS.inv_scaner("minecraft:sapling"), 1)     
  508.   APIS.rot(3)
  509.   r.place()
  510.  end
  511.  start()
  512.  while true do
  513.   require("term").clear()      
  514.   print("Лесоруб, одиночное дерево. Ожидание роста саженца.")
  515.   local _, wood = r.detect()
  516.   if wood == "solid" then
  517.    print("Рубка дерева.")           
  518.    r.swing()
  519.    os.sleep(5)
  520.    for i=1, 8 do
  521.     beam.suck()
  522.    end
  523.    start()     
  524.    require("term").clear()
  525.    APIS.charge(charge_side)
  526.    APIS.charge_tool(battery_side)
  527.   end
  528.   os.sleep(10)
  529.  end
  530. end
  531. function APIS.inv_scaner(filter)
  532. --автопоисковик заданного итема в своем инвентаре по системному имени.
  533. --возвращает номер ячейки итема, первого найденного от начала ивентаря.
  534.  local inv = require("component").inventory_controller
  535.  ins = inv.getInventorySize(3)
  536.  if ins ~= nil then
  537.   for i=1, ins do
  538.    if inv.getStackInSlot(3, i).name == filter then
  539.     print(filter.."найден!")
  540.     return i
  541.    end
  542.   end
  543.  print("Найти "..filter.."не удалось.")
  544.  return 0
  545.  end
  546. end
  547. function APIS.waypoints(ores_table)
  548.  local function distance(blockA, blockB)
  549.  local dist = math.sqrt(math.pow(blockA.x - blockB.x,2) +
  550.    math.pow(blockA.z - blockB.z,2) + math.pow(blockA.y - blockB.y,2))
  551.   return dist
  552.  end
  553.  local way_table = {}
  554.  table.insert(way_table, {lc.x, lc.z, lc.y})
  555.  print("Запись ближайшей точки из 1 слота таблицы руд")
  556.  local closest_point = ores_table[1]
  557.  print("Ближайшая точка: ", closest_point.x)
  558.  while #way_table ~= #ores_table+1 do
  559.   for i=1, #ores_table do  
  560.    print("Итерация номер: "..i)
  561.    print("Первая пара сравнений")
  562.    for a,b in way_table[#way_table] do
  563.     print(a,b)
  564.    end
  565.    for a,b in ores_table[i] do
  566.     print(a,b)
  567.    end
  568.    for a,b in closest_point do
  569.     print(a,b)
  570.    end
  571.    if distance(way_table[#way_table], ores_table[i]) <
  572.     distance(way_table[#way_table], closest_point) then
  573.     closest_point = ores_table[i]
  574.    end
  575.   end
  576.   table.insert(way_table, closest_point)
  577.  end
  578.  return way_table
  579. end
  580. function APIS.scanVolume(xn,zn)
  581.  --сканирование карьерного "этажа" заданного радиуса -10 блоков вниз+сканер+10 блоков вверх
  582.  local geo = require("component").geolyzer
  583.  local ores_table = {}
  584.  for xt=0,xn do
  585.   for zt=0,zn do
  586.    local scan = geo.scan(xt,zt,true)
  587.    for yt=23, 43 do
  588.     if scan[yt] > 2.5 and scan[yt] < 40 then
  589.      table.insert(ores_table, {x=xt, z=zt, y=(yt-33)+lc.y})
  590.     end
  591.    end
  592.   end
  593.  end
  594.  return ores_table
  595. end
  596. function APIS.ore_grouper(volume)
  597.  local ore_group_list = {}
  598.  local function distance(blokA, blockB)
  599.   local distance = math.sqrt(math.pow(blokA.x - blokB.x,2) +
  600.   math.pow(blokA.z - blokB.z,2) + math.pow(blokA.y - blokB.y,2))
  601.   return distance
  602.  end
  603.  for xn=0, #volume do
  604.   for zn=0, #volume[xn] do
  605.    for yn=-10, #volume[zn]-10 do
  606. --перебор каждой ячейки 3д объема, -10 чтоб совместить с координатной системой
  607. --т.к. то что для геосканера "1" - то для робота "-10" по Y
  608.     if volume[xn][zn][yn+11] > 2.5 then
  609.      if #ore_group_list == 0 then
  610. --если нет ни 1 жилы, создаем первую жилу, добавляем в нее первый блок руды
  611.       table.insert(ore_group_list,{})
  612.       table.insert(ore_group_list[1],{x=xn, z=zn, y=lc.y - yn})
  613.      else
  614.       local block_added = false
  615.       for i=1, #ore_group_list do
  616.        if block_added then break end
  617.        for j=1, #ore_group_list[i] do
  618. --проверка расстояния, от найденного блока руды до любого блока в любой из жил
  619. --если блок руды касается блока из жилы хотя бы по диагонали - тогда добавляем его в эту жилу
  620.         if distance(ore_group_list[i][j], {xn, zn, lc.y - yn}) < 2 then
  621.          table.insert(ore_group_list[i],{x=xn, z=zn, y=lc.y - yn})
  622.          block_added = true
  623. --если новый блок добавлен к какой-либо жиле - сбиваем оба цикла проверки по жилам
  624. --и переключаемся на новый кусок руды
  625.          break
  626.         end
  627.        end
  628.       end
  629.       if not block_added then
  630. --если проверены все жилы и ни с одним блоком не соприкасается найденная руда
  631. --создаем новую жилу, добавляем туда найденный блок руды
  632.        table.insert(ore_group_list,{})
  633.        table.insert(ore_group_list[#ore_group_list],{x=xn, z=zn, y=lc.y - yn})
  634.       end    
  635.      end
  636.     end
  637.    end
  638.   end
  639.  end
  640. end
  641.  
  642. return APIS
  643. --rm lib/api.lua, pastebin get -f NNYWA1aZ lib/api.lua, require("api").quarry(3,3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement