From 62e3a8b9ff665a46ec2160d9b0cf72f7d4f2fdfa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 00:11:43 +0100 Subject: [PATCH] Add player skin support, add female skin --- mods/PLAYER/simple_skins/depends.txt | 3 + mods/PLAYER/simple_skins/description.txt | 1 + mods/PLAYER/simple_skins/init.lua | 148 ++++++++++++++++++ mods/PLAYER/simple_skins/intllib.lua | 45 ++++++ mods/PLAYER/simple_skins/license.txt | 21 +++ mods/PLAYER/simple_skins/locale/fr.po | 51 ++++++ mods/PLAYER/simple_skins/locale/it.po | 52 ++++++ mods/PLAYER/simple_skins/locale/ms.po | 51 ++++++ mods/PLAYER/simple_skins/locale/template.pot | 50 ++++++ mods/PLAYER/simple_skins/meta/character.txt | 3 + mods/PLAYER/simple_skins/meta/character_1.txt | 3 + mods/PLAYER/simple_skins/mod.conf | 1 + mods/PLAYER/simple_skins/readme.md | 7 + .../simple_skins/textures/character_1.png | Bin 0 -> 5505 bytes .../textures/inventory_plus_skins.png | Bin 0 -> 2182 bytes 15 files changed, 436 insertions(+) create mode 100644 mods/PLAYER/simple_skins/depends.txt create mode 100644 mods/PLAYER/simple_skins/description.txt create mode 100644 mods/PLAYER/simple_skins/init.lua create mode 100644 mods/PLAYER/simple_skins/intllib.lua create mode 100644 mods/PLAYER/simple_skins/license.txt create mode 100644 mods/PLAYER/simple_skins/locale/fr.po create mode 100644 mods/PLAYER/simple_skins/locale/it.po create mode 100644 mods/PLAYER/simple_skins/locale/ms.po create mode 100644 mods/PLAYER/simple_skins/locale/template.pot create mode 100644 mods/PLAYER/simple_skins/meta/character.txt create mode 100644 mods/PLAYER/simple_skins/meta/character_1.txt create mode 100644 mods/PLAYER/simple_skins/mod.conf create mode 100644 mods/PLAYER/simple_skins/readme.md create mode 100644 mods/PLAYER/simple_skins/textures/character_1.png create mode 100644 mods/PLAYER/simple_skins/textures/inventory_plus_skins.png diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/simple_skins/depends.txt new file mode 100644 index 000000000..1927ce890 --- /dev/null +++ b/mods/PLAYER/simple_skins/depends.txt @@ -0,0 +1,3 @@ +mcl_player +intllib? +3d_armor? diff --git a/mods/PLAYER/simple_skins/description.txt b/mods/PLAYER/simple_skins/description.txt new file mode 100644 index 000000000..61c7bff64 --- /dev/null +++ b/mods/PLAYER/simple_skins/description.txt @@ -0,0 +1 @@ +Mod that allows players to set their individual skins. \ No newline at end of file diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua new file mode 100644 index 000000000..3a41490f4 --- /dev/null +++ b/mods/PLAYER/simple_skins/init.lua @@ -0,0 +1,148 @@ +-- Simple Skins mod for Minetest (MineClone 2 Edition) + +-- Released by TenPlus1 and based on Zeg9's code under MIT license + +skins = { + skins = {}, meta = {}, + modpath = minetest.get_modpath("simple_skins"), + skin_count = 0, -- counter of _custom_ skins (all skins except character.png) +} + + +-- Load support for intllib. +local S, NS = dofile(skins.modpath .. "/intllib.lua") + + +-- load skin list and metadata +local id, f, data, skin = 1 + +while true do + + skin = "character_" .. id + + -- does skin file exist ? + f = io.open(skins.modpath .. "/textures/" .. skin .. ".png") + + -- escape loop if not found and remove last entry + if not f then + id = id - 1 + break + end + + f:close() + + -- does metadata exist for that skin file ? + f = io.open(skins.modpath .. "/meta/" .. skin .. ".txt") + + if f then + data = minetest.deserialize("return {" .. f:read('*all') .. "}") + f:close() + end + + -- add metadata to list + skins.meta[skin] = { + name = data and data.name or "", + author = data and data.author or "", + } + + id = id + 1 + skins.skin_count = skins.skin_count + 1 +end + +skins.set_player_skin = function(player, skin) + if not player then + return + end + local playername = player:get_player_name() + skins.skins[playername] = skin + player:set_attribute("simple_skins:skin", skins.skins[playername]) + skins.update_player_skin(player) + if minetest.get_modpath("3d_armor") then + armor.textures[playername].skin = skin .. ".png" + armor:update_player_visuals(player) + end +end + +skins.update_player_skin = function(player) + if not player then + return + end + local playername = player:get_player_name() + mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }) +end + +-- load player skin on join +minetest.register_on_joinplayer(function(player) + + local name = player:get_player_name() + local skin = player:get_attribute("simple_skins:skin") + local set_skin + -- do we already have a skin in player attributes? + if skin then + set_skin = skin + + -- otherwise use random skin if not set + else + local r = math.random(0, skins.skin_count) + if r == 0 then + set_skin = "character" + else + set_skin = "character_" .. r + end + end + if set_skin then + skins.set_player_skin(player, set_skin) + end +end) + +-- command to set player skin (usually for custom skins) +minetest.register_chatcommand("setskin", { + params = "[] ", + description = S("Select player skin of yourself or another player"), + privs = {}, + func = function(name, param) + + local playername, skin_id = string.match(param, "([^ ]+) (%d+)") + if not playername or not skin_id then + skin_id = string.match(param, "(%d+)") + if not skin_id then + return false, S("Insufficient or wrong parameters") + end + playername = name + end + skin_id = tonumber(skin_id) + + local player = minetest.get_player_by_name(playername) + + if not player then + return false, S("Player @1 not online!", playername) + end + if name ~= playername then + local privs = minetest.get_player_privs(name) + if not privs.server then + return false, S("You need the “server” privilege to change the skin of other players!") + end + end + + local skin + if skin_id == nil or skin_id > skins.skin_count or skin_id < 0 then + return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) + elseif skin_id == 0 then + skin = "character" + else + skin = "character_" .. tostring(skin_id) + end + + skins.set_player_skin(player, skin) + local skinfile = skin..".png" + + local your_msg = S("Your skin has been set to: @1", skinfile) + if name == playername then + return true, your_msg + else + minetest.chat_send_player(playername, your_msg) + return true, S("Skin of @1 set to: @2", playername, skinfile) + end + + end, +}) diff --git a/mods/PLAYER/simple_skins/intllib.lua b/mods/PLAYER/simple_skins/intllib.lua new file mode 100644 index 000000000..6669d7202 --- /dev/null +++ b/mods/PLAYER/simple_skins/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/PLAYER/simple_skins/license.txt b/mods/PLAYER/simple_skins/license.txt new file mode 100644 index 000000000..fec6f6aa5 --- /dev/null +++ b/mods/PLAYER/simple_skins/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/PLAYER/simple_skins/locale/fr.po b/mods/PLAYER/simple_skins/locale/fr.po new file mode 100644 index 000000000..30d8e36e7 --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/fr.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: 2017-07-29 07:17+0200\n" +"Last-Translator: fat115 \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Sélectionner l'apparence du joueur :" + +#: init.lua +msgid "Name: " +msgstr "Nom : " + +#: init.lua +msgid "Author: " +msgstr "Auteur : " + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Commande admin pour définir l'apparence du joueur" + +#: init.lua +msgid "'s skin set to" +msgstr ", apparence définie pour" + +#: init.lua +msgid "Set player skin" +msgstr "Définir l'apparence du joueur" + +#: init.lua +msgid "Close" +msgstr "Fermer" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MOD] Simple Skins chargé" diff --git a/mods/PLAYER/simple_skins/locale/it.po b/mods/PLAYER/simple_skins/locale/it.po new file mode 100644 index 000000000..d4701316d --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/it.po @@ -0,0 +1,52 @@ +# simple_skin . +# Copyright (C) 2018 +# This file is distributed under the same license as the PACKAGE package. +# Stefano Peris , 2018. +# Github: +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 07:29+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Stefano Peris \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Seleziona la skin del giocatore" + +#: init.lua +msgid "Name: " +msgstr "Nome" + +#: init.lua +msgid "Author: " +msgstr "Autore" + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Comando di admin per impostare la skin del giocatore" + +#: init.lua +msgid "'s skin set to" +msgstr ", la skin è impostata su" + +#: init.lua +msgid "Set player skin" +msgstr "Imposta la skin del giocatore" + +#: init.lua +msgid "Close" +msgstr "Chiudi" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MOD] Skins semplici caricate" diff --git a/mods/PLAYER/simple_skins/locale/ms.po b/mods/PLAYER/simple_skins/locale/ms.po new file mode 100644 index 000000000..bba5982d4 --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/ms.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: 2018-02-14 01:23+0800\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Pilih Kulit Pemain:" + +#: init.lua +msgid "Name: " +msgstr "Nama: " + +#: init.lua +msgid "Author: " +msgstr "Pencipta: " + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Perintah pentadbir untuk menetapkan kulit pemain" + +#: init.lua +msgid "'s skin set to" +msgstr " telah ditukarkan kulitnya kepada" + +#: init.lua +msgid "Set player skin" +msgstr "Tetapkan kulit pemain" + +#: init.lua +msgid "Close" +msgstr "Tutup" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MODS] Simple Skins telah dimuatkan" diff --git a/mods/PLAYER/simple_skins/locale/template.pot b/mods/PLAYER/simple_skins/locale/template.pot new file mode 100644 index 000000000..36282e43c --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/template.pot @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "" + +#: init.lua +msgid "Name: " +msgstr "" + +#: init.lua +msgid "Author: " +msgstr "" + +#: init.lua +msgid "Admin command to set player skin" +msgstr "" + +#: init.lua +msgid "'s skin set to" +msgstr "" + +#: init.lua +msgid "Set player skin" +msgstr "" + +#: init.lua +msgid "Close" +msgstr "" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "" diff --git a/mods/PLAYER/simple_skins/meta/character.txt b/mods/PLAYER/simple_skins/meta/character.txt new file mode 100644 index 000000000..5a07db19e --- /dev/null +++ b/mods/PLAYER/simple_skins/meta/character.txt @@ -0,0 +1,3 @@ +name = "Steve", +author = "(Texture pack author)", +description = "The default male skin.", diff --git a/mods/PLAYER/simple_skins/meta/character_1.txt b/mods/PLAYER/simple_skins/meta/character_1.txt new file mode 100644 index 000000000..ec4389550 --- /dev/null +++ b/mods/PLAYER/simple_skins/meta/character_1.txt @@ -0,0 +1,3 @@ +name = "Alex", +author = "(Texture pack author)", +description = "The default female skin.", diff --git a/mods/PLAYER/simple_skins/mod.conf b/mods/PLAYER/simple_skins/mod.conf new file mode 100644 index 000000000..aff90aabe --- /dev/null +++ b/mods/PLAYER/simple_skins/mod.conf @@ -0,0 +1 @@ +name = simple_skins diff --git a/mods/PLAYER/simple_skins/readme.md b/mods/PLAYER/simple_skins/readme.md new file mode 100644 index 000000000..0c6980bbb --- /dev/null +++ b/mods/PLAYER/simple_skins/readme.md @@ -0,0 +1,7 @@ +Simple Skins, MineClone 2 Edition + +Simple Skins mod to allow players to select a skin. +Use the chat command /setskin to change skin. + +Original mod: +https://forum.minetest.net/viewtopic.php?id=9100 diff --git a/mods/PLAYER/simple_skins/textures/character_1.png b/mods/PLAYER/simple_skins/textures/character_1.png new file mode 100644 index 0000000000000000000000000000000000000000..71f02471dc622249681a511a66087b803e97dbdf GIT binary patch literal 5505 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 DKOkQJ literal 0 HcmV?d00001 diff --git a/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png b/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc97759cd8c906632a0ff2712b647c23abc2278 GIT binary patch literal 2182 zcmV;12zmF3P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvvI8d!{O1%o0%F&3SgUe_96t@xjF)G>N>cHZ z&5Qj?pTL1##Z9sDk(O*YzxrUWn-{yeUpSaNS}%`j zYX1s*d<@7z?d{cWa#ue^9ntOheEgny-)q03j=U2)>9b)SSHshC^y|91Rp;-|Ap?vN z;mS{Oy(rM2N{i-cJ9UH@+;kbObKUu4D?U4R{g4v&MayN-GmI}_qk}cS zdAVbuGcTX{Iu*=32t6Ia8DYea%X~8am+N-4)=pg_TW+inm)kjwFgA1h7rj6TEyXk* ze9vW`^2R<9>%m|=Fc&Pa+9obqq(^S~!?Q=fXoIn`H7E~t0EjSmL@?yRfKB8hC9>JM zOavSY_^F88A?+I&pcvgCv%rn_3FH*F=f;>!r>~1n%#aok5qc zn*k)W+nm`#A-K)l=FIYztLVTQ#ZAtj%@`OAlU!VMbN68GSKdqv|B5&FjXATa`#+d7 zn>uCgCvP8E8}(Eae+b&UaARuyg0L;`sw>qs?vo)mWk2v#%5zDOcM(|LNym{*YP&^IxcJR|h?wTg6D7!K?@Pd#hK1L&1i%Qu6q2&}a}r*wVfnsG#M#3E zrPvu+K$WF5hq2*;6R7L~Iu>bAW>U;LR=H4|R1JDxhE$@){;M#8OtQH8F&>yV8L?1N zQ56OYu9#$m#r}*jkiKD2#AGJ?=_pq+^`ZMVV5y2y&o$jB@enwMLy0vHQMdwdT`Y}V z9^Pwt!XaWhg|~)4Q(*__Jg2?Eo>`PV4~HW=&k^O3YvhH~hHCw&j}q`xMqV=FmOuOh zPw(hXIgqDPRcAr$N#*RRbx z7xB1c0{}kG71`<`s^EX6sto=dUm=F1wKC_ZMLNyLStO`aw}VwpYlu~KG??#js_2G- z1GOacj?(J>O2G1#EY@-qsg$o+>W<)cn--3wZ2kt)1t<@#h~&fo000JJOGiWi{{a60 z|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0|XW-2Yq6wLI3~($Vo&& zR4C7Fl0irmQ5eU6GYk~EJM7M^>ngKUDy#@)As!Y%C@2b1FJW}ZONSPc4xW-dWQV{G zdP>M30y}l|AW0oIyqLirioi>jQsB@IZ)kK@yLI^TvBVlqSL`UMNi@-Bi*| zJ-$666d0YEADx*OtH#F7%NOroA6{Hr-`??o?z6ec;=uAo_0#sBH!E+SExn%|X#r+e z>r?lx-WtDQ0gG$vO6^Zy8wOr|tS)a