Advertisement
LifeGate

WoodCutter for Turtle (ComputerCraft)

May 8th, 2013
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.80 KB | None | 0 0
  1. --このプログラムは、白樺などのまっすぐ生えるだけの木前提で
  2. --作ってあります。木の種類によってはプログラムを修正する必要があると
  3. --思います。
  4.  
  5.  
  6. -- 燃料補給関数。
  7. -- 一旦全てのアイテムをしまって、木材を1スタック取得する。
  8. -- かまどから燃料回収後、木炭8個、木材1スタックをセットして次の燃料作成を開始する。
  9. -- 最初のアイテムをしまうことに失敗した場合、falseを返す。
  10. function chargeCoal()
  11.     if putWood() == false then
  12.         return false
  13.     end
  14.     turtle.select(3)
  15.     turtle.suckDown()
  16.     turtle.select(14)
  17.     turtle.refuel(1)
  18.     turtle.back()
  19.     turtle.down()
  20.     turtle.turnLeft()
  21.     turtle.forward()
  22.     turtle.suckUp()
  23.     turtle.back()
  24.     turtle.up()
  25.     turtle.drop(8)
  26.     turtle.up()
  27.     turtle.forward()
  28.     turtle.select(3)
  29.     turtle.dropDown()
  30.     turtle.back()
  31.     turtle.down()
  32.     turtle.turnRight()
  33.     turtle.forward()
  34.     return true
  35. end
  36.  
  37. -- 燃料補給チェック関数。Configで燃料無限にしている場合は無条件でtrueを返す。
  38. -- 燃料が20未満でかつ手持ちの木炭が1個の時、燃料補給関数chargeCoal()を実行する。
  39. -- 手持ちの木炭が十分な場合、木炭1個消費するのみ。
  40. -- 燃料補給に失敗した場合、falseを返す。それ以外の場合はtrueを返す。
  41. function refuelTurtle()
  42.     fuelLevel = turtle.getFuelLevel()
  43.     if fuelLevel == "unlimited" then
  44.         return true
  45.     end
  46.    
  47.     if fuelLevel < 20 then
  48.         turtle.select(14)
  49.         if turtle.getItemCount(14) == 1 then
  50.             if chargeCoal() == false then
  51.                 return false
  52.             end
  53.             turtle.refuel(1)
  54.         end
  55.         turtle.refuel(1)
  56.     end
  57.     return true
  58. end
  59.  
  60. -- インベントリの状況を見て、アイテムを保管するべきな場合はtrueを返す。
  61. -- 判断条件は13スロット目にアイテムがあること。
  62. function isPutWood()
  63.     return turtle.getItemCount(13) > 0
  64. end
  65.  
  66. -- インベントリのアイテムをチェストに移す。
  67. -- スロット3~13のアイテムが対象。
  68. -- 苗木は苗木用のチェストに、その他のアイテムは真下のチェストに移す。
  69. function putWood()
  70.     turtle.turnLeft()
  71.     for i=3,13 do
  72.         turtle.select(i)
  73.         if turtle.getItemSpace(i) ~= 64 then
  74.             if turtle.compareTo(15) == true then
  75.                 result = turtle.drop()
  76.             else
  77.                 result = turtle.dropDown()
  78.             end
  79.            
  80.             if result == false then
  81.                 turtle.turnRight()
  82.                 return false
  83.             end
  84.         end
  85.     end
  86.     turtle.turnRight()
  87.     return true
  88. end
  89.  
  90. -- 手持ちの苗木の確認用関数。
  91. -- スロット1の苗木が0の場合、trueを返す。
  92. function isBlankSheed()
  93.     return turtle.getItemSpace(1) == 64
  94. end
  95.  
  96. -- 苗木用のチェストから、苗木を補充する関数。
  97. function chargeSheed()
  98.     turtle.select(1)
  99.     turtle.turnLeft()
  100.     result = turtle.suck()
  101.     turtle.turnRight()
  102.     return result
  103. end
  104.  
  105. -- 手持ちの骨粉の確認用関数。
  106. function isBlankBone()
  107.     return turtle.getItemSpace(2) == 64
  108. end
  109.  
  110. -- 骨粉用のチェストから、骨粉を補充する関数。
  111. function chargeBone()
  112.     turtle.select(2)
  113.     turtle.turnRight()
  114.     result = turtle.suck()
  115.     turtle.turnLeft()
  116.     return result
  117. end
  118.  
  119. -- 骨粉をかけた苗木が育ったかどうかを判断する関数。
  120. -- 16番目のスロットに原木をセットし、目の前のブロックと比較することで判断している。
  121. function isWoodcut()
  122.     turtle.select(16)
  123.     return turtle.compare()
  124. end
  125.  
  126. -- 伐採を実行する関数。
  127. -- 上部にブロックがなくなるまで伐採する。
  128. -- 伐採後、四方の葉っぱブロックを破壊しながら下降する。
  129. -- 一番下まで降りた後、水流で集めた苗木を回収するために前進、下降し苗木を回収する。
  130. function woodcut()
  131.     turtle.select(3)
  132.     turtle.dig()
  133.     turtle.forward()
  134.     upCnt = 0
  135.     repeat
  136.         turtle.digUp()
  137.         turtle.up()
  138.         upCnt = upCnt + 1
  139.     until turtle.detectUp() == false
  140.     for i=1, upCnt do
  141.         if (upCnt - i) > 0 then
  142.             for a=1, 4 do
  143.                 turtle.dig()
  144.                 turtle.turnLeft()
  145.             end
  146.         end
  147.         turtle.down()
  148.     end
  149.     turtle.forward()
  150.     turtle.suckDown()
  151.     turtle.down()
  152.     turtle.suck()
  153.     turtle.turnLeft()
  154.     turtle.suck()
  155.     turtle.turnRight()
  156.     turtle.turnRight()
  157.     turtle.suck()
  158.     turtle.turnLeft()
  159.     turtle.up()
  160.     turtle.back()
  161.     turtle.back()
  162. end
  163.  
  164. -- 手持ちの苗木を1番スロットに集める関数。
  165. -- 苗木が無くなった場合、チェストから補充する前にこの関数を先に実行する。
  166. function transferSheed()
  167.     for i=4,13 do
  168.         turtle.select(i)
  169.         if turtle.compareTo(15) ==true then
  170.             turtle.transferTo(1)
  171.         end
  172.     end
  173. end
  174.  
  175. -- メインプロセス。燃料チェック、苗木チェック、骨粉チェックを行い、動作可能な場合伐採を実行する。
  176. -- 実行不可能な状態(燃料切れ、苗木切れ、骨粉切れ、収納チェストが一杯)、falseを返す。
  177. function startProcess()
  178.     if refuelTurtle() == false then
  179.         return false
  180.     end
  181.     if isBlankSheed() == true then
  182.         transferSheed()
  183.         if isBlankSheed() == true then
  184.             if chargeSheed() == false then
  185.                 return false
  186.             end
  187.         end
  188.     end
  189.    
  190.     turtle.select(1)
  191.     turtle.place()
  192.     turtle.select(2)
  193.     repeat
  194.         if isBlankBone() == true then
  195.             if chargeBone() == false then
  196.                 return false
  197.             end
  198.         end
  199.         turtle.select(2)
  200.         turtle.place()
  201.     until isWoodcut() == true
  202.     woodcut()
  203.     return true
  204. end
  205.  
  206. print("Proess Start...")
  207.  
  208. endProcess = false
  209.  
  210. -- メインルーチン。メインプロセスがtrueを返し続ける間は、メインプロセスを実行し続ける。
  211. while endProcess == false do
  212.     if startProcess() == false then
  213.         endProcess = true
  214.     end
  215.    
  216.     if endProcess == true then
  217.         putWood()
  218.     end
  219.    
  220.     if isPutWood() == true then
  221.         if putWood() == false then
  222.             endProcess = true
  223.         end
  224.     end
  225. end
  226.  
  227. print("Process End")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement