Advertisement
ivan52

TreeFerma(OC)

Mar 24th, 2015
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.18 KB | None | 0 0
  1. local r = require('robot')
  2. local comp = require('computer')
  3. local term = require('term')
  4. local sides = require('sides')
  5. local inv = require('component').inventory_controller
  6. local fs = require('filesystem')
  7. --================СПИСОК БЛОКОВ ДЛЯ ЗАПОЛНЕНИЯ================--
  8. musor={}
  9. musor['minecraft:stone'] = true
  10. musor['minecraft:cobblestone'] = true
  11. musor['minecraft:dirt'] = true
  12. musor['minecraft:gravel'] = true
  13. musor['minecraft:sandstone'] = true
  14. musor['minecraft:stonebrick'] = true
  15. --================ПОИСК БЛОКОВ ДЛЯ РАВНЕНИЯ===================--
  16. function poisk(slots)
  17.   for slot = 1, slots do
  18.     if r.count(slot) > 0 then
  19.       if musor[inv.getStackInInternalSlot(slot).name] ~= nil then
  20.         r.select(slot)
  21.         return true
  22.       end
  23.     end
  24.   end
  25.   return false
  26. end
  27. --=======ЗАПОЛНЕНИЕ ИНВЕНТАРЯ БЛОКАМИ ДЛЯ СТРОИТЕЛЬСТВА========--
  28. function zapoln(slot1)
  29.   for a=1,inv.getInventorySize(3) do
  30.     if inv.getStackInSlot(3,a) ~= nil then
  31.       if musor[inv.getStackInSlot(3,a).name] then
  32.         r.select(slot1)
  33.         inv.suckFromSlot(3,a)
  34.         return true
  35.       end
  36.     end
  37.   end
  38. return false  
  39. end
  40. function placeDown()
  41.   while not r.placeDown() do
  42.     r.swingDown()
  43.   end
  44. end
  45. function place(a)
  46.   while not r.place(a) do
  47.     r.swing()
  48.   end
  49. end
  50. loc = {x=0, y=0, z=0, b=0}
  51. function forward()
  52.     while not r.forward() do
  53.       r.swing()
  54.     end
  55.     if loc.b == 0 then loc.y = loc.y+1
  56.     elseif loc.b == 1 then loc.x = loc.x+1
  57.     elseif loc.b == 2 then loc.y = loc.y-1
  58.     else loc.x = loc.x-1 end
  59.     return true
  60. end
  61. function back()
  62.    if not r.back() then
  63.      r.turnAround()
  64.      while not r.forward() do
  65.        r.swing()
  66.      end
  67.      r.turnAround()
  68.    end
  69.    if loc.b == 0 then loc.y = loc.y-1
  70.    elseif loc.b == 1 then loc.x = loc.x-1
  71.    elseif loc.b == 2 then loc.y = loc.y+1
  72.    else loc.x = loc.x+1 end
  73.    return true
  74. end
  75. function up()
  76.   while not r.up() do
  77.     r.swingUp()
  78.   end
  79.   loc.z = loc.z+1
  80.   return true
  81. end
  82. function down()
  83.   while not r.down() do
  84.     r.swingDown()
  85.   end
  86.   loc.z = loc.z-1
  87.   return true
  88. end
  89. function turnRight()
  90.   loc.b = (loc.b+1)%4
  91.   r.turnRight()
  92. end
  93. function turnAround()
  94.   loc.b = (loc.b+2)%4
  95.   r.turnAround()
  96. end
  97. function turnLeft()
  98.   loc.b = (loc.b+3)%4
  99.   r.turnLeft()
  100. end
  101.  
  102.  
  103. function d1()
  104.   local d = loc.b
  105.   local p = loc.x
  106.   local t = loc.y
  107.   local g = loc.z
  108.   if loc.b ~= 2 then
  109.     while loc.b ~= 2 do
  110.       turnRight()
  111.     end
  112.   end
  113.   if loc.z>0 then
  114.     while loc.z > 0 do
  115.       down()
  116.     end
  117.   end
  118.   if loc.z < 0 then
  119.     while loc.z < 0 do
  120.       up()
  121.     end
  122.   end
  123.   if loc.x > 0 then
  124.     turnRight()
  125.     while loc.x > 0 do
  126.       forward()
  127.     end
  128.     turnLeft()
  129.   end
  130.   while loc.y > 0 do
  131.     forward()
  132.   end
  133.   while comp.energy() < comp.maxEnergy() * 0.8 do
  134.     os.sleep(8)
  135.   end
  136.   turnRight()
  137.   for i=1,11 do
  138.     r.select(i)
  139.     r.drop()
  140.   end
  141.   for i=1,8 do
  142.     while not zapoln(i) do
  143.       os.sleep(0.2)
  144.     end
  145.   end
  146.   turnRight()
  147.    while loc.y ~= t do
  148.       forward()
  149.     end
  150.     if loc.x ~= p then
  151.       turnRight()
  152.       while loc.x ~=p do
  153.         forward()
  154.       end
  155.     end
  156.     if loc.b ~= d then
  157.       while loc.b ~= d do
  158.         turnLeft()
  159.       end
  160.     end
  161.     if g<0 then
  162.       while loc.z>g do
  163.         down()
  164.       end
  165.     end
  166.     if g>0 then
  167.       while loc.z<g do
  168.         up()
  169.       end
  170.     end
  171. end
  172.  
  173.  
  174. function t()
  175.   local bl,en=r.detectUp()
  176.   if en == 'solid' then
  177.       while (en=='solid') and (loc.z<10) do
  178.         up()
  179.         r.swingUp()
  180.         bl,en=r.detectUp()
  181.       end
  182.       while loc.z>0 do
  183.         down()
  184.       end
  185.    end
  186.    local bl,en = r.detectDown()
  187.   if en ~= 'solid' then
  188.    while en ~= 'solid' do
  189.      down()
  190.      bl,en = r.detectDown()
  191.    end
  192.    while loc.z<-1 do
  193.      up()
  194.      inventar()
  195.      placeDown()
  196.    end
  197.    up()
  198.  end
  199.  r.select(16)
  200.  if (r.compareDown()==false) or (r.detectDown()==false) then
  201.     r.swingDown()
  202.     inv1()
  203.   end
  204. end
  205.  
  206.  
  207. function inv1()
  208. r.select(12)
  209. if r.count()==0 then
  210.   local b = 12
  211.   while (r.count() == 0) and (b <=16) do
  212.     r.select(b)  
  213.     b=b+1
  214.   end
  215. end
  216. placeDown()
  217. r.select(a)
  218. end
  219. function rastasovka()
  220.   t1={}
  221.   t1['minecraft:hopper']={slot=1,kol=17}
  222.   t1['minecraft:dirt']={slot=2,kol=16}
  223.   t1['minecraft:torch']={slot=3,kol=12}
  224.   t1['minecraft:chest']={slot=4,kol=4}
  225.   t1['minecraft:water_bucket']={slot=5,kol=1}
  226.   t1['minecraft:sapling']={slot=16,kol=64}
  227.   b4 = 'minecraft:water_bucket'
  228.   for i1=1,9 do
  229.     r.select(t1[inv.getStackInSlot(3, i1).name].slot)
  230.     inv.suckFromSlot(3,i1,t1[inv.getStackInSlot(3, i1).name].kol)
  231.     if inv.getStackInSlot(3, i1+1) ~= nil then
  232. if inv.getStackInSlot(3,i1+1).name=='minecraft:water_bucket' and inv.getStackInInternalSlot(t1['minecraft:water_bucket'].slot) ~=nil then
  233.         t1['minecraft:water_bucket'].slot = t1['minecraft:water_bucket'].slot+1
  234.       end
  235.     end
  236.   end
  237.   t1 = nil
  238.   i1 = nil
  239. end
  240.  
  241. function inventar()
  242.   if not poisk(11) then
  243.     d1()
  244.   end
  245. end
  246. function usl1()
  247.   if comp.energy() < comp.maxEnergy()*0.5 then
  248.     d1()
  249.   elseif r.count(9) > 0 then
  250.     d1()
  251.   end
  252. end
  253. function file()
  254.   if  fs.exists('Progr') == true then
  255.     file = io.open("Progr","r")
  256.     Prog = file:read()+0
  257.     file:close()
  258.   end
  259. end
  260. Progr = 0
  261. file()
  262. if Prog ~=1 then
  263. t()
  264.   for o=1,13 do
  265.     for i=1,16 do
  266.       forward()
  267.       usl1()
  268.       t()
  269.     end
  270.     if o < 13 then
  271.       while loc.b<1 do
  272.        turnRight()
  273.       end
  274.       while loc.b>1 do
  275.         turnLeft()
  276.       end
  277.       forward()
  278.       usl1()
  279.       t()
  280.       if (o)%2==0 then
  281.         turnLeft()
  282.       else
  283.         turnRight()
  284.       end
  285.     end
  286.   end
  287.   up()
  288.   for i=1,4 do
  289.     turnLeft()
  290.     for i=1,12 do
  291.       forward()
  292.       inv1()
  293.     end
  294.   end
  295.   if loc.b ~= 2 then
  296.     while loc.b ~= 2 do
  297.       turnRight()
  298.     end
  299.   end
  300.   if loc.x > 0 then
  301.     turnRight()
  302.     while loc.x > 0 do
  303.       forward()
  304.     end
  305.     turnLeft()
  306.   end
  307.   while loc.y > 0 do
  308.     forward()
  309.   end
  310.   down()
  311.   turnRight()
  312.   for i=1,16 do
  313.     r.select(i)
  314.     os.sleep(0.2)
  315.     r.drop()
  316.   end
  317.   turnLeft()
  318.   rastasovka()
  319.   r.select(4)
  320.   turnAround()
  321.   up()
  322.   for i=1,10 do
  323.     forward()
  324.   end
  325.   turnRight()
  326.   for i=1,6 do
  327.     forward()
  328.   end
  329.   down()
  330.   r.select(9)
  331.   r.swingDown()
  332.   down()
  333.   for i=1,3 do
  334.     for i=1,3 do
  335.       r.swing()
  336.       forward()
  337.     end
  338.     for i=1,3 do
  339.       back()
  340.     end
  341.     turnLeft()
  342.   end
  343.   for i=1,5 do
  344.     r.swing()
  345.     forward()
  346.   end
  347.   turnRight()
  348.   for i=1,3 do
  349.     r.swing()
  350.     forward()
  351.   end
  352.   turnLeft()
  353.   for i=1,3 do
  354.     r.swing()
  355.     forward()
  356.   end
  357.   turnLeft()
  358.   r.swing()
  359.   forward()
  360.   up()
  361.   r.select(4)
  362.   forward()
  363.     place()
  364.     back()
  365.     place()
  366.   down()
  367.   back()
  368.   place()
  369.   turnRight()
  370.   back()
  371.   place()
  372.   r.select(1)
  373.   for i=1,2 do
  374.     back()
  375.     place(3)
  376.   end
  377.   turnRight()
  378.   back()
  379.   place(5)
  380.   for i=1,2 do
  381.     back()
  382.     place(3)
  383.   end
  384.   turnLeft()
  385.   back()
  386.   place(4)
  387.   for i=1,7 do
  388.     back()
  389.     place(3)
  390.   end
  391.   up()
  392.   r.select(9)
  393.   placeDown()
  394.   r.select(1)
  395.   turnLeft()
  396.   for i=1,3 do
  397.     forward()
  398.   end
  399.   turnRight()
  400.   for i=1,3 do
  401.     forward()
  402.   end
  403.   turnRight()
  404.   down()
  405.   forward()
  406.   place(3)
  407.   back()
  408.   place(3)
  409.   up()
  410.     r.select(9)
  411.     placeDown()
  412.     r.select(1)
  413.   up()
  414.   for i=1,6 do
  415.     forward()
  416.   end
  417.   turnAround()
  418.   for i=1,2 do
  419.      down()
  420.   end
  421.   forward()
  422.     place(3)
  423.     back()
  424.     place(3)
  425.   up()
  426.   r.select(9)
  427.   r.placeDown()
  428.   r.select(2)
  429.   turnLeft()
  430.   for i=1,2 do
  431.     forward()
  432.   end
  433.   turnRight()
  434.   up()
  435.   for i=1,2 do
  436.     for o=1,4 do
  437.       down()
  438.       r.select(2)
  439.       turnLeft()
  440.       place()
  441.       turnAround()
  442.       place()
  443.       turnLeft()
  444.       up()
  445.       r.select(16)
  446.       turnLeft()
  447.       place()
  448.       turnAround()
  449.       place()
  450.       turnLeft()
  451.       if o<4 then
  452.         forward()
  453.       end
  454.       forward()
  455.     end
  456.       if i<2 then
  457.         turnRight()
  458.         for i=1,4 do
  459.           forward()
  460.         end
  461.         turnRight()
  462.         forward()
  463.       end
  464.   end  
  465.   forward()
  466.   turnLeft()
  467.   for i=1,3 do
  468.     forward()
  469.   end
  470.   turnAround()
  471.   for i=1,4 do
  472.     for o=1,11 do
  473.       if (o==1) or (o==6) or (o==11) then
  474.         r.select(3)
  475.         turnLeft()
  476.         place()
  477.         turnRight()
  478.        end
  479.        if o<11 then
  480.          forward()
  481.        end
  482.     end
  483.     r.select(i+4)
  484.     turnRight()
  485.     inv.equip()
  486.     r.useDown()
  487.    end
  488.    r.select(15)
  489.    inv.equip()
  490.    for i=1,2 do
  491.      turnRight()
  492.      forward()
  493.      if i==2 then
  494.        forward()
  495.      end
  496.    end
  497.    turnRight()
  498.    while loc.x>0 do
  499.      forward()
  500.    end
  501.    turnLeft()
  502.    while loc.y>0 do
  503.      forward()
  504.    end
  505.    down()
  506.    for i=1,15 do
  507.      r.select(i)
  508.      r.drop()
  509.    end
  510.    turnAround()
  511.    while loc.y<2 do
  512.      forward()
  513.    end
  514.    turnRight()
  515.    while loc.x<4 do
  516.      forward()
  517.    end
  518.    turnLeft()
  519.    r.select(1)
  520.    Progr=1  
  521.    file = io.open("Progr","w")
  522.    file:write(Progr)
  523.    file:close()
  524. end
  525.    loc = {x=0, y=0, z=0, b=0}
  526. function dom(noreturn)
  527.   -- двигаемся домой
  528.   local d = loc.b
  529.   local p = loc.x
  530.   local t = loc.y
  531.   if loc.b ~= 2 then
  532.     while loc.b ~= 2 do
  533.       turnRight()
  534.     end
  535.   end
  536.   if loc.x > 0 then
  537.     turnRight()
  538.     while loc.x > 0 do
  539.       forward()
  540.     end
  541.     turnLeft()
  542.   end
  543.   while loc.y > 0 do
  544.     forward()
  545.   end
  546.   while loc.z>0 do
  547.     down()
  548.   end
  549.   turnLeft()
  550.  
  551.   -- выгрузка дерева
  552.   for i=1,15 do
  553.     r.select(i)
  554.     if r.compareTo(16)==true then
  555.       r.dropDown()
  556.     else
  557.       r.drop()
  558.     end
  559.   end
  560.  
  561.   -- забираем саженцы
  562.   r.select(16)
  563.   r.suckDown(64-r.count(16))
  564.  
  565.   -- зарядка
  566.   while comp.energy() < 25000 do
  567.     os.sleep(8)
  568.   end
  569.   turnLeft()
  570.   -- возвращаемся если нет флага "в один конец"
  571.   if not noreturn then
  572.     while loc.z<2 do
  573.       up()
  574.     end
  575.     while loc.y ~= t do
  576.       forward()
  577.     end
  578.     if loc.x ~= p then
  579.       turnRight()
  580.       while loc.x ~=p do
  581.         forward()
  582.       end
  583.     end
  584.     if loc.b ~= d then
  585.       while loc.b ~= d do
  586.         turnLeft()
  587.       end
  588.     end
  589.   end
  590. end
  591.  
  592. -- Проверка условий, на возврат домой
  593. function usl()
  594.   if r.count(15) > 32 then
  595.     dom()
  596.   end
  597.   if r.count(16) < 8 then
  598.     dom()
  599.   end
  600.   if comp.energy() < 11000 then
  601.     dom()
  602.   end
  603. end
  604.  
  605. -- Робот определяет выросло ли дерево и рубит его
  606. function axe()
  607.  if r.detect() == true then
  608.     r.select(1)
  609.     r.swing()
  610.     forward()
  611.     r.swingDown()
  612.     -- робот рубит дерево
  613.     while r.compareUp() == true do
  614.       r.swingUp()
  615.       up()
  616.     end
  617.     -- возвращается
  618.     while loc.z ~= 2 do
  619.       down()
  620.       r.swingDown()
  621.     end
  622.    
  623.     r.select(16)
  624.     placeDown()
  625.     r.select(1)
  626.     back()
  627.   end
  628. end
  629.  
  630.  
  631. -- ======================== Г Л А В Н Ы Й   Ц И К Л ======================== --
  632.  
  633. -- робот движется по полю по кругу,
  634. -- и рубит выросшие деревья
  635. while true do
  636.   -- робот едет на стартовую позицию
  637.   -- (левый передний угол поля)
  638.   for i=1,2 do
  639.     up()
  640.   end
  641.   for i=1,4 do
  642.     forward()
  643.   end
  644.  
  645.   -- проход по ферме
  646.   for i=1, 8 do
  647.     -- проверка дерева слева и справа
  648.     usl()
  649.     forward()
  650.     turnLeft()
  651.     axe()
  652.     turnAround()
  653.     axe()
  654.     turnLeft()
  655.     forward()
  656.    
  657.     -- если робот прошел первые 4 пары деревьев,
  658.     -- движемся ко второму ряду
  659.     if i == 4 then
  660.       turnRight()
  661.       for c=1, 4 do forward() end
  662.       turnRight()
  663.     end
  664.   end
  665.  
  666.   -- робот возвращается домой
  667.   -- (флаг true означает - в один конец)
  668.   dom(true)
  669.  
  670.   -- робот спит и видит сны =)
  671.   print('Progress of sleeping')
  672.   for i=1,10 do
  673.     os.sleep(72)
  674.     print(i*10,' %')
  675.   end
  676.   term.clear()
  677.   print('moving')
  678. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement