From fa54b0ec624b6ad45a497984b47018df6ec66f41 Mon Sep 17 00:00:00 2001 From: Alexander Weber Date: Thu, 15 Jun 2017 17:18:51 +0200 Subject: [PATCH] initial sfinv support --- depends.txt | 1 + init.lua | 3 + sfinv_page.lua | 128 +++++++++++++++++++++++++++++++++++++ unified_inventory_page.lua | 110 +++++++++++++++---------------- 4 files changed, 185 insertions(+), 57 deletions(-) create mode 100644 sfinv_page.lua diff --git a/depends.txt b/depends.txt index 34f0ef9..45a6c66 100644 --- a/depends.txt +++ b/depends.txt @@ -2,3 +2,4 @@ default intllib? unified_inventory? 3d_armor? +sfinv? diff --git a/init.lua b/init.lua index d1f4111..dd33174 100644 --- a/init.lua +++ b/init.lua @@ -34,3 +34,6 @@ if minetest.get_modpath("unified_inventory") then dofile(skins.modpath.."/unified_inventory_page.lua") end +if minetest.get_modpath("sfinv") then + dofile(skins.modpath.."/sfinv_page.lua") +end diff --git a/sfinv_page.lua b/sfinv_page.lua new file mode 100644 index 0000000..15ad56e --- /dev/null +++ b/sfinv_page.lua @@ -0,0 +1,128 @@ +local S +if minetest.get_modpath("intllib") then + S = intllib.Getter() +else + S = function(s) return s end +end + +local dropdown_values = {} +local skins_reftab = {} +local skins_reftab_byskin = {} + +-- collect skins data +local total_pages = 1 +for i, skin in ipairs(skins.list) do + local page = math.floor((i-1) / 16)+1 + local index_p = (i-1)%16+1 + skins_reftab[i] = { index = i, page = page, index_p = index_p, skin = skin } + skins_reftab_byskin[skin] = skins_reftab[i] + total_pages = page +end + +-- generate the current formspec +local function get_formspec(player, context) + local name = player:get_player_name() + local skin = skins.get_player_skin(player) + + -- overview page + local formspec = "image[0,.75;1,2;"..skins.preview[skin].."]" + .."label[6,.5;"..S("Raw texture")..":]" + .."image[6,1;2,1;"..skins.textures[skin].."]" + + local meta = skins.meta[skin] + if meta then + if meta.name ~= "" then + formspec = formspec.."label[2,.5;"..S("Name")..": "..minetest.formspec_escape(meta.name).."]" + end + if meta.author ~= "" then + formspec = formspec.."label[2,1;"..S("Author")..": "..minetest.formspec_escape(meta.author).."]" + end + if meta.license ~= "" then + formspec = formspec.."label[2,1.5;"..S("License")..": "..minetest.formspec_escape(meta.license).."]" + end + if meta.description ~= "" then --what's that?? + formspec = formspec.."label[2,2;"..S("Description")..": "..minetest.formspec_escape(meta.description).."]" + end + end + local page = 1 + if context.skins_page then + page = context.skins_page + elseif skins_reftab_byskin[skin] then + page = skins_reftab_byskin[skin].page + end + + for i = (page-1)*16+1, page*16 do + if not skins_reftab[i] then + break + end + local index_p = skins_reftab[i].index_p + local x = (index_p-1) % 8 + local y + if index_p > 8 then + y = 5 + else + y = 3.2 + end + formspec = formspec.."image_button["..x..","..y..";1,2;".. + skins.preview[skins_reftab[i].skin]..";skins_set$"..i..";]".. + "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skins.meta[skins_reftab[i].skin].name).."]" + end + local page_prev = page - 1 + local page_next = page + 1 + if page_prev < 1 then + page_prev = total_pages + end + if page_next > total_pages then + page_next = 1 + end + local page_list = "" + dropdown_values = {} + for pg=1, total_pages do + local pagename = S("Page").." "..pg.."/"..total_pages + dropdown_values[pagename] = pg + if pg > 1 then page_list = page_list.."," end + page_list = page_list..pagename + end + formspec = formspec + .."button[0,8.3;1,.5;skins_page$"..page_prev..";<<]" + .."dropdown[1,8.16;6.5,.5;skins_selpg;"..page_list..";"..page.."]" + .."button[7,8.3;1,.5;skins_page$"..page_next..";>>]" + + return formspec +end + + + +sfinv.register_page("skins:overview", { + title = "Skins", + get = function(self, player, context) + print(dump(context)) + return sfinv.make_formspec(player, context, get_formspec(player, context)) + end +}) + + + +-- click button handlers +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.skins then +-- unified_inventory.set_inventory_formspec(player, "craft") + return + end + for field, _ in pairs(fields) do + local current = string.split(field, "$", 2) + if current[1] == "skins_set" then + skins.set_player_skin(player, skins_reftab[tonumber(current[2])].skin) +-- unified_inventory.set_inventory_formspec(player, "skins") + return + elseif current[1] == "skins_page" then +-- unified_inventory.set_inventory_formspec(player, "skins_page$"..current[2]) + return + end + end + if fields.skins_selpg then + local page = dropdown_values[fields.skins_selpg] +-- unified_inventory.set_inventory_formspec(player, "skins_page$"..(page)) + return + end +end) diff --git a/unified_inventory_page.lua b/unified_inventory_page.lua index f2f1aca..99a21c1 100644 --- a/unified_inventory_page.lua +++ b/unified_inventory_page.lua @@ -48,64 +48,62 @@ unified_inventory.register_button("skins", { }) -- Create all of the skin-picker pages. -skins.generate_pages = function() - local total_pages = 1 +local total_pages = 1 +for i, skin in ipairs(skins.list) do + local page = math.floor((i-1) / 16)+1 + local index_p = (i-1)%16+1 - for i, skin in ipairs(skins.list) do - local page = math.floor((i-1) / 16)+1 - local index_p = (i-1)%16+1 - - skins_reftab[i] = { index = i, page = page, index_p = index_p, skin = skin } - skins_reftab_byskin[skin] = skins_reftab[i] - total_pages = page - end - - for page=1, total_pages do - local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]" - for i = (page-1)*16+1, page*16 do - if not skins_reftab[i] then - break - end - local index_p = skins_reftab[i].index_p - local x = (index_p-1) % 8 - local y - if index_p > 8 then - y = 1.8 - else - y = -0.1 - end - formspec = (formspec.."image_button["..x..","..y..";1,2;".. - skins.preview[skins_reftab[i].skin]..";skins_set$"..i..";]".. - "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skins.meta[skins_reftab[i].skin].name).."]") - end - local page_prev = page - 1 - local page_next = page + 1 - if page_prev < 1 then - page_prev = total_pages - end - if page_next > total_pages then - page_next = 1 - end - local page_list = "" - dropdown_values = {} - for pg=1, total_pages do - local pagename = S("Page").." "..pg.."/"..total_pages - dropdown_values[pagename] = pg - if pg > 1 then page_list = page_list.."," end - page_list = page_list..pagename - end - formspec = (formspec - .."button[0,3.8;1,.5;skins_page$"..page_prev..";<<]" - .."dropdown[1,3.68;6.5,.5;skins_selpg;"..page_list..";"..page.."]" - .."button[7,3.8;1,.5;skins_page$"..page_next..";>>]") - unified_inventory.register_page("skins_page$"..(page), { - get_formspec = function(player) - return {formspec=formspec} - end - }) - end + skins_reftab[i] = { index = i, page = page, index_p = index_p, skin = skin } + skins_reftab_byskin[skin] = skins_reftab[i] + total_pages = page end +for page=1, total_pages do + local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]" + for i = (page-1)*16+1, page*16 do + if not skins_reftab[i] then + break + end + local index_p = skins_reftab[i].index_p + local x = (index_p-1) % 8 + local y + if index_p > 8 then + y = 1.8 + else + y = -0.1 + end + formspec = (formspec.."image_button["..x..","..y..";1,2;".. + skins.preview[skins_reftab[i].skin]..";skins_set$"..i..";]".. + "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skins.meta[skins_reftab[i].skin].name).."]") + end + local page_prev = page - 1 + local page_next = page + 1 + if page_prev < 1 then + page_prev = total_pages + end + if page_next > total_pages then + page_next = 1 + end + local page_list = "" + dropdown_values = {} + for pg=1, total_pages do + local pagename = S("Page").." "..pg.."/"..total_pages + dropdown_values[pagename] = pg + if pg > 1 then page_list = page_list.."," end + page_list = page_list..pagename + end + formspec = (formspec + .."button[0,3.8;1,.5;skins_page$"..page_prev..";<<]" + .."dropdown[1,3.68;6.5,.5;skins_selpg;"..page_list..";"..page.."]" + .."button[7,3.8;1,.5;skins_page$"..page_next..";>>]") + unified_inventory.register_page("skins_page$"..(page), { + get_formspec = function(player) + return {formspec=formspec} + end + }) +end + + -- click button handlers minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.skins then @@ -129,5 +127,3 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end end) - -skins.generate_pages()