From c53158d1596aaa32d4078d81f673dfb8e51a5ccd Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 19:12:29 -0500 Subject: [PATCH] Update to work with Unified Inventory v2 i.e. the formspec v4 rewrite Requires UI "version-2" tag or commit a7556c50 or later and and Minetest v5.4.0 or later This also makes it work properly in UI's "lite" mode. --- formspecs.lua | 99 +++++++++++++++++++++++++++++-------- mod.conf | 1 + textures/ui_misc_form.png | Bin 6177 -> 0 bytes unified_inventory_page.lua | 19 ++++--- 4 files changed, 91 insertions(+), 28 deletions(-) delete mode 100644 textures/ui_misc_form.png diff --git a/formspecs.lua b/formspecs.lua index 39d4a17..70a5dd8 100644 --- a/formspecs.lua +++ b/formspecs.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("skinsdb") +local ui = unified_inventory function skins.get_formspec_context(player) if player then @@ -11,7 +12,7 @@ function skins.get_formspec_context(player) end -- Show skin info -function skins.get_skin_info_formspec(skin) +function skins.get_skin_info_formspec(skin, perplayer_formspec) local texture = skin:get_texture() local m_name = skin:get_meta_string("name") local m_author = skin:get_meta_string("author") @@ -20,30 +21,82 @@ function skins.get_skin_info_formspec(skin) -- overview page local raw_size = m_format == "1.8" and "2,2" or "2,1" - local formspec = "image[0.8,.6;1,2;"..minetest.formspec_escape(skin:get_preview()).."]" + local lxoffs = 0.8 + local cxoffs = 2 + local rxoffs = 5.5 + + if type(perplayer_formspec) == "table" then -- we're using Unified Inventory + lxoffs = 1.5 + cxoffs = 3.75 + rxoffs = 7.5 + end + + local formspec = "image["..lxoffs..",.6;1,2;"..minetest.formspec_escape(skin:get_preview()).."]" if texture then - formspec = formspec.."label[6,.5;"..S("Raw texture")..":]" - .."image[6,1;"..raw_size..";"..texture.."]" + formspec = formspec.."label["..rxoffs..",.5;"..S("Raw texture")..":]" + .."image["..rxoffs..",1;"..raw_size..";"..texture.."]" end if m_name ~= "" then - formspec = formspec.."label[2,.5;"..S("Name")..": "..minetest.formspec_escape(m_name).."]" + formspec = formspec.."label["..cxoffs..",.5;"..S("Name")..": "..minetest.formspec_escape(m_name).."]" end if m_author ~= "" then - formspec = formspec.."label[2,1;"..S("Author")..": "..minetest.formspec_escape(m_author).."]" + formspec = formspec.."label["..cxoffs..",1;"..S("Author")..": "..minetest.formspec_escape(m_author).."]" end if m_license ~= "" then - formspec = formspec.."label[2,1.5;"..S("License")..": "..minetest.formspec_escape(m_license).."]" + formspec = formspec.."label["..cxoffs..",1.5;"..S("License")..": "..minetest.formspec_escape(m_license).."]" end return formspec end -function skins.get_skin_selection_formspec(player, context, y_delta) +function skins.get_skin_selection_formspec(player, context, perplayer_formspec) context.skins_list = skins.get_skinlist_for_player(player:get_player_name()) context.total_pages = 1 + local xoffs = 0 + local yoffs = 4 + local xspc = 1 + local yspc = 2 + local skinwidth = 1 + local skinheight = 2 + local xscale = 1 + local btn_y = 8.15 + local drop_y = 8 + local btn_width = 1 + local droppos = 1 + local droplen = 6.25 + local btn_right = 7 + local maxdisp = 16 + + local ctrls_height = 0.5 + + if type(perplayer_formspec) == "table" then -- it's being used under Unified Inventory + xoffs = perplayer_formspec.std_inv_x + xspc = ui.imgscale + yspc = ui.imgscale*2 + skinwidth = ui.imgscale*0.9 + skinheight = ui.imgscale*1.9 + xscale = ui.imgscale + btn_width = ui.imgscale + droppos = xoffs + btn_width + 0.1 + droplen = ui.imgscale * 6 - 0.2 + btn_right = droppos + droplen + 0.1 + + if perplayer_formspec.pagecols == 4 then -- and we're in lite mode + yoffs = 1 + maxdisp = 8 + drop_y = yoffs + skinheight + 0.1 + else + yoffs = 0.2 + drop_y = yoffs + skinheight*2 + 0.2 + end + + btn_y = drop_y + + end + for i, skin in ipairs(context.skins_list ) do - local page = math.floor((i-1) / 16)+1 + local page = math.floor((i-1) / maxdisp)+1 skin:set_meta("inv_page", page) - skin:set_meta("inv_page_index", (i-1)%16+1) + skin:set_meta("inv_page_index", (i-1)%maxdisp+1) context.total_pages = page end context.skins_page = context.skins_page or skins.get_player_skin(player):get_meta("inv_page") or 1 @@ -51,22 +104,25 @@ function skins.get_skin_selection_formspec(player, context, y_delta) local page = context.skins_page local formspec = "" - for i = (page-1)*16+1, page*16 do + + for i = (page-1)*maxdisp+1, page*maxdisp do local skin = context.skins_list[i] if not skin then break end local index_p = skin:get_meta("inv_page_index") - local x = (index_p-1) % 8 + local x = ((index_p-1) % 8) * xspc + xoffs local y if index_p > 8 then - y = y_delta + 1.9 + y = yoffs + yspc else - y = y_delta + y = yoffs end - formspec = formspec.."image_button["..x..","..y..";1,2;".. - minetest.formspec_escape(skin:get_preview())..";skins_set$"..i..";]".. + formspec = formspec.. + string.format("image_button[%f,%f;%f,%f;%s;skins_set$%i;]", + x, y, skinwidth, skinheight, + minetest.formspec_escape(skin:get_preview()), i).. "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin:get_meta_string("name")).."]" end @@ -87,10 +143,13 @@ function skins.get_skin_selection_formspec(player, context, y_delta) if pg > 1 then page_list = page_list.."," end page_list = page_list..pagename end - formspec = formspec - .."button[0,"..(y_delta+4.0)..";1,.5;skins_page$"..page_prev..";<<]" - .."dropdown[0.9,"..(y_delta+3.88)..";6.5,.5;skins_selpg;"..page_list..";"..page.."]" - .."button[7,"..(y_delta+4.0)..";1,.5;skins_page$"..page_next..";>>]" + formspec = formspec.. + string.format("button[%f,%f;%f,%f;skins_page$%i;<<]", + xoffs, btn_y, btn_width, ctrls_height, page_prev).. + string.format("button[%f,%f;%f,%f;skins_page$%i;>>]", + btn_right, btn_y, btn_width, ctrls_height, page_next).. + string.format("dropdown[%f,%f;%f,%f;skins_selpg;%s;%i]", + droppos, drop_y, droplen, ctrls_height, page_list, page) end return formspec end diff --git a/mod.conf b/mod.conf index 51ba162..b79cd34 100644 --- a/mod.conf +++ b/mod.conf @@ -2,3 +2,4 @@ name = skinsdb description = Player skin mod, supporting unified_inventory, sfinv and smart_inventory depends = player_api optional_depends = unified_inventory,3d_armor,clothing,sfinv +min_minetest_version = 5.4.0 diff --git a/textures/ui_misc_form.png b/textures/ui_misc_form.png deleted file mode 100644 index 2a7edb9d51f4cc3bfeb04861868b8a366ea56d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6177 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 H^WDDyE1|wV diff --git a/unified_inventory_page.lua b/unified_inventory_page.lua index 3bf9575..d39ee4f 100644 --- a/unified_inventory_page.lua +++ b/unified_inventory_page.lua @@ -1,10 +1,13 @@ local S = minetest.get_translator("skinsdb") unified_inventory.register_page("skins", { - get_formspec = function(player) + get_formspec = function(player, perplayer_formspec) local skin = skins.get_player_skin(player) - local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]"..skins.get_skin_info_formspec(skin).. - "button[.75,3;6.5,.5;skins_page;"..S("Change").."]" + local boffs = (type(perplayer_formspec) == "table") and 2 or 0.75 + + local formspec = perplayer_formspec.standard_inv_bg.. + skins.get_skin_info_formspec(skin, perplayer_formspec).. + "button["..boffs..",3;6.5,.5;skins_page;"..S("Change").."]" return {formspec=formspec} end, }) @@ -15,16 +18,16 @@ unified_inventory.register_button("skins", { tooltip = S("Skins"), }) -local function get_formspec(player) +local function get_formspec(player, perplayer_formspec) local context = skins.get_formspec_context(player) - local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]".. - skins.get_skin_selection_formspec(player, context, -0.2) + local formspec = perplayer_formspec.standard_inv_bg.. + skins.get_skin_selection_formspec(player, context, perplayer_formspec) return formspec end unified_inventory.register_page("skins_page", { - get_formspec = function(player) - return {formspec=get_formspec(player)} + get_formspec = function(player, perplayer_formspec) + return {formspec=get_formspec(player, perplayer_formspec)} end })