diff options
author | Alexander Weber <web.alexander@web.de> | 2018-02-14 00:28:09 +0100 |
---|---|---|
committer | sofar <sofar+github@foo-projects.org> | 2018-02-19 11:18:18 -0800 |
commit | ebdcede90e57c68aafbed747f6c7b94186e1c616 (patch) | |
tree | 60aadf057ceec7f5bb985631c16320ad161835e7 /formspecs.lua | |
parent | 751f0f953880f258f3c255b00797843b5c83514d (diff) |
unify the both inventories implementation unified_inventory supports now private skins too
Diffstat (limited to 'formspecs.lua')
-rw-r--r-- | formspecs.lua | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/formspecs.lua b/formspecs.lua index de53adb..0659724 100644 --- a/formspecs.lua +++ b/formspecs.lua @@ -1,5 +1,23 @@ local S = skins.S + +-- Prepare server-site state / context +function skins.rebuild_formspec_context(player, context) + local skin = skins.get_player_skin(player) + context.skins_list = skins.get_skinlist_for_player(player:get_player_name()) + context.total_pages = 1 + for i, skin in ipairs(context.skins_list ) do + local page = math.floor((i-1) / 16)+1 + skin:set_meta("inv_page", page) + skin:set_meta("inv_page_index", (i-1)%16+1) + context.total_pages = page + end + context.skins_page = context.skins_page or skin:get_meta("inv_page") + context.dropdown_values = nil + return context +end + + -- Show skin info function skins.get_skin_info_formspec(skin) local texture = skin:get_texture() @@ -23,3 +41,70 @@ function skins.get_skin_info_formspec(skin) end return formspec end + +function skins.get_skin_selection_formspec(context, y_delta) + local page = context.skins_page or 1 + local formspec = "" + for i = (page-1)*16+1, page*16 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 y + if index_p > 8 then + y = y_delta + 1.9 + else + y = y_delta + end + formspec = formspec.."image_button["..x..","..y..";1,2;".. + skin:get_preview()..";skins_set$"..i..";]".. + "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin:get_meta_string("name")).."]" + end + + if context.total_pages > 1 then + local page_prev = page - 1 + local page_next = page + 1 + if page_prev < 1 then + page_prev = context.total_pages + end + if page_next > context.total_pages then + page_next = 1 + end + local page_list = "" + context.dropdown_values = {} + for pg=1, context.total_pages do + local pagename = S("Page").." "..pg.."/"..context.total_pages + context.dropdown_values[pagename] = pg + 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..";>>]" + end + return formspec +end + +function skins.on_skin_selection_receive_fields(player, context, fields) + for field, _ in pairs(fields) do + local current = string.split(field, "$", 2) + if current[1] == "skins_set" then + local selected_skin = context.skins_list[tonumber(current[2])] + setmetatable(selected_skin, skins.skin_class) + + skins.set_player_skin(player, selected_skin) + return 'set' + elseif current[1] == "skins_page" then + context.skins_page = tonumber(current[2]) + return 'page' + end + end + if fields.skins_selpg then + context.skins_page = tonumber(context.dropdown_values[fields.skins_selpg]) + return 'page' + end +end |