Guest User

Item Retrieval Turtle

a guest
Sep 12th, 2013
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.99 KB | None | 0 0
  1. -- Num's item retrieval turtle
  2.  
  3. -- Inventory slot usage:
  4. -- 1: Outgoing ender chest
  5. -- 2: Returns ender chest
  6. -- 3: Emptied barrels
  7. -- 5-8: Grabbed stacks
  8. -- 9-12: To be delivered
  9. -- 13: To be returned
  10.  
  11. ----------------------
  12.  
  13. function forward()
  14.     while (not turtle.forward()) do sleep(3) end
  15. end
  16.  
  17. function back()
  18.     while (not turtle.back()) do sleep(3) end
  19. end
  20.  
  21. function left()
  22.     turtle.turnLeft()
  23. end
  24.  
  25. function right()
  26.     turtle.turnRight()
  27. end
  28.  
  29. function select(a)
  30.     turtle.select(a)
  31. end
  32.  
  33. function reset()
  34.     turtle.select(1)
  35.     for i = 1, 16 do turtle.back() end
  36.     right()
  37.     for i = 1, 16 do turtle.back() end
  38.     left()
  39.     if(turtle.detectUp()) then doError("Failed to reset!") end
  40. end
  41.  
  42. function refuel()
  43.     rednet.send(13, "2 Refueling...", true)
  44.     goto(fuelBarrel)
  45.     grabStack()
  46.     if(turtle.getItemCount(5) < 64) then
  47.         turtle.refuel(turtle.getItemCount())
  48.         removeBarrel()
  49.         doError("No more fuel!")
  50.     end
  51.     turtle.refuel(64)
  52. end
  53.  
  54. function removeBarrel()
  55.     rednet.send(13, "3 Removed a barrel!", true)
  56.     turtle.select(3)
  57.     turtle.digUp()
  58.     turtle.suckUp()
  59. end
  60.  
  61. function goto(target)
  62.     startX = x
  63.     startY = y
  64.     targetX = target%16
  65.     targetY = math.floor(target/16)
  66.    
  67.     while(x ~= targetX) do
  68.         if(x < targetX) then
  69.             forward()
  70.             x = x + 1
  71.         else
  72.             back()
  73.             x = x - 1
  74.         end
  75.     end
  76.    
  77.     if(y ~= targetY) then
  78.         turtle.turnRight()
  79.         while(y ~= targetY) do
  80.             if(y < targetY) then
  81.                 forward()
  82.                 y = y + 1
  83.             else
  84.                 back()
  85.                 y = y - 1
  86.             end
  87.         end    
  88.         turtle.turnLeft()
  89.     end
  90. end
  91.  
  92. function grabStack()
  93.     select(5)
  94.     turtle.suckUp()
  95. end
  96.  
  97. function prepDelivery(amount)
  98.     if(amount <= 0) then return end
  99.     if(amount > 256) then amount = 256 end
  100.    
  101.     stacks = 1
  102.     if(amount > 64) then stacks = stacks + 1 end
  103.     if(amount > 128) then stacks = stacks + 1 end
  104.     if(amount > 192) then stacks = stacks + 1 end
  105.    
  106.     fullStacks = stacks - 1
  107.     lastStackSize = 64
  108.     if(amount % 64 == 0) then fullStacks = stacks
  109.     else lastStackSize = amount - (fullStacks * 64) end
  110.    
  111.     for i = 1, stacks do grabStack() end
  112.     if(turtle.getItemCount(4 + stacks) < 64) then removeBarrel() end
  113.    
  114.     for i = 1, fullStacks do
  115.         select(4 + i)
  116.         turtle.transferTo(8 + i)
  117.     end
  118.    
  119.     select(4 + stacks)
  120.     turtle.transferTo(12, lastStackSize)
  121.     turtle.transferTo(13)
  122. end
  123.  
  124. function deliver(amount)
  125.     prepDelivery(amount)
  126.     select(1)
  127.     while (not turtle.placeDown()) do sleep(3) end
  128.     for i = 9, 12 do
  129.         select(i)
  130.         turtle.dropDown()
  131.     end
  132.     rednet.send(13, "1 Done!", true)
  133.     select(1)
  134.     turtle.digDown()
  135. end
  136.  
  137. function dropExtra()
  138.     select(2)
  139.     while (not turtle.placeDown()) do sleep(3) end
  140.     select(13)
  141.     turtle.dropDown()
  142.     select(2)
  143.     turtle.digDown()
  144. end
  145.  
  146. function check()
  147.     if(turtle.getFuelLevel() < 100) then refuel() end
  148. end
  149.  
  150. function doError(msg)
  151.     turtle.select(1)
  152.     rednet.send(13, "3 "..msg, true)
  153.     error(msg)
  154. end
  155.  
  156. ------------------------
  157.  
  158. sleep(1)
  159. rednet.open("right")
  160. rednet.send(13, "2 Resetting...", true)
  161. reset()
  162. x = 0
  163. y = 0
  164. barrelNum = 0
  165. fuelBarrel = 15
  166. rednet.send(13, "1 Ready!", true)
  167.  
  168. while true do
  169.     turtle.select(1)
  170.    
  171.     id, msg = rednet.receive()
  172.    
  173.     words = {}
  174.     wordCount = 0
  175.     for word in string.gmatch(msg, "%S+") do
  176.         words[wordCount] = word
  177.         wordCount = wordCount + 1
  178.     end
  179.    
  180.     barrelNum = 0
  181.     -- row 1
  182.     if(words[1] == "iron") then barrelNum = 1
  183.     elseif(words[1] == "copper") then barrelNum = 2
  184.     elseif(words[1] == "tin") then barrelNum = 3
  185.     elseif(words[1] == "gold") then barrelNum = 4
  186.     elseif(words[1] == "silver") then barrelNum = 5
  187.     elseif(words[1] == "lead") then barrelNum = 6
  188.     elseif(words[1] == "refinediron") then barrelNum = 7
  189.     elseif(words[1] == "uranium") then barrelNum = 8
  190.     elseif(words[1] == "dullshard") then barrelNum = 9
  191.     elseif(words[1] == "fireshard") then barrelNum = 10
  192.     elseif(words[1] == "airshard") then barrelNum = 11
  193.     elseif(words[1] == "earthshard") then barrelNum = 12
  194.     elseif(words[1] == "watershard") then barrelNum = 13
  195.     elseif(words[1] == "visshard") then barrelNum = 14
  196.     elseif(words[1] == "coalcoke") then barrelNum = 15
  197.     -- row 2
  198.     elseif(words[1] == "redstone") then barrelNum = 16
  199.     elseif(words[1] == "lapis") then barrelNum = 17
  200.     elseif(words[1] == "forcicium") then barrelNum = 18
  201.     elseif(words[1] == "flint") then barrelNum = 19
  202.     elseif(words[1] == "quartz") then barrelNum = 20
  203.     elseif(words[1] == "quartzdust") then barrelNum = 21
  204.     elseif(words[1] == "apatite") then barrelNum = 22
  205.     elseif(words[1] == "amber") then barrelNum = 23
  206.     elseif(words[1] == "quicksilver") then barrelNum = 24
  207.     elseif(words[1] == "forcegem") then barrelNum = 25
  208.     elseif(words[1] == "aluminum") then barrelNum = 26
  209.     elseif(words[1] == "ferrousore") then barrelNum = 27
  210.     --
  211.     elseif(words[1] == "coal") then barrelNum = 31
  212.     -- row 3
  213.     elseif(words[1] == "dirt") then barrelNum = 32
  214.     elseif(words[1] == "gravel") then barrelNum = 33
  215.     elseif(words[1] == "obsidian") then barrelNum = 34
  216.     elseif(words[1] == "netherrack") then barrelNum = 35
  217.     elseif(words[1] == "quarriedblock") then barrelNum = 36
  218.     elseif(words[1] == "ironscaffold") then barrelNum = 37
  219.     elseif(words[1] == "redcobble") then barrelNum = 38
  220.     -- row 4
  221.     elseif(words[1] == "oakplank") then barrelNum = 48
  222.     elseif(words[1] == "stick") then barrelNum = 49
  223.     elseif(words[1] == "fence") then barrelNum = 50
  224.     elseif(words[1] == "track") then barrelNum = 51
  225.     elseif(words[1] == "sign") then barrelNum = 52
  226.     elseif(words[1] == "bamboo") then barrelNum = 53
  227.     -- row 5
  228.     elseif(words[1] == "seeds") then barrelNum = 64
  229.     elseif(words[1] == "bone") then barrelNum = 65
  230.     elseif(words[1] == "string") then barrelNum = 66
  231.     elseif(words[1] == "sugar") then barrelNum = 67
  232.     elseif(words[1] == "gunpowder") then barrelNum = 68
  233.     elseif(words[1] == "minium") then barrelNum = 69
  234.     elseif(words[1] == "blueslime") then barrelNum = 70
  235.     elseif(words[1] == "flesh") then barrelNum = 71
  236.    
  237.     --
  238.     else rednet.send(13, "3 Invalid item!", true) end
  239.    
  240.     if(barrelNum ~= 0) then
  241.         rednet.send(13, "2 Getting "..words[0].." "..words[1].."...", true)
  242.         goto(barrelNum)
  243.         deliver(tonumber(words[0]))
  244.         dropExtra()
  245.         check()
  246.     end
  247. end
Advertisement
Add Comment
Please, Sign In to add comment