From 04b1cb9e7d748b4a2366ce321ac5a9f76e250a57 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Fri, 2 Aug 2019 16:39:43 +0200 Subject: [PATCH] Fix error on invalid item_button_ fields Also reduce the player inventory sending by one. If a formspec is sent, it'll also take the newest known search text --- callbacks.lua | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/callbacks.lua b/callbacks.lua index e6ea3e7..8bfe6b6 100644 --- a/callbacks.lua +++ b/callbacks.lua @@ -47,6 +47,15 @@ minetest.register_on_joinplayer(function(player) refill:set_size("main", 1) end) +local function apply_new_filter(player, search_text, new_dir) + local player_name = player:get_player_name() + minetest.sound_play("click", {to_player=player_name, gain = 0.1}) + unified_inventory.apply_filter(player, search_text, new_dir) + unified_inventory.current_searchbox[player_name] = search_text + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) +end + minetest.register_on_player_receive_fields(function(player, formname, fields) local player_name = player:get_player_name() @@ -60,7 +69,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.searchbox and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then unified_inventory.current_searchbox[player_name] = fields.searchbox - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) end for i, def in pairs(unified_inventory.buttons) do @@ -112,21 +120,18 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.current_page[player_name]) end + -- Check clicked item image button local clicked_item for name, value in pairs(fields) do - if string.sub(name, 1, 12) == "item_button_" then - local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") + local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") + if new_dir and mangled_item then clicked_item = unified_inventory.demangle_for_formspec(mangled_item) if string.sub(clicked_item, 1, 6) == "group:" then - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - unified_inventory.apply_filter(player, clicked_item, new_dir) - unified_inventory.current_searchbox[player_name] = clicked_item - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) + -- Change search filter to this group + apply_new_filter(player, clicked_item, new_dir) return end - if new_dir == "recipe" - or new_dir == "usage" then + if new_dir == "recipe" or new_dir == "usage" then unified_inventory.current_craft_direction[player_name] = new_dir end break @@ -145,6 +150,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.alternate[player_name] = 1 unified_inventory.set_inventory_formspec(player, "craftguide") elseif player_creative then + -- Creative page: Add entire stack to inventory local inv = player:get_inventory() local stack = ItemStack(clicked_item) stack:set_count(stack:get_stack_max()) @@ -162,12 +168,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.sound_play("paperflip2", {to_player=player_name, gain = 1.0}) elseif fields.searchresetbutton then - unified_inventory.apply_filter(player, "", "nochange") - unified_inventory.current_searchbox[player_name] = "" - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) - minetest.sound_play("click", - {to_player=player_name, gain = 0.1}) + apply_new_filter(player, "", "nochange") end -- alternate buttons