From 167dddaa84f8b0e65bd054c6ee0195e888199646 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Fri, 5 Mar 2021 10:58:18 -0500 Subject: [PATCH] Convert over to formspec version 4 I recreated the original layout as best as practical, but by necessity there are a few minor positioning changes, since the underlying hard-wired inventory slots are square now and image positioning is now scaled by exactly 1.250 in both dimensions (as opposed to roughly 1.25 by 1.16). Backstage, I also needed to fix the aspect ratios of the various inventory slot elements. That meant redesigning the single-slot image from scratch. It was already blurry/grainy and a little ugly, and trying to alter it would have only made it worse. The slot image is now exactly 56x56 pixels square, set on a 64x64 canvas, so there's a 4 pixel empty space around the edges. The full 256px .xcf workfile is included in the UI folder. I've re-tiled all slot/inv images from the new single slot. I also re-rendered the trash can icon from it since it was blurry and oddly-sized. I couldn't find the original upstream image, so since they're free, I used one of my Linux system's icons which happens to resemble it. I also removed a couple more improper uses of `background[]` where `image[]` is more appropriate. There are tons of minor tweaks throughout the code to re-align everything, and I had to rewrite a few sections to avoid code duplication and to allow for a little more flexibility (mainly to make "lite" mode look right). --- bags.lua | 49 ++--- init.lua | 36 +++- internal.lua | 189 ++++++++++-------- register.lua | 125 ++++++------ textures/ui_bags_header.png | Bin 1241 -> 1243 bytes textures/ui_bags_inv_large.png | Bin 3401 -> 2767 bytes textures/ui_bags_inv_medium.png | Bin 2300 -> 1900 bytes textures/ui_bags_inv_small.png | Bin 1232 -> 1029 bytes textures/ui_bags_trash.png | Bin 1157 -> 0 bytes textures/ui_craftguide_form.png | Bin 962 -> 0 bytes textures/ui_crafting_arrow.png | Bin 0 -> 941 bytes textures/ui_crafting_form.png | Bin 2343 -> 3598 bytes textures/ui_main_inventory.png | Bin 4467 -> 3930 bytes textures/ui_misc_form.png | Bin 5789 -> 4020 bytes textures/ui_single_slot.png | Bin 629 -> 728 bytes textures/ui_single_slot_bright.png | Bin 0 -> 898 bytes textures/ui_trash_slot.png | Bin 0 -> 1056 bytes ...inventory single slot 256px with trash.xcf | Bin 0 -> 172298 bytes waypoints.lua | 90 ++++----- 19 files changed, 263 insertions(+), 226 deletions(-) delete mode 100644 textures/ui_bags_trash.png delete mode 100644 textures/ui_craftguide_form.png create mode 100644 textures/ui_crafting_arrow.png create mode 100644 textures/ui_single_slot_bright.png create mode 100644 textures/ui_trash_slot.png create mode 100644 unified inventory single slot 256px with trash.xcf 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 f9bf1dd8fc6f88bb368143f28bace184e5125001..c7a9c381672f74d9da05ab16e80c4d318d406720 100644 GIT binary patch literal 1243 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 literal 3401 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 O5abzWn@TIc+y4QNH<3{Q diff --git a/textures/ui_bags_inv_medium.png b/textures/ui_bags_inv_medium.png index 5924f54661010db89ab6dba906da683e608da064..b31bfa18e3a97b6516ed8a57c49caf0d5d1b46e7 100644 GIT binary patch literal 1900 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 NSeP(uXnXJx+J8?}Q>Op` diff --git a/textures/ui_bags_trash.png b/textures/ui_bags_trash.png deleted file mode 100644 index 824713092ff04d8eae8d59dc1e90c489d472c28d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1157 zcmV;01bX|4P) zohN_;NKvF5BD3~WM8cFcr{O>Ag>Uw{L<#H2%yS_xl+i4vvyBvqbk=N2Bkcdt)(gC0& zB__qz7P`iuJ6Y2m09s-uOi3zFNCb$@0~X1hF(V-*t)*BpBY+MPt=cDdMvOzCYdUnq zK;A*3Rr};7I5bfW#FCL>$vQ~1YNOVeGbUsN$hipSIAU@V0`i)8ny6c~QES4Kzp+Tv z-1#vjVTMH#V2N9)TeVTEB`wz<#B(WL?r)-Q)kdv3pvVaTi+iKLiMmxAwfgU}{_0k3 z)atK#e|4`N!D8*nRuRn02wDuL+cjuOn85|L`dV6k3fNk)>QKem1y%Z|I3@Pn8`k>o z07*!KB_VBel=`>G2WUc%JgD{5r-`sQVk`oQ^o*m$k>L=SqUTuqq`VfO#6UR;u}H>5 zgnpwJrq#1!MwqpK;Mx%syj+QOs9)dOr_3EK@R6RdS1BzRDx}2F%Nn7XN<8w9UAcv1*L zkD-S*V3D#JF)7p9D1F@}p)m}+TTsskifZnhdaAw{8x1^$9*x$Z1adNu0c2sCkO2eF zky9fT7l}6BDb@|=3(CI&Y6QkJg6Hp;dH@W(hnJo0#oKdZVe1bI!7@OxCGnHUxqEkN zy8w%K09oz*Ud1I}<(|sC3JVDdG3ZwdfcB}~IG)CoL-x@x3xLU~W3z}7!;mo{A*0hp zz~_kr*|3~;5xs~#_8Fqkh-V9cKga1~P=shSqDM@DX2_TW-r`yTc=B1iq~x54{l5+l z4FPWM>cmy+Rw9WQGGbJm!C$^Udf=9BA77dMKg?l>MxlDzSpo!#kO2mPz`dN_{y1K_ zzkMytqv5wvt2Z0|fC7asLUJ?sw!7k*S&l9&YU?DD0Sh&h3V6$&jy3{ z@8AFZ`}fP2FFC&Zb+qMBM1zNFg-MYBAxE(uo zT)TEHKR^Hb_wT;GzCfn}-5eSkdh6D$($dnhva+>n*S5B{-nemN(xgd1m)P6ecXoDe z*|KHRrcDbMF5IEakt5%>0vYjH@RK*PmzE^3^O67SyW z<*TgQv3vLL|K@3qj-g?bSy}hkr5FD{5FT58S@tw2lA++hiHsDtuW2dAKHPZa(ZhQ^ zZ++*U6@K^kZnV9$=+}dbtNEP+)z+-v@+Ca)Z`jH|HPc?*w~Vcct`SN-H0@-PrIc~{ zb+gE|{^qyfXNSYQv&$TO!0WITMQhe4QOUahm;sKg-WAUuTYdS2nD=@0K>lLh`>U z%x_@&Mb{OHjw=y@D>rKWqMth^|`6r5!k z7#JMFmmG8WlX`>uKpcY_S>__#V%_+~C9A|Gi^nbN%TakYpy>>M7?>Cv4hjF;KN-aH MboFyt=akR{0KFTassI20 diff --git a/textures/ui_crafting_arrow.png b/textures/ui_crafting_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4648f9bda200e0bc91df3d1fbc23ab79c0b0eb44 GIT binary patch literal 941 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 literal 2343 zcma)8c|4Ts9)D?$Gs!Yz%dup7W$AD%sgRv9hA`Br6lIyIAraY^XeLQUldWcuu_SJX zvd(ZRLndp7QehCHLy}R^plP@>y61Cm=bn4+eg1eqzvuV3VB zTgDZwqRH;}TB?T3J91Xb&yM=p^5mcK+aZ_|V`=u4u?*URM)Oh*d`=?O#&BOjesjnp z5IbC%%Q0q{2NkGBp5?q54U*iXp1luiy@U11B*m+jX0d4adx_=N-i7G!t&*Y{0cZeg z6wG@4^VHIQW05-VJulCmi8+%vlmFddtu-z-^Mma7Yn@}u*HBLqUW6w;4APRNompkr zgU{pw`in;9-#xf4;?MMJOq6NW(u)(TxufM1t%Pe>qeuetN1T^2ptkODK>gu!qmUgT zlqg`hlFBJS`T)r0oeJuLSuO{oc?tDPA^(@zwWM_{m}-rLr)Z19?GeRLq#Pjygt
ZEv7VNgIIfqiM#UpE34`10a@rQScZjR5> zXw+Z-qBUw`P6wG^j7e#5!?byX=-ySn>(E9 z3Jx4ewT=u`Q}31ya5r%19bb`lxv^@Q7$STvt8w0O?3q1lFYXPe%qJ*YO)Mw?ortl? zxr+9__1B4%bNW^Yv-jspdgTZes9>J`jvCeS^|r*BQp1`&wSKeU1w+zOBwGBywh7vP z?yg!#IJ$M0PF^JS=xr#gI;n?xJk@$Sa>(*jPJ$wdpIeF8{LSXK7?k!6p@fjjf}+t> z%WEAXLpT?nd_O;{NqGfqH7MOV+1cgjXeV}ot5eF;g1?jMa@b~2+LiUJ#F6ynSRh1r zrU`vPZLon+Hk=Gab}NWDxKi|XuBOyS-rMBQJl!}x^l{W_sx7kIrLYhoT;XYwL+IIYLn^oY0~$>1{=4hq$+jU2id2avdWTuHF|fH>@HSg%X`k9i1u$u;_BSy zT{Zg<+sh9ampWFJ;-0&s)RFN@FG7#Q49?gr#IN#*dqX|HCC%-vTf38oO2noSe{bAu@14#l$Cxws=`QH z?9rR}$j=YuNofI0lw9jGF57o`n%w(xz(AY#Q?*D2Y;X#3&NPnuxZ`WVRM@L8WQVAy z2v|-s#9;3f%Gq^~D>GcynzyGIx@}}U2H*Ng7nVcAePI!-YL@x8-~s|WHq7H5X8knI zK;v>jmwn+)`48%M0rP{&;0o(xpY`5P5DCmhiNW<6kwX5k8|2dMEj~zUtQZ->`6y-0 zqZdIXE_50{@`G%|V8)Mvqssgv9siW0|9|o^@K0KQv&0~6)`;;m;k-66DQR{wTIGVv zK%MuN)Ix&3j083pB;UN5y&DJkGxy51a?;~pi(qrjO5;p82}B}VJEGlpcMg^iBNJU8QIRMqEape*v^(?vVH0nHJaYGR$I5D;}P7wslhf zoN>IG&bf41%-NsmDkpNE7M3_%e^Ei#FI)3UKxRa|78XjYsNE`VVgrOq(Dk7zAygq*Mk3U1?s62 z)%^S@1+PBQj9JHajLM37+_;sJ4ewA^(uk|3Is0P}30bIKy6? z-HLy?cxQPEYTE^mRtldr#Gq6@zMYI{7dFr|p{scJ@M1V2CKXH2;kx(RrH%$RM^A_e zY+K$Q_$w(B$W62le5Gyhf)6_82QWG6R0|9iuFqrGOGw{a>^7;=_J_@U@|QQGw? jlec05o}Jtfv9&D{HJrW~MBtj>2MBPqcSYW_^&$QP6{$O_ diff --git a/textures/ui_main_inventory.png b/textures/ui_main_inventory.png index b9a054576f690ffe6da19efbf6d7d5a3a5534e78..495a54ef8223ad9e06c2259a1e9852f62c693a9b 100644 GIT binary patch literal 3930 zcmcgvdpy%^8=q57MGhsAIZP-aDp4777!R9JJ;|BKaoUtaSRO-#<`|koQc(_z$!Tn! z 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 literal 4467 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 J>7|?h`B$Kb45I)5 diff --git a/textures/ui_single_slot.png b/textures/ui_single_slot.png index 63da98d9188248e4fc8fa0f1d0a626af809e2b0f..a732bd1cb819d3123ad204ea15a22578a0a1c34b 100644 GIT binary patch literal 728 zcmV;}0w?{6P)vg@sMnWY{FTdo5;NHrd$7WFmOqQ_bAsJafJ-oPjfzn0|Ewjlh@e#vthPdFn(@ zK3pf`qtMPYuqUDYtvmwlRZs1Zulg<@PL9A`zKgkLv}{()yvmSeMnIy5bcgL>Yp~hr z%=tId0QcFqwbf+JEha9;Aj=E^07C{G=7(GTjs177_v$FXJqEV^sP;IUO|e8MM5zEC z&yWEF`W$W_t{=RNdM^M_0Jr%mEol8g zEt}17MCB&`ST86H5pFhJn`y?Q>Ht0oyPPhjB^I`;Wk2@|}Nt~^~ zeSsi|T(TnFvtkZJ=teXjpK9=rPX$FfZyRzCG$^FinJMbAB59H=vVJ@Xg^;q6@c))V zN+HHY_=iiOl1oT(#tHxdAOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=0RJbz1R+pZ zYBadOrERy-@9YAje@0(;fcj>4qnlA(Q(%;78iU1AV}^@d+0NF*YtdgCfsOQp$R?}t znpzaD{A36eF*VNRGh6Y7e@Aa&d@|Nk>OwV><#@%;+f0=_Bh}D$lXl!Pn|Vk3YZGV_ zdXDC*IB;1bwxZ-hP~P;+PCs}42TMm{Go|-rn9>VTq43<|pVKdgjE`x<1}LHc0000< KMNUMnLSTYEK}vxD literal 629 zcmV-*0*d{KP)1ONa4fwmRy0006!NklyonS3kDT19K7ItE#pdeToISix|Vy9qZ zr4Vcaf{h`C2v(*Mj0d?(+?{8!IbHP5#<`ruye(##f&J~9uVM!9;bS5}zg}*V26?wp0*mdZL{HlB?fbIG9f0r>3ZJtp7*@xJ@0wX zd*1V&_q^vl?|ILA-t+&$lk@ZYVL_vLu`S)8pvoh35H0EPfhJ=9uz*bkY z-)qHtHKKc5=57!nLJadM&MSQ1+KxmHF{W9-UgF<^dD})R3Wp7$MBN#`5vJGWNi}&)*)&>w!`zP{2CA%TWlCB10V-+{feQ>L07& z?m?b2ZDS-Pq|+fN`5Iy<%YAgB+sD2RS&R=4&_#Wnd*@%||425eoOowc&ziq($}ADZt7K*sUn$82_zDQMNRmXk?fw(HqV25Ey{~S>PwNt4KnW-TC7=Y9fD%vw{+|GG4PY>Qs2@dUdIClmHP@q1Ch($ literal 0 HcmV?d00001 diff --git a/textures/ui_trash_slot.png b/textures/ui_trash_slot.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd4909d598535d717a886151f481fc378c8835e GIT binary patch literal 1056 zcmV+*1mF9KP)jqK7G!)?>YCvOEz)(t9Q@{ zT*1>A1TjCJx}!%2Z&Tw3p+nQao`rT%a|pCkJ=G>!aUH%t+XEl)ySO{&EtzGrplZk> zJs?pjopd|hNH&|zyY8FQ03UK-t1H23xEO>!23e#F07yybNBymM{oqO1`}#P*0}@;R zxcW(Lwt~e&AqoX>I8qW4V*0KA+TmAT?@Is_z!9TGU6b6rQwz4`k=MS<2cq;5tWwAnlE^P+mKz*ppaJAOqP!& znI@=t)(w?V2q{Z(|B)%A6k?c!=M;rfijd?b+ckjBUr^i_os(A!u+Lv~NzZj=zzo%# z>6`Srp3qr)Cu?ozobfQT1>&mFuo?j|((hlpK*T!EMXAYqpn=#T(?o}J@? z9ss*21d_&?m=^@tp*w6-`}}dP#shSTGN~;NAp2=|Vxmc(E&xDaFQWCu0chU5z%D@- z=>bE+J^;bkqMgzs1-uF4p96HCUx?AnQyueE%x~-?nB}$Nbs#1lem7F`_A*dZB=O0S0Q*phVR16(&G*8u-_05@h-0)Qk$0|tv2j!Nl@ zGqcR2klebF+)tspA&dU zVu}awnC5_Vf)EJmxwa;H(p0&HAlIc2eq0DoUJQp)sj)gM&(q>B&xZgj!D2JuH=u?j>0W9JIxD zdH>(wQz6_A+I|M`Ejy9ia8WtaYXT}XqRNJfR*qJ|JtsEV;>wdzUZP*|!onBi6{T#uW3gX#hN#3R(NcF()-)ioJLk(b6`38^y0P2OnL z*2H5GKRn($e2Qm-6@OJNim>=#2oye5rlYAXf89NycW-!SXrECRYA#svm+gYBse(09 zrM44n`x|C6YHIh^2-=8!f#!}l3~LSFih>hCIny)kI11ek50Clglzm4HQ+OgO6pnX! aa)R0{oZ6ZV{q)9|%$ux|JEW<=3g|UTol_nvdU-|y#4@%HgGTj1ek zHqWL@7lI&2?gs%uM8Z!Kek97(hM!XZ2!cRA_|t(OAAZx|r^m$+pDz5a!cSugi08XJt2#cp4fJ-U%-sXW}dVB-Dgbh=;=0hYCDy-UQ;|~&6qXEtSu9CoHNDU z&8&-=4gBlU4#@5ek`V(#UNG0!&BJ@<6tix?8z7(H;vM~Gdi$Aq&-9o&c`mRlnC0a) zce0Kit+*~f+p$Ft#iB_^aq$JlVJ2NS+_ zsJrMWqV6{bE{U0k+e|ZWk6AMjBgJtmK!`5+VfdM&xVUTAt`MRsP(J!ohMz2MAs086 zi>t`R&E(=jxwxuaTqGA)hd6sm5P?5M_@Vlc{MK9?0-_a))9?qOrCeP0*vQTaNa&AR z$A;)wcR9H8ppsZx_m*7Po(<8lju+xQM>e1L9Tzee5Aqjr>9t(AjSbZnu%Y2YE-Yn3 zBQ_w~u(yopc7x66mc@l7T!_vM{<@=U!u$nm5X8s)84#~boi?P@nA3U?`|fy2jU}y1 z)DDO)t8Go|5R#F1s@l-ngmh$TJ6a0`*0d%HROl`!P@*Y<7V^mUgml0iC0at*l90cl zN`WQ`nzV)72MY8TY)*GV+5=Kjg0v>2ro$D+Nk;ou2q4XGN7SOK70c-g1=<=CP`f%J zv?U~_(G{AIC;hHWi`F0vY3cvfY9f+4#OWF>Bu2&I;Hlxb;gp;5jr zA>l8mhD2dUBLiJRs&`d|mgXDS5YoYAOsq2$T3pLTrNVe2B6lXFnpc>ZIU(ig3Js(k zav+Ihz!ysQwlH5>SPL1b2FNhT|APM5f$r@ukZ7Ln7Y4zkBi9OD9<+?9{$>SSHb$NU?M(e_7niB#<-P`

1|ygq8NSqHKIX2A6+9Lq8OcziGSBcAo7jq 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 literal 0 HcmV?d00001 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}