From 918df53f3b6a6e0d0f486c75c756078db0a84b12 Mon Sep 17 00:00:00 2001 From: GreenDimond <24834740+GreenXenith@users.noreply.github.com> Date: Tue, 2 Apr 2019 17:18:17 -0700 Subject: [PATCH] Autogenerate skin previews and other @GreenDimond changes --- formspecs.lua | 9 +++-- init.lua | 10 ++++++ meta/character.txt | 3 -- skin_meta_api.lua | 55 ++++++++++++++++++++++++++++-- skinlist.lua | 7 ++-- textures/character.png | Bin 1605 -> 0 bytes textures/character_preview.png | Bin 604 -> 0 bytes textures/inventory_plus_skins.png | Bin 673 -> 0 bytes textures/readme.txt | 3 +- textures/skindb_mask_chest.png | Bin 0 -> 114 bytes textures/skindb_mask_head.png | Bin 0 -> 139 bytes textures/skindb_mask_rarm.png | Bin 0 -> 118 bytes textures/skindb_mask_rleg.png | Bin 0 -> 118 bytes textures/skindb_transform.png | Bin 0 -> 191 bytes textures/skins_button.png | Bin 309 -> 250 bytes textures/ui_misc_form.png | Bin 5419 -> 6177 bytes unified_inventory_page.lua | 1 + 17 files changed, 77 insertions(+), 11 deletions(-) delete mode 100644 meta/character.txt delete mode 100644 textures/character.png delete mode 100644 textures/character_preview.png delete mode 100644 textures/inventory_plus_skins.png create mode 100644 textures/skindb_mask_chest.png create mode 100644 textures/skindb_mask_head.png create mode 100644 textures/skindb_mask_rarm.png create mode 100644 textures/skindb_mask_rleg.png create mode 100644 textures/skindb_transform.png diff --git a/formspecs.lua b/formspecs.lua index 89e60f7..39d4a17 100644 --- a/formspecs.lua +++ b/formspecs.lua @@ -16,11 +16,14 @@ function skins.get_skin_info_formspec(skin) local m_name = skin:get_meta_string("name") local m_author = skin:get_meta_string("author") local m_license = skin:get_meta_string("license") + local m_format = skin:get_meta("format") -- overview page - local formspec = "image[0,.75;1,2;"..skin:get_preview().."]" + local raw_size = m_format == "1.8" and "2,2" or "2,1" + + local formspec = "image[0.8,.6;1,2;"..minetest.formspec_escape(skin:get_preview()).."]" if texture then formspec = formspec.."label[6,.5;"..S("Raw texture")..":]" - .."image[6,1;2,1;"..skin:get_texture().."]" + .."image[6,1;"..raw_size..";"..texture.."]" end if m_name ~= "" then formspec = formspec.."label[2,.5;"..S("Name")..": "..minetest.formspec_escape(m_name).."]" @@ -63,7 +66,7 @@ function skins.get_skin_selection_formspec(player, context, y_delta) y = y_delta end formspec = formspec.."image_button["..x..","..y..";1,2;".. - skin:get_preview()..";skins_set$"..i..";]".. + minetest.formspec_escape(skin:get_preview())..";skins_set$"..i..";]".. "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin:get_meta_string("name")).."]" end diff --git a/init.lua b/init.lua index a771df4..33345ed 100644 --- a/init.lua +++ b/init.lua @@ -82,3 +82,13 @@ player_api.register_model("skinsdb_3d_armor_character_5.b3d", { sit = {x=81, y=160}, }, }) + +-- Register default character.png if not part of this mod +local default_skin_obj = skins.get(skins.default) +if not default_skin_obj then + default_skin_obj = skins.new(skins.default) + default_skin_obj:set_texture("character.png") + default_skin_obj:set_meta("format", '1.0') + default_skin_obj:set_meta("_sort_id", 0) + default_skin_obj:set_meta("name", "Sam") +end diff --git a/meta/character.txt b/meta/character.txt deleted file mode 100644 index b4599e6..0000000 --- a/meta/character.txt +++ /dev/null @@ -1,3 +0,0 @@ -Sam 0 -Jordach -CC BY-SA 3.0 diff --git a/skin_meta_api.lua b/skin_meta_api.lua index 06929e8..375905b 100644 --- a/skin_meta_api.lua +++ b/skin_meta_api.lua @@ -56,7 +56,58 @@ function skin_class:set_preview(value) end function skin_class:get_preview() - return self._preview or "player.png" + if self._preview then + return self._preview + end + + local player_skin = "("..self:get_texture()..")" + local skin = "" + + -- Consistent on both sizes: + --Chest + skin = skin .. "([combine:16x32:-16,-12=" .. player_skin .. "^[mask:skindb_mask_chest.png)^" + --Head + skin = skin .. "([combine:16x32:-4,-8=" .. player_skin .. "^[mask:skindb_mask_head.png)^" + --Hat + skin = skin .. "([combine:16x32:-36,-8=" .. player_skin .. "^[mask:skindb_mask_head.png)^" + --Right Arm + skin = skin .. "([combine:16x32:-44,-12=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^" + --Right Leg + skin = skin .. "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" + + -- 64x skins have non-mirrored arms and legs + local left_arm + local left_leg + + if self:get_meta("format") == "1.8" then + left_arm = "([combine:16x32:-24,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^" + left_leg = "([combine:16x32:-12,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))^" + else + left_arm = "([combine:16x32:-44,-12=" .. player_skin .. "^[mask:skindb_mask_rarm.png^[transformFX)^" + left_leg = "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png^[transformFX)^" + end + + -- Left Arm + skin = skin .. left_arm + --Left Leg + skin = skin .. left_leg + + -- Add overlays for 64x skins. these wont appear if skin is 32x because it will be cropped out + --Chest Overlay + skin = skin .. "([combine:16x32:-16,-28=" .. player_skin .. "^[mask:skindb_mask_chest.png)^" + --Right Arm Overlay + skin = skin .. "([combine:16x32:-44,-28=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^" + --Right Leg Overlay + skin = skin .. "([combine:16x32:0,-16=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" + --Left Arm Overlay + skin = skin .. "([combine:16x32:-40,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^" + --Left Leg Overlay + skin = skin .. "([combine:16x32:4,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))" + + -- Full Preview + skin = "(((" .. skin .. ")^[resize:64x128)^[mask:skindb_transform.png)" + + return skin end function skin_class:apply_skin_to_player(player) @@ -133,6 +184,6 @@ end function skin_class:is_applicable_for_player(playername) local assigned_player = self:get_meta("playername") - return assigned_player == nil or assigned_player == true or + return minetest.check_player_privs(playername, {server=true}) or assigned_player == nil or assigned_player == true or (assigned_player:lower() == playername:lower()) end diff --git a/skinlist.lua b/skinlist.lua index f8055a2..293ffb6 100644 --- a/skinlist.lua +++ b/skinlist.lua @@ -1,9 +1,12 @@ - local skins_dir_list = minetest.get_dir_list(skins.modpath.."/textures") for _, fn in pairs(skins_dir_list) do local name, sort_id, assignment, is_preview, playername - local nameparts = string.gsub(fn, "[.]", "_"):split("_") + local nameparts = { + fn:match("^%w+"), + fn:gsub("^%w+_", ""):gsub("%.%w+$", ""), + fn:match("%w+$"), + } -- check allowed prefix and file extension if (nameparts[1] == 'player' or nameparts[1] == 'character') and diff --git a/textures/character.png b/textures/character.png deleted file mode 100644 index fe0154df869d1cb50b0350cad080f143ddb74ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1605 zcmbVLXH-)M7=6tm+d#<6doPTw<6X_Wo9@*fnO=qQZoDLvI!lh;?14=*yC(3L!C zC~V1%>@7XjQ=MxM(QMe1zMFZSMKL4w>ft)2BSIh4C- zKbcH6sVjM;IPgc>=P;THp_d>u!_Cc2DwT@G;*RXFX477vfYB_7pYG}D`J}O^E%S@J zDW5_7R2WroZ4)7W3S^tYwMl^ZY3w9G-=Mbc2F#&@9P2m)D?o%QSdc3&#)%T%+dYkA zvV#yziC`)O%R?FfM5u<)ES^w}V1-^pC7Z-0OPEnBuomRhZ_v7FKonHmRo(<$ta2$XFFOeX$2{yYDh z``yK^eMxMz7^a=%1)j~{NB zcCMH^`^@>${REw8q-u#F4&;vpZFBjdxcB3u+Y~K_2(FYp?>Xm>*#)oZP|Q?T_|o~W zt;U|l$ghIFsUb}0a+7{n*ZWdbNogGh!XIpAZe@X_MA@`_z-BGdIVy1?%FdpGXajKa zYC;zpbN+ZwjXCb)7gt=hd!JeybJXINQPyLD!|Uaeh}vDwsqW{SP8;9x7D_nW zl>ILmcXFtS9xu`f^UsOS3_JOB^IuU_XA(kAm(M;PjJWZ^?tbMP zqUv{5a1=t8Weisbl|3ZZajEAp!iB#CD{ZBhvH3UG?GN_JWMJw)BtP5d+!5prpO6`` zIw!|&X)19MkrU74L~HiCeFC%zNkru$@>j-cz@c(!|s!|U4K>kC(~`FZ8c#B3EYzd7Vf zJs8!}&^qg~t28pNUVkXh=z8+4yvr!MzG{AE=oOCt{Jo_;=rTm#HSt;3E{t@=)|VoyPo91q~*b-+`6498VuvWqyPW^02%k*yrAH|q3Fe@ z<-w%p!=>N6pytA*;l85czoY5JsNAuR<-(;Cj{p{?01$Nm>c*(wy`bg7q#fG;O1}a@ zrvf*P0o=NtUh)DO!T{a7pWeKm=ftMszoJ4b94;Od?ZyQdAe0v#jTj%28YH6_A($B= zof;#d8Y7|@A(j{*l^G(O7$KP#Ad?y+qZuKZ6B~vZBAOW@o){sQ86lZQMn+CfPDMpU zLPA18K|xJTO-M*cnEJwI00001bW%=J06^y0W&i*H_DMuRRCwBrkhNOHKoEt`S&8G` zU_CW8PtK#@?oM>#+3$9DegE+x0I(f}WeUKwKv|ML9f(S+>QM36!^J*Dp`x7c zAtL~sfP@H6$7(e@AX7g|sAizVs9_8%C}IL0paHs$k^Ds@0_PMy6dX`rT)>wsOdwqn qg$4dip!#Kqf9C@Wq+r2;nM`YG{E1(Eo(d%Z0000!W{^RrZA8#I)XKG-m`1T|*O>M{48|B4yhu6tp@tK|X`fAbA%qYR5 zlhg0BJ1}xMGR@@Kx(WzS`8aei09|$T-*vV*P5Iumsb3{Lr%p`Qp(o(vw38JnW|G;n z+`MML^_wZ6tim9WU*}k^xcqp^(%lK$pFDj1{-jU+nfmX4euz)sZ?yO9Gns==#Pt1K z&)6v(+Z4AbfNy2?v3!QFUH|+~_59+0D&UwG`CsE7yKL*NzQ^(R=7VC*)78&qol`;+ E0Q%+@_y7O^ diff --git a/textures/readme.txt b/textures/readme.txt index 93776ed..9d0b450 100644 --- a/textures/readme.txt +++ b/textures/readme.txt @@ -7,6 +7,7 @@ One or multiple private skins for player "nick": player_[nick].png or player_[nick]_[number-or-name].png -Preview files for public and private skins: +Preview files for public and private skins. +Optional, overrides the generated preview character_*_preview.png or player_*_*_preview.png diff --git a/textures/skindb_mask_chest.png b/textures/skindb_mask_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..b0456da44cf232578425bb3744c28132bdb45748 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2%>VHW;`ADb50q$YKTtZeb8+WSBKa0w}2B z>Eak-aXR_W`389d!yXP+odU6{1_M4h_dWsEp2e9(7c>|c>?bnYfBE-&6;M5cr>mdK II;Vst0N`pHc>n+a literal 0 HcmV?d00001 diff --git a/textures/skindb_mask_head.png b/textures/skindb_mask_head.png new file mode 100644 index 0000000000000000000000000000000000000000..50586731233520d2b5ab3b3523ff4dea19b7edc0 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2%>VHW;`ADb50q$YKTtZeb8+WSBKa0w`$f z>Eak-aXR_Wc?Q-3HW33OBLfgH6ks^)%&6SVHW;`ADb50q$YKTtZeb8+WSBKa0w}2A z>Eak-aXL9cf|Umddj9`E9C1U`K+q^LgmJ5g!N28KS^`?mC98mxO literal 0 HcmV?d00001 diff --git a/textures/skindb_mask_rleg.png b/textures/skindb_mask_rleg.png new file mode 100644 index 0000000000000000000000000000000000000000..d06c3d8a396f2dc41af89d89ef66e66ebd330610 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2%>VHW;`ADb50q$YKTtZeb8+WSBKa0w}2A z>Eak-aXL9cf|Umddj4~2Bq*gETEUd1nb5d7Vd5c+A2OCsA`A@Ar!pB{<(tk9)WhKE L>gTe~DWM4f9>^OU literal 0 HcmV?d00001 diff --git a/textures/skindb_transform.png b/textures/skindb_transform.png new file mode 100644 index 0000000000000000000000000000000000000000..a36bf543650db5cc2b9ffb90a77541991fba4a59 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!2%=&JC;8LQk(@Ik;M!QddeWoSh3W;3@BLW z>EaktaqI1^jhqYy94rTFzTLl>Bf!0S!tbz&hy4t;&f3E3TcrQ~;g3R~Vq_3>`S<^? nyvQO*>?8JyNIV4d!1o5`v?px8@(#TI3ljBo^>bP0l+XkKL0v9J literal 0 HcmV?d00001 diff --git a/textures/skins_button.png b/textures/skins_button.png index 7f6e19e89e1012d23268916d54d5ed26a470716f..f4c006c4e73828340e0605906a72e0588da5347a 100644 GIT binary patch delta 236 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 H^WDDyE1|wV literal 5419 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 diff --git a/unified_inventory_page.lua b/unified_inventory_page.lua index ede819a..572d253 100644 --- a/unified_inventory_page.lua +++ b/unified_inventory_page.lua @@ -12,6 +12,7 @@ unified_inventory.register_page("skins", { unified_inventory.register_button("skins", { type = "image", image = "skins_button.png", + tooltip = "Skins", }) local function get_formspec(player)