Advertisement
JohnDog3112

CC to Hex Loader

Jul 29th, 2022
1,062
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.43 KB | None | 0 0
  1. local scanChest = "minecraft:chest_1"
  2. local dropper = "botania:open_crate_2"
  3. local hopper = "minecraft:hopper_2"
  4. local clearCircle = "right"
  5. local loadCircle = "left"
  6. local hopperLock = "bottom"
  7.  
  8. local blockReader = peripheral.find("blockReader")
  9.  
  10. local nameToPattern = {
  11.     minds_reflection="qaq",
  12.     compass_purification="aa",
  13.     alidades_purification="wa",
  14.     archers_distilation="wqaawdd",
  15.     break_block="qaqqqqq",
  16.     architects_distilation="weddwaa",
  17.     additive_distilation="waaw",
  18.     conjure_light="qqd"
  19. }
  20.  
  21. local patternToName = {}
  22. for i,v in pairs(nameToPattern) do
  23.     patternToName[v] = i
  24. end
  25.  
  26. local letterToNum = {
  27. w = 0,
  28. q = 5,
  29. a = 4,
  30. e = 1,
  31. d = 2,
  32. }
  33. local numToLetter = {}
  34. for i,v in pairs(letterToNum) do
  35.     numToLetter[v] = i
  36. end
  37.  
  38. local tmpChests = peripheral.getNames()
  39. local chests = {}
  40. local emptySlots = {}
  41. local nbtToPattern = {}
  42.  
  43.  
  44. for i=1, #tmpChests do
  45.     if tmpChests[i] ~= scanChest and tmpChests[i] ~= dropper and tmpChests[i]:find("chest") then
  46.         table.insert(chests,peripheral.wrap(tmpChests[i]))
  47.     end
  48. end
  49.  
  50. local patternStorage = {}
  51. local function addPatternToStorage(chest, slot, item)
  52.     local pattern = nbtToPattern[item.nbt]
  53.     if not patternStorage[pattern] then
  54.         patternStorage[pattern] = {amount=1,variants={}}
  55.         patternStorage[pattern].variants[item.nbt] = {{chest,slot,item.count}}
  56.     else
  57.         if not patternStorage[pattern].variants[item.nbt] then
  58.             patternStorage[pattern].amount = patternStorage[pattern].amount + 1
  59.             patternStorage[pattern].variants[item.nbt] = {{chest,slot,item.count}}
  60.         else
  61.             table.insert(patternStorage[pattern].variants[item.nbt],{chest,slot,item.count})
  62.         end
  63.     end
  64. end
  65. local function isHexHolder(itemName)
  66.     return itemName == "hexcasting:slate" or itemName == "hexcasting:scroll_small" or itemName == "hexcasting:scroll_medium" or itemName == "hexcasting:scroll"
  67. end
  68. local function readScanChest()
  69.     local scan = blockReader.getBlockData().Items
  70.     local parsedScan = {}
  71.     local items = #scan
  72.     if not scan[0] then
  73.         items = -1
  74.     end
  75.     for i=0, items do
  76.         if isHexHolder(scan[i].id) and scan[i].tag then
  77.             local pattern = {}
  78.             if scan[i].tag.pattern then --scrolls
  79.                 pattern = scan[i].tag.pattern.angles
  80.             else --slates
  81.                 pattern = scan[i].tag.BlockEntityTag.pattern.angles
  82.             end
  83.             local parsedPattern = ""
  84.             for j=1, #pattern do
  85.                 parsedPattern = parsedPattern .. numToLetter[pattern[j]]
  86.             end
  87.             parsedScan[scan[i].Slot+1] = parsedPattern
  88.         end
  89.     end
  90.     return parsedScan
  91. end
  92. local function transferToStorage(chestName,slot)
  93.     local item = peripheral.call(chestName,"getItemDetail",slot)
  94.     local amount = item.count
  95.     if not isHexHolder(item.name) or not item.nbt then
  96.         local targetLocation = table.remove(emptySlots)
  97.         chests[targetLocation[1]].pullItems(chestName,slot,amount,targetLocation[2])
  98.         return 0
  99.     end
  100.     local pattern = nbtToPattern[item.nbt]
  101.     if not patternStorage[pattern] or not patternStorage[pattern].variants[item.nbt] then
  102.         local targetLocation = table.remove(emptySlots)
  103.         chests[targetLocation[1]].pullItems(chestName,slot,amount,targetLocation[2])
  104.         addPatternToStorage(targetLocation[1], targetLocation[2], item)
  105.         return 0
  106.     end
  107.     for i,v in pairs(patternStorage[pattern].variants[item.nbt])    do
  108.         if v[3] + item.count <= 64 then
  109.             v[3] = v[3] + item.count
  110.             chests[v[1]].pullItems(chestName,slot,amount,v[2])
  111.             return 0
  112.         end
  113.     end
  114.     --if the variant doesn't exist in storage yet
  115.     local targetLocation = table.remove(emptySlots)
  116.     chests[targetLocation[1]].pullItems(chestName,slot,amount,targetLocation[2])
  117.     addPatternToStorage(targetLocation[1], targetLocation[2], item)
  118. end
  119. local function transferFromStorage(chestName,slot,storageChestID,storageSlot, amount)
  120.     local storageChest = chests[storageChestID]
  121.     local item = storageChest.getItemDetail(storageSlot)
  122.     if not amount then
  123.         amount = item.count
  124.     end
  125.     storageChest.pushItems(chestName,storageSlot,amount,slot)
  126.     if not isHexHolder(item.name) or not item.nbt then
  127.         return 0
  128.     end
  129.    
  130.     local pattern = nbtToPattern[item.nbt]
  131.     if not pattern or not patternStorage[pattern] or not patternStorage[pattern].variants[item.nbt] then
  132.         return 0
  133.     end
  134.     local toRemove = -1
  135.     for i,v in pairs(patternStorage[pattern].variants[item.nbt]) do
  136.         if v[1] == storageChestID and v[2] == storageSlot then
  137.             v[3] = v[3] - item.count
  138.             if v[3] <= 0 then
  139.                 toRemove = i
  140.             end
  141.             break
  142.         end
  143.     end
  144.     if toRemove > 0 then
  145.         table.remove(patternStorage[pattern].variants[item.nbt],toRemove)
  146.         if #patternStorage[pattern].variants[item.nbt] == 0 then
  147.             patternStorage[pattern].variants[item.nbt] = nil
  148.             patternStorage[pattern].amount = patternStorage[pattern].amount - 1
  149.         end
  150.     end
  151. end
  152. function loadHexes(hexes)
  153.     local hexUses = {}
  154.     local parsedHex = {{}}
  155.     local numIter = 1
  156.     for i,v in pairs(hexes) do
  157.         if nameToPattern[v] then
  158.             local pattern = nameToPattern[v]
  159.             if not patternStorage[pattern] or patternStorage[pattern].amount == 0 then
  160.                 error("You don't have any: " .. v .. " hexes!")
  161.             end
  162.             if not hexUses[pattern] then
  163.                 hexUses[pattern] = 0
  164.             end
  165.             hexUses[pattern] = hexUses[pattern] + 1
  166.             if hexUses[pattern] <= patternStorage[pattern].amount then
  167.                 local curIter = 1
  168.                 for k,u in pairs(patternStorage[pattern].variants) do
  169.                     if curIter == hexUses[pattern] then
  170.                         table.insert(parsedHex[numIter],{pattern,k})
  171.                         break
  172.                     end
  173.                     curIter = curIter + 1
  174.                 end
  175.             else
  176.                 print("Adding iteration due to " .. v .. " being used more times than the number of variants stored (" .. (hexUses[pattern]) .. " times)")
  177.                 hexUses = {}
  178.                 hexUses[pattern] = 1
  179.                 numIter = numIter + 1
  180.                 parsedHex[numIter] = {}
  181.                 for k,u in pairs(patternStorage[pattern].variants) do
  182.                     parsedHex[numIter][1] = {pattern,k}
  183.                     break
  184.                 end
  185.             end
  186.         else
  187.             error("The pattern: " .. v .. " is not recognized!")
  188.         end
  189.     end
  190.     redstone.setOutput(clearCircle,false) -- ensure that it's off
  191.     sleep(.1)
  192.     redstone.setOutput(clearCircle,true)
  193.     sleep(.1)
  194.     redstone.setOutput(clearCircle,false)
  195.     sleep(3)
  196.     for i=1, #parsedHex do
  197.         redstone.setOutput(hopperLock,false)
  198.         sleep(.2)
  199.         local curIter = parsedHex[i]
  200.         for j=1, #curIter do
  201.             local item = patternStorage[curIter[j][1]].variants[curIter[j][2]][1]
  202.             chests[item[1]].pushItems(dropper,item[2],1,1)
  203.         end
  204.         redstone.setOutput(loadCircle,false) -- ensure that it's off
  205.         sleep(.1)
  206.         redstone.setOutput(loadCircle,true)
  207.         sleep(.1)
  208.         redstone.setOutput(loadCircle,false)
  209.         sleep(7)
  210.         redstone.setOutput(hopperLock,true)
  211.         sleep(.2)
  212.         local itemsInHopper = peripheral.call(hopper,"list")
  213.         while itemsInHopper[1] or itemsInHopper[2] or itemsInHopper[3] or itemsInHopper[4] or itemsInHopper[5] do
  214.             for i,v in pairs(itemsInHopper) do
  215.                 transferToStorage(hopper,i)
  216.             end
  217.             sleep(.5)
  218.             itemsInHopper = peripheral.call(hopper,"list")
  219.         end
  220.     end
  221.     redstone.setOutput(hopperLock,false)
  222.    
  223. end
  224. local patternsToScan = {}
  225. for i=1, #chests do
  226.     local size = chests[i].size()
  227.     local inv = chests[i].list()
  228.     for j=1, size do
  229.         if inv[j] then
  230.             if isHexHolder(inv[j].name) and inv[j].nbt then
  231.                 if nbtToPattern[inv[j].nbt] then
  232.                     addPatternToStorage(i,j,inv[j])
  233.                 else
  234.                     if not patternsToScan[inv[j].nbt] then
  235.                         patternsToScan[inv[j].nbt] = {amount=1,stacks={{i,j,inv[j].count}}}
  236.                     else
  237.                         table.insert(patternsToScan[inv[j].nbt].stacks,{i,j,inv[j].count})
  238.                     end
  239.                 end
  240.             end
  241.         else
  242.             table.insert(emptySlots,{i,j})
  243.         end
  244.     end
  245. end
  246.  
  247. local stuffInScanChest = peripheral.call(scanChest,"list")
  248. local scanChestSize = peripheral.call(scanChest,"size")
  249. local scanChestScan = readScanChest()
  250. for i, v in pairs(stuffInScanChest) do
  251.     if not isHexHolder(v.name) or not v.nbt then
  252.         transferToStorage(scanChest, i)
  253.     else
  254.         nbtToPattern[v.nbt] = scanChestScan[i]
  255.         if patternsToScan[v.nbt] then
  256.             for k,u in pairs(patternsToScan[v.nbt].stacks) do
  257.                 addPatternToStorage(u[1],u[2],chests[u[1]].getItemDetail(u[2]))
  258.             end
  259.             patternsToScan[v.nbt] = nil
  260.         end
  261.         transferToStorage(scanChest,i)
  262.     end
  263. end
  264.    
  265. for i,v in pairs(patternsToScan) do
  266.     chests[v.stacks[1][1]].pushItems(scanChest,v.stacks[1][2],1,1)
  267.     local scanChestScan = readScanChest()
  268.     nbtToPattern[i] = scanChestScan[1]
  269.     if not patternToName[scanChestScan[1]] then
  270.         print("unregistered pattern: " .. scanChestScan[1] .. " !")
  271.     end
  272.     chests[v.stacks[1][1]].pullItems(scanChest,1,1,v.stacks[1][2])
  273.     for k,u in pairs(v.stacks) do
  274.         addPatternToStorage(u[1],u[2],chests[u[1]].getItemDetail(u[2]))
  275.     end
  276. end
  277. patternsToScan = nil
  278.  
  279.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement