dadragon84

Turtle Autocrafter by Things

May 10th, 2023
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local slots = {}
  2. --# Fill a table with the sixteen slot IDs.
  3. for i = 1, 16 do
  4.     slots[i] = i
  5. end
  6. local matches = {}
  7. local itemCount = 0
  8. local numItems = 0
  9. local leastItems = 64
  10.  
  11. function clearOuterSlots()
  12.     for i=4,16,4 do
  13.         if turtle.getItemCount(i) > 0 then
  14.             turtle.select(i)
  15.             turtle.drop(i)
  16.         end
  17.     end
  18.     for i = 13,15 do
  19.         if turtle.getItemCount(i) > 0 then
  20.             turtle.select(i)
  21.             turtle.drop(i)
  22.         end
  23.     end
  24. end
  25.  
  26. clearOuterSlots()
  27. while #slots > 0 do
  28.     --# Get the next slot number from the slot ID table
  29.     local current = table.remove(slots, 1)
  30.     --# Create a new match set including it.
  31.     if turtle.getItemCount(current) > 0 then
  32.     local match = {current}
  33.     turtle.select(current)
  34.     --# Check the contents of that slot against the remaining unmatched slots.
  35.     for i = #slots, 1, -1 do
  36.         if turtle.compareTo(slots[i]) then
  37.             table.insert(match, table.remove(slots, i))
  38.         end
  39.     end
  40.     --# Sort the slot IDs in the current set of matches (optional)
  41.     table.sort(match)
  42.     --# Add the current set of matches to the final table.
  43.     table.insert(matches, match)
  44.     end
  45. end
  46. while true do
  47. clearOuterSlots()
  48. for i = 1,#matches do
  49.     for k = 1,#matches[i] do
  50.     itemCount = itemCount + turtle.getItemCount(matches[i][k])
  51.     --print(string.format("Match %d: %d / %d", i, matches[i][k], itemCount))
  52.     numItems = k
  53.     end
  54. local perSlot = math.floor(itemCount / numItems)
  55. --print(string.format("Item %d per slot: %d", numItems, perSlot))
  56. for k = 1,#matches[i] do
  57.     local slotItemCount = turtle.getItemCount(matches[i][k])
  58.         if slotItemCount < perSlot then
  59.         --print(string.format("Slot %d has less than %d items", matches[i][k], perSlot))
  60.             for j = 1,#matches[i] do
  61.             if turtle.getItemCount(matches[i][j]) > perSlot then
  62.                 local requiredItems = perSlot - turtle.getItemCount(matches[i][k])
  63.                     if (turtle.getItemCount(matches[i][j]) - requiredItems) >= perSlot then
  64.                         turtle.select(matches[i][j])
  65.                         turtle.transferTo(matches[i][k], requiredItems)
  66.                     else
  67.                         for w=1,requiredItems do
  68.                             while turtle.getItemCount(matches[i][j]) > perSlot do
  69.                             turtle.select(matches[i][j])
  70.                             turtle.transferTo(matches[i][k], 1)
  71.                             end
  72.                         end
  73.                     end
  74.                 print(requiredItems)
  75.                 --print(string.format("Transferring %d items from %d to %d", requiredItems, matches[i][j], matches[i][k]))
  76.             end
  77.         end
  78.     end
  79. end
  80. itemCount = 0
  81. numItems = 0
  82. end
  83. for i=1,3 do
  84.     if turtle.getItemCount(i) < leastItems then
  85.     leastItems = turtle.getItemCount(i)
  86.     end
  87. end
  88. for i=5,7 do
  89.     if turtle.getItemCount(i) < leastItems then
  90.     leastItems = turtle.getItemCount(i)
  91.     end
  92. end
  93. for i=9,11 do
  94.     if turtle.getItemCount(i) < leastItems then
  95.     leastItems = turtle.getItemCount(i)
  96.     end
  97. end
  98. --print(string.format("Crafting %d items ..", (leastItems-1)))
  99. turtle.select(16)
  100. turtle.craft(leastItems-1)
  101. turtle.drop()
  102. print("Done!")
  103. leastItems = 64
  104. os.sleep(2)
  105. end
Add Comment
Please, Sign In to add comment