From 004a39aaf771aa94bfbcdd0834d61134d49249c7 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 13 Jan 2024 10:40:25 +0100 Subject: [PATCH] Categories: Improve automatic ore categorization This function is now executed after registering all recipes within unified_inventory to properly register all item drops as ores. --- category.lua | 5 ++ default-categories.lua | 145 ++++++++++++++++++++--------------------- register.lua | 2 +- 3 files changed, 77 insertions(+), 75 deletions(-) diff --git a/category.lua b/category.lua index 46b3e02..f32a947 100644 --- a/category.lua +++ b/category.lua @@ -115,6 +115,11 @@ function unified_inventory.set_category_index(category_name, index) update_category_list() end function unified_inventory.add_category_item(category_name, item) + if type(item) ~= "string" then + minetest.log("warning", "[unified_inventory] Cannot register category item: " .. dump(item)) + return + end + ensure_category_exists(category_name) unified_inventory.registered_category_items[category_name][item] = true end diff --git a/default-categories.lua b/default-categories.lua index cf39200..1982527 100644 --- a/default-categories.lua +++ b/default-categories.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("unified_inventory") +local ui = unified_inventory unified_inventory.register_category('plants', { symbol = "flowers:tulip", @@ -25,74 +26,87 @@ unified_inventory.register_category('lighting', { label = S("Lighting") }) - -if unified_inventory.automatic_categorization then - minetest.register_on_mods_loaded(function() - - -- Add biome nodes to environment category - for _,def in pairs(minetest.registered_biomes) do - local env_nodes = { - def.node_riverbed, def.node_top, def.node_filler, def.node_dust, - } - for i,node in pairs(env_nodes) do - if node then - unified_inventory.add_category_item('environment', node) - end +local function register_automatic_categorization() + -- Add biome nodes to environment category + for _,def in pairs(minetest.registered_biomes) do + local env_nodes = { + def.node_riverbed, def.node_top, def.node_filler, def.node_dust, + } + for i,node in pairs(env_nodes) do + if node then + unified_inventory.add_category_item('environment', node) end end + end - -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment - for _,item in pairs(minetest.registered_ores) do - if item.ore_type == "scatter" then - -- The NodeResolver is run *after* minetest.register_on_mods_loaded, thus the - -- existence of ore names were yet not checked or enforced. - local def = minetest.registered_nodes[item.ore] or {} - local drop = def.drop - if drop and drop ~= "" then - unified_inventory.add_category_item('minerals', item.ore) - unified_inventory.add_category_item('minerals', drop) - else - unified_inventory.add_category_item('environment', item.ore) + -- Preparation for ore registration: find all possible drops (digging) + local possible_node_dig_drops = { + -- ["default:stone_with_coal"] = { "default:coal_lump", "mymod:raregem" } + -- Ores may be contained multiple times, depending on drop chances. + } + for itemname, recipes in pairs(ui.crafts_for.usage) do + for _, recipe in ipairs(recipes) do + if recipe.type == "digging" or recipe.type == "digging_chance" then + if not possible_node_dig_drops[itemname] then + possible_node_dig_drops[itemname] = {} end - else - unified_inventory.add_category_item('environment', item.ore) + local stack = ItemStack(recipe.output) + table.insert(possible_node_dig_drops[itemname], stack:get_name()) end end + end - -- Add items by item definition - for name, def in pairs(minetest.registered_items) do - local group = def.groups or {} - if not group.not_in_creative_inventory then - if group.stair or - group.slab or - group.wall or - group.fence then - unified_inventory.add_category_item('building', name) - elseif group.flora or - group.flower or - group.seed or - group.leaves or - group.sapling or - group.tree then - unified_inventory.add_category_item('plants', name) - elseif def.type == 'tool' then - unified_inventory.add_category_item('tools', name) - elseif def.liquidtype == 'source' then - unified_inventory.add_category_item('environment', name) - elseif def.light_source and def.light_source > 0 then - unified_inventory.add_category_item('lighting', name) - elseif group.door or - minetest.global_exists("doors") and ( - doors.registered_doors and doors.registered_doors[name..'_a'] or - doors.registered_trapdoors and doors.registered_trapdoors[name] - ) then - unified_inventory.add_category_item('building', name) - end + -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment + for _, odef in pairs(minetest.registered_ores) do + local drops = possible_node_dig_drops[odef.ore] + if drops and odef.ore_type == "scatter" then + ui.add_category_item('minerals', odef.ore) + -- Register all possible drops as "minerals" + ui.add_category_items('minerals', drops) + possible_node_dig_drops[odef.ore] = {} -- mask as handled + else + ui.add_category_item('environment', odef.ore) + end + end + + -- Add items by item definition + for name, def in pairs(minetest.registered_items) do + local group = def.groups or {} + if not group.not_in_creative_inventory then + if group.stair or + group.slab or + group.wall or + group.fence then + unified_inventory.add_category_item('building', name) + elseif group.flora or + group.flower or + group.seed or + group.leaves or + group.sapling or + group.tree then + unified_inventory.add_category_item('plants', name) + elseif def.type == 'tool' then + unified_inventory.add_category_item('tools', name) + elseif def.liquidtype == 'source' then + unified_inventory.add_category_item('environment', name) + elseif def.light_source and def.light_source > 0 then + unified_inventory.add_category_item('lighting', name) + elseif group.door or + minetest.global_exists("doors") and ( + doors.registered_doors and doors.registered_doors[name..'_a'] or + doors.registered_trapdoors and doors.registered_trapdoors[name] + ) then + unified_inventory.add_category_item('building', name) end end - end) + end end +if ui.automatic_categorization then + ui.register_on_initialized(register_automatic_categorization) +end + + -- [[ unified_inventory.add_category_items('plants', { "default:dry_grass_5", @@ -259,23 +273,6 @@ unified_inventory.add_category_items('minerals', { "default:coal_lump", "default:bronzeblock", "default:goldblock", - - "stairs:slab_bronzeblock", - "stairs:slab_copperblock", - "stairs:slab_steelblock", - "stairs:slab_tinblock", - "stairs:stair_bronzeblock", - "stairs:stair_copperblock", - "stairs:stair_inner_bronzeblock", - "stairs:stair_inner_copperblock", - "stairs:stair_inner_steelblock", - "stairs:stair_inner_tinblock", - "stairs:stair_outer_bronzeblock", - "stairs:stair_outer_copperblock", - "stairs:stair_outer_steelblock", - "stairs:stair_outer_tinblock", - "stairs:stair_steelblock", - "stairs:stair_tinblock", }) unified_inventory.add_category_items('building', { diff --git a/register.lua b/register.lua index 225a861..eedccb0 100644 --- a/register.lua +++ b/register.lua @@ -215,7 +215,7 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item) local group_name = name:sub(7) local group_item = ui.get_group_item(group_name) show_is_group = not group_item.sole - displayitem = group_item.item or "unknown" + displayitem = group_item.item or name selectitem = group_item.sole and displayitem or name end local label = show_is_group and "G" or ""