From aa2867b76777d1cad3099662da403890e5b53ab7 Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Wed, 28 Jun 2017 23:06:00 +0200 Subject: [PATCH 1/3] Creative: Inventory design overhaul --- mods/creative/inventory.lua | 171 ++++++++++++++--------- mods/creative/textures/creative_less.png | Bin 0 -> 193 bytes mods/creative/textures/creative_more.png | Bin 0 -> 193 bytes mods/sfinv/api.lua | 4 +- mods/sfinv/init.lua | 16 +-- 5 files changed, 113 insertions(+), 78 deletions(-) create mode 100644 mods/creative/textures/creative_less.png create mode 100644 mods/creative/textures/creative_more.png diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 0e1d813eaf..0de158351f 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -8,60 +8,33 @@ function creative.init_creative_inventory(player) start_i = 0 } - minetest.create_detached_inventory("creative_" .. player_name, { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2) - if not to_list == "main" then - return count - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player2) - return 0 - end, - allow_take = function(inv, listname, index, stack, player2) - return -1 - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player2) - end, - on_put = function(inv, listname, index, stack, player2) - end, - on_take = function(inv, listname, index, stack, player2) - if stack and stack:get_count() > 0 then - minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory") - end - end, - }, player_name) - return player_inventory[player_name] end function creative.update_creative_inventory(player_name, tab_content) local creative_list = {} local inv = player_inventory[player_name] or - creative.init_creative_inventory(minetest.get_player_by_name(player_name)) - local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) + creative.init_creative_inventory(minetest.get_player_by_name(player_name)) for name, def in pairs(tab_content) do if not (def.groups.not_in_creative_inventory == 1) and - def.description and def.description ~= "" and - (def.name:find(inv.filter, 1, true) or - def.description:lower():find(inv.filter, 1, true)) then + def.description and def.description ~= "" and + (def.name:find(inv.filter, 1, true) or + def.description:lower():find(inv.filter, 1, true)) then creative_list[#creative_list+1] = name end end - table.sort(creative_list) - player_inv:set_size("main", #creative_list) - player_inv:set_list("main", creative_list) inv.size = #creative_list + table.sort(creative_list) + return creative_list end -- Create the trash field local trash = minetest.create_detached_inventory("creative_trash", { -- Allow the stack to be placed and remove it in on_put() -- This allows the creative inventory to restore the stack - allow_put = function(inv, listname, index, stack, player) + allow_put = function(_, _, _, stack) return stack:get_count() end, on_put = function(inv, listname) @@ -78,38 +51,67 @@ function creative.register_tab(name, title, items) is_in_nav = function(self, player, context) return creative.is_enabled_for(player:get_player_name()) end, + get = function(self, player, context) local player_name = player:get_player_name() - creative.update_creative_inventory(player_name, items) - local inv = player_inventory[player_name] + local inv = player_inventory[player_name] or + creative.init_creative_inventory( + minetest.get_player_by_name(player_name)) + + local ipp = inv.expand and 3*8 or 6*8 local start_i = inv.start_i or 0 - local pagenum = math.floor(start_i / (3*8) + 1) - local pagemax = math.ceil(inv.size / (3*8)) - return sfinv.make_formspec(player, context, - "label[6.2,3.35;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" .. - [[ - image[4.06,3.4;0.8,0.8;creative_trash_icon.png] - listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] - list[current_player;main;0,4.7;8,1;] - list[current_player;main;0,5.85;8,3;8] - list[detached:creative_trash;main;4,3.3;1,1;] - listring[] - button[5.4,3.2;0.8,0.9;creative_prev;<] - button[7.25,3.2;0.8,0.9;creative_next;>] - button[2.1,3.4;0.8,0.5;creative_search;?] - button[2.75,3.4;0.8,0.5;creative_clear;X] - tooltip[creative_search;Search] - tooltip[creative_clear;Reset] - listring[current_player;main] - field_close_on_enter[creative_filter;false] - ]] .. - "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. - "listring[detached:creative_" .. player_name .. ";main]" .. - "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. - default.get_hotbar_bg(0,4.7) .. - default.gui_bg .. default.gui_bg_img .. default.gui_slots - .. creative.formspec_add, false) + local pagenum = math.floor(start_i / ipp + 1) + local inv_items = creative.update_creative_inventory(player_name, items) + local pagemax = math.ceil(inv.size / ipp) + local offset = inv.expand and 3 or 6 + + local formspec = + "label[6.2," .. offset .. ".35;" .. minetest.colorize("#FFFF00", + tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" .. + "image[4.06," .. offset .. ".4;0.8,0.8;creative_trash_icon.png]" .. + "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .. + "list[current_player;main;0," .. (offset + 1) .. ".5;8,1;]" .. + "list[detached:creative_trash;main;4," .. offset .. ".3;1,1;]" .. + "listring[]" .. + "button[5.4," .. offset .. ".2;0.8,0.9;creative_prev;<]" .. + "button[7.25," .. offset .. ".2;0.8,0.9;creative_next;>]" .. + "button[2.1," .. offset .. ".4;0.8,0.5;creative_search;?]" .. + "button[2.75," .. offset .. ".4;0.8,0.5;creative_clear;X]" .. + "image_button[3.78,8.55;0.45,0.4;creative_" .. + (inv.expand and "less" or "more") .. + ".png;creative_" .. + (inv.expand and "less" or "more") .. + ";;true;false;]" .. + "tooltip[creative_search;Search]" .. + "tooltip[creative_clear;Reset]" .. + "listring[current_player;main]" .. + "field_close_on_enter[creative_filter;false]" .. + "field[0.25," .. offset .. ".5;2.25,1;creative_filter;;" .. + minetest.formspec_escape(inv.filter) .. "]" .. + default.get_hotbar_bg(0, (inv.expand and 4.5 or 7.5)) .. + default.gui_bg .. default.gui_bg_img .. default.gui_slots .. + creative.formspec_add + + if inv.expand then + formspec = formspec .. + "list[current_player;main;0,5.55;8,3;8]" + end + + local first_item = (pagenum - 1) * ipp + for i = first_item, first_item + ipp - 1 do + local item_name = inv_items[i + 1] + if not item_name then break end + local X = i % 8 + local Y = (i % ipp - X) / 8 + 1 + + formspec = formspec .. + "item_image_button[" .. (X - 0.05) .. "," .. (Y - 1) .. + ";1.1,1.1;" .. item_name .. ";" .. item_name .. "_inv;]" + end + + return sfinv.make_formspec(player, context, formspec, false) end, + on_enter = function(self, player, context) local player_name = player:get_player_name() local inv = player_inventory[player_name] @@ -117,6 +119,7 @@ function creative.register_tab(name, title, items) inv.start_i = 0 end end, + on_player_receive_fields = function(self, player, context, fields) local player_name = player:get_player_name() local inv = player_inventory[player_name] @@ -127,25 +130,32 @@ function creative.register_tab(name, title, items) inv.filter = "" creative.update_creative_inventory(player_name, items) sfinv.set_player_inventory_formspec(player, context) + elseif fields.creative_search or fields.key_enter_field == "creative_filter" then inv.start_i = 0 inv.filter = fields.creative_filter:lower() creative.update_creative_inventory(player_name, items) sfinv.set_player_inventory_formspec(player, context) - elseif not fields.quit then + + elseif fields.creative_more or fields.creative_less then + inv.expand = fields.creative_more and true or false + sfinv.set_player_inventory_formspec(player, context) + + elseif fields.creative_prev or fields.creative_next then local start_i = inv.start_i or 0 + local ipp = inv.expand and 3*8 or 6*8 if fields.creative_prev then - start_i = start_i - 3*8 + start_i = start_i - ipp if start_i < 0 then - start_i = inv.size - (inv.size % (3*8)) + start_i = inv.size - (inv.size % ipp) if inv.size == start_i then - start_i = math.max(0, inv.size - (3*8)) + start_i = math.max(0, inv.size - ipp) end end elseif fields.creative_next then - start_i = start_i + 3*8 + start_i = start_i + ipp if start_i >= inv.size then start_i = 0 end @@ -153,13 +163,38 @@ function creative.register_tab(name, title, items) inv.start_i = start_i sfinv.set_player_inventory_formspec(player, context) + + else for item in pairs(fields) do + if item:find(":") then + local can_add = false + local player_inv = player:get_inventory() + + for i = 1, 8 do + if player_inv:get_stack("main", i):is_empty() then + can_add = true + break + end + end + + if can_add or inv.expand then + if item:sub(-4) == "_inv" then + item = item:sub(1,-5) + end + + local stack = ItemStack(item) + player_inv:add_item("main", + item .. " " .. stack:get_stack_max()) + end + end + end end end }) end minetest.register_on_joinplayer(function(player) - creative.update_creative_inventory(player:get_player_name(), minetest.registered_items) + creative.update_creative_inventory( + player:get_player_name(), minetest.registered_items) end) creative.register_tab("all", "All", minetest.registered_items) diff --git a/mods/creative/textures/creative_less.png b/mods/creative/textures/creative_less.png new file mode 100644 index 0000000000000000000000000000000000000000..c248a85556e7aff91463bb87574eb78b6f7cdce0 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=wj^(N7a$D;Kb?2i11Zh|kH}&M z25w;xW@MN(M*=9wUgGKN%Kng5Qoum$aOYJ6ppa~4NJNQqer|4RUI~!Pz~Eeznpl#W zqEMb$lA+-4=^K!um&y(lSM_vp4B@z*{Nw+B`@{eL|CdZVKkqCUnfx)>bHL)Z$ zMWH;iBtya7(>EYRFO?lAuIlOH7{YNq`N#kN_J{xf|1X(#e%@dCV`)hTm?Y9cOy?;X ZZyA1VRfubSIVS^TlBcVm%Q~loCID&CH~0Vm literal 0 HcmV?d00001 diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index bd6de1edfb..5f0f89c140 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -39,8 +39,8 @@ local theme_main = "bgcolor[#080808BB;true]" .. default.gui_bg .. default.gui_bg_img local theme_inv = default.gui_slots .. [[ - list[current_player;main;0,4.7;8,1;] - list[current_player;main;0,5.85;8,3;8] + list[current_player;main;0,4.5;8,1;] + list[current_player;main;0,5.55;8,3;8] ]] function sfinv.make_formspec(player, context, content, show_inv, size) diff --git a/mods/sfinv/init.lua b/mods/sfinv/init.lua index f030222ce5..3096b185ab 100644 --- a/mods/sfinv/init.lua +++ b/mods/sfinv/init.lua @@ -9,14 +9,14 @@ sfinv.register_page("sfinv:crafting", { image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270] listring[current_player;main] listring[current_player;craft] - image[0,4.75;1,1;gui_hb_bg.png] - image[1,4.75;1,1;gui_hb_bg.png] - image[2,4.75;1,1;gui_hb_bg.png] - image[3,4.75;1,1;gui_hb_bg.png] - image[4,4.75;1,1;gui_hb_bg.png] - image[5,4.75;1,1;gui_hb_bg.png] - image[6,4.75;1,1;gui_hb_bg.png] - image[7,4.75;1,1;gui_hb_bg.png] + image[0,4.5;1,1;gui_hb_bg.png] + image[1,4.5;1,1;gui_hb_bg.png] + image[2,4.5;1,1;gui_hb_bg.png] + image[3,4.5;1,1;gui_hb_bg.png] + image[4,4.5;1,1;gui_hb_bg.png] + image[5,4.5;1,1;gui_hb_bg.png] + image[6,4.5;1,1;gui_hb_bg.png] + image[7,4.5;1,1;gui_hb_bg.png] ]], true) end }) From 2f887aaae3930a8d79aff020232c0d7f7d3d0656 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 2 Jul 2017 10:39:46 +0200 Subject: [PATCH 2/3] +2 tabs --- mods/creative/inventory.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 0de158351f..c74083f6e6 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -18,9 +18,9 @@ function creative.update_creative_inventory(player_name, tab_content) for name, def in pairs(tab_content) do if not (def.groups.not_in_creative_inventory == 1) and - def.description and def.description ~= "" and - (def.name:find(inv.filter, 1, true) or - def.description:lower():find(inv.filter, 1, true)) then + def.description and def.description ~= "" and + (def.name:find(inv.filter, 1, true) or + def.description:lower():find(inv.filter, 1, true)) then creative_list[#creative_list+1] = name end end From a04fe89eb3deb0263ac810cef88bdf8e1cb32340 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 2 Jul 2017 10:45:12 +0200 Subject: [PATCH 3/3] Fix ugly Y position switch in expanded mode Set 4x8 inventory as default Allow adding items to the inventory even when the top row is filled --- mods/creative/inventory.lua | 57 ++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index c74083f6e6..0d6c3e1dcb 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -17,9 +17,9 @@ function creative.update_creative_inventory(player_name, tab_content) creative.init_creative_inventory(minetest.get_player_by_name(player_name)) for name, def in pairs(tab_content) do - if not (def.groups.not_in_creative_inventory == 1) and - def.description and def.description ~= "" and - (def.name:find(inv.filter, 1, true) or + if def.groups.not_in_creative_inventory ~= 1 and + def.description and def.description ~= "" and + (def.name:find(inv.filter, 1, true) or def.description:lower():find(inv.filter, 1, true)) then creative_list[#creative_list+1] = name end @@ -45,6 +45,20 @@ trash:set_size("main", 1) creative.formspec_add = "" +local function handle_item_button_press(fields, player) + local player_inv = player:get_inventory() + for item in pairs(fields) do + if item:find(":") and item:sub(-4) == "_inv" then + local stack = ItemStack(item:sub(1, -5)) + stack:set_count(stack:get_stack_max()) + if player_inv:room_for_item("main", stack) then + player_inv:add_item("main", stack) + end + return + end + end +end + function creative.register_tab(name, title, items) sfinv.register_page("creative:" .. name, { title = title, @@ -58,12 +72,12 @@ function creative.register_tab(name, title, items) creative.init_creative_inventory( minetest.get_player_by_name(player_name)) - local ipp = inv.expand and 3*8 or 6*8 + local ipp = inv.expand and 6*8 or 3*8 local start_i = inv.start_i or 0 local pagenum = math.floor(start_i / ipp + 1) local inv_items = creative.update_creative_inventory(player_name, items) local pagemax = math.ceil(inv.size / ipp) - local offset = inv.expand and 3 or 6 + local offset = inv.expand and 6 or 3 local formspec = "label[6.2," .. offset .. ".35;" .. minetest.colorize("#FFFF00", @@ -88,13 +102,13 @@ function creative.register_tab(name, title, items) "field_close_on_enter[creative_filter;false]" .. "field[0.25," .. offset .. ".5;2.25,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. - default.get_hotbar_bg(0, (inv.expand and 4.5 or 7.5)) .. + default.get_hotbar_bg(0, (inv.expand and 7.5 or 4.5)) .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. creative.formspec_add - if inv.expand then + if not inv.expand then formspec = formspec .. - "list[current_player;main;0,5.55;8,3;8]" + "list[current_player;main;0,5.5;8,3;8]" end local first_item = (pagenum - 1) * ipp @@ -144,7 +158,7 @@ function creative.register_tab(name, title, items) elseif fields.creative_prev or fields.creative_next then local start_i = inv.start_i or 0 - local ipp = inv.expand and 3*8 or 6*8 + local ipp = inv.expand and 6*8 or 3*8 if fields.creative_prev then start_i = start_i - ipp @@ -164,29 +178,8 @@ function creative.register_tab(name, title, items) inv.start_i = start_i sfinv.set_player_inventory_formspec(player, context) - else for item in pairs(fields) do - if item:find(":") then - local can_add = false - local player_inv = player:get_inventory() - - for i = 1, 8 do - if player_inv:get_stack("main", i):is_empty() then - can_add = true - break - end - end - - if can_add or inv.expand then - if item:sub(-4) == "_inv" then - item = item:sub(1,-5) - end - - local stack = ItemStack(item) - player_inv:add_item("main", - item .. " " .. stack:get_stack_max()) - end - end - end + else + handle_item_button_press(fields, player) end end })