From 3074d625e2797765d72cc2456384f78212937168 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 26 Feb 2022 11:36:56 +0100 Subject: [PATCH] Version 4: Feature checks and deprecate internal functions --- callbacks.lua | 17 +++++++--------- group.lua | 41 -------------------------------------- init.lua | 9 ++++++++- internal.lua | 10 ++++++++++ legacy.lua | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 52 deletions(-) create mode 100644 legacy.lua diff --git a/callbacks.lua b/callbacks.lua index af2c127..e92175d 100644 --- a/callbacks.lua +++ b/callbacks.lua @@ -14,9 +14,9 @@ end minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() unified_inventory.players[player_name] = {} - unified_inventory.current_index[player_name] = 1 + unified_inventory.current_index[player_name] = 1 -- Item (~page) index unified_inventory.filtered_items_list[player_name] = - unified_inventory.items_list + unified_inventory.items_list unified_inventory.activefilter[player_name] = "" unified_inventory.active_search_direction[player_name] = "nochange" unified_inventory.apply_filter(player, "", "nochange") @@ -244,11 +244,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.current_page[player_name]) end) -if minetest.delete_detached_inventory then - minetest.register_on_leaveplayer(function(player) - local player_name = player:get_player_name() - minetest.delete_detached_inventory(player_name.."_bags") - minetest.delete_detached_inventory(player_name.."craftrecipe") - minetest.delete_detached_inventory(player_name.."refill") - end) -end +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + minetest.remove_detached_inventory(player_name.."_bags") + minetest.remove_detached_inventory(player_name.."refill") +end) diff --git a/group.lua b/group.lua index 3864267..2bc8e2f 100644 --- a/group.lua +++ b/group.lua @@ -1,30 +1,5 @@ local S = minetest.get_translator("unified_inventory") -function unified_inventory.canonical_item_spec_matcher(spec) - local specname = ItemStack(spec):get_name() - if specname:sub(1, 6) ~= "group:" then - return function (itemname) - return itemname == specname - end - end - - local group_names = specname:sub(7):split(",") - return function (itemname) - local itemdef = minetest.registered_items[itemname] - for _, group_name in ipairs(group_names) do - if (itemdef.groups[group_name] or 0) == 0 then - return false - end - end - return true - end -end - -function unified_inventory.item_matches_spec(item, spec) - local itemname = ItemStack(item):get_name() - return unified_inventory.canonical_item_spec_matcher(spec)(itemname) -end - function unified_inventory.extract_groupnames(groupname) local specname = ItemStack(groupname):get_name() if specname:sub(1, 6) ~= "group:" then @@ -34,22 +9,6 @@ function unified_inventory.extract_groupnames(groupname) return table.concat(group_names, S(" and ")), #group_names end -unified_inventory.registered_group_items = { - mesecon_conductor_craftable = "mesecons:wire_00000000_off", - stone = "default:cobble", - wood = "default:wood", - book = "default:book", - sand = "default:sand", - leaves = "default:leaves", - tree = "default:tree", - vessel = "vessels:glass_bottle", - 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 diff --git a/init.lua b/init.lua index 98ee2e5..38cc8cb 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,11 @@ -- Unified Inventory +if not minetest.features.formspec_version_element then + -- At least formspec_version[] is the minimal feature requirement + error("Unified Inventory requires Minetest version 5.4.0 or newer.\n" .. + " Please update Minetest or use an older version of Unified Inventory.") +end + local modpath = minetest.get_modpath(minetest.get_current_modname()) local worldpath = minetest.get_worldpath() @@ -46,7 +52,7 @@ unified_inventory = { list_img_offset = 0.13, standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", - version = 3 + version = 4 } local ui = unified_inventory @@ -170,3 +176,4 @@ end dofile(modpath.."/item_names.lua") dofile(modpath.."/waypoints.lua") +dofile(modpath.."/legacy.lua") -- mod compatibility diff --git a/internal.lua b/internal.lua index b49906e..c43bd32 100644 --- a/internal.lua +++ b/internal.lua @@ -378,3 +378,13 @@ function ui.apply_filter(player, filter, search_dir) ui.active_search_direction[player_name] = search_dir ui.set_inventory_formspec(player, ui.current_page[player_name]) end + +-- Inform players about potential visual issues +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local info = minetest.get_player_information(player_name) + if info and (info.formspec_version or 0) < 4 then + minetest.chat_send_player(player_name, S("Unified Inventory: Your game version is too old" + .. " and does not support the GUI requirements. You might experience visual issues.")) + end +end) diff --git a/legacy.lua b/legacy.lua new file mode 100644 index 0000000..5b62894 --- /dev/null +++ b/legacy.lua @@ -0,0 +1,55 @@ +-- Inefficient pattern matching + +local warned_funcs = {} +local function LOG_ONCE(funcname) + if warned_funcs[funcname] then return end + warned_funcs[funcname] = true + minetest.log("error", "Call to undocumented, deprecated API '" .. funcname .. "'." + .. " In a future version of Unified Inventory this will result in a real error.") +end + +function unified_inventory.canonical_item_spec_matcher(spec) + LOG_ONCE("canonical_item_spec_matcher") + local specname = ItemStack(spec):get_name() + if specname:sub(1, 6) ~= "group:" then + return function (itemname) + return itemname == specname + end + end + + local group_names = specname:sub(7):split(",") + return function (itemname) + local itemdef = minetest.registered_items[itemname] + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + return false + end + end + return true + end +end + +function unified_inventory.item_matches_spec(item, spec) + LOG_ONCE("item_matches_spec") + local itemname = ItemStack(item):get_name() + return unified_inventory.canonical_item_spec_matcher(spec)(itemname) +end + + +unified_inventory.registered_group_items = { + mesecon_conductor_craftable = "mesecons:wire_00000000_off", + stone = "default:cobble", + wood = "default:wood", + book = "default:book", + sand = "default:sand", + leaves = "default:leaves", + tree = "default:tree", + vessel = "vessels:glass_bottle", + wool = "wool:white", +} + +function unified_inventory.register_group_item(groupname, itemname) + LOG_ONCE("register_group_item") + unified_inventory.registered_group_items[groupname] = itemname +end +