Advertisement
whaamp

Untitled

Jan 12th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.31 KB | None | 0 0
  1. enderchest = peripheral.wrap("top")
  2. chest = peripheral.wrap("bottom")
  3. inventory = peripheral.wrap("right")
  4.  
  5. info = {
  6. max_height = 19
  7. }
  8.  
  9. me = {
  10. column = 0,
  11. level = -1,
  12. direction = 0
  13. }
  14.  
  15. positions = {
  16. last_position = {
  17. column = 0,
  18. level = 0,
  19. direction = 0
  20. },
  21. open_positions = {}
  22. }
  23.  
  24. chests = {
  25. todeposit = {"black","orange","black"},
  26. mistakes = {"black","black","red"}
  27. }
  28.  
  29. function go_to(target)
  30. if me.column ~= target.column then
  31. local new_target = {column = me.column}
  32. local up_distance = (info.max_height - me.level) + (info.max_height - target.level)
  33. local down_distance = me.level + target.level
  34. if up_distance < down_distance then
  35. new_target.level = info.max_height + 1
  36. else
  37. new_target.level = 0
  38. end
  39. if me.column < target.column then
  40. new_target.direction = 2
  41. else
  42. new_target.direction = 0
  43. end
  44. go_to(new_target)
  45. for i = me.column * 3, target.column * 3 - 1 do
  46. while not turtle.forward() do
  47. turtle.dig()
  48. end
  49. end
  50. me.column = target.column
  51. end
  52. while me.level < target.level do
  53. if turtle.up() then
  54. me.level = me.level + 1
  55. else
  56. turtle.digDown()
  57. end
  58. end
  59. while me.level > target.level do
  60. if turtle.down() then
  61. me.level = me.level - 1
  62. else
  63. turtle.digDown()
  64. end
  65. end
  66. if me.direction == (target.direction + 1) % 4 then
  67. turtle.turnLeft()
  68. me.direction = target.direction
  69. else
  70. while me.direction ~= target.direction do
  71. turtle.turnRight()
  72. me.direction = (me.direction + 1) % 4
  73. end
  74. end
  75. end
  76.  
  77. function position_after(position)
  78. local new_position = {}
  79. if position.direction == 3 then
  80. new_position.direction = 0
  81. if position.level == info.max_height then
  82. new_position.level = 0
  83. new_position.column = position.column + 1
  84. else
  85. new_position.level = position.level + 1
  86. end
  87. else
  88. new_position.direction = position.direction + 1
  89. end
  90. return new_position
  91. end
  92.  
  93. function next_open_position()
  94. if #positions.open_positions > 0 then
  95. local position = {positions.open_positions[1], 1}
  96. for i = 2, #positions.open_positions do
  97. if positions.open_positions[i].column > position[1].column
  98. or positions.open_positions[i].level > position[1].column
  99. or positions.open_positions[i].direction > position[1].direction then
  100. else
  101. position = {positions.open_positions[i], i}
  102. end
  103. end
  104. table.remove(positions.open_positions, position[2])
  105. return position[1]
  106. else
  107. local position = positions.last_position
  108. positions.last_position = position_after(position)
  109. return positions.last_position
  110. end
  111. end
  112.  
  113. function place_enderchest(group)
  114. turtle.select(1)
  115. while not turtle.placeUp() do
  116. turtle.down()
  117. me.level = me.level - 1
  118. end
  119. enderchest.setColorNames(group[1],group[2],group[3])
  120. end
  121.  
  122. function same_item(item, stack)
  123. return item.string_id == stack.string_id
  124. end
  125.  
  126. function safe_string(text)
  127. local new_text = {}
  128. for i = 1, #text do
  129. local val = string.byte(text, i)
  130. new_text[i] = (val > 31 and val < 127) and val or 32
  131. end
  132. return string.char(unpack(new_text))
  133. end
  134.  
  135. function is_registered(stack)
  136. stack.string_id = safe_string(stack.id..stack.dmg..stack.raw..stack.display)
  137. for _, item in ipairs(items) do
  138. if same_item(item, stack) then
  139. return item
  140. end
  141. end
  142. end
  143.  
  144. function register(stack)
  145. local item = is_registered(stack)
  146. if not item then
  147. item.string_id = stack.string_id
  148. item.damage = stack.dmg
  149. item.max_damage = stack.max_dmg
  150. item.max_stack = stack.max_size
  151. item.recipes = {}
  152. item.quantity = 0
  153. item.position = next_open_position()
  154. end
  155. return item
  156. end
  157.  
  158. function check_items_to_sort()
  159. local items_to_sort = {}
  160. local inventory_items = inventory.getAllStacks()
  161. for i = 2, #inventory_items do
  162. table.insert(items_to_sort, register(inventory_items[i].basic()))
  163. end
  164. local enderchest_items = enderchest.getAllStacks()
  165. for _, item in ipairs(enderchest_items) do
  166. table.insert(items_to_sort, register(item.basic()))
  167. end
  168. return items_to_sort
  169. end
  170.  
  171. function distance_away(position)
  172. local distance = 0
  173. local up_distance = (info.max_height - me.level) + (info.max_height - position.level)
  174. local down_distance = me.level + position.level
  175. distance = distance + min(up_distance, down_distance)
  176. distance = distance + 3 * (me.column)
  177. if up_distance < down_distance then
  178. new_position.level = info.max_height + 1
  179. else
  180. new_position.level = 0
  181. end
  182. end
  183.  
  184. function sort_order(item_1, item_2)
  185. return distance_away(item_1.position) > distance_away(item_2.position)
  186. end
  187.  
  188. function sort_inventory(items_to_sort)
  189. local inventory_items = inventory.getAllStacks()
  190. for i = 2, #inventory_items do
  191. inventory_items[i].slot = i
  192. end
  193. table.sort(items_to_sort, sort_order)
  194. return items_to_sort
  195. end
  196.  
  197. function slice(table, first, last)
  198. local sliced = {}
  199. for i = first, math.min(last, #table) do
  200. table.insert(sliced, table[i])
  201. end
  202. return sliced
  203. end
  204.  
  205. function deposit_item(item)
  206. go_to(item.position)
  207. turtle.select(item.slot)
  208. local start_amount = turtle.getItemCount()
  209. turtle.drop()
  210. item.quantity = item.quantity + start_amount - turtle.getItemCount()
  211. end
  212.  
  213. function store_mistakes()
  214. inventory.condenseItems()
  215. local stacks = inventory.getAllStacks()
  216. if #stacks > 1 then
  217. place_enderchest(chests.mistakes)
  218. end
  219. for i = 2, #stacks do
  220. turtle.select(i)
  221. turtle.dropUp()
  222. end
  223. end
  224.  
  225. function begin_sorting(total_items_to_sort)
  226. local items_to_sort = slice(total_items_to_sort, 1, 15)
  227. total_items_to_sort = slice(total_items_to_sort, 16, #total_items_to_sort)
  228. while #items_to_sort > 0 do
  229. closest_item = sort_inventory(items_to_sort)[#items_to_sort]
  230. deposit_item(closest_item)
  231. table.remove(items_to_sort)
  232. end
  233. store_mistakes()
  234. end
  235.  
  236. function begin_depositing()
  237. inventory.condenseItems()
  238. chest.condenseItems()
  239. local chest_item_amount = #chest.getAllStacks()
  240. while chest_item_amount > 0 or #inventory.getAllStacks() > 1 do
  241. while turtle.suckDown() do
  242. end
  243. if chest_item_amount > 0 then
  244. place_enderchest(chests.todeposit)
  245. while turtle.suckDown() do
  246. if not turtle.dropUp() then
  247. turtle.dropDown()
  248. break
  249. end
  250. end
  251. end
  252. local items_to_sort = check_items_to_sort()
  253. begin_sorting(items_to_sort)
  254. chest.condenseItems()
  255. chest_item_amount = #chest.getAllStacks()
  256. end
  257. end
  258.  
  259. while true do
  260. command = io.read()
  261. if command == ">" then
  262. begin_depositing()
  263. end
  264. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement