rhn

ItemSortStore backup

rhn
Apr 2nd, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.55 KB | None | 0 0
  1. ---------------------------------------------Definition---------------------------------------------------------------
  2. shutdown=false --initialization of shutdown parameter
  3.  
  4. ignorelist={"placeholder"}--not implemented
  5.  
  6. ---------------------------------------------First time user entry:---------------------------------------------------------------
  7. --Check if this is first time run, no saved choices on file
  8. if (fs.exists("choices") == false) then
  9.     while true do
  10.             print("Please input pastebin ID of modemlist")
  11.  
  12.             local answer = read()
  13.             if #answer~=8 then
  14.                 print("-Wrong answer, not correct length of pastebin ID-")
  15.             else
  16.                     pasteID=answer
  17.  
  18.                     break
  19.             end
  20.     end
  21. --Save choices to file for future rrstarts
  22. local file = fs.open("choices","w")
  23. file.writeLine("pasteID=".."\""..pasteID.."\"")
  24. file.close()
  25. end
  26.  
  27. -- Read choices from file
  28. os.loadAPI("choices")
  29. pasteID = choices.pasteID
  30. --print(pasteID)
  31.  
  32. --Load network modem IDs from pastebin file
  33. if (fs.exists("modemfile") == true) then
  34.     shell.run("delete","modemfile")
  35. end
  36. shell.run("pastebin","get",pasteID,"modemfile")--pasteID
  37. os.loadAPI("modemfile") -- Reads choices from file
  38. local storetype = modemfile.storetype --type of single item containers used for bulk storage
  39. local modemlist = modemfile.modemlist
  40. local storetypeRandom=modemfile.storetypeRandom --type of multi item containers used for random storage
  41. local modemlistRandom=modemfile.modemlistRandom
  42.  
  43. --Combine modemlist with full network name
  44. for i=1,#modemlist do
  45.     for j=1,#modemlist[1] do
  46.         modemlist[i][j]=storetype..tostring(modemlist[i][j])
  47.         --print(modemlist[i][j])
  48.     end
  49. end
  50. for i=1,#modemlistRandom do
  51.     for j=1,#modemlistRandom[1] do
  52.         modemlistRandom[i][j]=storetypeRandom..tostring(modemlistRandom[i][j])
  53.         --print(modemlistRandom[i][j])
  54.     end
  55. end
  56.  
  57. ---------------------------------------------Peripheral wrap---------------------------------------------------------------
  58. --List all networked peripherals
  59. local peripheralList = peripheral.getNames()
  60. --Initialize crate modem peripheral list
  61. local cratemodem={}
  62. for i=1,#modemlist do
  63.     cratemodem[i]={}
  64. end
  65. --wrap crate modems
  66. for i=1,#modemlist do
  67.     for j=1,#modemlist[1] do
  68.         for index = 1, #peripheralList do
  69.             if string.find(peripheralList[index], modemlist[i][j]) then --scan to see if names match
  70.                 cratemodem[i][j]=peripheral.wrap(peripheralList[index]) --wrap crate modems to array
  71.             end
  72.         end
  73.     end
  74. end
  75. --Initialize chest modem peripheral list
  76. local chestmodem={}
  77. for i=1,#modemlistRandom do
  78.     chestmodem[i]={}
  79. end
  80. --wrap chest modems
  81. --print(textutils.serialize(modemlistRandom))
  82.  
  83. for i=1,#modemlistRandom do
  84.     for j=1,#modemlistRandom[1] do
  85.         for index = 1, #peripheralList do
  86.             if peripheralList[index] == modemlistRandom[i][j] then --scan to see if names match
  87.                 chestmodem[i][j]=peripheral.wrap(peripheralList[index]) --wrap chest modems to array
  88.             end
  89.         end
  90.     end
  91. end
  92. --print(textutils.serialize(chestmodem))
  93.  
  94.  
  95.  
  96. ---------------------------------------------Functions---------------------------------------------------------------
  97. local function StorageScan() --Scan crates and build array of items
  98. -- Initialize item information tables
  99. local itemMapName={}
  100. local itemMapCount={}
  101. local itemMapDamage={}
  102. for i=1,#modemlist do
  103.     itemMapName[i]={}
  104.     itemMapCount[i]={}
  105.     itemMapDamage[i]={}
  106. end
  107. --Start scan
  108. for i=1,#cratemodem do
  109.     for j=1,#cratemodem[1] do
  110.         local iteminfo=cratemodem[i][j].list()
  111.         if  iteminfo[1]~= nil then
  112.             itemMapName[i][j]=iteminfo[1].name
  113.             itemMapCount[i][j]=iteminfo[1].count
  114.             itemMapDamage[i][j]=iteminfo[1].damage
  115.         else
  116.             itemMapName[i][j]="noitem"
  117.             itemMapCount[i][j]=0
  118.             itemMapDamage[i][j]=0
  119.         end
  120.         --print(i..","..j..": "..itemMapCount[i][j].." "..itemMapName[i][j].."/"..itemMapDamage[i][j])
  121.     end
  122. end
  123. return itemMapName,itemMapCount,itemMapDamage
  124. end
  125.  
  126.  
  127. local function StorageScanRandom()
  128. local itemMapNameRandom={}
  129. local itemMapCountRandom={}
  130. local itemMapDamageRandom={}
  131.  
  132. --Initialize "3d" tables
  133. for i=1,#modemlistRandom do
  134.         itemMapNameRandom[i]={}
  135.         itemMapCountRandom[i]={}
  136.         itemMapDamageRandom[i]={}
  137. end
  138. for i=1,#modemlistRandom do
  139.     for j=1,#modemlistRandom[1] do
  140.         itemMapNameRandom[i][j]={}
  141.         itemMapCountRandom[i][j]={}
  142.         itemMapDamageRandom[i][j]={}
  143.     end
  144. end
  145. --save name, count and damage for all items in random storage
  146. for i=1,#chestmodem do
  147.     for j=1,#chestmodem[1] do
  148.         chestlist=chestmodem[i][j].list()
  149.         for k=1,chestmodem[i][j].size() do
  150.             if  chestlist[k]~= nil then
  151.                 itemMapNameRandom[i][j][k]=chestlist[k].name
  152.                 itemMapCountRandom[i][j][k]=chestlist[k].count
  153.                 itemMapDamageRandom[i][j][k]=chestlist[k].damage
  154.             else
  155.                 itemMapNameRandom[i][j][k]="noitem"
  156.                 itemMapCountRandom[i][j][k]=0
  157.                 itemMapDamageRandom[i][j][k]=0
  158.             end
  159.         end
  160.     end
  161. end
  162. --print(textutils.serialize(itemMapNameRandom))
  163. return itemMapNameRandom,itemMapCountRandom,itemMapDamageRandom
  164. end --end function
  165.  
  166.  
  167. --Find first empty in crate
  168. local function findEmpty(itemMapName)
  169.     for j=1,#itemMapName[1] do
  170.         for i=1,#itemMapName do
  171.             if string.find(itemMapName[i][j], "noitem") then
  172.                 return i,j,true
  173.             end
  174.         end
  175.     end
  176.     return 0,0,false
  177. end
  178.  
  179.  
  180. --Find first empty in chest
  181. local function findEmptyRandom(itemMapNameRandom)
  182.     for j=1,#itemMapNameRandom[1] do
  183.         for i=1,#itemMapNameRandom do
  184.             for k=1,#itemMapNameRandom[1][1] do
  185.                 if string.find(itemMapNameRandom[i][j][k], "noitem") then
  186.                     return i,j,k,true
  187.                 end
  188.             end
  189.         end
  190.     end
  191.     return 0,0,0,false
  192. end
  193.  
  194.  
  195. ---------------------------------------------Rednet prep---------------------------------------------------------------
  196. --Rednet initialization
  197. rednet.open("right")
  198. --Find rednet IDs for crate turtles
  199. local IDs={}
  200. if rednet.lookup("ItemSortCrate") then
  201.     for i=1,#modemlist do
  202.         IDs[i]=rednet.lookup("ItemSortCrate","row"..i)
  203.         --print(IDs[i])
  204.     end
  205. else
  206.     print("No crate turtles found, shutting down!")
  207.     shutdown=true
  208. end
  209. --Find IDs for random turtles
  210. local Randomsearch={rednet.lookup("ItemSortRandom")}
  211. if Randomsearch~=nil then
  212.     IDsRandom={}
  213.     for i=1,#Randomsearch do
  214.         if rednet.lookup("ItemSortRandom","random"..i) then
  215.             IDsRandom[i]=Randomsearch[i]
  216.             print("Random turtle "..tostring(IDsRandom[i]).." found")
  217.         end
  218.     end
  219. else
  220. print("No random storage turtles found")
  221. end
  222.  
  223.  
  224. ---------------------------------------------Execution---------------------------------------------------------------
  225. if shutdown==false then
  226.     print("Starting sorting operation")
  227. end
  228.  
  229. -- Main loop
  230. while shutdown==false do
  231.  
  232. --print("Starting crate sort")
  233. --Scan network for items and build arrays of names and count
  234. itemMapName,itemMapCount,itemMapDamage = StorageScan()
  235.  
  236.  
  237. --Scan inputchest
  238. inputChest=peripheral.wrap("top")
  239. --print("Input chest contents:")
  240. local sortlist={}  -- Format: sortlist={{itemname,damage,count},{itemname,damage,count},...}
  241. local sortlistRandom={}
  242. local sortcounter=1
  243. local sortcounterRandom=1
  244. for i=1,inputChest.size() do
  245.     inputItem=inputChest.getItemMeta(i)
  246.     if  inputItem~= nil then
  247.         if inputItem.maxCount==1 then
  248.             --print("Item: "..inputItem.name.."/"..inputItem.damage.." does not stack")
  249.             sortlistRandom[sortcounterRandom]={inputItem.name,inputItem.damage,1,1}
  250.             sortcounterRandom=sortcounterRandom+1
  251.         else
  252.             --print(inputItem.name.."/"..inputItem.damage)
  253.             sortlist[sortcounter]={inputItem.name,inputItem.damage,inputItem.count,inputItem.maxCount}
  254.             sortcounter=sortcounter+1
  255.         end
  256.     end
  257. end
  258.  
  259. --Initialize sendlist
  260. sendlist={}
  261. for i=1,#modemlist do -------
  262.     sendlist[i]={}
  263. end
  264.  
  265. --Compare input chest with crates and add to sendlist if match is found
  266. sortfound={}
  267. for k=1,#sortlist do
  268.     sortfound[k]=false
  269. end
  270. for i=1,#itemMapName do
  271.     for j=1,#itemMapName[1] do
  272.         for index = 1, #sortlist do
  273.             if string.find(itemMapName[i][j], sortlist[index][1]) and string.find(itemMapDamage[i][j], sortlist[index][2]) then
  274.                 if #sendlist[i]==nil then --Check if first entry in sendlist
  275.                     sendlist[i][1]={sortlist[index][1],sortlist[index][2],j}--Send itemname/damage/position j to turtle in row i
  276.                 else
  277.                     sendlist[i][#sendlist[i]+1]={sortlist[index][1],sortlist[index][2],j}
  278.                 end
  279.                 print("Sort "..sortlist[index][1].."/"..sortlist[index][2].." @ "..i..","..j)
  280.                 sortfound[index]=true
  281.             end
  282.         end
  283.     end
  284. end
  285.  
  286. --If no existing crate was found for item, assign new crate
  287. for k=1,#sortlist do
  288.     if sortfound[k]==false then
  289.         ie,je,freecrate=findEmpty(itemMapName)
  290.         if freecrate==true then
  291.             sendlist[ie][#sendlist[ie]+1]={sortlist[k][1],sortlist[k][2],je}
  292.             itemMapName[ie][je]="reserved"
  293.             print("Sort "..sortlist[k][1].."/"..sortlist[k][2].." to empty crate @ "..ie..","..je)
  294.         else
  295.             print("No available empty crates, sending "..sortlist[k][1].."/"..sortlist[k][2].." to random storage!")
  296.             sortlistRandom[sortcounterRandom]={sortlist[k][1],sortlist[k][2],sortlist[k][3],sortlist[k][4]}
  297.             sortcounterRandom=sortcounterRandom+1
  298.         end
  299.     end
  300. end
  301. --print(textutils.serialize(sortlistRandom)) --Prints list of items to be sorted to random storage
  302.  
  303. --Send sorting instructions for crates to turtles:
  304. for i=1,#sendlist do
  305.     rednet.send(IDs[i],sendlist[i])
  306. end
  307. --print("Ending crate sort")
  308.  
  309. if #sortlistRandom>0 then
  310. --print("Starting chest sort")
  311. --local x = os.clock()
  312. --Build sendlistRandom for random storage
  313. itemMapNameRandom,itemMapCountRandom,itemMapDamageRandom = StorageScanRandom()
  314. --print(textutils.serialize(itemMapNameRandom))
  315. --Initialize sendlistRandom
  316. sendlistRandom={}
  317. --Find chest and slot for random storage items
  318. for s = 1, #sortlistRandom do
  319.     local sortfoundrandom=false
  320.     if sortlistRandom[s][4]>1 then
  321.         for i=1,#itemMapNameRandom do
  322.             for j=1,#itemMapNameRandom[1] do
  323.                 for k=1,#itemMapNameRandom[1][1] do
  324.                     --if partly full stack exists
  325.                     if string.find(itemMapNameRandom[i][j][k], sortlistRandom[s][1])
  326.                                                 and string.find(itemMapDamageRandom[i][j][k], sortlistRandom[s][2])
  327.                                                             and itemMapCountRandom[i][j][k]<sortlistRandom[s][4] then
  328.                         if sortlistRandom[s][3] <= sortlistRandom[s][4]-itemMapCountRandom[i][j][k] then --Input count < free space
  329.                             sendAmount=sortlistRandom[s][3]
  330.                         else
  331.                             sendAmount=sortlistRandom[s][4]-itemMapCountRandom[i][j][k]--Input count > free space
  332.                         end
  333.                         itemMapCountRandom[i][j][k]=itemMapCountRandom[i][j][k]+sendAmount --Update scanned amount to new count
  334.                         if #sendlistRandom==nil then --Check if first entry in sendlist
  335.                             --name,damage,amount,i,j
  336.                             sendlistRandom[1]={sortlistRandom[s][1],sortlistRandom[s][2],sendAmount,i,j,k}
  337.                         else
  338.                             sendlistRandom[#sendlistRandom+1]={sortlistRandom[s][1],sortlistRandom[s][2],sendAmount,i,j,k}
  339.                         end
  340.                         sortfoundrandom=true
  341.                         break
  342.                     end-----
  343.                 end
  344.                 if sortfoundrandom then break end
  345.             end
  346.             if sortfoundrandom then break end
  347.         end
  348.         if sortfoundrandom==false then
  349.             ie,je,ke,freechest=findEmptyRandom(itemMapNameRandom)
  350.             if freechest==true then
  351.                 print("Send "..sortlistRandom[s][1].."/"..sortlistRandom[s][2].." to empty slot in chest")
  352.                 if #sendlistRandom==nil then --Check if first entry in sendlist
  353.                     sendlistRandom[1]={sortlistRandom[s][1],sortlistRandom[s][2],sortlistRandom[s][3],ie,je,ke}
  354.                 else
  355.                     sendlistRandom[#sendlistRandom+1]={sortlistRandom[s][1],sortlistRandom[s][2],sortlistRandom[s][3],ie,je,ke}
  356.                 end
  357.                 itemMapNameRandom[ie][je][ke]="reserved"
  358.             else
  359.                 print("Warning: No available storage for "..sortlistRandom[s][1].."/"..sortlistRandom[s][2].." found!")
  360.             end
  361.         end
  362.     else --Item doesn't stack, send to empty slot
  363.         ie,je,ke,freechest=findEmptyRandom(itemMapNameRandom)
  364.         if freechest==true then
  365.             print("Send "..sortlistRandom[s][1].."/"..sortlistRandom[s][2].." to empty slot in chest")
  366.             if #sendlistRandom==nil then --Check if first entry in sendlist
  367.                 sendlistRandom[1]={sortlistRandom[s][1],sortlistRandom[s][2],sortlistRandom[s][3],ie,je,ke}
  368.             else
  369.                 sendlistRandom[#sendlistRandom+1]={sortlistRandom[s][1],sortlistRandom[s][2],sortlistRandom[s][3],ie,je,ke}
  370.             end
  371.             itemMapNameRandom[ie][je][ke]="reserved"
  372.         else
  373.             print("Warning: No available storage for "..sortlistRandom[s][1].."/"..sortlistRandom[s][2].." found!")
  374.         end
  375.     end
  376. end
  377. --local xs=os.clock() - x
  378. --print("Ending chest sort. Elapsed time: "..xs)
  379. end
  380.  
  381. --Send sorting instructions to random storage turtles:
  382. if Randomsearch~=nil and sendlistRandom~=nil then
  383.     --print(textutils.serialize(sendlistRandom))
  384.     rednet.send(IDsRandom[1],sendlistRandom)
  385.     sendlistRandom=nil
  386. end
  387.  
  388. sleep(#modemlist[1]*2+3)
  389. end --end main loop
Add Comment
Please, Sign In to add comment