forked from minetest-mods/unified_inventory
67 lines
2.0 KiB
Lua
67 lines
2.0 KiB
Lua
|
|
||
|
unified_inventory.registered_group_items = {
|
||
|
mesecon_conductor_craftable = "mesecons:wire_00000000_off",
|
||
|
wool = "wool:white",
|
||
|
}
|
||
|
|
||
|
function unified_inventory.register_group_item(groupname, itemname)
|
||
|
unified_inventory.registered_group_items[groupname] = itemname
|
||
|
end
|
||
|
|
||
|
|
||
|
-- This is used when displaying craft recipes, where an ingredient is
|
||
|
-- specified by group rather than as a specific item. A single-item group
|
||
|
-- is represented by that item, with the single-item status signalled
|
||
|
-- in the "sole" field. If the group contains no items at all, the item
|
||
|
-- field will be nil.
|
||
|
--
|
||
|
-- Within a multiple-item group, we prefer to use an item that has the
|
||
|
-- same specific name as the group, and if there are more than one of
|
||
|
-- those items we prefer the one registered for the group by a mod.
|
||
|
-- Among equally-preferred items, we just pick the one with the
|
||
|
-- lexicographically earliest name.
|
||
|
|
||
|
function compute_group_item(group_name)
|
||
|
local candidate_items = {}
|
||
|
for itemname, itemdef in pairs(minetest.registered_items) do
|
||
|
if (itemdef.groups.not_in_creative_inventory or 0) == 0 and
|
||
|
(itemdef.groups[group_name] or 0) ~= 0 then
|
||
|
table.insert(candidate_items, itemname)
|
||
|
end
|
||
|
end
|
||
|
local num_candidates = #candidate_items
|
||
|
if num_candidates == 0 then
|
||
|
return {sole = true}
|
||
|
elseif num_candidates == 1 then
|
||
|
return {item = candidate_items[1], sole = true}
|
||
|
end
|
||
|
local bestitem = ""
|
||
|
local bestpref = 0
|
||
|
for _, item in ipairs(candidate_items) do
|
||
|
local pref
|
||
|
if item == unified_inventory.registered_group_items[group_name] then
|
||
|
pref = 3
|
||
|
elseif item:gsub("^[^:]+:", "") == group_name then
|
||
|
pref = 2
|
||
|
else
|
||
|
pref = 1
|
||
|
end
|
||
|
if pref > bestpref or (pref == bestpref and item < bestitem) then
|
||
|
bestitem = item
|
||
|
bestpref = pref
|
||
|
end
|
||
|
end
|
||
|
return {item = bestitem, sole = false}
|
||
|
end
|
||
|
|
||
|
|
||
|
local group_item_cache = {}
|
||
|
|
||
|
function unified_inventory.get_group_item(group_name)
|
||
|
if not group_item_cache[group_name] then
|
||
|
group_item_cache[group_name] = compute_group_item(group_name)
|
||
|
end
|
||
|
return group_item_cache[group_name]
|
||
|
end
|
||
|
|