diff --git a/api.lua b/api.lua index 8cc5532..b9449f1 100644 --- a/api.lua +++ b/api.lua @@ -43,7 +43,7 @@ minetest.after(0.01, function() end table.sort(ui.items_list) ui.items_list_size = #ui.items_list - print("Unified Inventory. inventory size: "..ui.items_list_size) + print("Unified Inventory. Inventory size: "..ui.items_list_size) for _, name in ipairs(ui.items_list) do local def = minetest.registered_items[name] -- Simple drops @@ -133,16 +133,53 @@ minetest.after(0.01, function() end end end + + -- Test_User refactoring to increase server boot speed, on server with 57k+ nodes was 9 mins load time, now only ~1 seconds. + + local spec_matcher = {} + for _, name in ipairs(ui.items_list) do + for group, value in pairs(minetest.registered_items[name].groups) do -- we only need to care about groups, exact items are handled separately + if value and value ~= 0 then + if not spec_matcher[group] then spec_matcher[group] = {} end + spec_matcher[group][name] = true + end + end + end + for _, recipes in pairs(ui.crafts_for.recipe) do for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) do - local matches_spec = ui.canonical_item_spec_matcher(spec) - for _, name in ipairs(ui.items_list) do - if matches_spec(name) then + + local specname = ItemStack(spec):get_name() + if specname:sub(1,6) == "group:" then + local accepted = {} + local firstgroup = true -- needed for initial group setup + for _, group in ipairs(specname:sub(7):split(",")) do + if firstgroup then -- needed to setup initial value + if spec_matcher[group] then + for name, _ in pairs(spec_matcher[group]) do + accepted[name] = true + end + end + firstgroup = false + else + if spec_matcher[group] then + for name, _ in pairs(accepted) do + accepted[name] = spec_matcher[group][name] + end + else + accepted = {} + end + end + end + for name, _ in pairs(accepted) do ingredient_items[name] = true end + else + ingredient_items[specname] = true end + end for name, _ in pairs(ingredient_items) do if ui.crafts_for.usage[name] == nil then @@ -153,6 +190,26 @@ minetest.after(0.01, function() end end + -- for _, recipes in pairs(ui.crafts_for.recipe) do + -- for _, recipe in ipairs(recipes) do + -- local ingredient_items = {} + -- for _, spec in pairs(recipe.items) do + -- local matches_spec = ui.canonical_item_spec_matcher(spec) + -- for _, name in ipairs(ui.items_list) do + -- if matches_spec(name) then + -- ingredient_items[name] = true + -- end + -- end + -- end + -- for name, _ in pairs(ingredient_items) do + -- if ui.crafts_for.usage[name] == nil then + -- ui.crafts_for.usage[name] = {} + -- end + -- table.insert(ui.crafts_for.usage[name], recipe) + -- end + -- end + -- end + for _, callback in ipairs(ui.initialized_callbacks) do callback() end