diff --git a/bags.lua b/bags.lua index 1bb2b5c..735a758 100644 --- a/bags.lua +++ b/bags.lua @@ -7,24 +7,24 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape -local bags_inv_bg_prefix = "image[-0.1,1.0;10.05," +local bags_inv_bg_prefix = "image[0.3,1.5;"..(unified_inventory.imgscale*8).."," unified_inventory.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ - string.gsub(unified_inventory.standard_inv_bg, "YYY", "4.4"), - bags_inv_bg_prefix.."1.175;ui_bags_header.png]", - "label[0,0;" .. F(S("Bags")) .. "]", - "button[0,2.2;2,0.5;bag1;" .. F(S("Bag @1", 1)) .. "]", - "button[2,2.2;2,0.5;bag2;" .. F(S("Bag @1", 2)) .. "]", - "button[4,2.2;2,0.5;bag3;" .. F(S("Bag @1", 3)) .. "]", - "button[6,2.2;2,0.5;bag4;" .. F(S("Bag @1", 4)) .. "]", + unified_inventory.standard_inv_bg, + bags_inv_bg_prefix..uninv.imgscale..";ui_bags_header.png]", + "label["..unified_inventory.form_header_x..","..unified_inventory.form_header_y..";" .. F(S("Bags")) .. "]", + "button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", + "button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", + "button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", + "button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", "listcolors[#00000000;#00000000]", - "list[detached:" .. F(player_name) .. "_bags;bag1;0.5,1.1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag2;2.5,1.1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag3;4.5,1.1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag4;6.5,1.1;1,1;]" + "list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]" }) } end, }) @@ -49,28 +49,29 @@ for bag_i = 1, 4 do local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image local fs = { - string.gsub(unified_inventory.standard_inv_bg, "YYY", "4.4"), - "image[7,0;1,1;" .. image .. "]", - "label[0,0;" .. F(S("Bag @1", bag_i)) .. "]", + unified_inventory.standard_inv_bg, + "image[9.2,0.4;1,1;" .. image .. "]", + "label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", "listcolors[#00000000;#00000000]", - "list[current_player;bag" .. bag_i .. "contents;0,1.1;8,3;]", - "listring[current_name;bag" .. bag_i .. "contents]", "listring[current_player;main]", } local slots = stack:get_definition().groups.bagslots if slots == 8 then - fs[#fs + 1] = bags_inv_bg_prefix.."1.175;ui_bags_inv_small.png]" + fs[#fs + 1] = bags_inv_bg_prefix..uninv.imgscale..";ui_bags_inv_small.png]" elseif slots == 16 then - fs[#fs + 1] = bags_inv_bg_prefix.."2.35;ui_bags_inv_medium.png]" + fs[#fs + 1] = bags_inv_bg_prefix..(uninv.imgscale*2)..";ui_bags_inv_medium.png]" elseif slots == 24 then - fs[#fs + 1] = bags_inv_bg_prefix.."3.525;ui_bags_inv_large.png]" + fs[#fs + 1] = bags_inv_bg_prefix..(uninv.imgscale*3)..";ui_bags_inv_large.png]" end + fs[#fs + 1] = "list[current_player;bag" .. bag_i .. "contents;0.45,1.65;8,3;]" + fs[#fs + 1] = "listring[current_name;bag" .. bag_i .. "contents]" + local player_name = player:get_player_name() -- For if statement. if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then - fs[#fs + 1] = "image[5.91,-0.06;1.21,1.15;ui_bags_trash.png]" - .. "list[detached:trash;main;6,0.1;1,1;]" + fs[#fs + 1] = "image[7.8,0.25;"..uninv.imgscale..","..uninv.imgscale..";ui_trash_slot.png]" + .. "list[detached:trash;main;7.95,0.25;1,1;]" end local inv = player:get_inventory() for i = 1, 4 do @@ -87,8 +88,8 @@ for bag_i = 1, 4 do end local img = def.inventory_image local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size - fs[#fs + 1] = string.format("image_button[%i,0;1,1;%s;bag%i;%s]", - i + 1, img, i, label) + fs[#fs + 1] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]", + (i + 1.35)*1.25, img, i, label) end end return { formspec = table.concat(fs) } diff --git a/init.lua b/init.lua index 7be101c..9487675 100644 --- a/init.lua +++ b/init.lua @@ -36,20 +36,36 @@ unified_inventory = { -- Trash enabled trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), + formspec_x = 1, -- UI doesn't use these first two anymore, but other mods + formspec_y = 1, -- may need them. pagecols = 8, pagerows = 10, - page_y = 0, - formspec_y = 1, - main_button_x = 0, - main_button_y = 9, - craft_result_x = 0.3, - craft_result_y = 0.5, - form_header_y = 0, - standard_background = "background[-0.2,-0.2;1,1;ui_form_bg.png;true]", -- the 'true' scales to fill, overrides the 1,1 - standard_inv = "list[current_player;main;0,YYY;8,4;]", -- the YYY's are placeholders which get - standard_inv_bg = "image[-0.1,YYY;10.05,4.70;ui_main_inventory.png]", -- replaced later by string.gsub() + page_x = 10.75, + page_y = 1.25, + craft_x = 2.8, + craft_y = 1, + resultstr_y = 0.6, + main_button_x = 0.4, + main_button_y = 11.0, + page_buttons_x = 11.60, + page_buttons_y = 10.15, + searchwidth = 3.4, + form_header_x = 0.4, + form_header_y = 0.4, + btn_spc = 0.85, + btn_size = 0.75, + imgscale = 1.25, + std_inv_x = 0.3, + std_inv_y = 5.5, + standard_background = "background[0,0;1,1;ui_form_bg.png;true]", } +uninv = unified_inventory + +uninv.standard_inv = "list[current_player;main;"..(uninv.std_inv_x+0.15)..","..(uninv.std_inv_y+0.15)..";8,4;]" +uninv.standard_inv_bg = "image["..uninv.std_inv_x..","..uninv.std_inv_y..";"..(uninv.imgscale*8).. + ","..(uninv.imgscale*4)..";ui_main_inventory.png]" + -- Disable default creative inventory local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") if creative then diff --git a/internal.lua b/internal.lua index 78cba2a..a456316 100644 --- a/internal.lua +++ b/internal.lua @@ -9,6 +9,7 @@ local F = minetest.formspec_escape -- This is a game engine bug, and in the anticipation that it might be -- fixed some day we don't want to rely on it. So for safety we apply -- an encoding that avoids all formspec metacharacters. + function unified_inventory.mangle_for_formspec(str) return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end) end @@ -16,30 +17,59 @@ function unified_inventory.demangle_for_formspec(str) return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) end + function unified_inventory.get_per_player_formspec(player_name) local lite = unified_inventory.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) local ui = {} + ui.formspec_x = unified_inventory.formspec_x + ui.formspec_y = unified_inventory.formspec_y ui.pagecols = unified_inventory.pagecols ui.pagerows = unified_inventory.pagerows + ui.page_x = unified_inventory.page_x ui.page_y = unified_inventory.page_y - ui.formspec_y = unified_inventory.formspec_y + ui.craft_x = unified_inventory.craft_x + ui.craft_y = unified_inventory.craft_y + ui.resultstr_y = unified_inventory.resultstr_y ui.main_button_x = unified_inventory.main_button_x ui.main_button_y = unified_inventory.main_button_y - ui.craft_result_x = unified_inventory.craft_result_x - ui.craft_result_y = unified_inventory.craft_result_y + ui.page_buttons_x = unified_inventory.page_buttons_x + ui.page_buttons_y = unified_inventory.page_buttons_y + ui.searchwidth = unified_inventory.searchwidth + ui.form_header_x = unified_inventory.form_header_x ui.form_header_y = unified_inventory.form_header_y + ui.btn_spc = unified_inventory.btn_spc + ui.btn_size = unified_inventory.btn_size + ui.std_inv_x = unified_inventory.std_inv_x + ui.std_inv_y = unified_inventory.std_inv_y + ui.standard_inv = unified_inventory.standard_inv + ui.standard_inv_bg = unified_inventory.standard_inv_bg if lite then + + ui.formspec_x = 0.6 + ui.formspec_y = 0.6 ui.pagecols = 4 ui.pagerows = 6 - ui.page_y = 0.25 - ui.formspec_y = 0.47 - ui.main_button_x = 8.2 - ui.main_button_y = 6.5 - ui.craft_result_x = 2.8 - ui.craft_result_y = 3.4 - ui.form_header_y = -0.1 + ui.page_x = 10.5 + ui.page_y = 1.1 + ui.craft_x = 2.6 + ui.craft_y = 0.65 + ui.resultstr_y = 0.3 + ui.main_button_x = ui.page_x + ui.main_button_y = 7.8 + ui.page_buttons_x = ui.page_x + ui.page_buttons_y = 6.2 + ui.searchwidth = 1.6 + ui.form_header_x = 0.2 + ui.form_header_y = 0.2 + ui.btn_spc = 0.8 + ui.btn_size = 0.7 + ui.std_inv_x = 0.1 + ui.std_inv_y = 4.6 + ui.standard_inv = "list[current_player;main;"..(ui.std_inv_x+0.15)..","..(ui.std_inv_y+0.15)..";8,4;]" + ui.standard_inv_bg = "image["..ui.std_inv_x..","..ui.std_inv_y..";"..(unified_inventory.imgscale*8).. + ","..(unified_inventory.imgscale*4)..";ui_main_inventory.png]" end ui.items_per_page = ui.pagecols * ui.pagerows @@ -55,6 +85,9 @@ function unified_inventory.get_formspec(player, page) local player_name = player:get_player_name() local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) + local formheaderx = ui_peruser.form_header_x + local formheadery = ui_peruser.form_header_y + unified_inventory.current_page[player_name] = page local pagedef = unified_inventory.pages[page] @@ -63,20 +96,20 @@ function unified_inventory.get_formspec(player, page) end local formspec = { - "size[14,10]", + "formspec_version[4]size[17.75,12.25]", pagedef.formspec_prepend and "" or "no_prepend[]", unified_inventory.standard_background -- Background } local n = 4 if draw_lite_mode then - formspec[1] = "size[11,7.7]" + formspec[1] = "formspec_version[4]size[14,9.75]" formspec[3] = unified_inventory.standard_background end if unified_inventory.is_creative(player_name) - and page == "craft" then - formspec[n] = "background[0,"..(ui_peruser.formspec_y + 2)..";1,1;ui_single_slot.png]" + and page == "craft" then -- add the "Refill" slot. + formspec[n] = "image["..(ui_peruser.craft_x-2.5)..","..(ui_peruser.craft_y+2.5)..";"..uninv.imgscale..","..uninv.imgscale..";ui_single_slot.png]" n = n+1 end @@ -109,8 +142,8 @@ function unified_inventory.get_formspec(player, page) if def.type == "image" then if (def.condition == nil or def.condition(player) == true) then formspec[n] = "image_button[" - formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) - formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;" + formspec[n+1] = ( ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4) + formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * ui_peruser.btn_spc)..";"..ui_peruser.btn_size..","..ui_peruser.btn_size..";" formspec[n+3] = F(def.image)..";" formspec[n+4] = F(def.name)..";]" formspec[n+5] = "tooltip["..F(def.name) @@ -118,8 +151,8 @@ function unified_inventory.get_formspec(player, page) n = n+7 else formspec[n] = "image[" - formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) - formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;" + formspec[n+1] = ( ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4) + formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * ui_peruser.btn_spc)..";"..ui_peruser.btn_size..","..ui_peruser.btn_size..";" formspec[n+3] = F(def.image).."^[colorize:#808080:alpha]" n = n+4 @@ -130,7 +163,7 @@ function unified_inventory.get_formspec(player, page) if fsdata.draw_inventory ~= false then -- Player inventory formspec[n] = "listcolors[#00000000;#00000000]" - formspec[n+1] = string.gsub(unified_inventory.standard_inv, "YYY", ui_peruser.formspec_y + 3.5) + formspec[n+1] = ui_peruser.standard_inv n = n+2 end @@ -138,71 +171,55 @@ function unified_inventory.get_formspec(player, page) return table.concat(formspec, "") end - -- Controls to flip items pages - local start_x = 9.2 - - if not draw_lite_mode then - formspec[n] = - "image_button[" .. (start_x + 0.6 * 0) - .. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]" - .. "tooltip[start_list;" .. F(S("First page")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 1) - .. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]" - .. "tooltip[rewind3;" .. F(S("Back three pages")) .. "]" - .. "image_button[" .. (start_x + 0.6 * 2) - .. ",9;.8,.8;ui_left_icon.png;rewind1;]" - .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 3) - .. ",9;.8,.8;ui_right_icon.png;forward1;]" - .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]" - .. "image_button[" .. (start_x + 0.6 * 4) - .. ",9;.8,.8;ui_doubleright_icon.png;forward3;]" - .. "tooltip[forward3;" .. F(S("Forward three pages")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 5) - .. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]" - .. "tooltip[end_list;" .. F(S("Last page")) .. "]" - else - formspec[n] = - "image_button[" .. (8.2 + 0.65 * 0) - .. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]" - .. "tooltip[start_list;" .. F(S("First page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 1) - .. ",5.8;.8,.8;ui_left_icon.png;rewind1;]" - .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 2) - .. ",5.8;.8,.8;ui_right_icon.png;forward1;]" - .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 3) - .. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]" - .. "tooltip[end_list;" .. F(S("Last page")) .. "]" - end - n = n+1 - -- Search box formspec[n] = "field_close_on_enter[searchbox;false]" - n = n+1 - if not draw_lite_mode then - formspec[n] = "field[9.5,8.325;3,1;searchbox;;" - .. F(unified_inventory.current_searchbox[player_name]) .. "]" - formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - formspec[n+2] = "image_button[12.9,8.1;.8,.8;ui_reset_icon.png;searchresetbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" - else - formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;" - .. F(unified_inventory.current_searchbox[player_name]) .. "]" - formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - formspec[n+2] = "image_button[11,5;.8,.8;ui_reset_icon.png;searchresetbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" + formspec[n+1] = "field["..ui_peruser.page_buttons_x..",".. + ui_peruser.page_buttons_y..";".. + (ui_peruser.searchwidth - 0.1)..",".. + ui_peruser.btn_size..";searchbox;;".. + F(unified_inventory.current_searchbox[player_name]) .. "]" + formspec[n+2] = "image_button["..(ui_peruser.page_buttons_x + ui_peruser.searchwidth)..",".. + ui_peruser.page_buttons_y..";".. + ui_peruser.btn_size..","..ui_peruser.btn_size.. + ";ui_search_icon.png;searchbutton;]".. + "tooltip[searchbutton;" ..F(S("Search")) .. "]" + formspec[n+3] = "image_button["..(ui_peruser.page_buttons_x + ui_peruser.searchwidth + ui_peruser.btn_spc)..",".. + ui_peruser.page_buttons_y..";".. + ui_peruser.btn_size..","..ui_peruser.btn_size.. + ";ui_reset_icon.png;searchresetbutton;]".. + "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" + + n = n + 4 + + -- Controls to flip items pages + + local btnlist = { + { "ui_skip_backward_icon.png", "start_list", "First page" }, + { "ui_doubleleft_icon.png", "rewind3", "Back three pages" }, + { "ui_left_icon.png", "rewind1", "Back one page" }, + { "ui_right_icon.png", "forward1", "Forward one page" }, + { "ui_doubleright_icon.png", "forward3", "Forward three pages" }, + { "ui_skip_forward_icon.png", "end_list", "Last page" }, + } + + if draw_lite_mode then + btnlist[5] = nil + btnlist[2] = nil + end + + local bn = 0 + for _, b in pairs(btnlist) do + formspec[n] = "image_button[".. + (ui_peruser.page_buttons_x + ui_peruser.btn_spc*bn)..",".. + (ui_peruser.page_buttons_y + ui_peruser.btn_spc)..";".. + ui_peruser.btn_size..",".. + ui_peruser.btn_size..";".. + b[1]..";"..b[2]..";]".. + "tooltip["..b[2]..";"..F(S(b[3])).."]" + bn = bn + 1 + n = n + 1 end - n = n+3 local no_matches = S("No matching items") if draw_lite_mode then @@ -211,7 +228,7 @@ function unified_inventory.get_formspec(player, page) -- Items list if #unified_inventory.filtered_items_list[player_name] == 0 then - formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";" .. F(no_matches) .. "]" + formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]" else local dir = unified_inventory.active_search_direction[player_name] local list_index = unified_inventory.current_index[player_name] @@ -239,8 +256,8 @@ function unified_inventory.get_formspec(player, page) local button_name = "item_button_" .. dir .. "_" .. unified_inventory.mangle_for_formspec(name) - formspec[n] = ("item_image_button[%f,%f;.81,.81;%s;%s;]"):format( - 8.2 + x * 0.7, ui_peruser.formspec_y + ui_peruser.page_y + y * 0.7, + formspec[n] = ("item_image_button[%f,%f;"..ui_peruser.btn_size..","..ui_peruser.btn_size..";%s;%s;]"):format( + ui_peruser.page_x + x * ui_peruser.btn_spc, ui_peruser.page_y + y * ui_peruser.btn_spc, name, button_name ) formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format( @@ -252,14 +269,14 @@ function unified_inventory.get_formspec(player, page) end end end - formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F(S("Page")) .. ": " + formspec[n] = "label["..ui_peruser.page_x..","..formheadery..";"..F(S("Page")) .. ": " .. S("@1 of @2",page2,pagemax).."]" end n= n+1 if unified_inventory.activefilter[player_name] ~= "" then - formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F(S("Filter")) .. ":]" - formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..F(unified_inventory.activefilter[player_name]).."]" + formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.55)..";" .. F(S("Filter")) .. ":]" + formspec[n+1] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.2)..";"..F(unified_inventory.activefilter[player_name]).."]" end return table.concat(formspec, "") end diff --git a/register.lua b/register.lua index cfc1d7d..df7f5d1 100644 --- a/register.lua +++ b/register.lua @@ -1,6 +1,7 @@ local S = minetest.get_translator("unified_inventory") local NS = function(s) return s end local F = minetest.formspec_escape +local inv_voffs = 4.75 minetest.register_privilege("creative", { description = S("Can use the creative inventory"), @@ -12,7 +13,6 @@ minetest.register_privilege("ui_full", { give_to_singleplayer = false, }) - local trash = minetest.create_detached_inventory("trash", { --allow_put = function(inv, listname, index, stack, player) -- if unified_inventory.is_creative(player:get_player_name()) then @@ -166,26 +166,30 @@ unified_inventory.register_button("clear_inv", { unified_inventory.register_page("craft", { get_formspec = function(player, perplayer_formspec) - local formspecy = perplayer_formspec.formspec_y - local formheadery = perplayer_formspec.form_header_y + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local craftx = perplayer_formspec.craft_x + local crafty = perplayer_formspec.craft_y + local inv_voffs = perplayer_formspec.inv_voffs + local craftresultx = craftx + 5 local player_name = player:get_player_name() - local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]" - formspec = formspec..string.gsub(unified_inventory.standard_inv_bg, "YYY", (formspecy + 3.4)) - formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]" + local formspec = "image["..craftx..","..crafty..";"..(uninv.imgscale*6)..","..(uninv.imgscale*3)..";ui_crafting_form.png]" + formspec = formspec..perplayer_formspec.standard_inv_bg + formspec = formspec.."label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]" formspec = formspec.."listcolors[#00000000;#00000000]" - formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]" - formspec = formspec.."list[current_player;craft;2,"..formspecy..";3,3;]" + formspec = formspec.."list[current_player;craftpreview;"..(craftresultx+0.15)..","..(crafty+0.15)..";1,1;]" + formspec = formspec.."list[current_player;craft;"..(craftx+0.15)..","..(crafty+0.15)..";3,3;]" if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec = formspec.."label[7,"..(formspecy + 1.5)..";" .. F(S("Trash:")) .. "]" - formspec = formspec.."background[7,"..(formspecy + 2)..";1,1;ui_single_slot.png]" - formspec = formspec.."list[detached:trash;main;7,"..(formspecy + 2)..";1,1;]" + formspec = formspec.."label["..(craftx+6.45)..","..(crafty + 2.4)..";" .. F(S("Trash:")) .. "]" + formspec = formspec.."image["..(craftx+6.25)..","..(crafty + 2.5)..";"..uninv.imgscale..","..uninv.imgscale..";ui_trash_slot.png]" + formspec = formspec.."list[detached:trash;main;"..(craftx+6.4)..","..(crafty + 2.65)..";1,1;]" end formspec = formspec.."listring[current_name;craft]" formspec = formspec.."listring[current_player;main]" if unified_inventory.is_creative(player_name) then - formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F(S("Refill:")) .. "]" - formspec = formspec.."list[detached:"..F(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]" + formspec = formspec.."label["..(craftx-2.3)..","..(crafty + 2.4)..";" .. F(S("Refill:")) .. "]" + formspec = formspec.."list[detached:"..F(player_name).."refill;main;"..(craftx-2.35)..","..(crafty + 2.65)..";1,1;]" end return {formspec=formspec} end, @@ -260,16 +264,18 @@ local other_dir = { unified_inventory.register_page("craftguide", { get_formspec = function(player, perplayer_formspec) - local formspecy = perplayer_formspec.formspec_y + local craftx = perplayer_formspec.craft_x + local crafty = perplayer_formspec.craft_y + local craftarrowx = craftx + 3.75 + local craftresultx = craftx + 5 + local formheaderx = perplayer_formspec.form_header_x local formheadery = perplayer_formspec.form_header_y - local craftresultx = perplayer_formspec.craft_result_x - local craftresulty = perplayer_formspec.craft_result_y local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) local fs = { - string.gsub(unified_inventory.standard_inv_bg, "YYY", (formspecy + 3.4)), - "label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]", + perplayer_formspec.standard_inv_bg, + "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", "listcolors[#00000000;#00000000]" } local item_name = unified_inventory.current_item[player_name] @@ -298,39 +304,44 @@ unified_inventory.register_page("craftguide", { end local has_give = player_privs.give or unified_inventory.is_creative(player_name) - fs[#fs + 1] = "background[0.5,"..(formspecy + 0.2)..";8,3;ui_craftguide_form.png]" + fs[#fs + 1] = "image["..craftarrowx..","..crafty..";1.25,1.25;ui_crafting_arrow.png]" fs[#fs + 1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", - craftresultx, craftresulty, F(role_text[dir]), item_name_shown) - fs[#fs + 1] = stack_image_button(0, formspecy, 1.1, 1.1, - "item_button_" .. rdir .. "_", ItemStack(item_name)) + craftx-2.3, perplayer_formspec.resultstr_y, F(role_text[dir]), item_name_shown) + + local giveme_form = table.concat({ + "label[".. (craftx-2.3).."," .. (crafty + 2.7) .. ";" .. F(S("Give me:")) .. "]", + "button["..(craftx-2.4).."," .. (crafty + 2.9) .. ";0.5,0.5;craftguide_giveme_1;1]", + "button["..(craftx-1.85).."," .. (crafty + 2.9) .. ";0.5,0.5;craftguide_giveme_10;10]", + "button["..(craftx-1.3).."," .. (crafty + 2.9) .. ";0.5,0.5;craftguide_giveme_99;99]" + }) if not craft then -- No craft recipes available for this item. - fs[#fs + 1] = "label[5.5,"..(formspecy + 2.35)..";" + fs[#fs + 1] = "label["..(craftx+2.5)..","..(crafty+1.5)..";" .. F(no_recipe_text[dir]) .. "]" - local no_pos = dir == "recipe" and 4.5 or 6.5 - local item_pos = dir == "recipe" and 6.5 or 4.5 - fs[#fs + 1] = "image["..no_pos..","..formspecy..";1.1,1.1;ui_no.png]" - fs[#fs + 1] = stack_image_button(item_pos, formspecy, 1.1, 1.1, + local no_pos = dir == "recipe" and (craftx+2.5) or craftresultx + local item_pos = dir == "recipe" and craftresultx or (craftx+2.5) + fs[#fs + 1] = "image["..no_pos..","..crafty..";1.2,1.2;ui_no.png]" + fs[#fs + 1] = stack_image_button(item_pos, crafty, 1.2, 1.2, "item_button_" .. other_dir[dir] .. "_", ItemStack(item_name)) if has_give then - fs[#fs + 1] = "label[0," .. (formspecy + 2.10) .. ";" .. F(S("Give me:")) .. "]" - .. "button[0, " .. (formspecy + 2.7) .. ";0.6,0.5;craftguide_giveme_1;1]" - .. "button[0.6," .. (formspecy + 2.7) .. ";0.7,0.5;craftguide_giveme_10;10]" - .. "button[1.3," .. (formspecy + 2.7) .. ";0.8,0.5;craftguide_giveme_99;99]" + fs[#fs + 1] = giveme_form end return { formspec = table.concat(fs) } + else + fs[#fs + 1] = stack_image_button(craftresultx, crafty, 1.2, 1.2, + "item_button_" .. rdir .. "_", ItemStack(craft.output)) + fs[#fs + 1] = stack_image_button(craftx-2.3, crafty, 1.2, 1.2, + "item_button_usage_", ItemStack(item_name)) end local craft_type = unified_inventory.registered_craft_types[craft.type] or unified_inventory.craft_type_defaults(craft.type, {}) if craft_type.icon then fs[#fs + 1] = string.format("image[%f,%f;%f,%f;%s]", - 5.7, (formspecy + 0.05), 0.5, 0.5, craft_type.icon) + craftarrowx+0.1, crafty + 0.95, 1, 1, craft_type.icon) end - fs[#fs + 1] = "label[5.5,"..(formspecy + 1)..";" .. F(craft_type.description).."]" - fs[#fs + 1] = stack_image_button(6.5, formspecy, 1.1, 1.1, - "item_button_usage_", ItemStack(craft.output)) + fs[#fs + 1] = "label["..(craftarrowx+0.15)..","..(crafty+0.2)..";" .. F(craft_type.description).."]" local display_size = craft_type.dynamic_display_size and craft_type.dynamic_display_size(craft) @@ -341,11 +352,12 @@ unified_inventory.register_page("craftguide", { -- This keeps recipes aligned to the right, -- so that they're close to the arrow. - local xoffset = 5.5 + local xoffset = craftx+3.75 + local bspc = 1.25 -- Offset factor for crafting grids with side length > 4 local of = (3/math.max(3, math.max(display_size.width, display_size.height))) local od = 0 - -- Minimum grid size at which size optimazation measures kick in + -- Minimum grid size at which size optimization measures kick in local mini_craft_size = 6 if display_size.width >= mini_craft_size then od = math.max(1, display_size.width - 2) @@ -354,12 +366,12 @@ unified_inventory.register_page("craftguide", { -- Size modifier factor local sf = math.min(1, of * (1.05 + 0.05*od)) -- Button size - local bsize_h = 1.1 * sf - local bsize_w = bsize_h - if display_size.width >= mini_craft_size then - bsize_w = 1.175 * sf + local bsize = 1.2 * sf + + if display_size.width >= mini_craft_size then -- it's not a normal 3x3 grid + bsize = 0.8 * sf end - if (bsize_h > 0.35 and display_size.width) then + if (bsize > 0.35 and display_size.width) then for y = 1, display_size.height do for x = 1, display_size.width do local item @@ -369,44 +381,41 @@ unified_inventory.register_page("craftguide", { -- Flipped x, used to build formspec buttons from right to left local fx = display_size.width - (x-1) -- x offset, y offset - local xof = (fx-1) * of + of - local yof = (y-1) * of + 1 + local xof = ((fx-1) * of + of) * bspc + local yof = ((y-1) * of + 1) * bspc if item then fs[#fs + 1] = stack_image_button( - xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h, + xoffset - xof, crafty - 1.25 + yof, bsize, bsize, "item_button_recipe_", ItemStack(item)) else -- Fake buttons just to make grid fs[#fs + 1] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", - xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h) + xoffset - xof, crafty - 1.25 + yof, bsize, bsize) end end end else -- Error fs[#fs + 1] = string.format("label[2,%f;%s]", - formspecy, F(S("This recipe is too@nlarge to be displayed."))) + crafty, F(S("This recipe is too@nlarge to be displayed."))) end if craft_type.uses_crafting_grid and display_size.width <= 3 then - fs[#fs + 1] = "label[0," .. (formspecy + 0.9) .. ";" .. F(S("To craft grid:")) .. "]" - .. "button[0, " .. (formspecy + 1.5) .. ";0.6,0.5;craftguide_craft_1;1]" - .. "button[0.6," .. (formspecy + 1.5) .. ";0.7,0.5;craftguide_craft_10;10]" - .. "button[1.3," .. (formspecy + 1.5) .. ";0.8,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + fs[#fs + 1] = "label["..(craftx-2.3).."," .. (crafty + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + .. "button[".. (craftx-2.4).."," .. (crafty + 1.9) .. ";0.5,0.5;craftguide_craft_1;1]" + .. "button[".. (craftx-1.85)..",".. (crafty + 1.9) .. ";0.5,0.5;craftguide_craft_10;10]" + .. "button[".. (craftx-1.3).."," .. (crafty + 1.9) .. ";0.5,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" end if has_give then - fs[#fs + 1] = "label[0," .. (formspecy + 2.1) .. ";" .. F(S("Give me:")) .. "]" - .. "button[0, " .. (formspecy + 2.7) .. ";0.6,0.5;craftguide_giveme_1;1]" - .. "button[0.6," .. (formspecy + 2.7) .. ";0.7,0.5;craftguide_giveme_10;10]" - .. "button[1.3," .. (formspecy + 2.7) .. ";0.8,0.5;craftguide_giveme_99;99]" + fs[#fs + 1] = giveme_form end if alternates and alternates > 1 then - fs[#fs + 1] = "label[5.5," .. (formspecy + 1.6) .. ";" + fs[#fs + 1] = "label["..(craftx+4).."," .. (crafty + 2.3) .. ";" .. F(S(recipe_text[dir], alternate, alternates)) .. "]" - .. "image_button[5.5," .. (formspecy + 2) .. ";1,1;ui_left_icon.png;alternate_prev;]" - .. "image_button[6.5," .. (formspecy + 2) .. ";1,1;ui_right_icon.png;alternate;]" + .. "image_button["..(craftarrowx+0.2).."," .. (crafty + 2.6) .. ";1.1,1.1;ui_left_icon.png;alternate_prev;]" + .. "image_button["..(craftarrowx+1.35).."," .. (crafty + 2.6) .. ";1.1,1.1;ui_right_icon.png;alternate;]" .. "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" .. "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" end diff --git a/textures/ui_bags_header.png b/textures/ui_bags_header.png index f9bf1dd..c7a9c38 100644 Binary files a/textures/ui_bags_header.png and b/textures/ui_bags_header.png differ diff --git a/textures/ui_bags_inv_large.png b/textures/ui_bags_inv_large.png index a3725ee..5d006fb 100644 Binary files a/textures/ui_bags_inv_large.png and b/textures/ui_bags_inv_large.png differ diff --git a/textures/ui_bags_inv_medium.png b/textures/ui_bags_inv_medium.png index 5924f54..b31bfa1 100644 Binary files a/textures/ui_bags_inv_medium.png and b/textures/ui_bags_inv_medium.png differ diff --git a/textures/ui_bags_inv_small.png b/textures/ui_bags_inv_small.png index 6776754..d24f0c5 100644 Binary files a/textures/ui_bags_inv_small.png and b/textures/ui_bags_inv_small.png differ diff --git a/textures/ui_bags_trash.png b/textures/ui_bags_trash.png deleted file mode 100644 index 8247130..0000000 Binary files a/textures/ui_bags_trash.png and /dev/null differ diff --git a/textures/ui_craftguide_form.png b/textures/ui_craftguide_form.png deleted file mode 100644 index d9be53f..0000000 Binary files a/textures/ui_craftguide_form.png and /dev/null differ diff --git a/textures/ui_crafting_arrow.png b/textures/ui_crafting_arrow.png new file mode 100644 index 0000000..4648f9b Binary files /dev/null and b/textures/ui_crafting_arrow.png differ diff --git a/textures/ui_crafting_form.png b/textures/ui_crafting_form.png index 9043287..6459346 100644 Binary files a/textures/ui_crafting_form.png and b/textures/ui_crafting_form.png differ diff --git a/textures/ui_main_inventory.png b/textures/ui_main_inventory.png index b9a0545..495a54e 100644 Binary files a/textures/ui_main_inventory.png and b/textures/ui_main_inventory.png differ diff --git a/textures/ui_misc_form.png b/textures/ui_misc_form.png index c6a6057..eea0dba 100644 Binary files a/textures/ui_misc_form.png and b/textures/ui_misc_form.png differ diff --git a/textures/ui_single_slot.png b/textures/ui_single_slot.png index 63da98d..a732bd1 100644 Binary files a/textures/ui_single_slot.png and b/textures/ui_single_slot.png differ diff --git a/textures/ui_single_slot_bright.png b/textures/ui_single_slot_bright.png new file mode 100644 index 0000000..daddc02 Binary files /dev/null and b/textures/ui_single_slot_bright.png differ diff --git a/textures/ui_trash_slot.png b/textures/ui_trash_slot.png new file mode 100644 index 0000000..4bd4909 Binary files /dev/null and b/textures/ui_trash_slot.png differ diff --git a/unified inventory single slot 256px with trash.xcf b/unified inventory single slot 256px with trash.xcf new file mode 100644 index 0000000..1d337ce Binary files /dev/null and b/unified inventory single slot 256px with trash.xcf differ diff --git a/waypoints.lua b/waypoints.lua index 97712b7..fd4ae7a 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -17,20 +17,27 @@ local waypoints_temp = {} unified_inventory.register_page("waypoints", { get_formspec = function(player) local player_name = player:get_player_name() + local wp_info_x = unified_inventory.form_header_x + 1.25 + local wp_info_y = unified_inventory.form_header_y + 0.5 + local wp_bottom_row = unified_inventory.std_inv_y - 1 + local wp_buttons_rj = unified_inventory.std_inv_x + 10.1 - unified_inventory.btn_spc + local wp_edit_w = unified_inventory.btn_spc * 4 - 0.1 -- build a "fake" temp entry if the server took too long -- during sign-on and returned an empty entry if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end local waypoints = datastorage.get(player_name, "waypoints") - local formspec = string.gsub(unified_inventory.standard_inv_bg, "YYY", "4.4") .. - "image[0,0;1,1;ui_waypoints_icon.png]" .. - "label[1,0;" .. F(S("Waypoints")) .. "]" + local formspec = unified_inventory.standard_inv_bg.. + "label["..unified_inventory.form_header_x..","..unified_inventory.form_header_y..";" .. F(S("Waypoints")) .. "]".. + "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" -- Tabs buttons: - for i = 1, 5, 1 do + for i = 1, 5 do formspec = formspec .. - "image_button[0.0," .. 0.2 + i * 0.7 .. ";.8,.8;" .. + "image_button["..unified_inventory.main_button_x..",".. + (wp_bottom_row - (5-i) * unified_inventory.btn_spc)..";".. + unified_inventory.btn_size..","..unified_inventory.btn_size..";" .. (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. "ui_" .. i .. "_icon.png;" .. "select_waypoint" .. i .. ";]" .. @@ -44,65 +51,52 @@ unified_inventory.register_page("waypoints", { local default_name = S("Waypoint @1", i) -- Main buttons: - formspec = formspec .. - "image_button[4.5,3.7;.8,.8;".. - "ui_waypoint_set_icon.png;".. - "set_waypoint"..i..";]".. - "tooltip[set_waypoint" .. i .. ";" - .. F(S("Set waypoint to current location")).."]" + -- note: the @1's in the set, arrow, and pencil tooltips are dummies. + local btnlist = { + { "ui_waypoint_set_icon.png", "set_waypoint", "Set waypoint to current location@1" }, + { waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", "toggle_waypoint", "Make waypoint @1", waypoint.active and "invisible" or "visible" }, + { waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png", "toggle_display_pos", "@1 display of waypoint coordinates", waypoint.display_pos and "Disable" or "Enable" }, + { "ui_circular_arrows_icon.png", "toggle_color", "Change color of waypoint display@1" }, + { "ui_pencil_icon.png", "rename_waypoint", "Edit waypoint name@1" } + } - formspec = formspec .. - "image_button[5.2,3.7;.8,.8;".. - (waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";".. - "toggle_waypoint"..i..";]".. - "tooltip[toggle_waypoint" .. i .. ";" - .. F(S("Make waypoint @1", - waypoint.active and S("invisible") or S("visible"))).."]" - - formspec = formspec .. - "image_button[5.9,3.7;.8,.8;".. - (waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;".. - "toggle_display_pos" .. i .. ";]".. - "tooltip[toggle_display_pos" .. i .. ";" - .. F(S("@1 display of waypoint coordinates", - waypoint.display_pos and S("Disable") or S("Enable"))) .."]" - - formspec = formspec .. - "image_button[6.6,3.7;.8,.8;".. - "ui_circular_arrows_icon.png;".. - "toggle_color"..i..";]".. - "tooltip[toggle_color" .. i .. ";" - .. F(S("Change color of waypoint display")).."]" - - formspec = formspec .. - "image_button[7.3,3.7;.8,.8;".. - "ui_pencil_icon.png;".. - "rename_waypoint"..i..";]".. - "tooltip[rename_waypoint" .. i .. ";" - .. F(S("Edit waypoint name")).."]" + local x = 4 + for _, b in pairs(btnlist) do + formspec = formspec .. + "image_button["..(wp_buttons_rj - unified_inventory.btn_spc * x)..",".. + wp_bottom_row..";".. + unified_inventory.btn_size..","..unified_inventory.btn_size..";".. + b[1]..";".. + b[2]..i..";]".. + "tooltip["..b[2]..i..";"..F(S(b[3], b[4] or "")).."]" + x = x - 1 + end -- Waypoint's info: + formspec = formspec.."label["..wp_info_x..","..(wp_info_y+1.1)..";" if waypoint.active then - formspec = formspec .. "label[1,0.8;"..F(S("Waypoint active")).."]" + formspec = formspec ..F(S("Waypoint active")).."]" else - formspec = formspec .. "label[1,0.8;"..F(S("Waypoint inactive")).."]" + formspec = formspec ..F(S("Waypoint inactive")).."]" end if temp.edit then formspec = formspec .. - "field[1.3,3.2;6,.8;rename_box" .. i .. ";;" - ..(waypoint.name or default_name).."]" .. - "image_button[7.3,2.9;.8,.8;".. + "field["..(wp_buttons_rj - wp_edit_w - 0.1)..","..(wp_bottom_row - unified_inventory.btn_spc)..";".. + wp_edit_w..","..unified_inventory.btn_size..";rename_box" .. i .. ";;".. + (waypoint.name or default_name).."]" .. + "image_button["..wp_buttons_rj..","..(wp_bottom_row - unified_inventory.btn_spc)..";".. + unified_inventory.btn_size..","..unified_inventory.btn_size..";".. "ui_ok_icon.png;".. "confirm_rename"..i.. ";]".. "tooltip[confirm_rename" .. i .. ";" .. F(S("Finish editing")).."]" end - formspec = formspec .. "label[1,1.3;"..F(S("World position"))..": " .. + formspec = formspec .. "label["..wp_info_x..","..(wp_info_y+1.6)..";"..F(S("World position"))..": " .. minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" .. - "label[1,1.8;"..F(S("Name"))..": ".. (waypoint.name or default_name) .. "]" .. - "label[1,2.3;"..F(S("HUD text color"))..": " .. + "label["..wp_info_x..","..(wp_info_y+2.10)..";"..F(S("Name"))..": ".. (waypoint.name or default_name) .. "]" .. + "label["..wp_info_x..","..(wp_info_y+2.60)..";"..F(S("HUD text color"))..": " .. hud_colors[waypoint.color or 1][3] .. "]" return {formspec=formspec}