AssortedBrunoz

ME system (bug fix later)

Sep 27th, 2024 (edited)
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.45 KB | None | 0 0
  1. -- ME SYSTEM BY NUNOTO
  2.  
  3. term.clear()
  4. local controller = peripheral.wrap("bottom")
  5. local output = peripheral.wrap("right")
  6. local item_queue = {}
  7.  
  8. local function reset()
  9.     term.clear()
  10.     term.setCursorPos(1,1)
  11. end
  12.  
  13. local function list()
  14.     local l = controller.list() --A TABLE WITH SLOT OBJECTS ({count = 64, name = "..."})
  15.  
  16.     --RETURNS A OPTIMIZED LIST
  17.     --[[
  18.     {
  19.         {
  20.         count = (total count of all drawers),
  21.         displayName = "Something"
  22.         name = "mod:something_lame"
  23.         slots = [1,2,5,3] (slots that drawers contain the item)
  24.         }
  25.     }
  26.     ]]
  27.     local optimized = {}
  28.     for slot, slot_obj in pairs(l) do
  29.         local details = controller.getItemDetail(slot)
  30.         --[[
  31.             count = _,
  32.             displayName = _,
  33.             itemGroups = _,
  34.             maxCount = _,
  35.             name = _
  36.         ]]
  37.         local found = false
  38.         for i_slot, i_slot_obj in pairs(optimized) do
  39.             if i_slot_obj.name == slot_obj.name then
  40.                 found = true
  41.                 i_slot_obj.count = slot_obj.count + details.count
  42.                 table.insert(i_slot_obj.slots, slot)
  43.             end
  44.         end
  45.         if not found then
  46.             table.insert(optimized,{
  47.                 count = details.count,
  48.                 displayName = details.displayName,
  49.                 name = details.name,
  50.                 slots = {slot}
  51.             })
  52.         end
  53.     end
  54.     return optimized
  55. end
  56. print("LOADING INVENTORY.... \nPLEASE WAIT....")
  57. local inventory = list()
  58.  
  59. local function special_unpack(s,e,tr)
  60.     local t = {}
  61.     for i = s, e, 1 do
  62.         table.insert(t, tr[i])
  63.     end
  64.     return t
  65. end
  66.  
  67. local function split(str, point)
  68.     return string.sub(str,1, string.find(str,point)-1), string.sub(str, string.find(str,point)+1)
  69. end
  70.  
  71.  
  72. local function pull(obj, amount)
  73.     local a = 0
  74.     local curr = 1
  75.     while a ~= amount do
  76.         a = a + controller.pushItems(peripheral.getName(output),obj.slots[curr],amount - a)
  77.         curr = curr + 1
  78.     end
  79. end
  80.  
  81. local function push(obj, amount)
  82.     for i = 1, #output.list(), 1 do
  83.         output.pushItems(peripheral.getName(controller),i)
  84.     end
  85. end
  86.  
  87. local function flush()
  88.     for i, v in pairs(controller.list()) do
  89.         if v.count <= 64 then
  90.             controller.pushItems(peripheral.getName(output),i)
  91.         end
  92.     end
  93.     reset()
  94.     write("ITEMS FLUSHED.")
  95.     os.sleep(5)
  96. end
  97.  
  98. local function deposit()
  99.     push()
  100.     reset()
  101.     write("ITEMS SUCCESSFULLY DEPOSITED.")
  102.     os.sleep(5)
  103. end
  104.  
  105. local function fracture(str)
  106.     local f = {}
  107.     for i in string.gmatch(str, "%a") do
  108.         table.insert( f,i )
  109.     end
  110.     return f
  111. end
  112.  
  113. local function closest_search(str)
  114.     local rating = {}
  115.     local fractured_target = fracture(string.lower(str))
  116.     for j, obj in pairs(inventory) do
  117.         local t = {slot = j, rating = 0}
  118.         for i, v in pairs(fracture(string.lower(obj.displayName))) do
  119.             if v == fractured_target[i] then
  120.                 t.rating = t.rating + 1
  121.             else
  122.                 t.rating = t.rating - 1
  123.             end
  124.         end
  125.         if t.rating > 0 then
  126.             table.insert( rating,t )
  127.         end
  128.     end
  129.     table.sort(rating, function(a,b)
  130.         return a.rating > b.rating
  131.     end)
  132.     if next(rating) == nil then
  133.         return nil
  134.     end
  135.  
  136.     return inventory[rating[1].slot]
  137. end
  138.  
  139. local function inclusive_search(str)
  140.  
  141.     local matches = {}
  142.  
  143.     for slot, obj in pairs(inventory) do
  144.         if string.find(string.lower(obj.displayName), string.lower(str)) then
  145.             table.insert( matches, obj )
  146.         end
  147.     end
  148.  
  149.     return matches
  150.  
  151. end
  152.  
  153. local function exact_search(str)
  154.     for opt_slot, slot_obj in pairs(inventory) do
  155.         if string.lower(slot_obj.displayName) == str then
  156.             return slot_obj
  157.         end
  158.     end
  159. end
  160.  
  161. local function withdraw(starting_mode)
  162.     reset()
  163.     term.setCursorPos(1,1)
  164.     local mode = starting_mode
  165.     local modes = {"CLOSEST","INCLUDES","EXACT"}
  166.  
  167.     write("INSERT ITEM NAME:\nCHANGE SEARCH MODE WITH <- or ->\nCURRENT MODE: "..modes[mode].."\nITEM: ")
  168.    
  169.     local function text_input()
  170.         local search = string.lower(read())
  171.         local obj = nil
  172.         if modes[mode] == "EXACT" then
  173.             obj = exact_search(search)
  174.         elseif modes[mode] == "INCLUDES" then
  175.             obj = inclusive_search(search)
  176.         elseif modes[mode] == "CLOSEST" then
  177.             obj = closest_search(search)
  178.         end
  179.  
  180.         if obj == nil then
  181.  
  182.             write("ITEM NOT FOUND.")
  183.             os.sleep(5)
  184.             withdraw(mode)
  185.             return
  186.  
  187.         elseif obj.name ~= nil then
  188.             --single answer
  189.             term.setCursorPos(1,4)
  190.             term.clearLine()
  191.  
  192.             write("ITEM FOUND: "..obj.displayName.."\nIS THIS THE CORRECT ITEM? (y/n)\n")
  193.  
  194.             local a = read()
  195.  
  196.             if a ~= "y" then
  197.                 return
  198.             end
  199.         else
  200.             if next(obj) == nil then
  201.                 write("NO ITEMS FOUND")
  202.                 os.sleep(2)
  203.                 withdraw(mode)
  204.                 return
  205.             end
  206.             if #obj == 9 then
  207.                 write("SEARCH TOO BROAD, PLEASE BE MORE PRECISE.")
  208.                 os.sleep(2)
  209.                 withdraw(mode)
  210.                 return
  211.             end
  212.             term.setCursorPos(1,1)
  213.             term.clearLine()
  214.  
  215.             write("SELECT ONE OF THE FOLLOWING ITEMS:")
  216.             term.setCursorPos(1,4)
  217.             --multiple options
  218.             for i, _obj in pairs(obj) do
  219.                 write((i)..". ".._obj.displayName.."\n")
  220.             end
  221.  
  222.             local chosen = tonumber(read())
  223.  
  224.             obj = obj[chosen]
  225.  
  226.             for i = 5, 14, 1 do
  227.                 term.setCursorPos(1,i)
  228.                 term.clearLine()
  229.             end
  230.         end
  231.  
  232.  
  233.         term.setCursorPos(1,1)
  234.         term.clearLine()
  235.  
  236.         write("INSERT DESIRED AMOUNT:")
  237.  
  238.         term.setCursorPos(1,5)
  239.         term.clearLine()
  240.         term.setCursorPos(1,4)
  241.         term.clearLine()
  242.  
  243.         write("ITEM: "..obj.displayName.."\nAVAILABLE AMOUNT: "..obj.count.."\nAMOUNT: ")
  244.  
  245.         local amount = tonumber(read())
  246.  
  247.         pull(obj, amount)
  248.     end
  249.     local function mode_switch()
  250.         while true do
  251.  
  252.             local event, key = os.pullEvent("key")
  253.             local p = #modes[mode]
  254.  
  255.             if key == keys.right then
  256.                 if mode + 1 > #modes then
  257.                     mode = 1
  258.                 else
  259.                     mode = mode + 1
  260.                 end
  261.             elseif key == keys.left then
  262.                 if mode - 1 == 0 then
  263.                     mode = #modes
  264.                 else
  265.                     mode = mode - 1
  266.                 end
  267.             end
  268.             local x,y = term.getCursorPos()
  269.  
  270.             term.setCursorPos(1,3)
  271.  
  272.             term.clearLine()
  273.  
  274.             write("CURRENT MODE: "..modes[mode])
  275.  
  276.             term.setCursorPos(x,y)
  277.         end
  278.     end
  279.  
  280.     parallel.waitForAny(text_input, mode_switch)
  281.  
  282. end
  283.  
  284. while true do
  285.     reset()
  286.     write("NSP CC INVENTORY SYSTEM\nO: ORDER ITEM\nI: INPUT ITEM\nF: FLUSH ITEMS\n")
  287.  
  288.     local key = read()
  289.  
  290.     --if key == keys.l then
  291.     --    open_page(1)
  292.     --end
  293.     if key == "o" then
  294.         withdraw(1)
  295.     elseif key == "i" then
  296.         deposit()
  297.     elseif key == "f" then
  298.         flush()
  299.     end
  300.     inventory = list()
  301. end
  302.  
Add Comment
Please, Sign In to add comment