From ebd1d1f245aa092fe99c10188b2707cf004e4132 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Wed, 24 Feb 2021 07:00:29 -0500 Subject: [PATCH 01/46] Improve consistency of inventory (and alike) imagery In a number of places, background[] is misused to place the inventory backdrop images. Where appropriate, image[] is used instead, so that "ui_form_bg.png" actually serves as the one and only true background image. In so doing, I was able to remake the bag inventory images, making them only big as is actually needed to hold 1, 2, or 3 rows of inventory slots. This, in turn, allows a standardized main inventory image to occupy the lower part of the window, which allows for consistent inventory image positioning and sizing from one page to another. I also removed ui_misc_form.png. Nothing in UI uses it, and any external mods that used it can just use the standard inventory and its background. Lastly, I reduced the background image to 512x384 px. It was unnecessarily large before, considering it has no real detail. The larger inventory images are all 512px wide, and multiples of 64px in height. Before, they were oddly sized. --- bags.lua | 23 +++++++++++++---------- init.lua | 5 ++++- internal.lua | 6 +++--- register.lua | 4 ++-- textures/ui_bags_header.png | Bin 0 -> 1241 bytes textures/ui_bags_inv_large.png | Bin 0 -> 3401 bytes textures/ui_bags_inv_medium.png | Bin 0 -> 2300 bytes textures/ui_bags_inv_small.png | Bin 0 -> 1232 bytes textures/ui_bags_lg_form.png | Bin 8119 -> 0 bytes textures/ui_bags_main_form.png | Bin 6068 -> 0 bytes textures/ui_bags_med_form.png | Bin 7197 -> 0 bytes textures/ui_bags_sm_form.png | Bin 6411 -> 0 bytes textures/ui_bags_trash.png | Bin 1382 -> 1157 bytes textures/ui_form_bg.png | Bin 1650 -> 1003 bytes textures/ui_main_inventory.png | Bin 4112 -> 4467 bytes textures/ui_misc_form.png | Bin 5368 -> 5789 bytes waypoints.lua | 2 +- 17 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 textures/ui_bags_header.png create mode 100644 textures/ui_bags_inv_large.png create mode 100644 textures/ui_bags_inv_medium.png create mode 100644 textures/ui_bags_inv_small.png delete mode 100644 textures/ui_bags_lg_form.png delete mode 100644 textures/ui_bags_main_form.png delete mode 100644 textures/ui_bags_med_form.png delete mode 100644 textures/ui_bags_sm_form.png diff --git a/bags.lua b/bags.lua index c61c982..c1fffb5 100644 --- a/bags.lua +++ b/bags.lua @@ -7,17 +7,19 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local bags_inv_bg_prefix = "image[-0.1,0.9;10.05," unified_inventory.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ - "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]", + 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,0.5;bag1;" .. F(S("Bag @1", 1)) .. "]", - "button[2,2;2,0.5;bag2;" .. F(S("Bag @1", 2)) .. "]", - "button[4,2;2,0.5;bag3;" .. F(S("Bag @1", 3)) .. "]", - "button[6,2;2,0.5;bag4;" .. F(S("Bag @1", 4)) .. "]", + "button[0,2.1;2,0.5;bag1;" .. F(S("Bag @1", 1)) .. "]", + "button[2,2.1;2,0.5;bag2;" .. F(S("Bag @1", 2)) .. "]", + "button[4,2.1;2,0.5;bag3;" .. F(S("Bag @1", 3)) .. "]", + "button[6,2.1;2,0.5;bag4;" .. F(S("Bag @1", 4)) .. "]", "listcolors[#00000000;#00000000]", "list[detached:" .. F(player_name) .. "_bags;bag1;0.5,1;1,1;]", "list[detached:" .. F(player_name) .. "_bags;bag2;2.5,1;1,1;]", @@ -47,26 +49,27 @@ 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)) .. "]", "listcolors[#00000000;#00000000]", "list[current_player;bag" .. bag_i .. "contents;0,1;8,3;]", "listring[current_name;bag" .. bag_i .. "contents]", - "listring[current_player;main]" + "listring[current_player;main]", } local slots = stack:get_definition().groups.bagslots if slots == 8 then - fs[#fs + 1] = "background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]" + fs[#fs + 1] = bags_inv_bg_prefix.."1.175;ui_bags_inv_small.png]" elseif slots == 16 then - fs[#fs + 1] = "background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]" + fs[#fs + 1] = bags_inv_bg_prefix.."2.35;ui_bags_inv_medium.png]" elseif slots == 24 then - fs[#fs + 1] = "background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]" + fs[#fs + 1] = bags_inv_bg_prefix.."3.525;ui_bags_inv_large.png]" end 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] = "background[6.06,0;0.92,0.92;ui_bags_trash.png]" + fs[#fs + 1] = "image[6,0;1,1;ui_bags_trash.png]" .. "list[detached:trash;main;6,0.1;1,1;]" end local inv = player:get_inventory() diff --git a/init.lua b/init.lua index 1a80abb..7be101c 100644 --- a/init.lua +++ b/init.lua @@ -44,7 +44,10 @@ unified_inventory = { main_button_y = 9, craft_result_x = 0.3, craft_result_y = 0.5, - form_header_y = 0 + 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() } -- Disable default creative inventory diff --git a/internal.lua b/internal.lua index eeab695..78cba2a 100644 --- a/internal.lua +++ b/internal.lua @@ -65,13 +65,13 @@ function unified_inventory.get_formspec(player, page) local formspec = { "size[14,10]", pagedef.formspec_prepend and "" or "no_prepend[]", - "background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" -- Background + unified_inventory.standard_background -- Background } local n = 4 if draw_lite_mode then formspec[1] = "size[11,7.7]" - formspec[3] = "background[-0.19,-0.2;11.4,8.4;ui_form_bg.png]" + formspec[3] = unified_inventory.standard_background end if unified_inventory.is_creative(player_name) @@ -130,7 +130,7 @@ function unified_inventory.get_formspec(player, page) if fsdata.draw_inventory ~= false then -- Player inventory formspec[n] = "listcolors[#00000000;#00000000]" - formspec[n+1] = "list[current_player;main;0,"..(ui_peruser.formspec_y + 3.5)..";8,4;]" + formspec[n+1] = string.gsub(unified_inventory.standard_inv, "YYY", ui_peruser.formspec_y + 3.5) n = n+2 end diff --git a/register.lua b/register.lua index 017e4af..cfc1d7d 100644 --- a/register.lua +++ b/register.lua @@ -171,7 +171,7 @@ unified_inventory.register_page("craft", { local player_name = player:get_player_name() local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]" - formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]" + formspec = formspec..string.gsub(unified_inventory.standard_inv_bg, "YYY", (formspecy + 3.4)) formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]" formspec = formspec.."listcolors[#00000000;#00000000]" formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]" @@ -268,7 +268,7 @@ unified_inventory.register_page("craftguide", { local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) local fs = { - "background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]", + string.gsub(unified_inventory.standard_inv_bg, "YYY", (formspecy + 3.4)), "label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]", "listcolors[#00000000;#00000000]" } diff --git a/textures/ui_bags_header.png b/textures/ui_bags_header.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bf1dd8fc6f88bb368143f28bace184e5125001 GIT binary patch literal 1241 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 O5abzWn@TIc+y4QNH<3{Q literal 0 HcmV?d00001 diff --git a/textures/ui_bags_inv_medium.png b/textures/ui_bags_inv_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..5924f54661010db89ab6dba906da683e608da064 GIT binary patch literal 2300 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 NSeP(uXnXJx+J8?}Q>Op` literal 0 HcmV?d00001 diff --git a/textures/ui_bags_lg_form.png b/textures/ui_bags_lg_form.png deleted file mode 100644 index 24dab308b163f3e395886aea17223b05e530ad7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8119 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 diff --git a/textures/ui_bags_med_form.png b/textures/ui_bags_med_form.png deleted file mode 100644 index 27a1591c0af720bf9f5279a3e60af124052126cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7197 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 diff --git a/textures/ui_bags_sm_form.png b/textures/ui_bags_sm_form.png deleted file mode 100644 index 6234eb8820eedbe0e6d8c3524f532d48459ee11e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6411 zcmd^DcUV)~vIkK>MT($+R1qnHKtP%_QK}-nN|OKqq)I>t2tkpK^eRn3M5zJ-(nU%F zCKTyiT995sk&@(Xitjt;-E;0e_wTpAFW+8!_F8Mt%$nbCW)h;Qu6*vyr87iCMCVjh z6tszmP9TAwGxuBsrf>uI()SnSlT$q+cvfpB7Zt$L?NSFb0Onk$Bn zhwlo%10zGGFnfw%4L zKONSWU4OCpn~3if<=I%5X5WXkDZ$c4G|)G?gjnnKRyYzwQAwcjo2UkS(4*@7RMe&I z&2_L7%QV7bYGHY-{LD~PJv-!iobOffdrtXXdixKlThBvKNzRNI?Ww)O)P^6OIk&bE!xPWrJ3<9D1gtolFC5F6a!`D9 z*p%9v<-`mx-tgEmUEPah=2DTjyyX#$H|Xf1B9bSiwjw&ocq@t+xXY6Q_mhnOKzL1` zm>o&K}d=RrE3fA%D&~E=0Ht5B*hUwP+=J#_)LQ02f;*8CbrKuM_oWR(4N@DMWIh4Abl2Jg&b-OK;V6(kry0aaM;SvgzD+}ZxzV}G zS+x(NVr0Rr86{c5pdTd}LG~q|Cdneu2-C)_pdLWL*r?yQ(7|DBn%(b7gu3*M5t3Bz zYK;$yUiv{24<^kF1`^<7GQy1{n2?XZy>lna{6%vjy=FaVdi;t85y7FJ6&p zi>{=HvDc&M6BSZJt#V7~K7^xOu0Q#3TZ+%BS~6$g3xx>qok3IS*%oQrDtkr()ejH6 zXx#Qaj^V(3DIw_ELpB>*R<#E&XGjT`WY1vzGQMBt%W2Y`N%x$@&3r5$Y-s>g-F-F) z>iBhPN#u&6NC?%K(bl77!D?vK2_o{_TAfvdlYd8;Z<=*8YYOJa*nR$r;pu?u~}*c7{QYpw5_LC>HxH{1AI`|lzs ztyALWwrfx{eWnp4**ZZo_jPzt)ti8EQ{4Nt+c&=Pm!gD~`6IF3u-xdm$JRf#8Tk|d z5g^}868;!2uWQk#xE~oW!YY;bd%Cg4r~D-EtP#hMh)1_#FfmilMX!0dvW(~s3;bT% zlw`-DIQg}dqz@#%U-KpD6Eso8FdbC7q!xUjgb_rXN!sNZ5QJ?dR$|f{ZIjRFIWfN? zMEZEulgI-*wX&DqpYA$P?VAJaBV~_LP_JT8YtjoB4n}G(>#$qGEHUh4(qQ4Hkw{{K zHLEPw(RW3jHE~8%1j{CLPF1?-a9%Fd>W0Rj?UMw*(-^u;*`^`;?i3Q2FH(5o$ZX>v zwXVyL8O1+~gIZVvM{P#A%L8`x@k{6i0a*)@C08&_WU8J}OMC`&;!x-0EBu%5Q1vHW z5LWhNbH>;CAVzL81%9x+fZ~l;N1nY!?mW}SUe`yxB^E|Q_(R4!b zp5e)m`sMth{5O#oCm+ChWxx?1AzS7+?0RFLXQQ2Gr5|)UUiqT@s{;omU%#ZnGygh> zYix8F_EDGYqjr;8PECZ)qe))-W|GKorVB%g%)c!JFDT z90{N%m(_hx3tibaCe5>7ehpBg4^9Q%Cv+Oq_YkkZ)gtUy zt+7TU37&Ttbgf%D4l5>vlV8trW8Bb=p#MddCFL7hqPXWZ!pHWhDojUd4c$xi#oLvj zGVKeMX0q7=<&VPyQS$=d(aw@5K|x}{5GP)DGNOhstR!o3<$1$rI&UyT58Pob@!Hj7 ziL_1oHpl^hoM1S|L5@Vsdg6D+6aY{8l3RYP8EyBwUmU`VIh(Vb+4%-~$_{w5&93~s z^bxC4DFl6;)sJGGO4v`H^b0!)gB20Q@$g|3F@-P@DI*~LFNZ=%U>T7=1+eTN49jY- z%LidD->~mv-sywkNFDlf(u#}##a?+EEbSOcJCQ&f`tprRF}AQxq>0WnF3tc}opDaKXS5tT@{peuCHvRdmG42@V>@xANmAuIZJ6alDjJuA-9dX?<5>+*Ai}r z_^?^9lK)A{qql)W@t#5E@@OcXfs-3)=(G zSU*7qvr*5LjGD`?zaO;3i0a;bt55DQ#VZ}g@`>W)scS8v1u^_ z)-Rp6&8uiK?7v>NtmDkQ6Ym%UyZF(ItbhA4TJ4DwJ7221(NSb#7%a`aem*=GGLD-@ z3od_#E*L7FbN?I@1)4{-1WOg=7zo`C+I)}Imz6!@BUT&q81lT6T(&Bc6=XXBJkNf*@N5#8aSK8}|=8mZX zf%u6kWL$W2_hCSd1b0HijZS2{K=p$FM|6dl#8En;Ni8rcp5P!Ex<))_6K2vlR1zKu zJ`Rs8Mkpz|VMqKbD7q2SA6p@M?E4#JWqRxh-#(Rj>KrSstY}MP>QxtPrs;C*uO#QZ zIv*HrY5HZnQplHyA9>4(k<0iIM7{d)iIej@>5{>z?_tmN-|DRsu;JQ*+-3`^+h%q0 znJspCE^?ScJNVM?;o&Qb`n0F7xg>q;&Olyjv_yLSl-(fg-E4k-oXnVsVN%OGWW&Zb zD&gS>y}MnY-ckyZw^Uh6#;j+#j*tH2w5iYbBszgcrY!?`qQz>LDPz=xh`jU2n=^j* zTC>Ma8JM33%?^YFJa7~=B_eM>e7ER&Yi~U;k3XJ#O0Vl-YuH&Lfbg+!4NU!Dr6t`9 z3kk|BLd*N$stpM-+$5D? z%K!l?^K%O%(^HUuA)@jCmb{;t9J zr`^Z@=~Mo0yMNc&rfYA zHe3EQAx+Wkp+{BC#*BNX#Sfp|aGDtLlr1Yer_%sE&n^vN_^Y%OxJyEGK;nmdZ6b#> z;uH2(wYmLe1fczVBkV8vWogyuIY`O?lPTjU_a-s68(@40+L8?RtJeh+a(3=wRtCS1 z5u1?Q;SSPIqNqG_Rg$w(?t_!h?-euGy4{lkRt+4kYVP1*W6{Ue(9CE*%IILaAT|1|9y`t_S+V?0+7#Ltu&$P4p>wYsDDp^O zPVR9BD!KNK_-MuWWeHQYt0lqecNY-aRqNJUQ#l^oGRG5Bal${cTvttDh4iC5->r2* zQ92O8i`oy<3%zRK6KxG|xiKFPGaCVp;D*7n>dP3c-8kM|kZfDz; zI)UBumfDM~la$b_0H&vOOM5Qi;?b@JvGSPHwWK5cS4y$Nv|~>WKBWL%>ucDlIfd5KcVg?MSl`VM^!0iYXIRRwU_-;t?wa(kD~SOms047H zmmhTRw-t2?gLA=up z)%r)@Q+1B`0sa#=?tKbfWKXQ;Q?GM;zr$S$sV_Qy1s~1Dloe;(G)m&jr{YYO((~{4XoCgBzP1dd}hZvsV2|NXj>oY8K{v5)aKd9MhdzlQEBrcQtd z()2~0(@xUKg*|mM+{BtGFeAb^W9(*d8!d(*@@@Rut6@Q#RJMKjz`16yjV&wNzmm(_ zaj#)wD|EW9$f`%t-OS^DDP;5~=h8TA<4ui&6*TB={i3qBI}N*Kj|sQc zLzgBHJC(vE@4vI;gndxB*rjTRGrVh1hw|OuSbob5IAJ6hvmFRWVK3e=&=^l!CF5g@ z_g`s)*8WtA7D&;yN*DGnjyi#L>z%@#HK62@c>`3afj6i~<>C&a9cNIq*hl5Mu4*>+ z)A_m*V_LACVuWzDYTMvQwRhR8{TDz;F?E~7!57R^EU^By9!0EalNwd^Jk^O|FFm=< z)3qU0lOJmg7MW#Cc zy{)tM@7TaXuLgCjtSl|c?P7lDjvhcp9s8qf+d%AFnYvgr#uL9ZmWJ!7ACzfkH%E={ zch9GZ?6_{c`&Fp}@Fu0D+><;Tc*s&wUhARDLFncbxM{5~7o>-|V;SLX&UT-9dOX3N z;Dvi>kQweYt+T5!SJHJZE40zA1H7^~Z$QOWw{qafC``i;Rne@7Q(>+F+hQN(y7PJk z-Ut6u{x0er!S2*tuAB0jG-X{!yR(MpFwmUHhbWCqe>rL5#$2A?$_L)78qTk zHnBtlQcLbd4`=j|9UUvY-m~^9dfVBYO$wRVcCSNVI_xEFO1)gf6|lubpS;%TUsj{FjO!1ZahsXhB|@JAcH6;;bY)_wI9e#y+gh~gvS7(e z?qHCqN7iuwk2&aJ(Z&8I_(F-D@;8_a)GJ)w@7Q+Fd)43KJMZ>*YdTR5!l#j23b52c zP(#OZF^h@gh!8FC0^0JRuMwRkm=gVMXZ4R8r+;a({!Au+O)>u}O)b0jVN6==AP+;+ zKh2leX(V704)rc{Y|ms;bmK^oxNwa5P5;y~j?zRou9K+yhn7ULO}EF=B|DXe)ON*p z`Dn8pQLaJ3BUx4{WMfgFh=z$u1q04%?%Qu4XB0fbBL?JUM?P>^M>vUvSl?YlxNdyE zzVw?xJRbDcxS!YD=U?x#=PdCV*rqw+3(yPL`KDk*QNN`oM4pWJHzZlpKhzMj== z1$Ov+O#j+{O6CUuRk|^5T-z6eAzSEg!JU=lEe~Rwooz#A-t|Zocz51NfjfKClGk)c zcyFz{IyU{l30Gc?GvPrU#+@cIJ|17$@}KHb*70?00)DA-xEl>?TWr342Gy+>xh-fS znY3{T>+jMG`_{>E!0kO%n zr?9)pbD@pvX2sAA7o6LQ#6d#Mfpy|ue`d6Y0RZNyzg`|8YdrpvP%L;<3$Wv1cdwM3WW)f8Gi%-001NyIwk-B1WZXpK~!ko?V8Pw8$}Suf72h+9^1QFB9dK2 zL_~0cJVA0rNJxYOJi*?Q!{!a(5x9ZKaW6=~i32(C0?C~xfCETTq#Po%_Iz{?hnXG5 zYkT9KnH^i;x@~F4{<*6E)m=3WJNu7Yu;{vD-oCeYY(AIc9)CHK*^iUc>GR*>Hvrxd z?>xNm&4Cyb5-g*?0?WxsNtp85ojvBsuWlva2j;!sZysG^fJXL&2RUG|BqW?MdEwsu zDP9WrzWDIZTSxm0P#ailITlOCjQB-x>q!+wQA_W`n;XM}07Xc|KI6ma(UJ(>HFwW$ zi{Xaw>Xwl+7=L^jUx?t1dj}%i0zAoxG3Ne4iuaC3TYv|WhzNbW0BAl{$gL>M8cFcr z{O>Ag>Uw{L<#H2%yS_xl+i4vvyBvqbk=N2Bkcdt)(gC0&B__qz7P`iuJ6Y2m09s-u zOi3zFNCb$@0~X1hF(V-*t)*BpBY+MPt=cDdMvOzCYkxX)#6aFbqE-9kCO9-v4aAa> zV#zv4v}&W)m@_711jxAv<~U+<5(4s?c$%nNwNY!rl)te^)ZFI0zlpk48@2lHvi|B;ZPeJl$yO1} z%LrNwrhnTtXi1pC1-1HGT7C-HTCwU-#n}Z_`lmQ0_S_rR`tJZqNP;CHZFH3Sx5x)* zLXSMC_0*?{usC8Y0*UmDqs5Wo5SXIpSo@^B7NEpHISR2z#zcgEqZg*tvtve>wSVB+ z5ftQDVgeKqBSI{BxeEtX5?6UNRL>5HkljWwKz|~!#7G>HkPuaVxhhMpCB4K0Y4xn} zioR;9N6Q3@tV(WC%vX7OKMy)AQ!-Rla*JZV$|L&*%*&GFs*-!Tr+Ig~^?mUUa0j>p z+yU+YcYr&<9pDb|O0D66wdj;ZZPKugr$<16Ai^T64)?rwUhe5Vf)WK~BQ9&b^D0l) z2Y+CZvH*cChnNA7;i@ipwI?kH!v0qcluufV>7XN<8w9UAcv1*LkD-S*V3D#JF)7p9 zD1F@}p)m}+TTsskifZnhdaAw{8x1^$9*x$Z1adNu0c2sCkO2eFky9fT7l}6BDb@|= z3(CI&Y6QkJg6Hp;dH@W(hnJo0#oKdZVSnon3&Ao#u_f`7$hmuWYP$f7cK})K{a(c- zU*(?4yb22m2{Gtb3xM{i-8i1cltcE>FAIRlsbjN<62p)&At9sFMZo8Y1KF^gb`iaZ zJ@y%*(1>RXfIr9SV^D->G@?gLfo8~<1K#3V0eJFRyrkrui2c6~4h;cr?&`!<>vUEk zi5N0sRGh(IzCL>3mTn(knf*V^VTeYddfHh61d5OW27$o6oZkL8Ub(-0EzG0gw^6G% z8~%U-g)TyJGWqV4)z_2@``+mL>X>rm4gDU&ABJ=M`*t!Ju3yPmda)9s$!KYr(T&$;(|zu(XA+?<1}Iwi*Zy$}eb z{}J?O2xQNew>!}hY<+xu$Yipcn_FC5oIoG|jfaPav$M0Mr6mf5a&d7Xkw{o97E~M# zXK!y`T3TvqYKp;N{QdpG$&!+iz`#H%l?tv%BofdA1#ry9#zrQSfm?QVc0j+YtIONl zn;#t=9UdMY5fRbd-3_XhmDS+jU{q98YHBJPjRv}fg@tOhx~HcnJv|-tL?Ur?baY@~ zps1**yu2LrckbM2Y;2Uv+6p2Ix0-?IPx~!~> z&*wWiIRQ=}F(3@UjE#)}yZ}sVYbyv{S62rp09pWpN~IbZ8R_ioY-ni6&CR7yC}1>T z1W8FrfV@~N28{WD(u`&`0gT;&>+5+LqSb2Iu(f(N4Ek1!h1Ih*U|8*%RQnpbQU9?X zE5))jIG9!gg|T6gPz?-=%T9wj>rq%5MPN| zCg?lWh5^bNoF!XO9wXjf2tPAsKjT}tH^{p0)3}>f||DAIK`Z83+m@~ zoKZ$Uk5k{e)Iade%I~{XEivvvlu+uzOWQEGq0_kG_PH|tdr_ZYv^dCwmmesO~ImE$xy!@ubZQsC}uV^*lK{cYnm8BWv=`PPc`BIX?;uBuu zw*<{c*E(d*ct24J9-m#)n~;l4KEyXi2H-U|`X2~2qGdf;edKAW^?bAW6M4&Ko@X+l z{bu7SbJ1A=BV7;g9r31$?ZP(+fR76WyPw|U9}w*q$@m0?D{>oi%6!V&T!a!Ztf2Wz zaO8Xec9DnwYlY;aIEu?}5In7eZQPHSh!Gm?9#e!y6%n{A8{vyQe7O4h>vClIsY9AW3JxXY5qBrd5hsBcP zdM@rNlr{5r!@CyWtr`wGTfUfkt91YSUFH1)^s4Dlj^B3pkNjPPbyoLUsK-5NE>-5) z5#GsJj{7p6Q&^twCZ?_i_dX5TelO`8-1^6_!?&zINjo<6@j}FjyNREM{%xU5o|Rl5 V?e#A{KmvaV;_B$>(18!R_8-k_m0$n> diff --git a/textures/ui_form_bg.png b/textures/ui_form_bg.png index d973b34a9d397be23f563a3d08a3f6f34747cb04..7111fac93eb3b59de8228df357c6dc6d3bee9312 100644 GIT binary patch literal 1003 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 diff --git a/textures/ui_misc_form.png b/textures/ui_misc_form.png index 2d6ad018d4b51f3a0315475e0a1e070a08521d55..c6a6057d51d08bda964ec0dc42ccdd2a670be9fe 100644 GIT binary patch literal 5789 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 J>7|?h`B$Kb45I)5 literal 5368 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 wlLnOnqty`OIMhw?+;fB*mh diff --git a/waypoints.lua b/waypoints.lua index e23ef4b..97712b7 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -23,7 +23,7 @@ unified_inventory.register_page("waypoints", { if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end local waypoints = datastorage.get(player_name, "waypoints") - local formspec = "background[0,4.5;8,4;ui_main_inventory.png]" .. + 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")) .. "]" From ae124b02c2921c371be0faf2a2989d51173ff2af Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Thu, 25 Feb 2021 13:17:58 -0500 Subject: [PATCH 02/46] Tweak trash can icon --- bags.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bags.lua b/bags.lua index c1fffb5..837edfe 100644 --- a/bags.lua +++ b/bags.lua @@ -69,7 +69,7 @@ for bag_i = 1, 4 do 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[6,0;1,1;ui_bags_trash.png]" + 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;]" end local inv = player:get_inventory() From fbbf786caf056aff70eec25f0878925f89d49bbe Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Thu, 25 Feb 2021 13:27:10 -0500 Subject: [PATCH 03/46] Tweak spacing between bags page top row and bag's inv --- bags.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/bags.lua b/bags.lua index 837edfe..bcaa520 100644 --- a/bags.lua +++ b/bags.lua @@ -7,7 +7,7 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape -local bags_inv_bg_prefix = "image[-0.1,0.9;10.05," +local bags_inv_bg_prefix = "image[-0.1,1.0;10.05," unified_inventory.register_page("bags", { get_formspec = function(player) @@ -16,15 +16,15 @@ unified_inventory.register_page("bags", { 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.1;2,0.5;bag1;" .. F(S("Bag @1", 1)) .. "]", - "button[2,2.1;2,0.5;bag2;" .. F(S("Bag @1", 2)) .. "]", - "button[4,2.1;2,0.5;bag3;" .. F(S("Bag @1", 3)) .. "]", - "button[6,2.1;2,0.5;bag4;" .. F(S("Bag @1", 4)) .. "]", + "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)) .. "]", "listcolors[#00000000;#00000000]", - "list[detached:" .. F(player_name) .. "_bags;bag1;0.5,1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag2;2.5,1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag3;4.5,1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag4;6.5,1;1,1;]" + "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;]" }) } end, }) @@ -53,7 +53,7 @@ for bag_i = 1, 4 do "image[7,0;1,1;" .. image .. "]", "label[0,0;" .. F(S("Bag @1", bag_i)) .. "]", "listcolors[#00000000;#00000000]", - "list[current_player;bag" .. bag_i .. "contents;0,1;8,3;]", + "list[current_player;bag" .. bag_i .. "contents;0,1.1;8,3;]", "listring[current_name;bag" .. bag_i .. "contents]", "listring[current_player;main]", } From d1a4396fbef08ef25b3350689d477e61432503d5 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 9 Mar 2021 11:12:50 +0100 Subject: [PATCH 04/46] Fix bags backwards compatibility breakage since 4403b69 (#167) --- bags.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bags.lua b/bags.lua index bcaa520..1bb2b5c 100644 --- a/bags.lua +++ b/bags.lua @@ -135,7 +135,7 @@ end local function load_bags_metadata(player, bags_inv) local player_inv = player:get_inventory() local meta = player:get_meta() - local bags_meta = meta:get_string("unified_inventory:bags") + local bags_meta = meta:get("unified_inventory:bags") local bags = bags_meta and minetest.deserialize(bags_meta) or {} local dirty_meta = false if not bags_meta then From 167dddaa84f8b0e65bd054c6ee0195e888199646 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Fri, 5 Mar 2021 10:58:18 -0500 Subject: [PATCH 05/46] 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 zcmchbXH-*b*2hCpx`+rOAVm}ly-0^31c3`06&2JA0W7G10b>X)30(yd6lo#^8%3Ik zUaAQ_moB|00-8t-5JDg!$t3E`oi(%8%$IlG^Wl_rPM&9qRuZXpP3U8ih60sA{TsNsUDgVEL3bbydm%~ zo-hh(j`tN%eQ-1Mv1jN|bBAPwd0Xc~cPDjG*?e@;&pR}rr_%sW4e0{TcmGbHhI2OV z2Cds42Z2DVcz~3io%uOAWkwL(cUCBJTM|A$O;^rh(SYn>$~wV9o8=ew=eGIL`R0ns zP$!TA;x3xSauDDhM4(G#a?B}XipwRrXue##e8SjfEhNXJ(-3~WM)C{3{y6P>5yB`3xYe6;D1S?0cBz zcC)+ptIl54@3&9LTZo**PQ#vOevR>Aokt@`S7AX@zd{judJiY#FB(4Bxgvpel)C4* zsF6$sd!_lBc8f=vwvCiXb5LuYjgvnE7us#l89J@EZD`pi#yVe!Vsv8nVOZRD5g(@+ z^vbs>D&26<6~cPRFpBH@Ot;jyzoG6GPqFgYf;%(|x~}F|-T2DL-KC3m;l5bK+&IA7 zd@QdG4q6-2b*+$3D%+)ll6cK~i+)6e(|6sb_@}tls)6DCb|?0>_Pr-)g6Y?1E@dGaL3}0xJKvx2{?X)n5(oI9dC2R@ z8;u`X>8;#uHgws>0-GNKjubs8Y7!OGB5?YLMlP$&hA#=};K}GKocWxBm{`G2X(`Pm&KPh4SD~d1dd>;ziw7aOuUCd_L79%FFXO)*W}2)v ztclEtN&bwB>Rd8*I6am+3aU4RQm3+*d0VcAvPwTvKY*ye z*zJrCU5*`9h%;(YBT5YIe8UK8p2ooosPnd*bxar?{>Y$fG!|U+qpT9T-NMqvBBhER z)JYjMa!|(gQEAW)N+S3m)S|W02Wt_yk*KEJH2~hw*@)7~B!TFvKNZYvJ?|KqhXzXL z{Pi^Lr6P@~oO$3zt)x;heX)A98dg$+AqgHbY2h_s($5Ao_mma*a6`Yp@NV3t7MK*D zQS8=ce)4CpwC&^qy{^4;h8ga`F|D z)qSvLz&P(@^rifvn@~y2MBw+cING~o^QfB)ZK@mGF7>G8oXabuNw_EeayrAYrz8Z3 zrWwp4&?8??!EU*{gMFxL2W@w52PXIdz|#s?Ql=<{^ko(QysHKZo|Lw*ymdjUx57%| z)@d;)nHE`#qQS-_Ppzs$@7x)&IL62pkygMkl+~9fiT3*H`sE_(O|z>x!A93-7pcWe z-_G^kRY5(=1!*a1(A4>FkQM`hAl4lD15|0dC#PoBUL*RgV<^MCO*Wxrc!KmXOh?=@ z9nP`;wy06qmyShLmLXRfAEUJ?WF8eOl}tRVOTNZ2mhB(J@6O#-oNZpUcIYuG1x^e^ zKfuyXz6)7Oj8zug7c=h)tVEjQ744&zwS~iSj7|32L?zM+x~H|MC^^FCVRj;|-P#?; zs9vl!`>Yq6>KVEvNW$1y+q`ew<^;rq5M})!%qDHcf*%8sO*l<}Pu)5pkUr)$iVLY2 z++7A?Mb4TNkr-Vko@|WPI0~l^;Qt@l@Nck@2LPgHZQFk*DbWU9feF|wT*vyiHxW%z z$r0rpIhVQ_U$+>8${E-SYfxW#WW$%R47y-*a|F0iY-w+VRhrd0tDc(>)5Y=RRj0#SyR;xo4DDH87 zOUyKM69o}IcBxjBypJAxqfGZ0Vx1(d1W=O`XC0OA6=tPtNZ#?Y=ITLly^DR26R1m? zYdk@wx(?xob-(kOF3J<}bpp6&a6>V+RAk)L(^s|H> z2n$Q^S|z6l*1C6PJjIEMRBLDYajZBuj?AN~%u7d=*2Ys#j-dsI%TT3^ytw;cQ&D>z z{t|(MRaJ{5`d0o0qdzk26I`1MIhSl~Qik}HFBQp#PGCfoCss7G z`RY*FXzd;x69zzxxzGi{NzcxMtjCD4h7pHe9GAE?wOEJU((|cU63WjJSCV@p$vU;s zV_^_5Tt@Ag-OLK(+wj&OH89gV4(fXa{LPckHsRueP%m(GT#RCw0q2aj5qb;2te#iO z0Ri=;5HhBpiZ~BI)mB^RO*C0d0%K%$&2ZZNFEOWM)hdDW?6f-rmF(1|w2vI*RL5tQ z89E!Sj;zh0?cPUEmz!g+2T+3JpB84UlB!n~6DkER(ruUKuV7Z`m5^XG` zDAJ^$Qa2E$R!Gu%BrIt>q|vEKND0BodGrpmX*8MVa=G)vo8^kd|cYpT<2CZsin03e+@Ma6-36e&r2{-|OR4 zTP3l}X1}6rGVilVe6h^(Nmr&!oT*Hp$`R>FgBOQ3sV!dNWIfCmb3k4^|orY zCPh?8`@cAib2Hm-^ydy0!pFv&4j~k41}Nr!=Yd34-rLHaOxuOv`5#`g^Oxl9(eB;B07|Ka!jtHhq-3}hiQw|!3n=C#-9t*Wb`W(midV3v{nL*>ViRaUr~kL!8!vE z2vfY-h}f`a7*0!bvgZ}cw-v!IKr&0W?nN0(VO}Piv(+^i`RGXT0u6G&oU@zD3K?xT zMhFc?sN6O_%zh^ZXHV+zDUvzf!CX`j($`R<%%|Kn2;Rz!6U(x zaMvCGqm{;g$AttSqG3(-nl>znXJqY&UBqk5)wA_e!VdK#*T5%{H0Fps8MkaI20E}$ zK~5ZdF9dAuEWUA|?u!x)M#T5wvBR4>;UYVCy*DezRCQn-9DUH<@w<;mDQkUn(j*M@ z{KHP8Q<#K6>u(&dSka1h-JGN1;@v3`dPKhVEt0KxVgU z%K)uhWSkAp3bk>FY4Tn^La0CEdH?8@r}yvEAMNw|cv+Kh`vO;_L4gWuC1@T+T*yE) z?7umShun!Mm`xKmNUkI@_}XejH+qWDQ=?oLP=Yoh$l>|;j=zN@{vbwGv+?MK@F;^l zz`1=i>LjiWC!f@^_95w>Wy@vLw^T?KqNnkmvd5JrVamRv_-!e32z7}x{>KP^*q?qy z3%NXIT3x5>x1+J9~#eQ@e_6h^uH2 z`bHn#hnomf)G5SJP`{W`NI&@(PfDr5?CYCU$EeBD>(1?v*qGnbo&P{%&>voNrB&kBc2n5-}o~UT4tU?GF zR)qj%kyJB)$dZpzKp+W1gs>QbLJ}ZAkg#Q+H`voTXXf90^Xto>amq94;a81bg!k*||h^Mf3(aPP9* zdmW!8Z-40b^D~Qwj}8u!8^7umt}QLt+SOs(Ug#YdAB%I5OBNi)$L@-#k((z5s8s3~ zKm-4eKS+bFr>bEzl>Qyz@4Dppsaln#Uk)cE$QV4+nV4HlAF_)wkV>T&mPCeqZ_(7e zX=@U}I?tm(d$;W!Qya-~5f6(I#55D0(V?&?t)wJ{zO+jrKg24cQzb4X)unp+wd0p} z_ZvFH7nx1=iD9zER-)xfAVz>_)Y9J$ypK@7f2)KkX??l=?x9zfYgM$D=?etewU{Fr zS>PmyTE!D=@hwC@WhF(Xb+^48=dL()Zr)WKrL27QYdCg#a4*BB672=KeJ9nxFOcWf zHrC#>UTQcQyD(|hi=WXNb6#Crlg+cMS^NMdTZh@YED*ZqW(Ay_*7P)8*LC8PP=*uM zleV}IgE|OCLZRf)#N6M2#@eOP1$Df!*3F=x(yK5({Q;lz)tOU0d%Wj0hXV7^)_xEs zLZMh#Y|UTH1sFy&Z&}D&bYT6?u=w z^Bjt6sU2~z?%dWx7JqbR^p>4nS!9;GS0%%1jkH!5^b3W;Mbemu$}2&OogENbZWu%rZysDf&3Q0P>T#S79}lDuGjevZ71pm*$JC1Weiyy4E%{g zu>*!1C*vfvTliAYbY&N^SEDBcLLY ze5N>tOJ5Ax`V)$04&n zG2NDC7#uiWI$Euxj7X|jcu~lq4;@=QU88B%8=onN#R^nX=LFY-6thI>@ZpZd!_bWzsVN&aGI5s!()Cx zNiSSKVZFA>Vx%h61F~xE#AYmoD)t*QDx;xE{bd)*2 z$6=||=Ex*0uRI_B_qAmvQ$PL&a^_`ZuwZ3< z1Hb$*ztn z@$YRki~yuKz?ns0Ez`{I#lNj2q+AL(uJ32kqalC+anrWiZ=hSZhpCyh+S`+?V~~28 zRCLvMf_4rdx)fJzfbyl7D7$(}E0{M?Z;_+a^NEiLd)8S@)!VHvAR*e?VSntpFwaTp?288V~Y%u0R`LDa1AC+`|G)abTh`c*4VbT^|j>4LtEuH z@S2+)j1Mm1wJyc;KYv-~M6_Vl@t)h_f)i0#@iKgCl<)*qYl#k?GkL%k_QNx3%-3o1 zUsz;@6{}8g){W!Sd`-R_Ozljm0%&$ry%|kxIoM|2db!xRI}H!@B=;R>=}lat*|!e0 z$$8IGMCB9;Z9%z%DB3sNJ^S18jf6_S>V5M49k(VY4|2Xngw}^n+D;@%lK>|2C-64| zao0k!;3GeUKA+l~T@&0`U_)gHUJbOD0`Y)P0xl<0?yS!I{i%`DfyWjP<97{KII+Ba zTVfDnbb;UfH*7Z2M|GFJw~KWkc{ihr@7nNUv}u=-7b7wT=Z}lt7-tmHHow)n2beiR zma=o|0aiLRJGA-krmbt_XAq~NAWNG<8+H)fK3?Kjx^m_(0BfiXt)qg8;V?H^LqvRz zMe^m{xQQ~rF=Gr&;8=4*WSmR}+x-3eCjd^lQo;TF-z}4?L2<=g5efQ_J3Z7|GHYAsJ4CQxhlP=Hs$_1P@bpO96{?2FmRaSl=DtM zGf3WJif0uG&iNAny0NdtxrzMMQ8TB)UQT?lYTqXaY|xUnWnL5P;!mW2ME@wk)Op|> z0YuBYNfQdTu)mkBi^^$W^bXHIQ4hf#U>M%=!KWUq==%Ba#cmQmTd!pjA(M7kKiVoU zgYA@01%_9=^saD=KC9tDb}2-Uto)!)JJ}9xiQB9NNJ?6*ZNno5(r6gbo)U1~$e2y~ zIowyB=T?-=Giq<+-Aer`%V@xmva2gkakWcVn3pW`PFn6OxMU0^%$KQT8{)H z<`Bx2k3semof_%EV|=EZ7!dC5!e7d!TgxBFx+j zX4=?e9NgLX!}3F?;gi0M;xT?CCy48=z699=ep#-Xdw*e1S93Tu51S2p@Xr;)7n`0@ zua0M`)BJ}Y<}x}S@NYy``dnS`eUMwtZ?>VGpuI|1)iy6g2sxi1tUhW?E&3(XEFJu}-@#4H?71zhw&biQ`=5t!8N4}|e zA<&Y#@NT@hRiOYUe)vXhRh&vG+HUJzB=4T*t+9eh8+c-<0E3uKxc1iD=%cOSi7xd)fVc)k6V~KF;-4tYvf})uJy4ME~neh%56V)Fo*q z?80TTD`BvC?tw^;ycM(g&Jj4)p%B&Dog&(vw~qB9A}cn-H#-3Y~|hnN%qp=Nf<@Yg>2f`IiPh#xNxxh zFl^o&ZN@YgT4#GTT`|>x$;TI#->Wlj5N2+{#W+ItK)eO1A3v0)Yga?*<~QB;6nF*O&_{;F8RxS``=pF{`i~x z+k@=v{a-fPy*gNB*=u-n->VPt8qNzRwF}{qAXli1`@R$bvOk~-Or^4xUp4Xcsw&aH zghm+4VpK`r1f;JoK{s>Ixucnm3S<8N@Bab<<3`^+lZ`IzNhFxYz!-#!fsL(MiNh^; zkow@ro4@oGyHWYkwY1vPg=WjQU%zC$VKGwTHW-)ICZ_GhGzg;Wds=QUx0~oF2PiU3HGZBTAmtn4X zA8+kXX}ZGJidG}R)@f?ZILZ5f{$e+=x}mG`BVrgEVH7^oDWJvcpcjPgiW&Zp-}=d0#wp{ZoUqy4O1WO9kYkYf_x#l zQ>n}Bb`Zyw{e&5jzzPHQOJH0r3`1_uV+gX_3v|hLAW^S2o4}66H>glk5hhUL)0php zJh}KX;p_N#%;**t0RZ<38<$+?#tfM2^RaTx z9C})hn=QJ~OMBD_mh1DCCSP_)K8>k!B6Wb5EK7M&h81|+-n>KR9br8HDWrkHzNhW; z?AJWEHoNEJ7B@qtgVIrsyoVi)r>qMrQRtHt1(fp^;tV-!=mQxRpuu%{P44-4 z6LWw(biV%8nJ{YdnGl&wzP9k_^jK{-%J*cT)F$rrrVC-Y;_kv}ZD=Ui7Qnic=Ac7d zX4_L%$H}46?+&l_K{J%a^P2GKah*MwyR2CGzGu7M+{ncWNm=U{7BTCmccj#fP_M=X zUaufORq`>DpWyYg@G|W${qU(~0+d3r=-KUQGsXl999at=q(f1MA z2=6w(n)`7TLMtGWJRCF6mR$E-o@}vHaGT1f1?n9d^~$`+Lm!-d${pD5f(DJnJ;*!d z`}jk#wW@Zo_$+zXFe3|PHy_ED^bgs;x+!eH^m+KD|3|yS35#t!8V@k2W^Fw4``5N9 zB7K(CsdOIFsq&-c-ru!8JL;pPqW|ZcHJ?x1k%7OUOq;397oLE^C39`z>wafKsYpMd&F$q%KvCPFSH6JO$P>_DfZ+e5H zG6V{iR-{w&xSV=P9ju+M_~`QV(>E!Y(QkLBwsCZ)9r{C0q9NC!X6c(ZMI)iAY{w8d z%TF6c&KP?`5Alp%<8F%PNqDcRc#qDNARirB_Z1x!Ikgl}3olFxM8I>NW67YoRY6tU zbtk7SDoj?A4M)S#Pbc1&)rgsz@;Rpn9H_yglgrPL`dTnusv&JRmy^$4eGPyW$FO!` zJAx?~lU4M&B7gL1V~yvQseFyAC+`gKcF(kayww^f$>7FGLrTq4A|k{^9-UzE6^jm+ z>O)KnG^`ZxBQ#L2A{jBG>wCHgN`yf1WCH;SVQSrxMyo4(S1vcPiB|J7G8Is|E?Y2H zV$!^P&5!3rTgG>P)!9wk(cMy7hn8LD({8I8v41+-9volU1J`Lj=Q<=W``ku8-5~Tc zy{-VdUu>uN8CFE!O|QEb*yxbAO=a<*$5V@q7ePMBxauYUC^uUoV#uF77$-`s3ou?k z_GWaMn#$PD6#SkbP4#}31?a{uN8zc8wDwkD8L{L)(_4TdJLvFkSfEFYLku{_V~OKi z!?>IB_tYPPPxK>qopyB8NZ}ngKB6P+vb;F|`F#i``Apq*cAOr6(G)egw*hd?4a~i7 zsAj*ML#dC9=d>L8cu^VlFmLe9$7aiCrp187VuSP!>WBP1rh>>{B_e_?CO7%^KN%!! zbuR8k<8QPzhmRjH%?9*EXH2JbazMj*m#h;n-aD8t+_}?Y@*ChoG^2H_#e!S6Ft`-= z8-2u`aO-B=#>!K9l#CczGbbDc#K$vat4j;!Y_YI8q*KI0nq)F58mT@n6xiTb{KVvX z3IAtsBME@>eT;qckr{g!EPBg%rV{06jGupTgJhf1U?8C6GJ;|T&DL7>aJ_c|Jx|)E z1@o|2+Ik??DL_5R;TdT(e-kdhNUEWVz3+Xfy1dh0*{y(LZ5n7En_9Q; zdld6v84czQ`;+hc{cXrK0f)`co)L+Lby5w`Em+ddRv0N~%#QV35 zMwcs+Jyqijn9+CsHni1uCR!UI?7Bii7#(nfgNVAG8q=}B?h5!vt>)-GA*vmS=iU(z zhx~{nva#`PUG(V#1xTM&QTf4Qz-Y&9Cu+_K8`COLl+<7o0ZE-`H8*!X6A`7T^jt6s zc~3qo(qYX#5f1;%eml1>K#;jam7< zW?<{)MNn@xV?b;Zau6rdihJ3(ET&F7krAf6G|#kPIsVcro0N+)q%L}k$B!S*o(CK? z!N=Qc63;o+()bt~O>$c3|2Snbi2zY?zmIoE&eb%waMUnjZ|bm<{`Hd;cAy z?<>Y(%O@nX9$XqrT1A+ZX9X*=DL4^!Y}$O6HuRhVey)aTo2THW!w0}MrHGj77#{= zSsm{Ft3xzoY0RsrQbfub$A_qOU7wV*B?`rA*3Cz-J+8y#UH5bKfJ;$(RuP`q7rK{_ zwX&Z1=7+t|zf*@~Fftzw8tv6a<LBXDG(% z%HF;$YUuTM6qUj=^{)WqN{K&kznE`H5>A^8v=rnUn1wf$|OP2M`G<%#))HbBxYNEmy7@&dA{vam5*BeWu z+K2j9Vbw9Ttr#%Gf}{{b;b3@;9R4!epX~(8;;g;GE@2W+@0;qF{~)lssczkXXpgoUnNy&<0ilzgDz(i0ro_snlGsNOP-*KoZgkGHV6 zh_Gvv)#r?jBa2N2{zwwssMF14Alh4a$P_@A%@4^vhyIl&jGZ=gZATGtk=c3p>Eo=nWl|ND(|{MlYwtupK10aL*YNaO>LuJ<3<+jld6!whN_!+NNI4ZpyDx%0H( zU;6B_sv7fKKTy2EZOxq+PU2fp9`~<2iG4_m-hL9YBT828ohaK0RwGECnOQ{gDy}|q z;?ZbWPv@m5x6N+j`IkGx@)d`Ra^axmoYxN(858fA>ekz@2jnnz`$XTpF`FGn;(YT7 zUgo%DuE5Azp;dO!zTQ*T9f~mL75kjLI;71#G5b4E;gJ~J8T3N}9V^t5-$k#INkkK3 zSP#^;VK~IsMBoeU+hAn8$Og5--ii*Y~Zh- z%|@S0boM7_Jka&K5dNG$v@S)rY=jj6q#5%l5f-OI-j5UyuvCH}ZS4ay_|+KT} z9=;$+HI0;@Kjl$TnG2YYbaN<&uGIAv#fMnXPVA`3xTiSoFV-L5*OR~Ab8@@O&KmJu 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} From cc93288a6b3010f4e8b24f5fd8627ee911625c55 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sat, 6 Mar 2021 13:35:34 -0500 Subject: [PATCH 06/46] bump minimum version to 5.4.0 --- mod.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/mod.conf b/mod.conf index bca70ca..89be528 100644 --- a/mod.conf +++ b/mod.conf @@ -5,3 +5,4 @@ description = """ Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide. """ +min_minetest_version = 5.4.0 From 7a0a44037abf64a7e43e9aa47548b7e03198077b Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sat, 6 Mar 2021 16:35:58 -0500 Subject: [PATCH 07/46] remove a couple of unused variables --- internal.lua | 1 - register.lua | 2 -- 2 files changed, 3 deletions(-) diff --git a/internal.lua b/internal.lua index a456316..b07122c 100644 --- a/internal.lua +++ b/internal.lua @@ -85,7 +85,6 @@ 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 diff --git a/register.lua b/register.lua index df7f5d1..a5512f4 100644 --- a/register.lua +++ b/register.lua @@ -1,7 +1,6 @@ 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"), @@ -170,7 +169,6 @@ unified_inventory.register_page("craft", { 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() From de575a651370fd1b61b2db7486c792ea0f49e057 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sat, 6 Mar 2021 19:05:27 -0500 Subject: [PATCH 08/46] 9-slice the background image --- init.lua | 2 +- textures/ui_form_bg.png | Bin 1003 -> 0 bytes textures/ui_formbg_9_sliced.png | Bin 0 -> 240 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 textures/ui_form_bg.png create mode 100644 textures/ui_formbg_9_sliced.png diff --git a/init.lua b/init.lua index 9487675..1944045 100644 --- a/init.lua +++ b/init.lua @@ -57,7 +57,7 @@ unified_inventory = { 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]", + standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", } uninv = unified_inventory diff --git a/textures/ui_form_bg.png b/textures/ui_form_bg.png deleted file mode 100644 index 7111fac93eb3b59de8228df357c6dc6d3bee9312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmeAS@N?(olHy`uVBq!ia0y~yU;;838#q{iRH3Gj2?GQ3CQlc~kcwMxuPO2|88WzB zY&79`_5Dvww|0XbQ)`0xoyN-ZSNt#CpO^Ptbiu_l5tX+Xy?RwDZ!o^fac2mNyVjs} z{XV}!WMwohAEqTvQwx!j0YudUN$|)(WHJ$o&?biGTx0bEnKC^xM zaxZj>`LUXMr{g)dx0O^rzw=(wV)?aQDV6X4{t)O7@`_wl!;x6WeRfiD+@hME!e4Ln zPB8 Date: Sun, 7 Mar 2021 03:57:39 -0500 Subject: [PATCH 09/46] shift the craft grid and guide down a bit to make more room for the result string (and shift the result string down a hair to follow) --- init.lua | 4 ++-- internal.lua | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/init.lua b/init.lua index 1944045..eaacea6 100644 --- a/init.lua +++ b/init.lua @@ -43,7 +43,7 @@ unified_inventory = { page_x = 10.75, page_y = 1.25, craft_x = 2.8, - craft_y = 1, + craft_y = 1.15, resultstr_y = 0.6, main_button_x = 0.4, main_button_y = 11.0, @@ -56,7 +56,7 @@ unified_inventory = { btn_size = 0.75, imgscale = 1.25, std_inv_x = 0.3, - std_inv_y = 5.5, + std_inv_y = 5.75, standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", } diff --git a/internal.lua b/internal.lua index b07122c..0500267 100644 --- a/internal.lua +++ b/internal.lua @@ -54,8 +54,8 @@ function unified_inventory.get_per_player_formspec(player_name) 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.craft_y = 0.75 + ui.resultstr_y = 0.35 ui.main_button_x = ui.page_x ui.main_button_y = 7.8 ui.page_buttons_x = ui.page_x From 97960c552b0a6ecc859310d5671bf516efb6b920 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 04:13:36 -0500 Subject: [PATCH 10/46] increase size and tweak position of "give/to grid" buttons and make them vary in pos with lite vs full mode --- init.lua | 1 + internal.lua | 2 ++ register.lua | 17 +++++++++-------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/init.lua b/init.lua index eaacea6..18968d4 100644 --- a/init.lua +++ b/init.lua @@ -45,6 +45,7 @@ unified_inventory = { craft_x = 2.8, craft_y = 1.15, resultstr_y = 0.6, + give_btn_x = 0.25, main_button_x = 0.4, main_button_y = 11.0, page_buttons_x = 11.60, diff --git a/internal.lua b/internal.lua index 0500267..48a8037 100644 --- a/internal.lua +++ b/internal.lua @@ -31,6 +31,7 @@ function unified_inventory.get_per_player_formspec(player_name) ui.craft_x = unified_inventory.craft_x ui.craft_y = unified_inventory.craft_y ui.resultstr_y = unified_inventory.resultstr_y + ui.give_btn_x = unified_inventory.give_btn_x ui.main_button_x = unified_inventory.main_button_x ui.main_button_y = unified_inventory.main_button_y ui.page_buttons_x = unified_inventory.page_buttons_x @@ -56,6 +57,7 @@ function unified_inventory.get_per_player_formspec(player_name) ui.craft_x = 2.6 ui.craft_y = 0.75 ui.resultstr_y = 0.35 + ui.give_btn_x = 0.15 ui.main_button_x = ui.page_x ui.main_button_y = 7.8 ui.page_buttons_x = ui.page_x diff --git a/register.lua b/register.lua index a5512f4..b1f5d74 100644 --- a/register.lua +++ b/register.lua @@ -268,6 +268,7 @@ unified_inventory.register_page("craftguide", { local craftresultx = craftx + 5 local formheaderx = perplayer_formspec.form_header_x local formheadery = perplayer_formspec.form_header_y + local give_x = perplayer_formspec.give_btn_x local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) @@ -307,10 +308,10 @@ unified_inventory.register_page("craftguide", { 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]" + "label[".. (give_x+0.1)..",".. (crafty + 2.7) .. ";" .. F(S("Give me:")) .. "]", + "button["..(give_x)..",".. (crafty + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]", + "button["..(give_x+0.8)..",".. (crafty + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]", + "button["..(give_x+1.6)..",".. (crafty + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" }) if not craft then @@ -400,10 +401,10 @@ unified_inventory.register_page("craftguide", { end if craft_type.uses_crafting_grid and display_size.width <= 3 then - 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")) .. "]" + fs[#fs + 1] = "label["..(give_x+0.1)..",".. (crafty + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + .. "button[".. (give_x)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" + .. "button[".. (give_x+0.8)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" + .. "button[".. (give_x+1.6)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" end if has_give then fs[#fs + 1] = giveme_form From eb4cf5bf4736965c39033348d522208b600d359c Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 04:26:11 -0500 Subject: [PATCH 11/46] increase spacing around the text above the items page ("Filter:" and its search key, and the page or "No matches) Adjust main and page flipping buttons' positions to compensate --- init.lua | 2 +- internal.lua | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/init.lua b/init.lua index 18968d4..67d5b9c 100644 --- a/init.lua +++ b/init.lua @@ -41,7 +41,7 @@ unified_inventory = { pagecols = 8, pagerows = 10, page_x = 10.75, - page_y = 1.25, + page_y = 1.45, craft_x = 2.8, craft_y = 1.15, resultstr_y = 0.6, diff --git a/internal.lua b/internal.lua index 48a8037..2d07472 100644 --- a/internal.lua +++ b/internal.lua @@ -53,15 +53,15 @@ function unified_inventory.get_per_player_formspec(player_name) ui.pagecols = 4 ui.pagerows = 6 ui.page_x = 10.5 - ui.page_y = 1.1 + ui.page_y = 1.25 ui.craft_x = 2.6 ui.craft_y = 0.75 ui.resultstr_y = 0.35 ui.give_btn_x = 0.15 ui.main_button_x = ui.page_x - ui.main_button_y = 7.8 + ui.main_button_y = 7.9 ui.page_buttons_x = ui.page_x - ui.page_buttons_y = 6.2 + ui.page_buttons_y = 6.3 ui.searchwidth = 1.6 ui.form_header_x = 0.2 ui.form_header_y = 0.2 @@ -276,8 +276,8 @@ function unified_inventory.get_formspec(player, page) n= n+1 if unified_inventory.activefilter[player_name] ~= "" then - 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]).."]" + formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.65)..";" .. F(S("Filter")) .. ":]" + formspec[n+1] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.25)..";"..F(unified_inventory.activefilter[player_name]).."]" end return table.concat(formspec, "") end From 603b5d1d4e79845b4c4f04e89209e74e249a020d Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 05:26:48 -0500 Subject: [PATCH 12/46] get rid of `uninv` global make all uses of it back into `unified_inventory.` --- bags.lua | 10 +++++----- init.lua | 8 +++----- internal.lua | 2 +- register.lua | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/bags.lua b/bags.lua index 735a758..fa98b93 100644 --- a/bags.lua +++ b/bags.lua @@ -14,7 +14,7 @@ unified_inventory.register_page("bags", { local player_name = player:get_player_name() return { formspec = table.concat({ unified_inventory.standard_inv_bg, - bags_inv_bg_prefix..uninv.imgscale..";ui_bags_header.png]", + bags_inv_bg_prefix..unified_inventory.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)) .. "]", @@ -57,11 +57,11 @@ for bag_i = 1, 4 do } local slots = stack:get_definition().groups.bagslots if slots == 8 then - fs[#fs + 1] = bags_inv_bg_prefix..uninv.imgscale..";ui_bags_inv_small.png]" + fs[#fs + 1] = bags_inv_bg_prefix..unified_inventory.imgscale..";ui_bags_inv_small.png]" elseif slots == 16 then - fs[#fs + 1] = bags_inv_bg_prefix..(uninv.imgscale*2)..";ui_bags_inv_medium.png]" + fs[#fs + 1] = bags_inv_bg_prefix..(unified_inventory.imgscale*2)..";ui_bags_inv_medium.png]" elseif slots == 24 then - fs[#fs + 1] = bags_inv_bg_prefix..(uninv.imgscale*3)..";ui_bags_inv_large.png]" + fs[#fs + 1] = bags_inv_bg_prefix..(unified_inventory.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]" @@ -70,7 +70,7 @@ for bag_i = 1, 4 do 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[7.8,0.25;"..uninv.imgscale..","..uninv.imgscale..";ui_trash_slot.png]" + fs[#fs + 1] = "image[7.8,0.25;"..unified_inventory.imgscale..","..unified_inventory.imgscale..";ui_trash_slot.png]" .. "list[detached:trash;main;7.95,0.25;1,1;]" end local inv = player:get_inventory() diff --git a/init.lua b/init.lua index 67d5b9c..d534209 100644 --- a/init.lua +++ b/init.lua @@ -61,11 +61,9 @@ unified_inventory = { standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", } -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]" +unified_inventory.standard_inv = "list[current_player;main;"..(unified_inventory.std_inv_x+0.15)..","..(unified_inventory.std_inv_y+0.15)..";8,4;]" +unified_inventory.standard_inv_bg = "image["..unified_inventory.std_inv_x..","..unified_inventory.std_inv_y..";"..(unified_inventory.imgscale*8).. + ","..(unified_inventory.imgscale*4)..";ui_main_inventory.png]" -- Disable default creative inventory local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") diff --git a/internal.lua b/internal.lua index 2d07472..d8b736c 100644 --- a/internal.lua +++ b/internal.lua @@ -110,7 +110,7 @@ function unified_inventory.get_formspec(player, page) if unified_inventory.is_creative(player_name) 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]" + formspec[n] = "image["..(ui_peruser.craft_x-2.5)..","..(ui_peruser.craft_y+2.5)..";"..unified_inventory.imgscale..","..unified_inventory.imgscale..";ui_single_slot.png]" n = n+1 end diff --git a/register.lua b/register.lua index b1f5d74..bd6ecf2 100644 --- a/register.lua +++ b/register.lua @@ -172,7 +172,7 @@ unified_inventory.register_page("craft", { local craftresultx = craftx + 5 local player_name = player:get_player_name() - local formspec = "image["..craftx..","..crafty..";"..(uninv.imgscale*6)..","..(uninv.imgscale*3)..";ui_crafting_form.png]" + local formspec = "image["..craftx..","..crafty..";"..(unified_inventory.imgscale*6)..","..(unified_inventory.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]" @@ -180,7 +180,7 @@ unified_inventory.register_page("craft", { 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["..(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.."image["..(craftx+6.25)..","..(crafty + 2.5)..";"..unified_inventory.imgscale..","..unified_inventory.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]" From 82bc2d3f959ff18b7ef7beed7bb9ee3c0f261c0a Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 05:33:25 -0500 Subject: [PATCH 13/46] use string.format() to create the standard_inv variables do it just once, after the lite mode settings are applied (if applicable) --- init.lua | 4 ---- internal.lua | 10 +++++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/init.lua b/init.lua index d534209..1538d65 100644 --- a/init.lua +++ b/init.lua @@ -61,10 +61,6 @@ unified_inventory = { standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", } -unified_inventory.standard_inv = "list[current_player;main;"..(unified_inventory.std_inv_x+0.15)..","..(unified_inventory.std_inv_y+0.15)..";8,4;]" -unified_inventory.standard_inv_bg = "image["..unified_inventory.std_inv_x..","..unified_inventory.std_inv_y..";"..(unified_inventory.imgscale*8).. - ","..(unified_inventory.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 d8b736c..e1a24fd 100644 --- a/internal.lua +++ b/internal.lua @@ -69,12 +69,16 @@ function unified_inventory.get_per_player_formspec(player_name) 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 + ui.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + ui.std_inv_x+0.15, ui.std_inv_y+0.15) + + ui.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", + ui.std_inv_x, ui.std_inv_y, + unified_inventory.imgscale*8, unified_inventory.imgscale*4) return ui, lite end From 23a089f174580fd19995c74ea9be92bf7c67f651 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 05:36:49 -0500 Subject: [PATCH 14/46] remove a used-only-once variable --- internal.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal.lua b/internal.lua index e1a24fd..eb4af0d 100644 --- a/internal.lua +++ b/internal.lua @@ -91,8 +91,6 @@ 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 formheadery = ui_peruser.form_header_y - unified_inventory.current_page[player_name] = page local pagedef = unified_inventory.pages[page] @@ -274,7 +272,7 @@ function unified_inventory.get_formspec(player, page) end end end - formspec[n] = "label["..ui_peruser.page_x..","..formheadery..";"..F(S("Page")) .. ": " + formspec[n] = "label["..ui_peruser.page_x..","..ui_peruser.form_header_y..";"..F(S("Page")) .. ": " .. S("@1 of @2",page2,pagemax).."]" end n= n+1 From c3679eaf7b180800a13548fabfd07d1e5f487fe0 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 05:38:37 -0500 Subject: [PATCH 15/46] fix indent --- internal.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal.lua b/internal.lua index eb4af0d..4adef3f 100644 --- a/internal.lua +++ b/internal.lua @@ -213,7 +213,7 @@ function unified_inventory.get_formspec(player, page) local bn = 0 for _, b in pairs(btnlist) do - formspec[n] = "image_button[".. + 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..",".. From 0c05f06fa84b778e366ceec986f6180f167c4559 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 06:09:13 -0500 Subject: [PATCH 16/46] "Please continue to use string.format here to avoid messy code" Derp :-) --- internal.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/internal.lua b/internal.lua index 4adef3f..0b6db4b 100644 --- a/internal.lua +++ b/internal.lua @@ -73,7 +73,7 @@ function unified_inventory.get_per_player_formspec(player_name) end ui.items_per_page = ui.pagecols * ui.pagerows - ui.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + ui.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", ui.std_inv_x+0.15, ui.std_inv_y+0.15) ui.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", @@ -259,8 +259,10 @@ 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;"..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, + formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format( + ui_peruser.page_x + x * ui_peruser.btn_spc, + ui_peruser.page_y + y * ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, name, button_name ) formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format( From 5a8a75f43bcb4bb46a5225efcdad003a0e27e665 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 06:27:40 -0500 Subject: [PATCH 17/46] put style-specific settings in their own tables and switch between them directly, instead of copy-and-modify. --- init.lua | 36 ++++++++++++++++++++++++++++++++---- internal.lua | 49 ++----------------------------------------------- 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/init.lua b/init.lua index 1538d65..72fcb39 100644 --- a/init.lua +++ b/init.lua @@ -35,9 +35,15 @@ unified_inventory = { -- Trash enabled trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), + imgscale = 1.25, + standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]",} - formspec_x = 1, -- UI doesn't use these first two anymore, but other mods - formspec_y = 1, -- may need them. +-- These tables establish position and layout for the two UI styles. +-- UI doesn't use formspec_[xy] anymore, but other mods may need them. + +unified_inventory.style_full = { + formspec_x = 1, + formspec_y = 1, pagecols = 8, pagerows = 10, page_x = 10.75, @@ -55,10 +61,32 @@ unified_inventory = { 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.75, - standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", +} + +unified_inventory.style_lite = { + formspec_x = 0.6, + formspec_y = 0.6, + pagecols = 4, + pagerows = 6, + page_x = 10.5, + page_y = 1.25, + craft_x = 2.6, + craft_y = 0.75, + resultstr_y = 0.35, + give_btn_x = 0.15, + main_button_x = 10.5, + main_button_y = 7.9, + page_buttons_x = 10.5, + page_buttons_y = 6.3, + searchwidth = 1.6, + form_header_x = 0.2, + form_header_y = 0.2, + btn_spc = 0.8, + btn_size = 0.7, + std_inv_x = 0.1, + std_inv_y = 4.6, } -- Disable default creative inventory diff --git a/internal.lua b/internal.lua index 0b6db4b..c356c41 100644 --- a/internal.lua +++ b/internal.lua @@ -21,55 +21,10 @@ 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.craft_x = unified_inventory.craft_x - ui.craft_y = unified_inventory.craft_y - ui.resultstr_y = unified_inventory.resultstr_y - ui.give_btn_x = unified_inventory.give_btn_x - ui.main_button_x = unified_inventory.main_button_x - ui.main_button_y = unified_inventory.main_button_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 + local ui = unified_inventory.style_full if lite then - - ui.formspec_x = 0.6 - ui.formspec_y = 0.6 - ui.pagecols = 4 - ui.pagerows = 6 - ui.page_x = 10.5 - ui.page_y = 1.25 - ui.craft_x = 2.6 - ui.craft_y = 0.75 - ui.resultstr_y = 0.35 - ui.give_btn_x = 0.15 - ui.main_button_x = ui.page_x - ui.main_button_y = 7.9 - ui.page_buttons_x = ui.page_x - ui.page_buttons_y = 6.3 - 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 = unified_inventory.style_lite end ui.items_per_page = ui.pagecols * ui.pagerows From b3077898a72243828001daa9459cc90963ca336f Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 08:00:12 -0500 Subject: [PATCH 18/46] make waypoints explicitly reference full-style vars (since it does not support lite mode) --- waypoints.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/waypoints.lua b/waypoints.lua index fd4ae7a..3d4136d 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -17,27 +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 + local wp_info_x = unified_inventory.style_full.form_header_x + 1.25 + local wp_info_y = unified_inventory.style_full.form_header_y + 0.5 + local wp_bottom_row = unified_inventory.style_full.std_inv_y - 1 + local wp_buttons_rj = unified_inventory.style_full.std_inv_x + 10.1 - unified_inventory.style_full.btn_spc + local wp_edit_w = unified_inventory.style_full.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 = unified_inventory.standard_inv_bg.. - "label["..unified_inventory.form_header_x..","..unified_inventory.form_header_y..";" .. F(S("Waypoints")) .. "]".. + local formspec = unified_inventory.style_full.standard_inv_bg.. + "label["..unified_inventory.style_full.form_header_x..","..unified_inventory.style_full.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 do formspec = formspec .. - "image_button["..unified_inventory.main_button_x..",".. - (wp_bottom_row - (5-i) * unified_inventory.btn_spc)..";".. - unified_inventory.btn_size..","..unified_inventory.btn_size..";" .. + "image_button["..unified_inventory.style_full.main_button_x..",".. + (wp_bottom_row - (5-i) * unified_inventory.style_full.btn_spc)..";".. + unified_inventory.style_full.btn_size..","..unified_inventory.style_full.btn_size..";" .. (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. "ui_" .. i .. "_icon.png;" .. "select_waypoint" .. i .. ";]" .. @@ -63,9 +63,9 @@ unified_inventory.register_page("waypoints", { local x = 4 for _, b in pairs(btnlist) do formspec = formspec .. - "image_button["..(wp_buttons_rj - unified_inventory.btn_spc * x)..",".. + "image_button["..(wp_buttons_rj - unified_inventory.style_full.btn_spc * x)..",".. wp_bottom_row..";".. - unified_inventory.btn_size..","..unified_inventory.btn_size..";".. + unified_inventory.style_full.btn_size..","..unified_inventory.style_full.btn_size..";".. b[1]..";".. b[2]..i..";]".. "tooltip["..b[2]..i..";"..F(S(b[3], b[4] or "")).."]" @@ -82,11 +82,11 @@ unified_inventory.register_page("waypoints", { if temp.edit then formspec = formspec .. - "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 .. ";;".. + "field["..(wp_buttons_rj - wp_edit_w - 0.1)..","..(wp_bottom_row - unified_inventory.style_full.btn_spc)..";".. + wp_edit_w..","..unified_inventory.style_full.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..";".. + "image_button["..wp_buttons_rj..","..(wp_bottom_row - unified_inventory.style_full.btn_spc)..";".. + unified_inventory.style_full.btn_size..","..unified_inventory.style_full.btn_size..";".. "ui_ok_icon.png;".. "confirm_rename"..i.. ";]".. "tooltip[confirm_rename" .. i .. ";" From 2d200eb9ae145beb0db1c66e1e3c12639c957770 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 08:13:53 -0500 Subject: [PATCH 19/46] Ditto for bags. --- bags.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bags.lua b/bags.lua index fa98b93..62d6862 100644 --- a/bags.lua +++ b/bags.lua @@ -13,9 +13,9 @@ unified_inventory.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ - unified_inventory.standard_inv_bg, + unified_inventory.style_full.standard_inv_bg, bags_inv_bg_prefix..unified_inventory.imgscale..";ui_bags_header.png]", - "label["..unified_inventory.form_header_x..","..unified_inventory.form_header_y..";" .. F(S("Bags")) .. "]", + "label["..unified_inventory.style_full.form_header_x..","..unified_inventory.style_full.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)) .. "]", @@ -49,7 +49,7 @@ for bag_i = 1, 4 do local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image local fs = { - unified_inventory.standard_inv_bg, + unified_inventory.style_full.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]", From 694553e68b9acfa56de68b3e7ab126ed83e13d98 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 08:18:17 -0500 Subject: [PATCH 20/46] use local "ui" to reference "unified_inventory", where practical (makes code shorter, easier to read and write) --- api.lua | 91 +++++++++++++++++++++++----------------------- bags.lua | 31 ++++++++-------- internal.lua | 99 ++++++++++++++++++++++++++------------------------- register.lua | 85 +++++++++++++++++++++---------------------- waypoints.lua | 39 ++++++++++---------- 5 files changed, 175 insertions(+), 170 deletions(-) diff --git a/api.lua b/api.lua index 81dd8f3..a81cf89 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,6 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory -- Create detached creative inventory after loading all mods minetest.after(0.01, function() @@ -8,12 +9,12 @@ minetest.after(0.01, function() if not rev_aliases[target] then rev_aliases[target] = {} end table.insert(rev_aliases[target], source) end - unified_inventory.items_list = {} + ui.items_list = {} for name, def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - table.insert(unified_inventory.items_list, name) + table.insert(ui.items_list, name) local all_names = rev_aliases[name] or {} table.insert(all_names, name) for _, player_name in ipairs(all_names) do @@ -26,30 +27,30 @@ minetest.after(0.01, function() for _,chk in pairs(recipe.items) do local groupchk = string.find(chk, "group:") if (not groupchk and not minetest.registered_items[chk]) - or (groupchk and not unified_inventory.get_group_item(string.gsub(chk, "group:", "")).item) + or (groupchk and not ui.get_group_item(string.gsub(chk, "group:", "")).item) or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then unknowns = true end end if not unknowns then - unified_inventory.register_craft(recipe) + ui.register_craft(recipe) end end end end end end - table.sort(unified_inventory.items_list) - unified_inventory.items_list_size = #unified_inventory.items_list - print("Unified Inventory. inventory size: "..unified_inventory.items_list_size) - for _, name in ipairs(unified_inventory.items_list) do + table.sort(ui.items_list) + ui.items_list_size = #ui.items_list + print("Unified Inventory. inventory size: "..ui.items_list_size) + for _, name in ipairs(ui.items_list) do local def = minetest.registered_items[name] -- Simple drops if type(def.drop) == "string" then local dstack = ItemStack(def.drop) if not dstack:is_empty() and dstack:get_name() ~= name then - unified_inventory.register_craft({ + ui.register_craft({ type = "digging", items = {name}, output = def.drop, @@ -115,7 +116,7 @@ minetest.after(0.01, function() end end for itemstring, count in pairs(drop_guaranteed) do - unified_inventory.register_craft({ + ui.register_craft({ type = "digging", items = {name}, output = itemstring .. " " .. count, @@ -123,7 +124,7 @@ minetest.after(0.01, function() }) end for itemstring, count in pairs(drop_maybe) do - unified_inventory.register_craft({ + ui.register_craft({ type = "digging_chance", items = {name}, output = itemstring .. " " .. count, @@ -132,22 +133,22 @@ minetest.after(0.01, function() end end end - for _, recipes in pairs(unified_inventory.crafts_for.recipe) do + for _, recipes in pairs(ui.crafts_for.recipe) do for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) do - local matches_spec = unified_inventory.canonical_item_spec_matcher(spec) - for _, name in ipairs(unified_inventory.items_list) do + local matches_spec = ui.canonical_item_spec_matcher(spec) + for _, name in ipairs(ui.items_list) do if matches_spec(name) then ingredient_items[name] = true end end end for name, _ in pairs(ingredient_items) do - if unified_inventory.crafts_for.usage[name] == nil then - unified_inventory.crafts_for.usage[name] = {} + if ui.crafts_for.usage[name] == nil then + ui.crafts_for.usage[name] = {} end - table.insert(unified_inventory.crafts_for.usage[name], recipe) + table.insert(ui.crafts_for.usage[name], recipe) end end end @@ -156,9 +157,9 @@ end) -- load_home local function load_home() - local input = io.open(unified_inventory.home_filename, "r") + local input = io.open(ui.home_filename, "r") if not input then - unified_inventory.home_pos = {} + ui.home_pos = {} return end while true do @@ -167,25 +168,25 @@ local function load_home() local y = input:read("*n") local z = input:read("*n") local name = input:read("*l") - unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z} + ui.home_pos[name:sub(2)] = {x = x, y = y, z = z} end io.close(input) end load_home() -function unified_inventory.set_home(player, pos) +function ui.set_home(player, pos) local player_name = player:get_player_name() - unified_inventory.home_pos[player_name] = vector.round(pos) + ui.home_pos[player_name] = vector.round(pos) -- save the home data from the table to the file - local output = io.open(unified_inventory.home_filename, "w") - for k, v in pairs(unified_inventory.home_pos) do + local output = io.open(ui.home_filename, "w") + for k, v in pairs(ui.home_pos) do output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n") end io.close(output) end -function unified_inventory.go_home(player) - local pos = unified_inventory.home_pos[player:get_player_name()] +function ui.go_home(player) + local pos = ui.home_pos[player:get_player_name()] if pos then player:set_pos(pos) return true @@ -194,7 +195,7 @@ function unified_inventory.go_home(player) end -- register_craft -function unified_inventory.register_craft(options) +function ui.register_craft(options) if not options.output then return end @@ -205,10 +206,10 @@ function unified_inventory.register_craft(options) if options.type == "normal" and options.width == 0 then options = { type = "shapeless", items = options.items, output = options.output, width = 0 } end - if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then - unified_inventory.crafts_for.recipe[itemstack:get_name()] = {} + if not ui.crafts_for.recipe[itemstack:get_name()] then + ui.crafts_for.recipe[itemstack:get_name()] = {} end - table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options) + table.insert(ui.crafts_for.recipe[itemstack:get_name()],options) end @@ -219,7 +220,7 @@ local craft_type_defaults = { } -function unified_inventory.craft_type_defaults(name, options) +function ui.craft_type_defaults(name, options) if not options.description then options.description = name end @@ -228,13 +229,13 @@ function unified_inventory.craft_type_defaults(name, options) end -function unified_inventory.register_craft_type(name, options) - unified_inventory.registered_craft_types[name] = - unified_inventory.craft_type_defaults(name, options) +function ui.register_craft_type(name, options) + ui.registered_craft_types[name] = + ui.craft_type_defaults(name, options) end -unified_inventory.register_craft_type("normal", { +ui.register_craft_type("normal", { description = F(S("Crafting")), icon = "ui_craftgrid_icon.png", width = 3, @@ -250,7 +251,7 @@ unified_inventory.register_craft_type("normal", { }) -unified_inventory.register_craft_type("shapeless", { +ui.register_craft_type("shapeless", { description = F(S("Mixing")), icon = "ui_craftgrid_icon.png", width = 3, @@ -265,7 +266,7 @@ unified_inventory.register_craft_type("shapeless", { }) -unified_inventory.register_craft_type("cooking", { +ui.register_craft_type("cooking", { description = F(S("Cooking")), icon = "default_furnace_front.png", width = 1, @@ -273,37 +274,37 @@ unified_inventory.register_craft_type("cooking", { }) -unified_inventory.register_craft_type("digging", { +ui.register_craft_type("digging", { description = F(S("Digging")), icon = "default_tool_steelpick.png", width = 1, height = 1, }) -unified_inventory.register_craft_type("digging_chance", { +ui.register_craft_type("digging_chance", { description = "Digging (by chance)", icon = "default_tool_steelpick.png^[transformFY.png", width = 1, height = 1, }) -function unified_inventory.register_page(name, def) - unified_inventory.pages[name] = def +function ui.register_page(name, def) + ui.pages[name] = def end -function unified_inventory.register_button(name, def) +function ui.register_button(name, def) if not def.action then def.action = function(player) - unified_inventory.set_inventory_formspec(player, name) + ui.set_inventory_formspec(player, name) end end def.name = name - table.insert(unified_inventory.buttons, def) + table.insert(ui.buttons, def) end -function unified_inventory.is_creative(playername) +function ui.is_creative(playername) return minetest.check_player_privs(playername, {creative=true}) or minetest.settings:get_bool("creative_mode") end diff --git a/bags.lua b/bags.lua index 62d6862..8588d41 100644 --- a/bags.lua +++ b/bags.lua @@ -7,15 +7,16 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape -local bags_inv_bg_prefix = "image[0.3,1.5;"..(unified_inventory.imgscale*8).."," +local ui = unified_inventory +local bags_inv_bg_prefix = "image[0.3,1.5;"..(ui.imgscale*8).."," -unified_inventory.register_page("bags", { +ui.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ - unified_inventory.style_full.standard_inv_bg, - bags_inv_bg_prefix..unified_inventory.imgscale..";ui_bags_header.png]", - "label["..unified_inventory.style_full.form_header_x..","..unified_inventory.style_full.form_header_y..";" .. F(S("Bags")) .. "]", + ui.style_full.standard_inv_bg, + bags_inv_bg_prefix..ui.imgscale..";ui_bags_header.png]", + "label["..ui.style_full.form_header_x..","..ui.style_full.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)) .. "]", @@ -29,7 +30,7 @@ unified_inventory.register_page("bags", { end, }) -unified_inventory.register_button("bags", { +ui.register_button("bags", { type = "image", image = "ui_bags_icon.png", tooltip = S("Bags"), @@ -44,12 +45,12 @@ local function get_player_bag_stack(player, i) end for bag_i = 1, 4 do - unified_inventory.register_page("bag" .. bag_i, { + ui.register_page("bag" .. bag_i, { get_formspec = function(player) local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image local fs = { - unified_inventory.style_full.standard_inv_bg, + ui.style_full.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]", @@ -57,20 +58,20 @@ for bag_i = 1, 4 do } local slots = stack:get_definition().groups.bagslots if slots == 8 then - fs[#fs + 1] = bags_inv_bg_prefix..unified_inventory.imgscale..";ui_bags_inv_small.png]" + fs[#fs + 1] = bags_inv_bg_prefix..ui.imgscale..";ui_bags_inv_small.png]" elseif slots == 16 then - fs[#fs + 1] = bags_inv_bg_prefix..(unified_inventory.imgscale*2)..";ui_bags_inv_medium.png]" + fs[#fs + 1] = bags_inv_bg_prefix..(ui.imgscale*2)..";ui_bags_inv_medium.png]" elseif slots == 24 then - fs[#fs + 1] = bags_inv_bg_prefix..(unified_inventory.imgscale*3)..";ui_bags_inv_large.png]" + fs[#fs + 1] = bags_inv_bg_prefix..(ui.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) + if ui.trash_enabled + or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then - fs[#fs + 1] = "image[7.8,0.25;"..unified_inventory.imgscale..","..unified_inventory.imgscale..";ui_trash_slot.png]" + fs[#fs + 1] = "image[7.8,0.25;"..ui.imgscale..","..ui.imgscale..";ui_trash_slot.png]" .. "list[detached:trash;main;7.95,0.25;1,1;]" end local inv = player:get_inventory() @@ -107,7 +108,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not stack:get_definition().groups.bagslots then return end - unified_inventory.set_inventory_formspec(player, "bag" .. i) + ui.set_inventory_formspec(player, "bag" .. i) return end end diff --git a/internal.lua b/internal.lua index c356c41..3314a16 100644 --- a/internal.lua +++ b/internal.lua @@ -1,5 +1,6 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory -- This pair of encoding functions is used where variable text must go in -- button names, where the text might contain formspec metacharacters. @@ -10,44 +11,44 @@ local F = minetest.formspec_escape -- 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) +function ui.mangle_for_formspec(str) return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end) end -function unified_inventory.demangle_for_formspec(str) +function ui.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}) +function ui.get_per_player_formspec(player_name) + local lite = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) - local ui = unified_inventory.style_full + local style = ui.style_full if lite then - ui = unified_inventory.style_lite + style = ui.style_lite end - ui.items_per_page = ui.pagecols * ui.pagerows - ui.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", - ui.std_inv_x+0.15, ui.std_inv_y+0.15) + style.items_per_page = style.pagecols * style.pagerows + style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + style.std_inv_x+0.15, style.std_inv_y+0.15) - ui.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", - ui.std_inv_x, ui.std_inv_y, - unified_inventory.imgscale*8, unified_inventory.imgscale*4) - return ui, lite + style.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", + style.std_inv_x, style.std_inv_y, + ui.imgscale*8, ui.imgscale*4) + return style, lite end -function unified_inventory.get_formspec(player, page) +function ui.get_formspec(player, page) if not player then return "" end local player_name = player:get_player_name() - local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) + local ui_peruser,draw_lite_mode = ui.get_per_player_formspec(player_name) - unified_inventory.current_page[player_name] = page - local pagedef = unified_inventory.pages[page] + ui.current_page[player_name] = page + local pagedef = ui.pages[page] if not pagedef then return "" -- Invalid page name @@ -56,22 +57,22 @@ function unified_inventory.get_formspec(player, page) local formspec = { "formspec_version[4]size[17.75,12.25]", pagedef.formspec_prepend and "" or "no_prepend[]", - unified_inventory.standard_background -- Background + ui.standard_background -- Background } local n = 4 if draw_lite_mode then formspec[1] = "formspec_version[4]size[14,9.75]" - formspec[3] = unified_inventory.standard_background + formspec[3] = ui.standard_background end - if unified_inventory.is_creative(player_name) + if ui.is_creative(player_name) and page == "craft" then -- add the "Refill" slot. - formspec[n] = "image["..(ui_peruser.craft_x-2.5)..","..(ui_peruser.craft_y+2.5)..";"..unified_inventory.imgscale..","..unified_inventory.imgscale..";ui_single_slot.png]" + formspec[n] = "image["..(ui_peruser.craft_x-2.5)..","..(ui_peruser.craft_y+2.5)..";"..ui.imgscale..","..ui.imgscale..";ui_single_slot.png]" n = n+1 end - local perplayer_formspec = unified_inventory.get_per_player_formspec(player_name) + local perplayer_formspec = ui.get_per_player_formspec(player_name) local fsdata = pagedef.get_formspec(player, perplayer_formspec) formspec[n] = fsdata.formspec @@ -84,7 +85,7 @@ function unified_inventory.get_formspec(player, page) local filtered_inv_buttons = {} - for i, def in pairs(unified_inventory.buttons) do + for i, def in pairs(ui.buttons) do if not (draw_lite_mode and def.hide_lite) then table.insert(filtered_inv_buttons, def) end @@ -136,7 +137,7 @@ function unified_inventory.get_formspec(player, page) ui_peruser.page_buttons_y..";".. (ui_peruser.searchwidth - 0.1)..",".. ui_peruser.btn_size..";searchbox;;".. - F(unified_inventory.current_searchbox[player_name]) .. "]" + F(ui.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.. @@ -185,23 +186,23 @@ function unified_inventory.get_formspec(player, page) end -- Items list - if #unified_inventory.filtered_items_list[player_name] == 0 then + if #ui.filtered_items_list[player_name] == 0 then 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] + local dir = ui.active_search_direction[player_name] + local list_index = ui.current_index[player_name] local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1) local pagemax = math.floor( - (#unified_inventory.filtered_items_list[player_name] - 1) + (#ui.filtered_items_list[player_name] - 1) / (ui_peruser.items_per_page) + 1) for y = 0, ui_peruser.pagerows - 1 do for x = 0, ui_peruser.pagecols - 1 do - local name = unified_inventory.filtered_items_list[player_name][list_index] + local name = ui.filtered_items_list[player_name][list_index] local item = minetest.registered_items[name] if item then -- Clicked on current item: Flip crafting direction - if name == unified_inventory.current_item[player_name] then - local cdir = unified_inventory.current_craft_direction[player_name] + if name == ui.current_item[player_name] then + local cdir = ui.current_craft_direction[player_name] if cdir == "recipe" then dir = "usage" elseif cdir == "usage" then @@ -209,11 +210,11 @@ function unified_inventory.get_formspec(player, page) end else -- Default: use active search direction by default - dir = unified_inventory.active_search_direction[player_name] + dir = ui.active_search_direction[player_name] end local button_name = "item_button_" .. dir .. "_" - .. unified_inventory.mangle_for_formspec(name) + .. ui.mangle_for_formspec(name) formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format( ui_peruser.page_x + x * ui_peruser.btn_spc, ui_peruser.page_y + y * ui_peruser.btn_spc, @@ -234,21 +235,21 @@ function unified_inventory.get_formspec(player, page) end n= n+1 - if unified_inventory.activefilter[player_name] ~= "" then + if ui.activefilter[player_name] ~= "" then formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.65)..";" .. F(S("Filter")) .. ":]" - formspec[n+1] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.25)..";"..F(unified_inventory.activefilter[player_name]).."]" + formspec[n+1] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.25)..";"..F(ui.activefilter[player_name]).."]" end return table.concat(formspec, "") end -function unified_inventory.set_inventory_formspec(player, page) +function ui.set_inventory_formspec(player, page) if player then - player:set_inventory_formspec(unified_inventory.get_formspec(player, page)) + player:set_inventory_formspec(ui.get_formspec(player, page)) end end --apply filter to the inventory list (create filtered copy of full one) -function unified_inventory.apply_filter(player, filter, search_dir) +function ui.apply_filter(player, filter, search_dir) if not player then return false end @@ -277,26 +278,26 @@ function unified_inventory.apply_filter(player, filter, search_dir) or llocaldesc and string.find(llocaldesc, lfilter, 1, true) end end - unified_inventory.filtered_items_list[player_name]={} + ui.filtered_items_list[player_name]={} for name, def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" and ffilter(name, def) then - table.insert(unified_inventory.filtered_items_list[player_name], name) + table.insert(ui.filtered_items_list[player_name], name) end end - table.sort(unified_inventory.filtered_items_list[player_name]) - unified_inventory.filtered_items_list_size[player_name] = #unified_inventory.filtered_items_list[player_name] - unified_inventory.current_index[player_name] = 1 - unified_inventory.activefilter[player_name] = filter - unified_inventory.active_search_direction[player_name] = search_dir - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) + table.sort(ui.filtered_items_list[player_name]) + ui.filtered_items_list_size[player_name] = #ui.filtered_items_list[player_name] + ui.current_index[player_name] = 1 + ui.activefilter[player_name] = filter + ui.active_search_direction[player_name] = search_dir + ui.set_inventory_formspec(player, + ui.current_page[player_name]) end -function unified_inventory.items_in_group(groups) +function ui.items_in_group(groups) local items = {} for name, item in pairs(minetest.registered_items) do for _, group in pairs(groups:split(',')) do @@ -308,7 +309,7 @@ function unified_inventory.items_in_group(groups) return items end -function unified_inventory.sort_inventory(inv) +function ui.sort_inventory(inv) local inlist = inv:get_list("main") local typecnt = {} local typekeys = {} diff --git a/register.lua b/register.lua index bd6ecf2..4533f6e 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 ui = unified_inventory minetest.register_privilege("creative", { description = S("Can use the creative inventory"), @@ -14,7 +15,7 @@ minetest.register_privilege("ui_full", { 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 + -- if ui.is_creative(player:get_player_name()) then -- return stack:get_count() -- else -- return 0 @@ -28,19 +29,19 @@ local trash = minetest.create_detached_inventory("trash", { }) trash:set_size("main", 1) -unified_inventory.register_button("craft", { +ui.register_button("craft", { type = "image", image = "ui_craft_icon.png", tooltip = S("Crafting Grid") }) -unified_inventory.register_button("craftguide", { +ui.register_button("craftguide", { type = "image", image = "ui_craftguide_icon.png", tooltip = S("Crafting Guide") }) -unified_inventory.register_button("home_gui_set", { +ui.register_button("home_gui_set", { type = "image", image = "ui_sethome_icon.png", tooltip = S("Set home position"), @@ -48,8 +49,8 @@ unified_inventory.register_button("home_gui_set", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - unified_inventory.set_home(player, player:get_pos()) - local home = unified_inventory.home_pos[player_name] + ui.set_home(player, player:get_pos()) + local home = ui.home_pos[player_name] if home ~= nil then minetest.sound_play("dingdong", {to_player=player_name, gain = 1.0}) @@ -59,7 +60,7 @@ unified_inventory.register_button("home_gui_set", { else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -67,7 +68,7 @@ unified_inventory.register_button("home_gui_set", { end, }) -unified_inventory.register_button("home_gui_go", { +ui.register_button("home_gui_go", { type = "image", image = "ui_gohome_icon.png", tooltip = S("Go home"), @@ -75,13 +76,13 @@ unified_inventory.register_button("home_gui_go", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - if unified_inventory.go_home(player) then + if ui.go_home(player) then minetest.sound_play("teleport", {to_player = player_name}) end else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -89,7 +90,7 @@ unified_inventory.register_button("home_gui_go", { end, }) -unified_inventory.register_button("misc_set_day", { +ui.register_button("misc_set_day", { type = "image", image = "ui_sun_icon.png", tooltip = S("Set time to day"), @@ -105,7 +106,7 @@ unified_inventory.register_button("misc_set_day", { else minetest.chat_send_player(player_name, S("You don't have the settime privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -113,7 +114,7 @@ unified_inventory.register_button("misc_set_day", { end, }) -unified_inventory.register_button("misc_set_night", { +ui.register_button("misc_set_night", { type = "image", image = "ui_moon_icon.png", tooltip = S("Set time to night"), @@ -129,7 +130,7 @@ unified_inventory.register_button("misc_set_night", { else minetest.chat_send_player(player_name, S("You don't have the settime privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -137,19 +138,19 @@ unified_inventory.register_button("misc_set_night", { end, }) -unified_inventory.register_button("clear_inv", { +ui.register_button("clear_inv", { type = "image", image = "ui_trash_icon.png", tooltip = S("Clear inventory"), action = function(player) local player_name = player:get_player_name() - if not unified_inventory.is_creative(player_name) then + if not ui.is_creative(player_name) then minetest.chat_send_player(player_name, S("This button has been disabled outside" .." of creative mode to prevent" .." accidental inventory trashing." .."\nUse the trash slot instead.")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) return end player:get_inventory():set_list("main", {}) @@ -158,11 +159,11 @@ unified_inventory.register_button("clear_inv", { {to_player=player_name, gain = 1.0}) end, condition = function(player) - return unified_inventory.is_creative(player:get_player_name()) + return ui.is_creative(player:get_player_name()) end, }) -unified_inventory.register_page("craft", { +ui.register_page("craft", { get_formspec = function(player, perplayer_formspec) local formheaderx = perplayer_formspec.form_header_x @@ -172,20 +173,20 @@ unified_inventory.register_page("craft", { local craftresultx = craftx + 5 local player_name = player:get_player_name() - local formspec = "image["..craftx..","..crafty..";"..(unified_inventory.imgscale*6)..","..(unified_inventory.imgscale*3)..";ui_crafting_form.png]" + local formspec = "image["..craftx..","..crafty..";"..(ui.imgscale*6)..","..(ui.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;"..(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 + if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then formspec = formspec.."label["..(craftx+6.45)..","..(crafty + 2.4)..";" .. F(S("Trash:")) .. "]" - formspec = formspec.."image["..(craftx+6.25)..","..(crafty + 2.5)..";"..unified_inventory.imgscale..","..unified_inventory.imgscale..";ui_trash_slot.png]" + formspec = formspec.."image["..(craftx+6.25)..","..(crafty + 2.5)..";"..ui.imgscale..","..ui.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 + if ui.is_creative(player_name) then 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 @@ -208,18 +209,18 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item) local selectitem = name if name:sub(1, 6) == "group:" then local group_name = name:sub(7) - local group_item = unified_inventory.get_group_item(group_name) + local group_item = ui.get_group_item(group_name) show_is_group = not group_item.sole displayitem = group_item.item or "unknown" selectitem = group_item.sole and displayitem or name end local label = show_is_group and "G" or "" - local buttonname = F(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem)) + local buttonname = F(buttonname_prefix..ui.mangle_for_formspec(selectitem)) local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]", x, y, w, h, F(displayitem), buttonname, label) if show_is_group then - local groupstring, andcount = unified_inventory.extract_groupnames(name) + local groupstring, andcount = ui.extract_groupnames(name) local grouptip if andcount == 1 then grouptip = S("Any item belonging to the @1 group", groupstring) @@ -259,7 +260,7 @@ local other_dir = { usage = "recipe", } -unified_inventory.register_page("craftguide", { +ui.register_page("craftguide", { get_formspec = function(player, perplayer_formspec) local craftx = perplayer_formspec.craft_x @@ -277,7 +278,7 @@ unified_inventory.register_page("craftguide", { "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", "listcolors[#00000000;#00000000]" } - local item_name = unified_inventory.current_item[player_name] + local item_name = ui.current_item[player_name] if not item_name then return { formspec = table.concat(fs) } end @@ -291,17 +292,17 @@ unified_inventory.register_page("craftguide", { item_name_shown = item_name end - local dir = unified_inventory.current_craft_direction[player_name] + local dir = ui.current_craft_direction[player_name] local rdir = dir == "recipe" and "usage" or "recipe" - local crafts = unified_inventory.crafts_for[dir][item_name] - local alternate = unified_inventory.alternate[player_name] + local crafts = ui.crafts_for[dir][item_name] + local alternate = ui.alternate[player_name] local alternates, craft if crafts and #crafts > 0 then alternates = #crafts craft = crafts[alternate] end - local has_give = player_privs.give or unified_inventory.is_creative(player_name) + local has_give = player_privs.give or ui.is_creative(player_name) 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;]", @@ -334,8 +335,8 @@ unified_inventory.register_page("craftguide", { "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, {}) + local craft_type = ui.registered_craft_types[craft.type] or + ui.craft_type_defaults(craft.type, {}) if craft_type.icon then fs[#fs + 1] = string.format("image[%f,%f;%f,%f;%s]", craftarrowx+0.1, crafty + 0.95, 1, 1, craft_type.icon) @@ -426,7 +427,7 @@ local function craftguide_giveme(player, formname, fields) local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) if not player_privs.give and - not unified_inventory.is_creative(player_name) then + not ui.is_creative(player_name) then minetest.log("action", "[unified_inventory] Denied give action to player " .. player_name) return @@ -441,7 +442,7 @@ local function craftguide_giveme(player, formname, fields) amount = tonumber(amount) or 0 if amount == 0 then return end - local output = unified_inventory.current_item[player_name] + local output = ui.current_item[player_name] if (not output) or (output == "") then return end local player_inv = player:get_inventory() @@ -462,21 +463,21 @@ local function craftguide_craft(player, formname, fields) local player_name = player:get_player_name() - local output = unified_inventory.current_item[player_name] or "" + local output = ui.current_item[player_name] or "" if output == "" then return end - local crafts = unified_inventory.crafts_for[ - unified_inventory.current_craft_direction[player_name]][output] or {} + local crafts = ui.crafts_for[ + ui.current_craft_direction[player_name]][output] or {} if #crafts == 0 then return end - local alternate = unified_inventory.alternate[player_name] + local alternate = ui.alternate[player_name] local craft = crafts[alternate] if craft.width > 3 then return end - unified_inventory.craftguide_match_craft(player, "main", "craft", craft, amount) + ui.craftguide_match_craft(player, "main", "craft", craft, amount) - unified_inventory.set_inventory_formspec(player, "craft") + ui.set_inventory_formspec(player, "craft") end minetest.register_on_player_receive_fields(function(player, formname, fields) diff --git a/waypoints.lua b/waypoints.lua index 3d4136d..36ba6da 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -1,5 +1,6 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory local hud_colors = { {"#FFFFFF", 0xFFFFFF, S("White")}, @@ -14,30 +15,30 @@ local hud_colors_max = #hud_colors -- Stores temporary player data (persists until player leaves) local waypoints_temp = {} -unified_inventory.register_page("waypoints", { +ui.register_page("waypoints", { get_formspec = function(player) local player_name = player:get_player_name() - local wp_info_x = unified_inventory.style_full.form_header_x + 1.25 - local wp_info_y = unified_inventory.style_full.form_header_y + 0.5 - local wp_bottom_row = unified_inventory.style_full.std_inv_y - 1 - local wp_buttons_rj = unified_inventory.style_full.std_inv_x + 10.1 - unified_inventory.style_full.btn_spc - local wp_edit_w = unified_inventory.style_full.btn_spc * 4 - 0.1 + local wp_info_x = ui.style_full.form_header_x + 1.25 + local wp_info_y = ui.style_full.form_header_y + 0.5 + local wp_bottom_row = ui.style_full.std_inv_y - 1 + local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc + local wp_edit_w = ui.style_full.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 = unified_inventory.style_full.standard_inv_bg.. - "label["..unified_inventory.style_full.form_header_x..","..unified_inventory.style_full.form_header_y..";" .. F(S("Waypoints")) .. "]".. + local formspec = ui.style_full.standard_inv_bg.. + "label["..ui.style_full.form_header_x..","..ui.style_full.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 do formspec = formspec .. - "image_button["..unified_inventory.style_full.main_button_x..",".. - (wp_bottom_row - (5-i) * unified_inventory.style_full.btn_spc)..";".. - unified_inventory.style_full.btn_size..","..unified_inventory.style_full.btn_size..";" .. + "image_button["..ui.style_full.main_button_x..",".. + (wp_bottom_row - (5-i) * ui.style_full.btn_spc)..";".. + ui.style_full.btn_size..","..ui.style_full.btn_size..";" .. (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. "ui_" .. i .. "_icon.png;" .. "select_waypoint" .. i .. ";]" .. @@ -63,9 +64,9 @@ unified_inventory.register_page("waypoints", { local x = 4 for _, b in pairs(btnlist) do formspec = formspec .. - "image_button["..(wp_buttons_rj - unified_inventory.style_full.btn_spc * x)..",".. + "image_button["..(wp_buttons_rj - ui.style_full.btn_spc * x)..",".. wp_bottom_row..";".. - unified_inventory.style_full.btn_size..","..unified_inventory.style_full.btn_size..";".. + ui.style_full.btn_size..","..ui.style_full.btn_size..";".. b[1]..";".. b[2]..i..";]".. "tooltip["..b[2]..i..";"..F(S(b[3], b[4] or "")).."]" @@ -82,11 +83,11 @@ unified_inventory.register_page("waypoints", { if temp.edit then formspec = formspec .. - "field["..(wp_buttons_rj - wp_edit_w - 0.1)..","..(wp_bottom_row - unified_inventory.style_full.btn_spc)..";".. - wp_edit_w..","..unified_inventory.style_full.btn_size..";rename_box" .. i .. ";;".. + "field["..(wp_buttons_rj - wp_edit_w - 0.1)..","..(wp_bottom_row - ui.style_full.btn_spc)..";".. + wp_edit_w..","..ui.style_full.btn_size..";rename_box" .. i .. ";;".. (waypoint.name or default_name).."]" .. - "image_button["..wp_buttons_rj..","..(wp_bottom_row - unified_inventory.style_full.btn_spc)..";".. - unified_inventory.style_full.btn_size..","..unified_inventory.style_full.btn_size..";".. + "image_button["..wp_buttons_rj..","..(wp_bottom_row - ui.style_full.btn_spc)..";".. + ui.style_full.btn_size..","..ui.style_full.btn_size..";".. "ui_ok_icon.png;".. "confirm_rename"..i.. ";]".. "tooltip[confirm_rename" .. i .. ";" @@ -103,7 +104,7 @@ unified_inventory.register_page("waypoints", { end, }) -unified_inventory.register_button("waypoints", { +ui.register_button("waypoints", { type = "image", image = "ui_waypoints_icon.png", tooltip = S("Waypoints"), @@ -218,7 +219,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) update_hud(player, waypoints, temp, i) end if update_formspec then - unified_inventory.set_inventory_formspec(player, "waypoints") + ui.set_inventory_formspec(player, "waypoints") end if hit then return end end From 5ea0208ffea35f0c0cdae6dcdba3f26e1366f01f Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 10:37:20 -0500 Subject: [PATCH 21/46] Multiple related changes to string handling 1) Convert most formspec elements to use string.format(), when the result would be more readable, or less messy, or at least makes the line shorter, assuming it looked like it really needed it to begin with. 2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive string concatenation into tables that then get concated only once, when their containing functions return the final formspec string. 3) In some places in the code, such tables were already being used, and were named "formspec", while others were named "fs". I settled on just one name, "formspec", as it's more readable, if longer. 4) There was a mix of styles of adding items to those tables: * Some places used line after line of `t[#t + 1] = foo/bar/baz`. * Others places used the form `t[1] = foo, t[2] = bar, ...`. * Still others used the form `t[n] = foo, t[n+1] = bar...`, with `n` being increased or reset every so often. Most of them should now be of the third form, with a few of the second. --- bags.lua | 27 ++++++++----- internal.lua | 87 ++++++++++++++++++++-------------------- register.lua | 108 ++++++++++++++++++++++++++++++-------------------- waypoints.lua | 77 ++++++++++++++++++----------------- 4 files changed, 165 insertions(+), 134 deletions(-) diff --git a/bags.lua b/bags.lua index 8588d41..30e7f7f 100644 --- a/bags.lua +++ b/bags.lua @@ -8,14 +8,14 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape local ui = unified_inventory -local bags_inv_bg_prefix = "image[0.3,1.5;"..(ui.imgscale*8).."," +local bags_inv_bg = "image[0.3,1.5;"..(ui.imgscale*8)..",%f;%s]" ui.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ ui.style_full.standard_inv_bg, - bags_inv_bg_prefix..ui.imgscale..";ui_bags_header.png]", + string.format(bags_inv_bg, ui.imgscale, "ui_bags_header.png"), "label["..ui.style_full.form_header_x..","..ui.style_full.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)) .. "]", @@ -49,30 +49,34 @@ for bag_i = 1, 4 do get_formspec = function(player) local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image - local fs = { + local formspec = { ui.style_full.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]", "listring[current_player;main]", } + local n = 6 + local slots = stack:get_definition().groups.bagslots if slots == 8 then - fs[#fs + 1] = bags_inv_bg_prefix..ui.imgscale..";ui_bags_inv_small.png]" + formspec[n] = string.format(bags_inv_bg, ui.imgscale, "ui_bags_inv_small.png") elseif slots == 16 then - fs[#fs + 1] = bags_inv_bg_prefix..(ui.imgscale*2)..";ui_bags_inv_medium.png]" + formspec[n] = string.format(bags_inv_bg, ui.imgscale*2, "ui_bags_inv_medium.png") elseif slots == 24 then - fs[#fs + 1] = bags_inv_bg_prefix..(ui.imgscale*3)..";ui_bags_inv_large.png]" + formspec[n] = string.format(bags_inv_bg, ui.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]" + formspec[n+1] = "list[current_player;bag" .. bag_i .. "contents;0.45,1.65;8,3;]" + formspec[n+2] = "listring[current_name;bag" .. bag_i .. "contents]" + n = n + 3 local player_name = player:get_player_name() -- For if statement. if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then - fs[#fs + 1] = "image[7.8,0.25;"..ui.imgscale..","..ui.imgscale..";ui_trash_slot.png]" + formspec[n] = "image[7.8,0.25;"..ui.imgscale..","..ui.imgscale..";ui_trash_slot.png]" .. "list[detached:trash;main;7.95,0.25;1,1;]" + n = n + 1 end local inv = player:get_inventory() for i = 1, 4 do @@ -89,11 +93,12 @@ 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[%f,0.4;1,1;%s;bag%i;%s]", + formspec[n] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]", (i + 1.35)*1.25, img, i, label) + n = n + 1 end end - return { formspec = table.concat(fs) } + return { formspec = table.concat(formspec) } end, }) end diff --git a/internal.lua b/internal.lua index 3314a16..9ce5b07 100644 --- a/internal.lua +++ b/internal.lua @@ -68,7 +68,9 @@ function ui.get_formspec(player, page) if ui.is_creative(player_name) and page == "craft" then -- add the "Refill" slot. - formspec[n] = "image["..(ui_peruser.craft_x-2.5)..","..(ui_peruser.craft_y+2.5)..";"..ui.imgscale..","..ui.imgscale..";ui_single_slot.png]" + formspec[n] = string.format("image[%f,%f;%f,%f;ui_single_slot.png]", + ui_peruser.craft_x - 2.5, ui_peruser.craft_y + 2.5, + ui.imgscale, ui.imgscale) n = n+1 end @@ -100,21 +102,20 @@ function ui.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 + 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) - formspec[n+6] = ";"..(def.tooltip or "").."]" - n = n+7 + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4, + ui_peruser.main_button_y + button_row * ui_peruser.btn_spc, + ui_peruser.btn_size,ui_peruser.btn_size, + F(def.image), + F(def.name)) + formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" + n = n+2 else - formspec[n] = "image[" - 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 - + formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]", + ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4, + ui_peruser.main_button_y + button_row * ui_peruser.btn_spc, + ui_peruser.btn_size,ui_peruser.btn_size,def.image) + n = n+1 end end end @@ -133,23 +134,21 @@ function ui.get_formspec(player, page) -- Search box formspec[n] = "field_close_on_enter[searchbox;false]" - 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(ui.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")) .. "]" + formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]", + ui_peruser.page_buttons_x, ui_peruser.page_buttons_y, + ui_peruser.searchwidth - 0.1, ui_peruser.btn_size, + F(ui.current_searchbox[player_name])) + formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_search_icon.png;searchbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth, ui_peruser.page_buttons_y, + ui_peruser.btn_size,ui_peruser.btn_size) + formspec[n+3] = "tooltip[searchbutton;" ..F(S("Search")) .. "]" + formspec[n+4] = string.format("image_button[%f,%f;%f,%f;ui_reset_icon.png;searchresetbutton;]", + 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) + formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]" - n = n + 4 + n = n + 6 -- Controls to flip items pages @@ -169,15 +168,14 @@ function ui.get_formspec(player, page) 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])).."]" + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + 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]) + formspec[n+1] = "tooltip["..b[2]..";"..F(S(b[3])).."]" bn = bn + 1 - n = n + 1 + n = n + 2 end local no_matches = S("No matching items") @@ -230,14 +228,17 @@ function ui.get_formspec(player, page) end end end - formspec[n] = "label["..ui_peruser.page_x..","..ui_peruser.form_header_y..";"..F(S("Page")) .. ": " - .. S("@1 of @2",page2,pagemax).."]" + formspec[n] = string.format("label[%f,%f;%s: %s]", + ui_peruser.page_x, ui_peruser.form_header_y, + F(S("Page")), S("@1 of @2",page2,pagemax)) end n= n+1 if ui.activefilter[player_name] ~= "" then - formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.65)..";" .. F(S("Filter")) .. ":]" - formspec[n+1] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y - 0.25)..";"..F(ui.activefilter[player_name]).."]" + formspec[n] = string.format("label[%f,%f;%s:]", + ui_peruser.page_x, ui_peruser.page_y - 0.65, F(S("Filter"))) + formspec[n+1] = string.format("label[%f,%f;%s]", + ui_peruser.page_x, ui_peruser.page_y - 0.25, F(ui.activefilter[player_name])) end return table.concat(formspec, "") end diff --git a/register.lua b/register.lua index 4533f6e..de22717 100644 --- a/register.lua +++ b/register.lua @@ -173,24 +173,32 @@ ui.register_page("craft", { local craftresultx = craftx + 5 local player_name = player:get_player_name() - local formspec = "image["..craftx..","..crafty..";"..(ui.imgscale*6)..","..(ui.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;"..(craftresultx+0.15)..","..(crafty+0.15)..";1,1;]" - formspec = formspec.."list[current_player;craft;"..(craftx+0.15)..","..(crafty+0.15)..";3,3;]" + local formspec = { + string.format("image[%f,%f;%f,%f;ui_crafting_form.png]", craftx, crafty, ui.imgscale*6, ui.imgscale*3), + perplayer_formspec.standard_inv_bg, + "label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", + "listcolors[#00000000;#00000000]", + "list[current_player;craftpreview;"..(craftresultx+0.15)..","..(crafty+0.15)..";1,1;]", + "list[current_player;craft;"..(craftx+0.15)..","..(crafty+0.15)..";3,3;]", + "listring[current_name;craft]", + "listring[current_player;main]" + } + local n=#formspec+1 + if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec = formspec.."label["..(craftx+6.45)..","..(crafty + 2.4)..";" .. F(S("Trash:")) .. "]" - formspec = formspec.."image["..(craftx+6.25)..","..(crafty + 2.5)..";"..ui.imgscale..","..ui.imgscale..";ui_trash_slot.png]" - formspec = formspec.."list[detached:trash;main;"..(craftx+6.4)..","..(crafty + 2.65)..";1,1;]" + formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) + formspec[n+1] = string.format("image[%f,%f;%f,%f;ui_trash_slot.png]", + craftx+6.25, crafty + 2.5, ui.imgscale, ui.imgscale) + formspec[n+2] = string.format("list[detached:trash;main;%f,%f;1,1;]", craftx + 6.4, crafty + 2.65) + n=n+3 end - formspec = formspec.."listring[current_name;craft]" - formspec = formspec.."listring[current_player;main]" + if ui.is_creative(player_name) then - 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;]" + formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) + formspec[n+2] = string.format("list[detached:%s;refill;main;%f,%f;1,1;]", + F(player_name), craftx - 2.35, crafty + 2.65) end - return {formspec=formspec} + return {formspec=table.concat(formspec)} end, }) @@ -273,16 +281,19 @@ ui.register_page("craftguide", { local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) - local fs = { + local formspec = { perplayer_formspec.standard_inv_bg, "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", "listcolors[#00000000;#00000000]" } + local item_name = ui.current_item[player_name] if not item_name then - return { formspec = table.concat(fs) } + return { formspec = table.concat(formspec) } end + local n = 4 + local item_name_shown if minetest.registered_items[item_name] and minetest.registered_items[item_name].description then @@ -304,9 +315,10 @@ ui.register_page("craftguide", { end local has_give = player_privs.give or ui.is_creative(player_name) - 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;]", + formspec[n] = "image["..craftarrowx..","..crafty..";1.25,1.25;ui_crafting_arrow.png]" + formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", craftx-2.3, perplayer_formspec.resultstr_y, F(role_text[dir]), item_name_shown) + n = n + 2 local giveme_form = table.concat({ "label[".. (give_x+0.1)..",".. (crafty + 2.7) .. ";" .. F(S("Give me:")) .. "]", @@ -317,31 +329,33 @@ ui.register_page("craftguide", { if not craft then -- No craft recipes available for this item. - fs[#fs + 1] = "label["..(craftx+2.5)..","..(crafty+1.5)..";" - .. F(no_recipe_text[dir]) .. "]" + formspec[n] = string.format("label[%f,%f;%s]", craftx+2.5, crafty+1.5, F(no_recipe_text[dir])) 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, + formspec[n+1] = "image["..no_pos..","..crafty..";1.2,1.2;ui_no.png]" + formspec[n+2] = 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] = giveme_form + formspec[n+3] = giveme_form end - return { formspec = table.concat(fs) } + return { formspec = table.concat(formspec) } else - fs[#fs + 1] = stack_image_button(craftresultx, crafty, 1.2, 1.2, + formspec[n] = 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, + formspec[n+1] = stack_image_button(craftx-2.3, crafty, 1.2, 1.2, "item_button_usage_", ItemStack(item_name)) + n = n + 2 end local craft_type = ui.registered_craft_types[craft.type] or ui.craft_type_defaults(craft.type, {}) if craft_type.icon then - fs[#fs + 1] = string.format("image[%f,%f;%f,%f;%s]", + formspec[n] = string.format("image[%f,%f;%f,%f;%s]", craftarrowx+0.1, crafty + 0.95, 1, 1, craft_type.icon) + n = n + 1 end - fs[#fs + 1] = "label["..(craftarrowx+0.15)..","..(crafty+0.2)..";" .. F(craft_type.description).."]" + formspec[n] = string.format("label[%f,%f;%s]", craftarrowx+0.15, crafty+0.2, F(craft_type.description)) + n = n + 1 local display_size = craft_type.dynamic_display_size and craft_type.dynamic_display_size(craft) @@ -384,42 +398,50 @@ ui.register_page("craftguide", { local xof = ((fx-1) * of + of) * bspc local yof = ((y-1) * of + 1) * bspc if item then - fs[#fs + 1] = stack_image_button( + formspec[n] = stack_image_button( 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;;]", + formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", xoffset - xof, crafty - 1.25 + yof, bsize, bsize) end + n = n + 1 end end else -- Error - fs[#fs + 1] = string.format("label[2,%f;%s]", + formspec[n] = string.format("label[2,%f;%s]", crafty, F(S("This recipe is too@nlarge to be displayed."))) + n = n + 1 end if craft_type.uses_crafting_grid and display_size.width <= 3 then - fs[#fs + 1] = "label["..(give_x+0.1)..",".. (crafty + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" - .. "button[".. (give_x)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" - .. "button[".. (give_x+0.8)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" - .. "button[".. (give_x+1.6)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + formspec[n] = "label["..(give_x+0.1)..",".. (crafty + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + formspec[n+1] = "button[".. (give_x)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" + formspec[n+2] = "button[".. (give_x+0.8)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" + formspec[n+3] = "button[".. (give_x+1.6)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + n = n + 4 end + if has_give then - fs[#fs + 1] = giveme_form + formspec[n] = giveme_form + n = n + 1 end if alternates and alternates > 1 then - fs[#fs + 1] = "label["..(craftx+4).."," .. (crafty + 2.3) .. ";" - .. F(S(recipe_text[dir], alternate, alternates)) .. "]" - .. "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]) .. "]" + formspec[n] = string.format("label[%f,%f;%s]", + craftx+4, crafty + 2.3, F(S(recipe_text[dir], alternate, alternates))) + formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]", + craftarrowx+0.2, crafty + 2.6) + formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]", + craftarrowx+1.35, crafty + 2.6) + formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" + formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" end - return { formspec = table.concat(fs) } + + return { formspec = table.concat(formspec) } end, }) diff --git a/waypoints.lua b/waypoints.lua index 36ba6da..4d3808d 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -29,21 +29,24 @@ ui.register_page("waypoints", { if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end local waypoints = datastorage.get(player_name, "waypoints") - local formspec = ui.style_full.standard_inv_bg.. - "label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Waypoints")) .. "]".. + local formspec = { ui.style_full.standard_inv_bg, + string.format("label[%f,%f;%s]", + ui.style_full.form_header_x, ui.style_full.form_header_y, + F(S("Waypoints"))), "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" + } + local n=4 -- Tabs buttons: for i = 1, 5 do - formspec = formspec .. - "image_button["..ui.style_full.main_button_x..",".. - (wp_bottom_row - (5-i) * ui.style_full.btn_spc)..";".. - ui.style_full.btn_size..","..ui.style_full.btn_size..";" .. - (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. - "ui_" .. i .. "_icon.png;" .. - "select_waypoint" .. i .. ";]" .. - "tooltip[select_waypoint" .. i .. ";" - .. S("Select Waypoint #@1", i).."]" + local sw="select_waypoint"..i + formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]", + ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, + (i == waypoints.selected) and "ui_blue_icon_background.png^" or "", + i, sw) + formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]" + n = n + 2 end local i = waypoints.selected or 1 @@ -63,44 +66,44 @@ ui.register_page("waypoints", { local x = 4 for _, b in pairs(btnlist) do - formspec = formspec .. - "image_button["..(wp_buttons_rj - ui.style_full.btn_spc * x)..",".. - wp_bottom_row..";".. - ui.style_full.btn_size..","..ui.style_full.btn_size..";".. - b[1]..";".. - b[2]..i..";]".. - "tooltip["..b[2]..i..";"..F(S(b[3], b[4] or "")).."]" + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", + wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, + ui.style_full.btn_size, ui.style_full.btn_size, + b[1], b[2], i) + formspec[n+1] = "tooltip["..b[2]..i..";"..F(S(b[3], b[4] or "")).."]" x = x - 1 + n = n + 2 end -- Waypoint's info: - formspec = formspec.."label["..wp_info_x..","..(wp_info_y+1.1)..";" + formspec[n] = "label["..wp_info_x..","..(wp_info_y+1.1)..";" if waypoint.active then - formspec = formspec ..F(S("Waypoint active")).."]" + formspec[n+1] = F(S("Waypoint active")).."]" else - formspec = formspec ..F(S("Waypoint inactive")).."]" + formspec[n+1] = F(S("Waypoint inactive")).."]" end + n = n + 2 if temp.edit then - formspec = formspec .. - "field["..(wp_buttons_rj - wp_edit_w - 0.1)..","..(wp_bottom_row - ui.style_full.btn_spc)..";".. - wp_edit_w..","..ui.style_full.btn_size..";rename_box" .. i .. ";;".. - (waypoint.name or default_name).."]" .. - "image_button["..wp_buttons_rj..","..(wp_bottom_row - ui.style_full.btn_spc)..";".. - ui.style_full.btn_size..","..ui.style_full.btn_size..";".. - "ui_ok_icon.png;".. - "confirm_rename"..i.. ";]".. - "tooltip[confirm_rename" .. i .. ";" - .. F(S("Finish editing")).."]" + formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]", + wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc, + wp_edit_w, ui.style_full.btn_size, i, (waypoint.name or default_name)) + formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]", + wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, i) + formspec[n+2] = "tooltip[confirm_rename"..i..";"..F(S("Finish editing")).."]" + n = n + 3 end - 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["..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] .. "]" + formspec[n] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+1.6, F(S("World position")), + minetest.pos_to_string(waypoint.world_pos or vector.new())) + formspec[n+1] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.10, F(S("Name")), (waypoint.name or default_name)) + formspec[n+2] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) - return {formspec=formspec} + return {formspec=table.concat(formspec)} end, }) From 382219c4665c843c55558949c0fa2c322b5127d9 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 7 Mar 2021 12:38:08 -0500 Subject: [PATCH 22/46] move S() calls into waypoints' button table instead of inside the loop --- waypoints.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/waypoints.lua b/waypoints.lua index 4d3808d..74ad2da 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -55,13 +55,12 @@ ui.register_page("waypoints", { local default_name = S("Waypoint @1", i) -- Main buttons: - -- 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" } + { "ui_waypoint_set_icon.png", "set_waypoint", S("Set waypoint to current location") }, + { waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", "toggle_waypoint", S("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", S("@1 display of waypoint coordinates", waypoint.display_pos and "Disable" or "Enable") }, + { "ui_circular_arrows_icon.png", "toggle_color", S("Change color of waypoint display") }, + { "ui_pencil_icon.png", "rename_waypoint", S("Edit waypoint name") } } local x = 4 @@ -70,7 +69,7 @@ ui.register_page("waypoints", { wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, ui.style_full.btn_size, ui.style_full.btn_size, b[1], b[2], i) - formspec[n+1] = "tooltip["..b[2]..i..";"..F(S(b[3], b[4] or "")).."]" + formspec[n+1] = "tooltip["..b[2]..i..";"..F(b[3]).."]" x = x - 1 n = n + 2 end From 3e7f00536613c0f8c3c361ca8ce9545e2221bbde Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 04:51:54 -0500 Subject: [PATCH 23/46] always modify and return a table.copy() of the style table --- internal.lua | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/internal.lua b/internal.lua index 9ce5b07..4338822 100644 --- a/internal.lua +++ b/internal.lua @@ -20,13 +20,9 @@ end function ui.get_per_player_formspec(player_name) - local lite = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) + local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) - local style = ui.style_full - - if lite then - style = ui.style_lite - end + local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full) style.items_per_page = style.pagecols * style.pagerows style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", @@ -35,7 +31,7 @@ function ui.get_per_player_formspec(player_name) style.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", style.std_inv_x, style.std_inv_y, ui.imgscale*8, ui.imgscale*4) - return style, lite + return style, draw_lite_mode end function ui.get_formspec(player, page) From 37546289bcbe579085a654454bb02776fc19835b Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 04:56:52 -0500 Subject: [PATCH 24/46] using a table.copy() to pass the style tables around requires setting-up items_per_page, standard_inv, and standard_inv_bg for both tables at init time. --- init.lua | 10 ++++++++++ internal.lua | 11 +---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/init.lua b/init.lua index 72fcb39..a19de39 100644 --- a/init.lua +++ b/init.lua @@ -89,6 +89,16 @@ unified_inventory.style_lite = { std_inv_y = 4.6, } +for _, style in ipairs({unified_inventory.style_full, unified_inventory.style_lite}) do + style.items_per_page = style.pagecols * style.pagerows + style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + style.std_inv_x+0.15, style.std_inv_y+0.15) + + style.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", + style.std_inv_x, style.std_inv_y, + unified_inventory.imgscale*8, unified_inventory.imgscale*4) +end + -- 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 4338822..f4e09ce 100644 --- a/internal.lua +++ b/internal.lua @@ -22,16 +22,7 @@ end function ui.get_per_player_formspec(player_name) local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) - local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full) - - style.items_per_page = style.pagecols * style.pagerows - style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", - style.std_inv_x+0.15, style.std_inv_y+0.15) - - style.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", - style.std_inv_x, style.std_inv_y, - ui.imgscale*8, ui.imgscale*4) - return style, draw_lite_mode + return table.copy(draw_lite_mode and ui.style_lite or ui.style_full), draw_lite_mode end function ui.get_formspec(player, page) From 6d892dda5ba4c817b7b75d74d8f54cd3341bda33 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 05:07:38 -0500 Subject: [PATCH 25/46] use local ui=unified_inventory shorthand in init.lua as elsewhere --- init.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/init.lua b/init.lua index a19de39..53a4287 100644 --- a/init.lua +++ b/init.lua @@ -36,12 +36,15 @@ unified_inventory = { -- Trash enabled trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), imgscale = 1.25, - standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]",} + standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", +} + +local ui = unified_inventory -- These tables establish position and layout for the two UI styles. -- UI doesn't use formspec_[xy] anymore, but other mods may need them. -unified_inventory.style_full = { +ui.style_full = { formspec_x = 1, formspec_y = 1, pagecols = 8, @@ -65,7 +68,7 @@ unified_inventory.style_full = { std_inv_y = 5.75, } -unified_inventory.style_lite = { +ui.style_lite = { formspec_x = 0.6, formspec_y = 0.6, pagecols = 4, @@ -89,14 +92,14 @@ unified_inventory.style_lite = { std_inv_y = 4.6, } -for _, style in ipairs({unified_inventory.style_full, unified_inventory.style_lite}) do +for _, style in ipairs({ui.style_full, ui.style_lite}) do style.items_per_page = style.pagecols * style.pagerows style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", style.std_inv_x+0.15, style.std_inv_y+0.15) style.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", style.std_inv_x, style.std_inv_y, - unified_inventory.imgscale*8, unified_inventory.imgscale*4) + ui.imgscale*8, ui.imgscale*4) end -- Disable default creative inventory From 8e94d864209f92c1beab5327ab723fc779be0354 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 09:14:21 -0500 Subject: [PATCH 26/46] don't display the refill slot image if no creative priv/mode (leftover from when it was part of the craft grid image) Also fixed a typo in the corresponding list[] element that made it not work. --- internal.lua | 8 -------- register.lua | 5 ++++- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/internal.lua b/internal.lua index f4e09ce..6509338 100644 --- a/internal.lua +++ b/internal.lua @@ -53,14 +53,6 @@ function ui.get_formspec(player, page) formspec[3] = ui.standard_background end - if ui.is_creative(player_name) - and page == "craft" then -- add the "Refill" slot. - formspec[n] = string.format("image[%f,%f;%f,%f;ui_single_slot.png]", - ui_peruser.craft_x - 2.5, ui_peruser.craft_y + 2.5, - ui.imgscale, ui.imgscale) - n = n+1 - end - local perplayer_formspec = ui.get_per_player_formspec(player_name) local fsdata = pagedef.get_formspec(player, perplayer_formspec) diff --git a/register.lua b/register.lua index de22717..52afa05 100644 --- a/register.lua +++ b/register.lua @@ -194,8 +194,11 @@ ui.register_page("craft", { end if ui.is_creative(player_name) then + formspec[n] = string.format("image[%f,%f;%f,%f;ui_single_slot.png]", + perplayer_formspec.craft_x - 2.5, perplayer_formspec.craft_y + 2.5, + ui.imgscale, ui.imgscale) formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) - formspec[n+2] = string.format("list[detached:%s;refill;main;%f,%f;1,1;]", + formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", F(player_name), craftx - 2.35, crafty + 2.65) end return {formspec=table.concat(formspec)} From 60d7a6d213f335ea4aff5b5e303e30f344d5912a Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 09:53:25 -0500 Subject: [PATCH 27/46] Draw the trash slot by overlaying the bare trash can icon over the single slot image instead of baking it in. --- bags.lua | 6 +++--- init.lua | 3 +++ register.lua | 3 +-- textures/ui_trash_slot.png | Bin 1056 -> 0 bytes textures/ui_trash_slot_icon.png | Bin 0 -> 782 bytes 5 files changed, 7 insertions(+), 5 deletions(-) delete mode 100644 textures/ui_trash_slot.png create mode 100644 textures/ui_trash_slot_icon.png diff --git a/bags.lua b/bags.lua index 30e7f7f..2510181 100644 --- a/bags.lua +++ b/bags.lua @@ -74,9 +74,9 @@ for bag_i = 1, 4 do if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec[n] = "image[7.8,0.25;"..ui.imgscale..","..ui.imgscale..";ui_trash_slot.png]" - .. "list[detached:trash;main;7.95,0.25;1,1;]" - n = n + 1 + formspec[n] = "image[7.8,0.25;"..ui.trash_slot_img.."]" + formspec[n+1] = "list[detached:trash;main;7.95,0.25;1,1;]" + n = n + 2 end local inv = player:get_inventory() for i = 1, 4 do diff --git a/init.lua b/init.lua index 53a4287..f3edf99 100644 --- a/init.lua +++ b/init.lua @@ -102,6 +102,9 @@ for _, style in ipairs({ui.style_full, ui.style_lite}) do ui.imgscale*8, ui.imgscale*4) end +ui.trash_slot_img = string.format("%f,%f;ui_single_slot.png^(ui_trash_slot_icon.png^[opacity:95)", + ui.imgscale, ui.imgscale) + -- Disable default creative inventory local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") if creative then diff --git a/register.lua b/register.lua index 52afa05..536dfc3 100644 --- a/register.lua +++ b/register.lua @@ -187,8 +187,7 @@ ui.register_page("craft", { if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) - formspec[n+1] = string.format("image[%f,%f;%f,%f;ui_trash_slot.png]", - craftx+6.25, crafty + 2.5, ui.imgscale, ui.imgscale) + formspec[n+1] = string.format("image[%f,%f;%s]", craftx+6.25, crafty + 2.5, ui.trash_slot_img) formspec[n+2] = string.format("list[detached:trash;main;%f,%f;1,1;]", craftx + 6.4, crafty + 2.65) n=n+3 end diff --git a/textures/ui_trash_slot.png b/textures/ui_trash_slot.png deleted file mode 100644 index 4bd4909d598535d717a886151f481fc378c8835e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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! aCW% z7Df>1j>Cb%|xUXMbUD*-PQvqK)qg(d(-&A$As5W@qEG)E|{Q&&fVPkEm>Ld`^tvPd)LNg64 z0?T%t-c)a;QW!;%08}cKO}5rMXPhztSFHKnFRTr2i8pFvYy8t$mR-rRY*s|xbUK}@ zW}DA}W|n1Fvn-p9qUco|$7=aU27D1?YCW zSQacC#uAWfwJLd@_f_9P5NMJl!9f%t>)G2^f$K?i?L4fbp$c_LN zJMj&|r4r!F$jFGcTCL)Gs)&pNPwa(tK%)!1wj*<~GeA{WfJbI|Q})NmZu~t4-UE+o zwc7mp`ud)3Oa_?=byXb$YP$@Th{%$v#yF1SIF92uj^j9v<2ZxiH&A5+U{JsFv;Y7A M07*qoM6N<$g7WZbC;$Ke literal 0 HcmV?d00001 From 76c9bb95178e3b968f85911465fdf55d5c238831 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 12:14:31 -0500 Subject: [PATCH 28/46] Use 9-slicing to build inventory-type backgrounds This way the slots are all nice and crisp regardless of GUI scale or image size, and we only need the single slot and its bright version. This also makes the standard crafting grid into a style table entry that can be referenced to insert the crafting grid at its proper style-specific position in any formspec. And it also makes the craft grid arrow, its X position, and the crafting grid's result slot X position into style table entries. Includes a few public helper functions to do most of the work: `ui.single_slot(xpos, ypos, bright)` Does just what it sounds like: it returns a single slot image. `xpos` and `ypos` are normal coordinates in slots, as you'd use in `image[]` element. `bright` is a flag that switches to the brighter version of the slot image. `ui.make_trash_slot(xpos, ypos)` Creates a single slot, with a one-item `list[]` and a trash can icon overlay. `ui.make_inv_img_grid(xpos, ypos, width, height, bright)` Generates a `width` by `height` grid of slot images, using the single_slot function above, starting at (`xpos`,`ypos`) for the top-left. Position is as in any `image[]` element, and dimensions are in integer numbers of slots (so 8,4 would be a standard inventory). `bright` is as above. All three return a string that can be directly inserted into a formspec. --- api.lua | 25 ++++++++++++++++++++++- bags.lua | 35 ++++++++++++++------------------ init.lua | 28 +++++++++++++++++-------- register.lua | 21 ++++++++----------- textures/ui_bags_header.png | Bin 1243 -> 0 bytes textures/ui_bags_inv_large.png | Bin 2767 -> 0 bytes textures/ui_bags_inv_medium.png | Bin 1900 -> 0 bytes textures/ui_bags_inv_small.png | Bin 1029 -> 0 bytes textures/ui_crafting_form.png | Bin 3598 -> 0 bytes textures/ui_main_inventory.png | Bin 3930 -> 0 bytes textures/ui_misc_form.png | Bin 4020 -> 0 bytes 11 files changed, 67 insertions(+), 42 deletions(-) delete mode 100644 textures/ui_bags_header.png delete mode 100644 textures/ui_bags_inv_large.png delete mode 100644 textures/ui_bags_inv_medium.png delete mode 100644 textures/ui_bags_inv_small.png delete mode 100644 textures/ui_crafting_form.png delete mode 100644 textures/ui_main_inventory.png delete mode 100644 textures/ui_misc_form.png diff --git a/api.lua b/api.lua index a81cf89..c556955 100644 --- a/api.lua +++ b/api.lua @@ -303,8 +303,31 @@ function ui.register_button(name, def) table.insert(ui.buttons, def) end - function ui.is_creative(playername) return minetest.check_player_privs(playername, {creative=true}) or minetest.settings:get_bool("creative_mode") end + +function ui.single_slot(xpos, ypos, bright) + return string.format("background9[%f,%f;%f,%f;ui_single_slot%s.png;false;16]", + xpos, ypos, ui.imgscale, ui.imgscale, (bright and "_bright" or "") ) +end + +function ui.make_trash_slot(xpos, ypos) + return + ui.single_slot(xpos, ypos).. + "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png^[opacity:95]".. + "list[detached:trash;main;"..xpos..","..ypos..";1,1;]" +end + +function ui.make_inv_img_grid(xpos, ypos, width, height, bright) + local tiled = {} + local n=1 + for y = 0, (height - 1) do + for x = 0, (width -1) do + tiled[n] = ui.single_slot(xpos + (ui.imgscale * x), ypos + (ui.imgscale * y), bright) + n = n + 1 + end + end + return table.concat(tiled) +end diff --git a/bags.lua b/bags.lua index 2510181..14ac875 100644 --- a/bags.lua +++ b/bags.lua @@ -8,14 +8,16 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape local ui = unified_inventory -local bags_inv_bg = "image[0.3,1.5;"..(ui.imgscale*8)..",%f;%s]" ui.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ ui.style_full.standard_inv_bg, - string.format(bags_inv_bg, ui.imgscale, "ui_bags_header.png"), + ui.single_slot(0.925, 1.5), + ui.single_slot(3.425, 1.5), + ui.single_slot(5.925, 1.5), + ui.single_slot(8.425, 1.5), "label["..ui.style_full.form_header_x..","..ui.style_full.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)) .. "]", @@ -49,34 +51,27 @@ for bag_i = 1, 4 do get_formspec = function(player) local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image + local slots = stack:get_definition().groups.bagslots + local formspec = { ui.style_full.standard_inv_bg, + ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), "image[9.2,0.4;1,1;" .. image .. "]", "label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", "listcolors[#00000000;#00000000]", "listring[current_player;main]", + string.format("list[current_player;bag%icontents;%f,%f;8,3;]", + bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset), + "listring[current_name;bag" .. bag_i .. "contents]", } - local n = 6 - - local slots = stack:get_definition().groups.bagslots - if slots == 8 then - formspec[n] = string.format(bags_inv_bg, ui.imgscale, "ui_bags_inv_small.png") - elseif slots == 16 then - formspec[n] = string.format(bags_inv_bg, ui.imgscale*2, "ui_bags_inv_medium.png") - elseif slots == 24 then - formspec[n] = string.format(bags_inv_bg, ui.imgscale*3, "ui_bags_inv_large.png") - end - formspec[n+1] = "list[current_player;bag" .. bag_i .. "contents;0.45,1.65;8,3;]" - formspec[n+2] = "listring[current_name;bag" .. bag_i .. "contents]" - n = n + 3 + local n = #formspec + 1 local player_name = player:get_player_name() -- For if statement. if ui.trash_enabled - or ui.is_creative(player_name) - or minetest.get_player_privs(player_name).give then - formspec[n] = "image[7.8,0.25;"..ui.trash_slot_img.."]" - formspec[n+1] = "list[detached:trash;main;7.95,0.25;1,1;]" - n = n + 2 + or ui.is_creative(player_name) + or minetest.get_player_privs(player_name).give then + formspec[n] = ui.make_trash_slot(7.8, 0.25) + n = n + 1 end local inv = player:get_inventory() for i = 1, 4 do diff --git a/init.lua b/init.lua index f3edf99..126e116 100644 --- a/init.lua +++ b/init.lua @@ -36,6 +36,7 @@ unified_inventory = { -- Trash enabled trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), imgscale = 1.25, + list_img_offset = 0.13, standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", } @@ -92,19 +93,31 @@ ui.style_lite = { std_inv_y = 4.6, } +dofile(modpath.."/api.lua") + for _, style in ipairs({ui.style_full, ui.style_lite}) do style.items_per_page = style.pagecols * style.pagerows style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", - style.std_inv_x+0.15, style.std_inv_y+0.15) + style.std_inv_x+0.13, style.std_inv_y+0.13) - style.standard_inv_bg = string.format("image[%f,%f;%f,%f;ui_main_inventory.png]", - style.std_inv_x, style.std_inv_y, - ui.imgscale*8, ui.imgscale*4) + style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. + ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) + + style.craftarrow_x = style.craft_x + 3.75 + style.craftarrow = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + style.craftarrow_x, style.craft_y, ui.imgscale, ui.imgscale) + style.craftresult_x = style.craft_x + 5 + style.craft_grid = table.concat({ + ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), + ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot + style.craftarrow, + string.format("list[current_player;craft;%f,%f;3,3;]", + style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), + string.format("list[current_player;craftpreview;%f,%f;1,1;]", + style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset) + }) end -ui.trash_slot_img = string.format("%f,%f;ui_single_slot.png^(ui_trash_slot_icon.png^[opacity:95)", - ui.imgscale, ui.imgscale) - -- Disable default creative inventory local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") if creative then @@ -120,7 +133,6 @@ if sfinv then end dofile(modpath.."/group.lua") -dofile(modpath.."/api.lua") dofile(modpath.."/internal.lua") dofile(modpath.."/callbacks.lua") dofile(modpath.."/match_craft.lua") diff --git a/register.lua b/register.lua index 536dfc3..4b6ec38 100644 --- a/register.lua +++ b/register.lua @@ -174,12 +174,10 @@ ui.register_page("craft", { local player_name = player:get_player_name() local formspec = { - string.format("image[%f,%f;%f,%f;ui_crafting_form.png]", craftx, crafty, ui.imgscale*6, ui.imgscale*3), perplayer_formspec.standard_inv_bg, + perplayer_formspec.craft_grid, "label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", "listcolors[#00000000;#00000000]", - "list[current_player;craftpreview;"..(craftresultx+0.15)..","..(crafty+0.15)..";1,1;]", - "list[current_player;craft;"..(craftx+0.15)..","..(crafty+0.15)..";3,3;]", "listring[current_name;craft]", "listring[current_player;main]" } @@ -187,18 +185,15 @@ ui.register_page("craft", { if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) - formspec[n+1] = string.format("image[%f,%f;%s]", craftx+6.25, crafty + 2.5, ui.trash_slot_img) - formspec[n+2] = string.format("list[detached:trash;main;%f,%f;1,1;]", craftx + 6.4, crafty + 2.65) - n=n+3 + formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) + n=n + 2 end if ui.is_creative(player_name) then - formspec[n] = string.format("image[%f,%f;%f,%f;ui_single_slot.png]", - perplayer_formspec.craft_x - 2.5, perplayer_formspec.craft_y + 2.5, - ui.imgscale, ui.imgscale) + formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", - F(player_name), craftx - 2.35, crafty + 2.65) + F(player_name), craftx - 2.2 - ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) end return {formspec=table.concat(formspec)} end, @@ -275,8 +270,8 @@ ui.register_page("craftguide", { local craftx = perplayer_formspec.craft_x local crafty = perplayer_formspec.craft_y - local craftarrowx = craftx + 3.75 - local craftresultx = craftx + 5 + local craftarrowx = perplayer_formspec.craftarrow_x + local craftresultx = perplayer_formspec.craftresult_x local formheaderx = perplayer_formspec.form_header_x local formheadery = perplayer_formspec.form_header_y local give_x = perplayer_formspec.give_btn_x @@ -317,7 +312,7 @@ ui.register_page("craftguide", { end local has_give = player_privs.give or ui.is_creative(player_name) - formspec[n] = "image["..craftarrowx..","..crafty..";1.25,1.25;ui_crafting_arrow.png]" + formspec[n] = perplayer_formspec.craftarrow formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", craftx-2.3, perplayer_formspec.resultstr_y, F(role_text[dir]), item_name_shown) n = n + 2 diff --git a/textures/ui_bags_header.png b/textures/ui_bags_header.png deleted file mode 100644 index c7a9c381672f74d9da05ab16e80c4d318d406720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1243 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 diff --git a/textures/ui_bags_inv_medium.png b/textures/ui_bags_inv_medium.png deleted file mode 100644 index b31bfa18e3a97b6516ed8a57c49caf0d5d1b46e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 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 diff --git a/textures/ui_main_inventory.png b/textures/ui_main_inventory.png deleted file mode 100644 index 495a54ef8223ad9e06c2259a1e9852f62c693a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3930 zcmcgvdpy%^8=q57MGhsAIZP-aDp4777!R9JJ;|BKaoUtaSRO-#<`|koQc(_z$!Tn! z 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 diff --git a/textures/ui_misc_form.png b/textures/ui_misc_form.png deleted file mode 100644 index eea0dbac4692e12896f8cd16e89e67c1da2447ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4020 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 Date: Mon, 8 Mar 2021 12:53:14 -0500 Subject: [PATCH 29/46] fix missing "XYZ" and "no" icon on waypoints show coordinates button --- textures/ui_xyz_off_icon.png | Bin 8606 -> 0 bytes textures/ui_xyz_on_icon.png | Bin 2182 -> 0 bytes waypoints.lua | 3 ++- 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 textures/ui_xyz_off_icon.png delete mode 100644 textures/ui_xyz_on_icon.png diff --git a/textures/ui_xyz_off_icon.png b/textures/ui_xyz_off_icon.png deleted file mode 100644 index 3c1836eb04eee88d81d26c9b83e571f3dacd4c1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8606 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 diff --git a/textures/ui_xyz_on_icon.png b/textures/ui_xyz_on_icon.png deleted file mode 100644 index 003ea63344be5dbf1f7a2b5da8eb6911e4aeb329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2182 zcmaKu`9Bkm1I8!i*i}f5ZKO}BIX{lcIoHV9D9W9jIhyO!T5^R*V#<~KEZd7*ZTL=fbaM9dYI!>XEw ztCMvHMkKG;PZ*znC}1cLB4Eo>@xVRciLTcv(<;n!RWltG$_bA<0x~RF7ieNZ=Kfpl zq|4kD1F3~VR=RTa^e%qj>yN6IZKsDdE!$KD!&Arqx8iGr1wte%E*7fC>v5hgyDdF& zIMepR$}?Cp8||xR91h9NIHJdi5BOof!n9 zNr{YjQ913cMtkkT;kcjka&pVNMlwaxhP)1E6x#)-Hcl%hL1@Ax!7+Bf#E6VB-LY43 zLK#YukOBwmpojFXGFk*h#On0|d07SVJWvzTGi5)MZO!X^IOlBBZ&tLQsW{HsD=m;H z3nu9*t_mKe60XZfBo%69txNRJ2}fy@eGx(ICYAj&0|5pes~~JJZ`NWs zXfGc@WgS{3{qo)L@4;|pkr*B+; zpl__~81Q_Y6M6lKltEtB=6&Dgvlh`JML)7q{0om}8-1=LZw+^>wHM`Yn1hmhi{mqI zkUlEWXx5Q@E#*^fAp8FLsDw;n$^-^Mpk4?7VCCLBS0ioxefJQph}Y8WDxHYKC%DaQ z;S}S{SxnxrX!9e)2O$3D(a}s)^K?Fsnr)dgYAEgs*N+MRAcFhsAtt+nKqn3tX!>A| z1ov$oM*^>J27j`N+!YN9YUgUVDi7_^D2K1$;313Dr4NYEy>ZC!n*?sr4bU`n7X_G# zK{&~O*Kj((kKI=w2WB+EPWcc2#H<)eJ^{NJXi}UR;}%KD1hd!U zrzlkqN2*Y`%i5Uh*xC->5p`nn-txzl!Q3n>dHca*Bh5TYHps&g{ozy;zTt|o>Edl1 zGZb36Bo{vk=IC2nMpmFtP|UePYO|={)YE6oFFjRlt+Ky3`lS|;{=(+14mjMnLPXRb z=%$uxJ8-$2t1#y^7}V6~%B{VevlrJm-VD{LLA%dpIAwU1e_iR|;d?CfdWxB= zbsW0u$iNG4;z#+L&BAYpyDkSmLkQhz!>PXr4Wh^EF6jZqi?k>6M9#OAM$mg?TH!|z zmtluqC?B?WV@!9!nCU3Log)4<+f4e6Xv<*!cX^+(t@wu;i^$T0m~&{ch3VWE>q%i@ z1|2ucYMEm`;RBBJz*}ENv~w%L)W*&Tt-A_Vmb=pl`O3pB)+I4u19?_`g6$m=UUoOV zJ4iCLa6=0jw*LJ2E|pO;mt)v>qz=b(0&q-;>~<%wlal}}*J=NwXP!y~Ka7dufwZCc zol_l@ld4hwn4up9~Ohll2w^?KZn@|4IqM>?o2sYWdzV=I#HaV4u@Z%+cb-$ls zJ)&m>qI_b9TkysleiNE|}Mrvu3O^xpPCH&hbs5@O@OD1J2IZc;z z;MeFgh5WE#L^LQRpJxS@BKg;*Nw~$Ij%|EYr!}tbnB~J73wyNN;N&?QgghL{OL2?S zhrvSmF>G}ayjIFgH+X8geB)a`}fF^>uc>{K*ChO1tmvbO|6}R z=ezexO#6VrJKM+E49hPQJ7>FqzH(^hYZ`_~!CVW9*%J`$*eCXwJFz5zxb3$#)ykbT z8x$eyO*@5UW=Xu=kbUHN!4sfUzG_eqvaXeQ%fZknc{kp6`(02^9}=Vt8$F-7VM|5< z7(1@))*4XvhUK9jV?b^@>u>ToJDB%?ucy?n2yfYnknr z@#~Cu(b|LlVuc*tWFK}5W Date: Mon, 8 Mar 2021 12:55:34 -0500 Subject: [PATCH 30/46] remove unused var, excess whitespace --- register.lua | 1 - waypoints.lua | 1 - 2 files changed, 2 deletions(-) diff --git a/register.lua b/register.lua index 4b6ec38..3958eb5 100644 --- a/register.lua +++ b/register.lua @@ -170,7 +170,6 @@ ui.register_page("craft", { local formheadery = perplayer_formspec.form_header_y local craftx = perplayer_formspec.craft_x local crafty = perplayer_formspec.craft_y - local craftresultx = craftx + 5 local player_name = player:get_player_name() local formspec = { diff --git a/waypoints.lua b/waypoints.lua index be7bf2f..2a8ead4 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -73,7 +73,6 @@ ui.register_page("waypoints", { x = x - 1 n = n + 2 end - -- Waypoint's info: formspec[n] = "label["..wp_info_x..","..(wp_info_y+1.1)..";" From 1210dbfe2240f728f4852a2189d64212926cbd29 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 13:15:24 -0500 Subject: [PATCH 31/46] make trash slot icon 128px MT nearest-neighbor-scales images to about 75px if they're 1x1 slot in size (at least on my screen). Use the next power of 2 above that, so that MT can scale down instead of up. --- textures/ui_trash_slot_icon.png | Bin 782 -> 1514 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/ui_trash_slot_icon.png b/textures/ui_trash_slot_icon.png index d3a772316531cbbfbe40245edba60cd113af6626..86ebba2b655b154ea41ff7388bcbbc9c12b5229a 100644 GIT binary patch literal 1514 zcmb_cYfO`86n?9~0HrD+I1DnGUx4C31_&Au@Jhc{D3q%eD+n676tqB@6iO+&MWcdW ztEE`$bQS@nzzEcG(IO&NRPaJO3zcqGU|>O7xyfzCWm&Rh+mG%1IhUNA=bYp`\$ zKnwFV<^TW-7`u}Q0Ll=efT@YW#Zb!*17KVO@7xytjZ)j|pJuzu)@U;>z zLDko6l<4P<+a+e4Y;K#U^{XU272W{%KbYG8v?X7_xO>2)pyd@b49gLId7bO*CXDbU z)C$p?$!TIr&-t4!V2aNCkX*@SHx+4cNC)hivF*LoGKL$6_`nP-)k8J_r+NmZ8=50m z#72BJpY1*9zlZ80BO?u(${?z@j0=m+mW22gz9Tc7y7hfXw>0&xFYt|jky(Bmva@;g}|O59mCs$_4Y-sB3Ib>#^%EU zr2tCf5T6dY+{h>(vdSAcnl}((t$ra8u5awz)s6r0S*~5X7E&NNrH%Z1K{&Hg+GLut zzWL&qb>A_HqogDuIiHa0AsZjjZ+1Q0M^wuG{R!eX%>)EheEbbKux> zJ!3bQ*X)6F+tev|KXUicQ^(^qeWNotXK?Z0$3DC+2Dy`D+d)D$sN$cQGTXe?oRzbE zFTdG%;%lRC`?u0x4VOumuFqaZxcCMH!svK9=tIFyGgTdtF<|3K3K6}gj z&~%fMf3#m8QaL`xo{$kAl_i#Fe?B^Rw$&^;V@pFiMNX*Ow5<;&G~hDK&D@l^6&_s8HcW5n_D)i?{V60H05qaXl)C5DU%fRUlZG#=Q` zT+boyCcE?K`&604Q}D;zmbR(S75O|0mcI7$#RpTbq@f%Gm(T;zVJh%q*k+i*2=h^gjzpz@*g`bQt2;i{!3{c;C#B~AKKDIp{%wLoJ}`L zjGopEQ#X(9vGg(Cjp@y-+M93pNy z7*ia@MRM3ePqixANCW% z7Df>1j>Cb%|xUXMbUD*-PQvqK)qg(d(-&A$As5W@qEG)E|{Q&&fVPkEm>Ld`^tvPd)LNg64 z0?T%t-c)a;QW!;%08}cKO}5rMXPhztSFHKnFRTr2i8pFvYy8t$mR-rRY*s|xbUK}@ zW}DA}W|n1Fvn-p9qUco|$7=aU27D1?YCW zSQacC#uAWfwJLd@_f_9P5NMJl!9f%t>)G2^f$K?i?L4fbp$c_LN zJMj&|r4r!F$jFGcTCL)Gs)&pNPwa(tK%)!1wj*<~GeA{WfJbI|Q})NmZu~t4-UE+o zwc7mp`ud)3Oa_?=byXb$YP$@Th{%$v#yF1SIF92uj^j9v<2ZxiH&A5+U{JsFv;Y7A M07*qoM6N<$g7WZbC;$Ke From 8ee0eb9fce82c42f38b7ff4fac3d0952a05b2289 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 14:01:29 -0500 Subject: [PATCH 32/46] swap the craft type icon with its word (makes it look like it used to) --- register.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/register.lua b/register.lua index 3958eb5..7ea2b10 100644 --- a/register.lua +++ b/register.lua @@ -347,10 +347,10 @@ ui.register_page("craftguide", { ui.craft_type_defaults(craft.type, {}) if craft_type.icon then formspec[n] = string.format("image[%f,%f;%f,%f;%s]", - craftarrowx+0.1, crafty + 0.95, 1, 1, craft_type.icon) + craftarrowx+0.35, crafty, 0.5, 0.5, craft_type.icon) n = n + 1 end - formspec[n] = string.format("label[%f,%f;%s]", craftarrowx+0.15, crafty+0.2, F(craft_type.description)) + formspec[n] = string.format("label[%f,%f;%s]", craftarrowx + 0.15, crafty + 1.4, F(craft_type.description)) n = n + 1 local display_size = craft_type.dynamic_display_size From 21f122336f21486921ae519209162cb17e43b2c8 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 14:11:45 -0500 Subject: [PATCH 33/46] make craft arrow 128px (same reason as the trash icon) --- textures/ui_crafting_arrow.png | Bin 941 -> 788 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/ui_crafting_arrow.png b/textures/ui_crafting_arrow.png index 4648f9bda200e0bc91df3d1fbc23ab79c0b0eb44..6901c58888398695f07f51a97b6815b92c7c482e 100644 GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H0wgodS2{2-Fx~caaSW-r_4dYDZ;?b9_7CsR zXuQ@t|7O?ajGihj8yCSVXT3{GBwyJJbl%&rNZjbeo1<|$hSiEX!m1q?irN1P{}SF) za+S|fV2au_WB>NT;On8~->;l`|9hui@sGOi55MnWaKQ$?*jr~@`!;vx6sB+fWml#g z_3~moZqJrmohG*BhG@c~r(3M=C3fg4G;~ihes?=ddxf_b$@YX$p7wwy!O+_y> zl`Tm)vaDrS{X+Aw1SbDK1!X(hm|iWM(D_rR;~cxhr~0#fU6M`F#}n_}_`RyYF@fJ-mFPvvN_uw6FVuBla0>%gOy2Yg&=#QBN>|8!^VS#^6s zlkDPRhXzrWXfwO*7QeRaTXJmG9zJ;oYpEomde-}9xp{$qmVNy({p##h_nG^Y_>IN* zmG*yRjsGaj>oK*Pzc#q{+6RS20!lqcAH^R~uW4(pefs$O%7=6J-QU)5_+uq6GegPi zO&@<>y^t5aw1tCF!sB3^eC>tpS0CSf-^F?Bd+>>cl6pY5?9SRS>2y(2-rtv7fApR> z)UC6k(zs~wEk4~SE zsn=z1m(QX5V0YZ5ZsDZI%%`ggi|)0=c)xc!&i*XrxVjPs(0Z=#c479d8~ZI*15-PL Mr>mdKI;Vst09D^+`v3p{ literal 941 zcmV;e15*5nP)v@O=Q>nVs9yTb8rX{x>}BCAL;JZr;fK#T)?y z6Kt~Q{>lv?Vw?)=j@-SFTNK1>p+a!&-oCz@@c&m#v=uI*M@iG3O~0gvGrq78R9N8I zlhyy)0niX9MfAA>LG|%sJ^YDO$qRceoSO0j_)dOZA%~_Phsz5TvPi*?{#-&pCFkH`8 zqLj@qVpt&NEsBsInKZxtJkm=C%50^PYT)@qgt$E5JswrIb6M)%Lga70m#o0NIVxU= zZZN0KQ~nV#05+JV&tlA*^S`Ncn$1jM9}uQ*Jutugdd_s0+1i&1aNE$vFwPD}FV>#q zQjkPws%-qbb}hGbTxGIeJCa*HAgOTK&aom2OJZ-XMQQESurV0|3;{Z8)b^Bb39O6{ z={f+- Date: Mon, 8 Mar 2021 14:41:49 -0500 Subject: [PATCH 34/46] Move craft guide a little to the right to make some room. --- init.lua | 25 +++++++++++++------ register.lua | 70 +++++++++++++++++++++++++++------------------------- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/init.lua b/init.lua index 126e116..ccfad38 100644 --- a/init.lua +++ b/init.lua @@ -54,7 +54,14 @@ ui.style_full = { page_y = 1.45, craft_x = 2.8, craft_y = 1.15, - resultstr_y = 0.6, + craftresult_x = 7.8, + craft_arrow_x = 6.55, + craft_guide_x = 3.3, + craft_guide_y = 1.15, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.3, + craft_guide_resultstr_y = 0.6, give_btn_x = 0.25, main_button_x = 0.4, main_button_y = 11.0, @@ -78,7 +85,14 @@ ui.style_lite = { page_y = 1.25, craft_x = 2.6, craft_y = 0.75, - resultstr_y = 0.35, + craftresult_x = 5.75, + craft_arrow_x = 6.35, + craft_guide_x = 3.1, + craft_guide_y = 0.75, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.15, + craft_guide_resultstr_y = 0.35, give_btn_x = 0.15, main_button_x = 10.5, main_button_y = 7.9, @@ -103,14 +117,11 @@ for _, style in ipairs({ui.style_full, ui.style_lite}) do style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) - style.craftarrow_x = style.craft_x + 3.75 - style.craftarrow = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", - style.craftarrow_x, style.craft_y, ui.imgscale, ui.imgscale) - style.craftresult_x = style.craft_x + 5 style.craft_grid = table.concat({ ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot - style.craftarrow, + string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale), string.format("list[current_player;craft;%f,%f;3,3;]", style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), string.format("list[current_player;craftpreview;%f,%f;1,1;]", diff --git a/register.lua b/register.lua index 7ea2b10..dc2344e 100644 --- a/register.lua +++ b/register.lua @@ -267,16 +267,17 @@ local other_dir = { ui.register_page("craftguide", { get_formspec = function(player, perplayer_formspec) - local craftx = perplayer_formspec.craft_x - local crafty = perplayer_formspec.craft_y - local craftarrowx = perplayer_formspec.craftarrow_x - local craftresultx = perplayer_formspec.craftresult_x - local formheaderx = perplayer_formspec.form_header_x - local formheadery = perplayer_formspec.form_header_y - local give_x = perplayer_formspec.give_btn_x + local craftguidex = perplayer_formspec.craft_guide_x + local craftguidey = perplayer_formspec.craft_guide_y + local craftguidearrowx = perplayer_formspec.craft_guide_arrow_x + local craftguideresultx = perplayer_formspec.craft_guide_result_x + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local give_x = perplayer_formspec.give_btn_x local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) + local formspec = { perplayer_formspec.standard_inv_bg, "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", @@ -311,34 +312,37 @@ ui.register_page("craftguide", { end local has_give = player_privs.give or ui.is_creative(player_name) - formspec[n] = perplayer_formspec.craftarrow + formspec[n] = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + craftguidearrowx, craftguidey, ui.imgscale, ui.imgscale) + formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", - craftx-2.3, perplayer_formspec.resultstr_y, F(role_text[dir]), item_name_shown) + perplayer_formspec.craft_guide_resultstr_x, perplayer_formspec.craft_guide_resultstr_y, + F(role_text[dir]), item_name_shown) n = n + 2 local giveme_form = table.concat({ - "label[".. (give_x+0.1)..",".. (crafty + 2.7) .. ";" .. F(S("Give me:")) .. "]", - "button["..(give_x)..",".. (crafty + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]", - "button["..(give_x+0.8)..",".. (crafty + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]", - "button["..(give_x+1.6)..",".. (crafty + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" + "label[".. (give_x+0.1)..",".. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]", + "button["..(give_x)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]", + "button["..(give_x+0.8)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]", + "button["..(give_x+1.6)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" }) if not craft then -- No craft recipes available for this item. - formspec[n] = string.format("label[%f,%f;%s]", craftx+2.5, crafty+1.5, F(no_recipe_text[dir])) - local no_pos = dir == "recipe" and (craftx+2.5) or craftresultx - local item_pos = dir == "recipe" and craftresultx or (craftx+2.5) - formspec[n+1] = "image["..no_pos..","..crafty..";1.2,1.2;ui_no.png]" - formspec[n+2] = stack_image_button(item_pos, crafty, 1.2, 1.2, + formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir])) + local no_pos = dir == "recipe" and (craftguidex+2.5) or craftguideresultx + local item_pos = dir == "recipe" and craftguideresultx or (craftguidex+2.5) + formspec[n+1] = "image["..no_pos..","..craftguidey..";1.2,1.2;ui_no.png]" + formspec[n+2] = stack_image_button(item_pos, craftguidey, 1.2, 1.2, "item_button_" .. other_dir[dir] .. "_", ItemStack(item_name)) if has_give then formspec[n+3] = giveme_form end return { formspec = table.concat(formspec) } else - formspec[n] = stack_image_button(craftresultx, crafty, 1.2, 1.2, + formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2, "item_button_" .. rdir .. "_", ItemStack(craft.output)) - formspec[n+1] = stack_image_button(craftx-2.3, crafty, 1.2, 1.2, + formspec[n+1] = stack_image_button(craftguidex-2.3, craftguidey, 1.2, 1.2, "item_button_usage_", ItemStack(item_name)) n = n + 2 end @@ -347,10 +351,10 @@ ui.register_page("craftguide", { ui.craft_type_defaults(craft.type, {}) if craft_type.icon then formspec[n] = string.format("image[%f,%f;%f,%f;%s]", - craftarrowx+0.35, crafty, 0.5, 0.5, craft_type.icon) + craftguidearrowx+0.35, craftguidey, 0.5, 0.5, craft_type.icon) n = n + 1 end - formspec[n] = string.format("label[%f,%f;%s]", craftarrowx + 0.15, crafty + 1.4, F(craft_type.description)) + formspec[n] = string.format("label[%f,%f;%s]", craftguidearrowx + 0.15, craftguidey + 1.4, F(craft_type.description)) n = n + 1 local display_size = craft_type.dynamic_display_size @@ -362,7 +366,7 @@ ui.register_page("craftguide", { -- This keeps recipes aligned to the right, -- so that they're close to the arrow. - local xoffset = craftx+3.75 + local xoffset = craftguidex+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))) @@ -395,13 +399,13 @@ ui.register_page("craftguide", { local yof = ((y-1) * of + 1) * bspc if item then formspec[n] = stack_image_button( - xoffset - xof, crafty - 1.25 + yof, bsize, bsize, + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize, "item_button_recipe_", ItemStack(item)) else -- Fake buttons just to make grid formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", - xoffset - xof, crafty - 1.25 + yof, bsize, bsize) + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize) end n = n + 1 end @@ -409,15 +413,15 @@ ui.register_page("craftguide", { else -- Error formspec[n] = string.format("label[2,%f;%s]", - crafty, F(S("This recipe is too@nlarge to be displayed."))) + craftguidey, F(S("This recipe is too@nlarge to be displayed."))) n = n + 1 end if craft_type.uses_crafting_grid and display_size.width <= 3 then - formspec[n] = "label["..(give_x+0.1)..",".. (crafty + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" - formspec[n+1] = "button[".. (give_x)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" - formspec[n+2] = "button[".. (give_x+0.8)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" - formspec[n+3] = "button[".. (give_x+1.6)..",".. (crafty + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + formspec[n] = "label["..(give_x+0.1)..",".. (craftguidey + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + formspec[n+1] = "button[".. (give_x)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" + formspec[n+2] = "button[".. (give_x+0.8)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" + formspec[n+3] = "button[".. (give_x+1.6)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" n = n + 4 end @@ -428,11 +432,11 @@ ui.register_page("craftguide", { if alternates and alternates > 1 then formspec[n] = string.format("label[%f,%f;%s]", - craftx+4, crafty + 2.3, F(S(recipe_text[dir], alternate, alternates))) + craftguidex+4, craftguidey + 2.3, F(S(recipe_text[dir], alternate, alternates))) formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]", - craftarrowx+0.2, crafty + 2.6) + craftguidearrowx+0.2, craftguidey + 2.6) formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]", - craftarrowx+1.35, crafty + 2.6) + craftguidearrowx+1.35, craftguidey + 2.6) formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" end From 2c16805ef9c9bd894a472e075547bcc3fd7e69f6 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Mon, 8 Mar 2021 14:54:38 -0500 Subject: [PATCH 35/46] Get rid of the image button left of the crafting guide It had the same function as clicking the craft result on the right (just inverted), making it redundant. Click either one more than once and UI would alternately show usages or recipes. --- register.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/register.lua b/register.lua index dc2344e..f90692c 100644 --- a/register.lua +++ b/register.lua @@ -342,9 +342,7 @@ ui.register_page("craftguide", { else formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2, "item_button_" .. rdir .. "_", ItemStack(craft.output)) - formspec[n+1] = stack_image_button(craftguidex-2.3, craftguidey, 1.2, 1.2, - "item_button_usage_", ItemStack(item_name)) - n = n + 2 + n = n + 1 end local craft_type = ui.registered_craft_types[craft.type] or From 0ebc9402edae03a631d1c77c39a4a8276a76cd06 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 05:53:26 -0500 Subject: [PATCH 36/46] minor tweaks to the slot images to make them better-resemble their pre-9-sliced versions (going to that mode made them slightly bigger and the corners slightly less round since they aren't blurry anymore) --- textures/ui_single_slot.png | Bin 728 -> 934 bytes textures/ui_single_slot_bright.png | Bin 898 -> 1581 bytes ...inventory single slot 256px with trash.xcf | Bin 172298 -> 191497 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/ui_single_slot.png b/textures/ui_single_slot.png index a732bd1cb819d3123ad204ea15a22578a0a1c34b..4d130bd47bfce15cd8ce36539d507350bb642b8d 100644 GIT binary patch delta 923 zcmV;M17!Tz1*Qj(8Gi-<0063Kaozv`18qq}K~#9!?VGVmEJ+lG|2pSXRrkff8~Ox- z!AAQC1{)cOI%s6jAU80(!Gei`$btq6$_67CY+_(!w1JPX(FTG~aKmdLu5i1mHtCj{ z)*ff}F5I56eki&bdV2W3I(2G-zksBqcP%x}!^_LdLPRq}lz#!B&X`aNMC1WHg%BPt zFE7jg6+o}on`7ohW?o|Ed8O1W0PYe1W_AGXLkM@?`|A+G&BevVm+u0wy1JShV^*}* zpS9KtA|lKTB0`tU*CT{bkJ34J>zq4s&RzBU{eQ*=u(r1L(OSD}tu2f(A4CMT`S?e> zrVs)Ez?dQ)fcY-1{ZT6;g7Y_kUk(lq1{&iFMh{)3Z{=T#VAfg#&o^NY*lMaEI=Z!HltpJ!gBcj=^ zZ*~6_f{4sAbJhw#DMbKy8qHUe%9Y3VCOB>8-||GG?z59@ewYaFK*J!s3jpuF0uq1( zAOT1K5`TaMAOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)%AOT1K5`Y9C0cZy>P5FRS z0iyzl5>)_R=Itg?btSh|bTcI7nb}QKHmIJ^YPc#^|2hC7dQwW=PfdA8Q9mMrh}<*t z)36@!pp?3sh9($C{fMYeyxswLXa&&k_e%iR0DsC!h7gy19rZQFl+1j+y}exy-363V zHvn$q<}pdJx!QEYJd827mAB#B;K|9!7XU{99-D#Vu1060DD1!x5ooQE=lLTuA8l=I zy*NT6E$_Sn@Uv3t6A|h9!#IcEl`ZnMNvZ)<=D%sJ&z*BuuYSMn#XCDYA4O!Bhzh0D zhkvH&xAxZ`z3z=M$g=EFYkls$-z|#b>sSB)U~g|P7m*br`V3&9u9zlqB|nGR!ZG$Zf<_xvAL#B xPftZ_J;TgdGj-hoJs+GbilRhPQqm~;7Zex#L|cH2DbjF_BfkOu|z0DsQ@0&kO2ew9Bv=3AH0luF91*g zxA`e9Kdi6M%zrjWv1lZsWRs|onYzAd+JmnT_yk3!>ol8gEt}17MCB&`ST86H5pFhJ zn`y?Q>Ht0oyPPhjB^I`;Wk2@|}Nt~^~eSsi|T(TnFvtkZJ=teXj zpK9=rPX$FfZyRzCG$^FinJMbAB59H=vVJ@Xg^;q6@PGf7LP{aVMfitHp^{5Ta>fb( z0U!VbfB+Bx0zd!=00AHX1b_e#00KY&2mt>lz~mxa7R%FWmvoZ=#irDop{UTkLSu%? zj~100)05p|g<4J4BP?lG_Xb4@JnV>eb>DA@NpbCDCoTZq@*|fmpI75vlaSKL)0WCt ze|N!x7k`^G<2HIwCd#m?JIl{_QW&~}q{+(a^)c}M$e6KE59j^?U3a9Ja^qU1tQ x-t^2)KX?8IOGjcerT1i*(hE_c@Z92`(=UgNk7>gOD53xW002ovPDHLkV1mCZOb!45 diff --git a/textures/ui_single_slot_bright.png b/textures/ui_single_slot_bright.png index daddc02769c7d9ee51701f1167d45e5f7333008f..c1292981222ac369b24aa316abcfd030c2a55892 100644 GIT binary patch delta 1575 zcmV+?2H5$62dxZ{8Gi-<0063Kaozv`1@uWoK~#9!?VHPP6h{<>zv`;$tEYP$UxtZ- z(QvaN2qBQoCK6I4R@w1PJOJV$Sg=AuVTFP~VG#ryPz2bCK{zp&kQjWMw#U<*#Z=jC z2iqiBc*g3IN;7JEY@hG^=Tu2Pzu?nL1IoPmKp)^0o^|tT0e@@23a|*Ig=ej;->kL? zJ}^NK0K;Z~VIa7G)1|>@z^V!UFW{Zoe;OEUg&?;4fWTyY2p9#%fFr<{Kw<#MZ9co# zD>tug1K=Yt3;YT^1D*qa7)3Nc1t0(_z*oRI;Jg7aXrM?brHG?E603ig9;~=FZ%d&iVd3o*4n>Xo;7cW+3W@a=H0{teD0q`U6!uAAFsQClH1>ig2 z1P}#5;G8;jDrhtsQGb8G4uSyJbx}&u4FH4?>j3QElYeCytyYWq`T5q=)YQ_02M?Mb zK77c4CEzLWJ#ZIz12mOUL7%Dl^Ct6AwOWhYp2Fk_g}T*MnC|;W!SC<8%cC zfIQFFca~+uajXXi2a|feuJ7Erv+(NGtH{K59{Alf#g;wR228z=0hKTeor#Hw%8?^S zqBxGRnSa+>qqRm#iIj3Z1AEr>@_bY9S(a^j?|Gg$dGciB`#v{r+?ap+_HD()__Zm6 zMQOVGVN?4j0srjTv*Fm-Sf#(eUqn%a@B8?^kLP)4t=AP`0qpg*YAn9DeL-uDDc|;! zCr{c&@$$;pcal#)O8WQF<+XpDeG(i`TaU6?ErJ`)cl~U`? zu76j9w_8d{tyWWwMnf1CC_vhakOScRzT^A8D0cd8uKCYBC4>+trHGOOtfDVP#m1JlW$v-Y5`;btyU|`^E}@V z!P{g?DN#zFj`5|G=Kg2by}RS>opiQcsu3lx-P!&lOzd~lauMp%uH?)z6h*2Y#59_ z0_~}(sg>pBll_lor;Z`Zm@?>0w9M)c_DXr$C;XI;^mk>~lI!?5bK4bRFx2m<0bre3e}^5x6rt5>f! zP4?fLSZ9H@GEMMLI?k$5pnrCDHo1B8=0X^T96NR_R7!~=fZ{Lih8|&$yMLkzs?{n3 z0|WW=^z`!O%a<1(J$jVUaf>|zel{hrvuWz^;ls|QOP7N2@$o205^V#u#JgpdxLEs9 z6pGA3l7zt!c`pPScs6Z}17*+{KF*<%J6uywj&o`?Xq4#c?dO z)?L*DOfvF?g@v`pj~}PEZhzfcxpwVZ+sJ+am;!!a!#1~Q6=2t{#>tV95pn$ZaWOD3 z;B4&;d%dzOV{UFPo1C1?3upbV#>t(mvq$N;tBTfHmyX$>ThBuq_$r&Nvp)mBu#0t; zLOEFTbi#(gC^63z-M!X~yg!=eK5O1Dn!tB7PZuFrPoXR*L$P6=?jY7>uemnUZFaEF Z{|%&Y#snIU`#1mq002ovPDHLkV1fhb3nKsk delta 886 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 literal 172298 zcmeHQ2|!KR|G)RX_u5{seOGBAWJ?%~a)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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 From 40d862298b3ce5da5d6d5054ecaf3cd89579b887 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 14:25:14 -0500 Subject: [PATCH 37/46] replace excessive spaces with tabs --- init.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/init.lua b/init.lua index ccfad38..c1a1a4b 100644 --- a/init.lua +++ b/init.lua @@ -111,22 +111,22 @@ dofile(modpath.."/api.lua") for _, style in ipairs({ui.style_full, ui.style_lite}) do style.items_per_page = style.pagecols * style.pagerows - style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", - style.std_inv_x+0.13, style.std_inv_y+0.13) + style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + style.std_inv_x+0.13, style.std_inv_y+0.13) style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. - ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) + ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) - style.craft_grid = table.concat({ - ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), - ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot - string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", - style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale), - string.format("list[current_player;craft;%f,%f;3,3;]", - style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), - string.format("list[current_player;craftpreview;%f,%f;1,1;]", - style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset) - }) + style.craft_grid = table.concat({ + ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), + ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot + string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale), + string.format("list[current_player;craft;%f,%f;3,3;]", + style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), + string.format("list[current_player;craftpreview;%f,%f;1,1;]", + style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset) + }) end -- Disable default creative inventory From 44e32df00a9952161013e032e14664d4fd6eef25 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 14:26:36 -0500 Subject: [PATCH 38/46] translate some strings inside their table --- internal.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal.lua b/internal.lua index 6509338..d92b932 100644 --- a/internal.lua +++ b/internal.lua @@ -132,12 +132,12 @@ function ui.get_formspec(player, page) -- 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" }, + { "ui_skip_backward_icon.png", "start_list", S("First page") }, + { "ui_doubleleft_icon.png", "rewind3", S("Back three pages") }, + { "ui_left_icon.png", "rewind1", S("Back one page") }, + { "ui_right_icon.png", "forward1", S("Forward one page") }, + { "ui_doubleright_icon.png", "forward3", S("Forward three pages") }, + { "ui_skip_forward_icon.png", "end_list", S("Last page") }, } if draw_lite_mode then @@ -152,7 +152,7 @@ function ui.get_formspec(player, page) ui_peruser.page_buttons_y + ui_peruser.btn_spc, ui_peruser.btn_size, ui_peruser.btn_size, b[1],b[2]) - formspec[n+1] = "tooltip["..b[2]..";"..F(S(b[3])).."]" + formspec[n+1] = "tooltip["..b[2]..";"..F(b[3]).."]" bn = bn + 1 n = n + 2 end From 97b882ad23f18f4dcef4da9d2471e8fdf54a4de3 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 14:39:44 -0500 Subject: [PATCH 39/46] add a version number variable to the main table --- init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/init.lua b/init.lua index c1a1a4b..6794465 100644 --- a/init.lua +++ b/init.lua @@ -38,6 +38,7 @@ unified_inventory = { imgscale = 1.25, list_img_offset = 0.13, standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", + version = 2 } local ui = unified_inventory From d0deba10c89a10755d0ac61d41dc2325a1e56dc6 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 14:44:08 -0500 Subject: [PATCH 40/46] pngcrush+optipng the new slot textures and remove the slot image .xcf project file --- textures/ui_single_slot.png | Bin 934 -> 648 bytes textures/ui_single_slot_bright.png | Bin 1581 -> 1032 bytes textures/ui_trash_slot_icon.png | Bin 1514 -> 1052 bytes ...inventory single slot 256px with trash.xcf | Bin 191497 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 unified inventory single slot 256px with trash.xcf diff --git a/textures/ui_single_slot.png b/textures/ui_single_slot.png index 4d130bd47bfce15cd8ce36539d507350bb642b8d..2451623c93dec16b8c9c7d9a1c156857930ec58a 100644 GIT binary patch delta 634 zcmV-=0)_pi2Z#lb8Gi%-0001Bxm5rF0#8XqK~!ko?U}KP+dvS8|C!m9WaGkD-V+#H zu+D(stsXUS7G~0lEnw ziNw|PhbV0W$D9-Zcuk9H5}vkf)k4-q4=ia`z6m+YfIwzg762|Hj1iTKkS1Rs@FE$% zigsoJO)w>t*REqoE)Q=?lN;0U^Be=L=vsr_rtu^j3L3SQ3|`Fl)qxR)wBfB$@@~-mbh#x>7E3OOWx+EZ)8zTFZM!_aDBX~NY^@Xt)@B(-aPcq3Zx^I{ U?g0m!CIA2c07*qoM6N<$f_i}^jQ{`u delta 923 zcmV;M17!S&1*Qj(8Gi-<0063Kaozv`18qq}K~#9!?VGVmEJ+lG|2pSXRrkff8~Ox- z!AAQC1{)cOI%s6jAU80(!Gei`$btq6$_67CY+_(!w1JPX(FTG~aKmdLu5i1mHtCj{ z)*ff}F5I56eki&bdV2W3I(2G-zksBqcP%x}!^_LdLPRq}lz#!B&X`aNMC1WHg%BPt zFE7jg6+o}on`7ohW?o|Ed8O1W0PYe1W_AGXLkM@?`|A+G&BevVm+u0wy1JShV^*}* zpS9KtA|lKTB0`tU*CT{bkJ34J>zq4s&RzBU{eQ*=u(r1L(OSD}tu2f(A4CMT`S?e> zrVs)Ez?dQ)fcY-1{ZT6;g7Y_kUk(lq1{&iFMh{)3Z{=T#VAfg#&o^NY*lMaEI=Z!HltpJ!gBcj=^ zZ*~6_f{4sAbJhw#DMbKy8qHUe%9Y3VCOB>8-||GG?z59@ewYaFK*J!s3jpuF0uq1( zAOT1K5`TaMAOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)%AOT1K5`Y9C0cZy>P5FRS z0iyzl5>)_R=Itg?btSh|bTcI7nb}QKHmIJ^YPc#^|2hC7dQwW=PfdA8Q9mMrh}<*t z)36@!pp?3sh9($C{fMYeyxswLXa&&k_e%iR0DsC!h7gy19rZQFl+1j+y}exy-363V zHvn$q<}pdJx!QEYJd827mAB#B;K|9!7XU{99-D#Vu1060DD1!x5ooQE=lLTuA8l=I zy*NT6E$_Sn@Uv3t6A|h9!#IcEl`ZnMNvZ)<=D%sJ&z*BuuYSMn#XCDYA4O!Bhzh0D zhkvH&xAxZ`z3z=M$g=EFYkls$-z|#b>sSB)U~g|P7m*br`V3&9u9zlqB|nGR!ZG$Zf<_xvAL#B xPftZ_J;TgdGj-hoJs+GbilRhPQqm~;7Zex#P7!Ha@7{viK=_#?dVLKIZI5T&Asq9B6w5R;ZhV~t7U?mo=y%wc&k zvy<#J^(M2^oB2MNi@AB9wbr}V#rF#K%AhfLG;q-v%B`4$0e@X0ViMxvZ?R9_r$LKZ zW;ub2gDg=#V}}9v*kFS#x`ac7A%Ks^4Cgq{BJ%{es1dxQl?74;v{`3`>)hZUBEmfY zp9!8|iB~w!G#*Ncx^QJ#`huOTYhz1F#3tAIfuH$<4q*;pXt2N~UgInis9E)-JLfgD z5uy}vi6XQ8QR7^Zr78%J?|w5>7xMkO&|n z=6<}~`!W1CqsKKq<0^Lv1wK)3rc&IA}Do1Rn~(VzFdoMD}+7>&~5& zHsA9RzpyQ6a+)`}!l|0R)Lg7L@o_L16bf;~U9g3GwtxGLS?zs%|L=r5e8Q*vDe;(P zk!jQm{!_JpIzB!=E)EKbI8sX_3SG3pp~kt|>pqHU7MVv$8q6|}cT%0H2g1k2#X*<) z2!KQtZK#Qt>Prfbd0O}qmlFi21vj^zgDJ&+hu;T@#4v4Mc2NWbcoL0^Ys6z-t&mrY zvjh@{3xD2>z@dSb7#vhnOlX5fqsFrO{nt{Un9~aag+@t0f+szZ`(BQ9{T2{tnqo44 z9tu4nix+FW@M5(jV|aa8~nKm||%Q~(t~1yBK002M$5 zPyti`6~M6ri2nl+k8%f&Ydj$yHXl$Z@)^!}<$qN%{u~9c0(~qyAd6w8-d(B$GKe#4 z#W8HZMxk+VY?$Q?l9(ORZ5t)yHeo&(G&t0Wl2uDeLMllZFo^75kuC0l7@NFotfO`Ay4WrKC1Yw3+%W)*uaN<4W7 z4}TYr8ck;GcfAi&BG%a=ltgT>!Y1j}aIG(QC;O%tT{}l?7q3VlYBZSQac=kD4@uc% zg>}-A$mUt~&cxZ87BHOZ$`U*w3+H=G(z2`lcROEielWU)VR#)dPm6#Cy5y%Ip-Y=B)@dIW rUgroJgTlu{mmVFZBt(Ryqw)QJs3|RKv6EB_00000NkvXXu0mjfR{z(G delta 1575 zcmV+?2H5$C2(1i|8Gi-<0063Kaozv`1@uWoK~#9!?VHPP6h{<>zv`;$tEYP$UxtZ- z(QvaN2qBQoCK6I4R@w1PJOJV$Sg=AuVTFP~VG#ryPz2bCK{zp&kQjWMw#U<*#Z=jC z2iqiBc*g3IN;7JEY@hG^=Tu2Pzu?nL1IoPmKp)^0o^|tT0e@@23a|*Ig=ej;->kL? zJ}^NK0K;Z~VIa7G)1|>@z^V!UFW{Zoe;OEUg&?;4fWTyY2p9#%fFr<{Kw<#MZ9co# zD>tug1K=Yt3;YT^1D*qa7)3Nc1t0(_z*oRI;Jg7aXrM?brHG?E603ig9;~=FZ%d&iVd3o*4n>Xo;7cW+3W@a=H0{teD0q`U6!uAAFsQClH1>ig2 z1P}#5;G8;jDrhtsQGb8G4uSyJbx}&u4FH4?>j3QElYeCytyYWq`T5q=)YQ_02M?Mb zK77c4CEzLWJ#ZIz12mOUL7%Dl^Ct6AwOWhYp2Fk_g}T*MnC|;W!SC<8%cC zfIQFFca~+uajXXi2a|feuJ7Erv+(NGtH{K59{Alf#g;wR228z=0hKTeor#Hw%8?^S zqBxGRnSa+>qqRm#iIj3Z1AEr>@_bY9S(a^j?|Gg$dGciB`#v{r+?ap+_HD()__Zm6 zMQOVGVN?4j0srjTv*Fm-Sf#(eUqn%a@B8?^kLP)4t=AP`0qpg*YAn9DeL-uDDc|;! zCr{c&@$$;pcal#)O8WQF<+XpDeG(i`TaU6?ErJ`)cl~U`? zu76j9w_8d{tyWWwMnf1CC_vhakOScRzT^A8D0cd8uKCYBC4>+trHGOOtfDVP#m1JlW$v-Y5`;btyU|`^E}@V z!P{g?DN#zFj`5|G=Kg2by}RS>opiQcsu3lx-P!&lOzd~lauMp%uH?)z6h*2Y#59_ z0_~}(sg>pBll_lor;Z`Zm@?>0w9M)c_DXr$C;XI;^mk>~lI!?5bK4bRFx2m<0bre3e}^5x6rt5>f! zP4?fLSZ9H@GEMMLI?k$5pnrCDHo1B8=0X^T96NR_R7!~=fZ{Lih8|&$yMLkzs?{n3 z0|WW=^z`!O%a<1(J$jVUaf>|zel{hrvuWz^;ls|QOP7N2@$o205^V#u#JgpdxLEs9 z6pGA3l7zt!c`pPScs6Z}17*+{KF*<%J6uywj&o`?Xq4#c?dO z)?L*DOfvF?g@v`pj~}PEZhzfcxpwVZ+sJ+am;!!a!#1~Q6=2t{#>tV95pn$ZaWOD3 z;B4&;d%dzOV{UFPo1C1?3upbV#>t(mvq$N;tBTfHmyX$>ThBuq_$r&Nvp)mBu#0t; zLOEFTbi#(gC^63z-M!X~yg!=eK5O1Dn!tB7PZuFrPoXR*L$P6=?jY7>uemnUZFaEF Z{|%&Y#snIU`#1mq002ovPDHLkV1h3B3n~Br diff --git a/textures/ui_trash_slot_icon.png b/textures/ui_trash_slot_icon.png index 86ebba2b655b154ea41ff7388bcbbc9c12b5229a..d40af263d3f9d554f210485bc22eb94e2bfe7cb9 100644 GIT binary patch literal 1052 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K588}#g)VJz{w+sx-k3C%+Ln>~)z3cBE5-xN6 z;d{YA*y*3J|Tf9kvCUBXhmlJqU5XV$d1 zaI?)_H>>TKH}lNj=}#)p37x%j=KbNP^Quoy09rx_6qJ4Oo~h5B8qgNGu6k->q|V=a zbISKBd)a62oLF5sLA`R?bjhoG=B2Ag@0^<*`RePQ|8M!~?ZS)g*B4FjJp9^V{pPt} z*I0;ed0u2@bgKPW`~UY=Cmz>C>q)svPuo0myDs1V`CF%3OG>$4R{!6u+-#q0mr?VqymrpaTkGA+NOi*>Hoy|i3a^VW26=CQAD$_yIHciz-* zyL^Q8f!opZ56hTmq-;Jj+yAfhfx2y4?icbH_D^U1ywbkG`{uh02LIEOe)=5UxzlLH z9=`uN`at=6dI^&}Ne3c%AG}a|`(oRhE%Cw!cvwHo_q{bS_h#mPwT4Kmi*kSK z-TyxYaOwI2aglaF{+gPGtHJxRL2Y;zev;J1~(GhUV^N zI2O6~7xO#bHCKCB19lso*?emIPlLy&>>tGamwLY8(}}p0jIzs|35K_)<`7uX?CjKgZCcPQAG2Re@^x=Vgx{-#^P=$h>0P<^xOboYIiDvij3(b1M94ljYT!2Wr+m ztBWhm@h_Nh{pPu|6F{uctN0B<-EB$Ps`S&uDotM`xqpn uOi1kJZ=Sw6rY&{jm)iTx3O7xyfzCWm&Rh+mG%1IhUNA=bYp`\$ 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 From 3d58befe0310a2cfa6c7e38eae53c3517bee556c Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 9 Mar 2021 14:54:41 -0500 Subject: [PATCH 41/46] Document the API version --- doc/mod_api.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/mod_api.txt b/doc/mod_api.txt index c0be129..0d100a0 100644 --- a/doc/mod_api.txt +++ b/doc/mod_api.txt @@ -3,6 +3,14 @@ unified_inventory API This file provides information about the API of unified_inventory. +API revisions within unified_inventory can be checked using: + + (unified_inventory.version or 1) + +**Revision history** + +* Version `1`: Classic formspec layout (no real_coordinates) +* Version `2`: Force formspec version 4 (includes real_coordinates) Misc functions -------------- From a7556c5044026f35a30d1e7964f1613c7d21484a Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 15:09:46 -0500 Subject: [PATCH 42/46] update minimum MT version number --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c917ec..d159c02 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Unified Inventory replaces the default survival and creative inventory. ## Requirements - * Minetest 5.0.0+ + * Minetest 5.4.0+ # Licenses @@ -96,4 +96,4 @@ Other files from Wikimedia Commons: RealBadAngel: (CC-BY-4.0) - * Everything else. \ No newline at end of file + * Everything else. From a84ce24067fe9ddcb835e3bf6f3972871f02192e Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 9 Mar 2021 18:31:16 -0500 Subject: [PATCH 43/46] use the ui.list_img_offset variable for offsetting the std inv list[] so that it'll match every other list that uses it. --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 6794465..231da9e 100644 --- a/init.lua +++ b/init.lua @@ -113,7 +113,7 @@ dofile(modpath.."/api.lua") for _, style in ipairs({ui.style_full, ui.style_lite}) do style.items_per_page = style.pagecols * style.pagerows style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", - style.std_inv_x+0.13, style.std_inv_y+0.13) + style.std_inv_x + ui.list_img_offset, style.std_inv_y + ui.list_img_offset) style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) From afb295ec22bf1fcc89ea2908b4124893c0801c98 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Wed, 10 Mar 2021 12:26:28 -0500 Subject: [PATCH 44/46] fix trash slot list[] offset (only noticable when listcolors[] allows slots to be visible, i.e. on mouseover) --- api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.lua b/api.lua index c556955..cb0786f 100644 --- a/api.lua +++ b/api.lua @@ -317,7 +317,7 @@ function ui.make_trash_slot(xpos, ypos) return ui.single_slot(xpos, ypos).. "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png^[opacity:95]".. - "list[detached:trash;main;"..xpos..","..ypos..";1,1;]" + "list[detached:trash;main;"..(xpos + ui.list_img_offset)..","..(ypos + ui.list_img_offset)..";1,1;]" end function ui.make_inv_img_grid(xpos, ypos, width, height, bright) From 608cdfb8875170e1f192019275a3f3d619286f9a Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Wed, 10 Mar 2021 12:32:55 -0500 Subject: [PATCH 45/46] fix refill slot list[] offset also --- register.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/register.lua b/register.lua index f90692c..3cb5f59 100644 --- a/register.lua +++ b/register.lua @@ -192,7 +192,7 @@ ui.register_page("craft", { formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", - F(player_name), craftx - 2.2 - ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) + F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) end return {formspec=table.concat(formspec)} end, From c044f5e3b08f0c68ab028d757b2fa63d9a1b0370 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Wed, 10 Mar 2021 21:20:31 -0500 Subject: [PATCH 46/46] use the trash slot icon's alpha instead of [combine also it's supposed to be 128px, not 256px. fixed that. --- api.lua | 2 +- textures/ui_trash_slot_icon.png | Bin 1052 -> 697 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/api.lua b/api.lua index cb0786f..05a34ee 100644 --- a/api.lua +++ b/api.lua @@ -316,7 +316,7 @@ end function ui.make_trash_slot(xpos, ypos) return ui.single_slot(xpos, ypos).. - "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png^[opacity:95]".. + "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png]".. "list[detached:trash;main;"..(xpos + ui.list_img_offset)..","..(ypos + ui.list_img_offset)..";1,1;]" end diff --git a/textures/ui_trash_slot_icon.png b/textures/ui_trash_slot_icon.png index d40af263d3f9d554f210485bc22eb94e2bfe7cb9..5fc4de1dff740d7db6dec814fa59bab030a0ef1a 100644 GIT binary patch literal 697 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H0wgodS2{2-Fg19(IEGZ*dOO=O`?iCC+kG#u zClj1Bv_ynfaAwvy|Np;n`@O1S1Cymoclh2B$qB#pa-rKA=F+Un>k;R^=XHPdsIrzi zt0%;v*dpMBP843)apa?M(I!6kk5|q`pJ#ot=Sh=spSfLE;OEKuHK)b)ZD;DMI4#|0 zC4cb4osSc(C#gBj)A_o7N0$D5E1w?a$1Po)pQkW&xfI45y6dlizX0BpzPyHuH{!>nHbEo=W$lrP@~y)W5gO4=a%TGQoIv>V4KN(UO`; zs#+Uatq+TaF-+6lvsV7=M*biDueU2sw|Mr?_Vd=o%%TjI%}?E~2PqOjf?iz&U||)1pTyBIi$EhR027 zM!xK@HfOzUToPIvOl+NE7}NHDIOxsmdgMp9$@vp2Ob;BM;yO#M>9~)z3cBE5-xN6 z;d{YA*y*3J|Tf9kvCUBXhmlJqU5XV$d1 zaI?)_H>>TKH}lNj=}#)p37x%j=KbNP^Quoy09rx_6qJ4Oo~h5B8qgNGu6k->q|V=a zbISKBd)a62oLF5sLA`R?bjhoG=B2Ag@0^<*`RePQ|8M!~?ZS)g*B4FjJp9^V{pPt} z*I0;ed0u2@bgKPW`~UY=Cmz>C>q)svPuo0myDs1V`CF%3OG>$4R{!6u+-#q0mr?VqymrpaTkGA+NOi*>Hoy|i3a^VW26=CQAD$_yIHciz-* zyL^Q8f!opZ56hTmq-;Jj+yAfhfx2y4?icbH_D^U1ywbkG`{uh02LIEOe)=5UxzlLH z9=`uN`at=6dI^&}Ne3c%AG}a|`(oRhE%Cw!cvwHo_q{bS_h#mPwT4Kmi*kSK z-TyxYaOwI2aglaF{+gPGtHJxRL2Y;zev;J1~(GhUV^N zI2O6~7xO#bHCKCB19lso*?emIPlLy&>>tGamwLY8(}}p0jIzs|35K_)<`7uX?CjKgZCcPQAG2Re@^x=Vgx{-#^P=$h>0P<^xOboYIiDvij3(b1M94ljYT!2Wr+m ztBWhm@h_Nh{pPu|6F{uctN0B<-EB$Ps`S&uDotM`xqpn uOi1kJZ=Sw6rY&{jm)iTx3