Advertisement
AssortedBrunoz

ME system v.1.3

Oct 11th, 2024 (edited)
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.20 KB | None | 0 0
  1. -- SMART INVENTORY SYSTEM BY ORION.
  2. -- @the_orion.5
  3.  
  4. -- in craft OS emulation, dont forget to attach the emulated inventories, here's the commands:
  5. -- attach top chest
  6. -- attach right chest
  7. -- attach bottom chest
  8. local BAPI = require("button_api")
  9. local main = BAPI.Desktop()
  10. local style = BAPI.Style
  11. local position = BAPI.Position
  12. local version = "v1.2"
  13. local width, height = term.getSize()
  14. if not fs.exists("list.json") then local a = fs.open("list.json","w") a.write("{}") a.close() end
  15. local item_knowledge_json = fs.open("list.json", "r")
  16. local item_knowledge = textutils.unserialiseJSON(item_knowledge_json.readAll())
  17. item_knowledge_json.close()
  18.  
  19. local controller = peripheral.find("storagedrawers:controller") or peripheral.wrap("bottom")
  20. local vault = peripheral.find("create:item_vault") or peripheral.find("create_connected:item_silo") or peripheral.wrap("top")
  21. local io_chest = peripheral.wrap("right")
  22. -- tools
  23.  
  24. local function reset()
  25.     term.setTextColour(colors.white)
  26.     paintutils.drawFilledBox(1,1,width,height, colors.black)
  27.     term.clear()
  28.     term.setCursorPos(1,1)
  29. end
  30.  
  31. local function timer()
  32.     os.sleep(300)
  33.     reset()
  34.     write("TIMED OUT.")
  35. end
  36.  
  37. local function fracture(str)
  38.     local f = {}
  39.     for i in string.gmatch(str, "%a") do
  40.         table.insert( f,i )
  41.     end
  42.     return f
  43. end
  44.  
  45. local function synth()
  46.     local function grab_unique(inventory)
  47.         for slot, slot_obj in pairs(inventory.list()) do
  48.             if slot_obj and not item_knowledge[slot_obj.name] then
  49.                 item_knowledge[slot_obj.name] = inventory.getItemDetail(slot).displayName
  50.             end
  51.         end
  52.     end
  53.  
  54.     grab_unique(vault)
  55.     grab_unique(controller)
  56.    
  57.     local t = fs.open("list.json", "w")
  58.     t.write(textutils.serialiseJSON(item_knowledge))
  59.     t.close()
  60. end
  61.  
  62. local function pull(item, amount)
  63.     local increase = 0
  64.     local prev = amount
  65.     while amount > 0 and prev ~= 0 do
  66.         prev = amount
  67.         for slot, slot_obj in pairs(controller.list()) do
  68.             if amount <= 0 then
  69.                 return
  70.             end
  71.             if slot_obj.name == item then
  72.                 amount = amount - controller.pushItems(peripheral.getName(io_chest), slot, amount)
  73.             end
  74.         end
  75.         for slot, slot_obj in pairs(vault.list()) do
  76.             if amount <= 0 then
  77.                 return
  78.             end
  79.             if slot_obj.name == item then
  80.                 amount = amount - vault.pushItems(peripheral.getName(io_chest), slot, amount)
  81.             end
  82.         end
  83.         prev = prev - amount
  84.     end
  85. end
  86.  
  87. local search_modes = {
  88.     {
  89.         name = "CLOSEST",
  90.         exec = function(str)
  91.             str = fracture(string.lower(str))
  92.             local scores = {}
  93.             for name, displayName in pairs(item_knowledge) do
  94.                 local score = 0
  95.                 for pointer, character in pairs(fracture(string.lower(displayName))) do
  96.                     if str[pointer] == character then
  97.                         score = score + 1
  98.                     else
  99.                         score = score - 1
  100.                     end
  101.                 end
  102.                 table.insert(scores,{
  103.                         name = name,
  104.                         displayName = displayName,
  105.                         score = score
  106.                     })
  107.             end
  108.             table.sort(scores,function(a,b)
  109.                 return a.score > b.score
  110.             end)
  111.             return scores[1].name, scores[1].displayName
  112.         end
  113.     },
  114.     {
  115.         name = "INCLUDES",
  116.         exec = function(str)
  117.             local found = {}
  118.             for name, displayName in pairs(item_knowledge) do
  119.                 if string.find(string.lower(displayName), string.lower(str)) then
  120.                     table.insert(found, {name = name, displayName = displayName})
  121.                 end
  122.             end
  123.             local mx,my = term.getSize()
  124.             local x, y = term.getCursorPos()
  125.             local oy = y
  126.             for i, v in pairs(found) do
  127.                 write(i..". "..v.displayName.."\n")
  128.                 y = y + 1
  129.                 if y == my-1 then
  130.                     write("PRESS ANY TO CONTINUE")
  131.                     os.pullEvent("key")
  132.                     for j = oy, my, 1 do
  133.                         term.setCursorPos(1,j)
  134.                         term.clearLine()
  135.                     end
  136.                     term.setCursorPos(1,oy)
  137.                 end
  138.             end
  139.             term.setCursorPos(1,3)
  140.             write("INSERT NUMBER: ")
  141.             local r = read()
  142.             if string.lower(r) == "exit" then
  143.                 return "SPECIAL_END", nil
  144.             end
  145.             local selection = tonumber(r)
  146.  
  147.             if selection then
  148.                 for j = oy, my, 1 do
  149.                     term.setCursorPos(1,j)
  150.                     term.clearLine()
  151.                 end
  152.                 term.setCursorPos(1,oy)
  153.                 return found[selection].name, found[selection].displayName
  154.             else
  155.                 return nil
  156.             end
  157.         end
  158.     },
  159.     {
  160.         name = "EXACT",
  161.         exec = function(str)
  162.             for name, displayName in pairs(item_knowledge) do
  163.                 if string.lower(str) == string.lower(displayName) then
  164.                     return name, displayName
  165.                 end
  166.             end
  167.             return nil
  168.         end
  169.     }
  170. }
  171.  
  172. local operations = {
  173.     {
  174.         name = "ORGANIZE INVENTORY",
  175.         color = colors.yellow,
  176.         exec = function()
  177.             reset()
  178.             write("ORGANIZING\n")
  179.  
  180.             local function organize(inventory, to)
  181.                 for slot, slot_obj in pairs(inventory) do
  182.                     write("[ "..slot.."/"..#inventory.." ]")
  183.                     local _,y = term.getCursorPos()
  184.                     term.setCursorPos(1,y)
  185.  
  186.                     if slot_obj.count < 64 then
  187.                         pcall(controller.pushItems, to, slot)
  188.                     else
  189.                         pcall(vault.pushItems, to,slot)
  190.                     end
  191.                 end
  192.             end
  193.             organize(controller.list(), peripheral.getName(vault))
  194.             write("\n")
  195.             organize(vault.list(), peripheral.getName(controller))
  196.             write("\nORGANIZATION COMPLETE")
  197.             os.sleep(5)
  198.         end
  199.     },
  200.     {
  201.         name = "WITHDRAW ITEMS  ",
  202.         color = colors.orange,
  203.         exec = function()
  204.             reset()
  205.             local mode = 2
  206.             write("INSERT ITEM SEARCH\nCURRENT MODE: "..search_modes[mode].name.."\n")
  207.             local x = false
  208.             local search;
  209.            
  210.             local function m()
  211.                 local r = read()
  212.                 if string.lower(r) == "exit" then
  213.                     x = true
  214.                     return
  215.                 end
  216.                 search, search_display = search_modes[mode].exec(r)
  217.                 if search == "SPECIAL_END" then
  218.                     x = true
  219.                 end
  220.                
  221.                 if not search then
  222.                     write("ITEM NOT FOUND")
  223.                     os.sleep(2)
  224.                     reset()
  225.                     write("INSERT ITEM SEARCH\nCURRENT MODE: "..search_modes[mode].name.."\n")
  226.                     m()
  227.                     return
  228.                 end
  229.             end
  230.             local function s()
  231.                 local x,y = term.getCursorPos()
  232.  
  233.                 local _, key = os.pullEvent("key")
  234.  
  235.                 if key == keys.right then
  236.                     mode = mode+1>#search_modes and 1 or mode+1
  237.                 elseif key == keys.left then
  238.                     mode = mode-1<1 and #search_modes or mode-1
  239.                 end
  240.                 term.setCursorPos(1,2)
  241.                 term.clearLine()
  242.                 write("CURRENT MODE: "..search_modes[mode].name.."\n")
  243.  
  244.                 term.setCursorPos(x,y)
  245.                 s()
  246.             end
  247.  
  248.             parallel.waitForAny(m,s)
  249.             if x then
  250.                 return
  251.             end
  252.             term.setCursorPos(1,1)
  253.             term.clearLine()
  254.             write("INSERT AMOUNT")
  255.             local amount
  256.             term.setCursorPos(1,3)
  257.             term.clearLine()
  258.             write("ITEM: "..search_display.."\n")
  259.             local count = 0
  260.             local function c(inventory)
  261.                 for slot, slot_obj in pairs(inventory) do
  262.                     if slot_obj.name == search then
  263.                         count = count + slot_obj.count
  264.                     end
  265.                 end
  266.             end
  267.             c(controller.list())
  268.             c(vault.list())
  269.             write("AVAILABLE: "..count.."\n")
  270.             local function get_amount()
  271.                
  272.                 r = read()
  273.                 if string.lower(r) == "exit" then
  274.                     return
  275.                 end
  276.                 amount = tonumber(r)
  277.                
  278.                 if amount == nil then
  279.                     --try to get a calculation
  280.                     local func, err = load("return "..r)
  281.                     amount = func()
  282.  
  283.                     if not amount then
  284.                         term.setCursorPos(1,5)
  285.                         write("INVALID NUMBER/EQUATION")
  286.                         os.sleep(2)
  287.                         term.clearLine()
  288.                         get_amount()
  289.                         return
  290.                     end
  291.                    
  292.                 end
  293.  
  294.             end
  295.  
  296.             get_amount()
  297.  
  298.             if search and amount then
  299.                 pull(search, amount)
  300.                 write("ITEMS WITHDRAWN.")
  301.                 os.sleep(2)
  302.             end
  303.         end
  304.     },
  305.     {
  306.         name = "DEPOSIT ITEMS ",
  307.         color = colors.red,
  308.         exec = function()
  309.             reset()
  310.             term.setTextColor(colors.red)
  311.             write("ALL ITEMS IN THE CHEST SHALL BE DEPOSITED, CONTINUE?\n(Y/N)\n")
  312.             local function confirm()
  313.                 local _, key = os.pullEvent("key")
  314.  
  315.                 if key == keys.y then
  316.                     local inventory = io_chest.list()
  317.                     for slot, _ in pairs(inventory) do
  318.                         write("[ "..slot.."/"..#inventory.." ]")
  319.                         local _,y = term.getCursorPos()
  320.                         term.setCursorPos(1,y)
  321.  
  322.                         io_chest.pushItems(peripheral.getName(vault), slot)
  323.                     end
  324.                     write("\nDEPOSIT COMPLETE")
  325.                     synth()
  326.                 elseif key == keys.n then
  327.                     return
  328.                 else
  329.                     confirm()
  330.                 end
  331.             end
  332.             confirm()
  333.         end
  334.     }
  335. }
  336.  
  337. -- execute
  338.  
  339. local function main_loop()
  340.  
  341.     reset()
  342.     write("          NSP SMART INVENTORY BY NUNOTO")
  343.  
  344.     local ops = {}
  345.  
  346.     for i, obj in pairs(operations) do
  347.         local s = style(obj.color)
  348.         s.text = obj.name
  349.         s.textColor = colors.white
  350.  
  351.         local p = position(width+1, height, "left", "", obj.name,1,1)
  352.         p.s_y = (i) * 4
  353.         p.e_y = (i) * 4 + 2
  354.  
  355.         main.addButton(p,s,obj.exec)
  356.     end
  357.    
  358.     main:awaitButtonClick()
  359.    
  360.     main_loop()
  361. end
  362.  
  363. item_knowledge = {}
  364. synth()
  365. main_loop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement