Update wardrobe mod to v1.2...

https://github.com/AntumMT/mod-wardrobe/releases/tag/v1.2
This commit is contained in:
Jordan Irwin 2021-04-20 18:45:23 -07:00
parent a49922df91
commit 1680557d39
69 changed files with 551 additions and 1659 deletions

View File

@ -93,7 +93,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
* [hbsprint][] ([LGPL][lic.lgpl2.1]) -- version: [f566d0f Git][ver.hbsprint] *2021-02-18* ([patched][patch.hbsprint])
* player/visuals/
* [invisibility][] ([MIT][lic.invisibility]) -- version: [65c0823 Git][ver.invisibility] *2021-01-21* ([patched][patch.invisibility])
* [wardrobe][] ([WTFPL][lic.wtfpl]) -- version: [1.1-2-c48b011 Git][ver.wardrobe] *2015-05-21*
* [wardrobe][] ([MIT][lic.wardrobe]) -- version: [1.2][ver.wardrobe] *2021-04-20*
* protection/
* [pvp_areas][] ([LGPL][lic.lgpl2.1]) -- version: [6e4d66d Git][ver.pvp_areas] *2018-07-26*
* [simple_protection][] ([CC0][lic.cc0]) -- version: [3630fe9 Git][ver.simple_protection] *2021-04-07* ([patched][patch.simple_protection])
@ -333,7 +333,8 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[vines]: https://forum.minetest.net/viewtopic.php?f=11&t=2344
[waffles]: https://forum.minetest.net/viewtopic.php?t=16669
[walking_light]: https://github.com/petermaloney/walking_light
[wardrobe]: https://forum.minetest.net/viewtopic.php?t=9680
[wardrobe]: https://github.com/AntumMT/mod-wardrobe
[wardrobe.old]: https://forum.minetest.net/viewtopic.php?t=9680
[weather]: https://forum.minetest.net/viewtopic.php?t=5245
[whitelist]: https://forum.minetest.net/viewtopic.php?t=8434
[windmill]: https://forum.minetest.net/viewtopic.php?id=7440
@ -397,6 +398,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[lic.trash_can]: mods/furniture/trash_can/LICENSE.txt
[lic.waffles]: mods/furniture/waffles/LICENSE.txt
[lic.walking_light]: mods/lighting/walking_light/README.md
[lic.wardrobe]: mods/player/visuals/wardrobe/LICENSE.txt
[lic.windmill]: mods/buildings/windmill/README.md
[lic.cc0]: doc/licenses/CC0.txt
@ -536,7 +538,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[ver.unifieddyes]: https://gitlab.com/VanessaE/unifieddyes/tags/2021-03-26-1
[ver.waffles]: https://github.com/GreenXenith/waffles/tree/15bcdce
[ver.walking_light]: https://github.com/petermaloney/walking_light/tree/766ef0f
[ver.wardrobe]: https://github.com/prestidigitator/minetest-mod-wardrobe/tree/c48b011
[ver.wardrobe]: https://github.com/AntumMT/mod-wardrobe/releases/tag/v1.2
[ver.whitelist]: https://github.com/AntumMT/mod-whitelist/tree/b813b19
[ver.windmill]: https://github.com/Sokomine/windmill/tree/47b029d
[ver.workbench]: https://github.com/minetest-mods/workbench/tree/bd14f59

View File

@ -2156,6 +2156,14 @@ mobs_animal:sheep_white = 0
#playeranim.animation_speed_sneak = 0.8
# *** wardrobe ***
## Number of skins shown per page.
# type: int
# default: 8
#wardrobe.skins_per_page = 8
# *** wieldview ***
# ???

74
mods/antum/skins/init.lua Normal file
View File

@ -0,0 +1,74 @@
local modname = core.get_current_modname()
local modpath = core.get_modpath(modname)
local texture_dir = modpath .. "/textures"
local function logit(lvl, msg)
core.log(lvl, "[" .. modname .. "] " .. msg)
end
local function texture_exists(fname)
local texture = texture_dir .. "/" .. fname
local f = io.open(texture, "r")
if f ~= nil then
io.close(f)
return true
end
return false
end
local skins = {
{"Ashley_by_loupicate.png", "Ashley",},
{"BlueZ_Sam_II_by_philipbenr.png", "BlueZ Sam II ",},
{"CaligoPL_by_CaligoPL.png", "CaligoPL",},
{"Charizard_by_Ferdi_Napoli.png", "Charizard",},
{"Charlotte_by_Sporax.png", "Charlotte",},
{"Chloé_by_nelly.png", "Chloé (by nelly) ",},
{"Chloé_by_Sporax.png", "Chloé (by Sporax)",},
{"Chop_by_Ferdi_Napoli.png", "Chop",},
{"Coralie_by_loupicate.png", "Coralie",},
{"Devil_by_viv100.png", "Devil",},
{"Emma_by_Cidney7760.png", "Emma",},
{"Female_angel_by_loupicate.png", "Angel (female)",},
{"Finn_The_Adventured_by_Ferdi_Napoli.png", "Finn",},
{"Fiona_by_loupicate.png", "Fiona",},
{"Fire_Mario_by_Ferdi_Napoli.png", "Fire Mario",},
{"Grégoire_by_Sporax.png", "Grégoire",},
{"Hobo_by_Minetestian.png", "Hobo",},
{"Infantry_man_by_philipbenr.png", "Infantry Man",},
{"Iris_by_loupicate.png", "Iris",},
{"Iron_Man_MK._7_by_Jordach.png", "Iron Man",},
{"Jake_by_Ferdi_Napoli.png", "Jake",},
{"Joker_by_Ferdi_Napoli.png", "Joker",},
{"Julia_by_nelly.png", "Julia",},
{"Ladyvioletkitty_by_lordphoenixmh.png", "LadyVioletKitty",},
{"Link_by_tux_peng.png", "Link",},
{"lisa_by_hansuke123.png", "Lisa",},
{"Male_angel_by_loupicate.png", "Angel (male)",},
{"Morgane_by_loupicate.png", "Morgane",},
{"Naruto_by_LuxAtheris.png", "Naruto",},
{"NERD_by_DJOZZY.png", "NERD",},
{"Older_Man_Sam_by_philipbenr.png", "Sam (older man)",},
{"philipbenr_by_philipbenr.png", "PhilipBenR",},
{"skin_minecraft_repris_by_Sporax.png", "Minecraft Repris",},
{"Space_Sam_by_philipbenr.png", "Sam (space)",},
{"Summer_by_lizzie.png", "Summer",},
{"SuperSam_by_AMMOnym.png", "Sam (super)",},
{"villiantest_III_by_marshrover.png", "VillianTest",},
{"War_Machine_by_Ferdi_Napoli.png", "War Machine",},
{"Witch_by_loupicate.png", "Witch",},
{"Zenohelds_by_sdzen.png", "Zenohelds",},
{"tessas_skin.png", "Tessa",},
}
for skin in pairs(skins) do
local key = skin[1]
local value = skin[2]
if not texture_exists(key) then
logit("warning", "texture " .. key .. " not found in " .. texture_dir)
end
wardrobe.registerSkin(skin[1], skin[2])
end

View File

@ -0,0 +1,3 @@
name = antum_skins
description =
depends = wardrobe

View File

Before

Width:  |  Height:  |  Size: 855 B

After

Width:  |  Height:  |  Size: 855 B

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 992 B

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 716 B

After

Width:  |  Height:  |  Size: 716 B

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 521 B

View File

Before

Width:  |  Height:  |  Size: 739 B

After

Width:  |  Height:  |  Size: 739 B

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 517 B

After

Width:  |  Height:  |  Size: 517 B

View File

Before

Width:  |  Height:  |  Size: 753 B

After

Width:  |  Height:  |  Size: 753 B

View File

Before

Width:  |  Height:  |  Size: 972 B

After

Width:  |  Height:  |  Size: 972 B

View File

@ -0,0 +1,41 @@
- [Ashley_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=885): CC BY-SA
- [BlueZ_Sam_II_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=143): CC BY-SA
- [CaligoPL_by_CaligoPL.png](http://minetest.fensta.bplaced.net/#id=99): CC BY-SA
- [Charizard_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=172): CC BY-NC-SA
- [Charlotte_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=852): CC BY-SA
- [Chloé_by_nelly.png](http://minetest.fensta.bplaced.net/#id=847): CC BY-SA
- [Chloé_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=851): CC BY-SA
- [Chop_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=164): CC BY-NC-SA
- [Coralie_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=894): CC BY-SA
- [Devil_by_viv100.png](http://minetest.fensta.bplaced.net/#id=93): CC BY-SA
- [Emma_by_Cidney7760.png](http://minetest.fensta.bplaced.net/#id=101): CC BY-SA
- [Female_angel_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=890): CC BY-SA
- [Finn_The_Adventured_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=175): CC BY-NC-SA
- [Fiona_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=860): CC BY-SA
- [Fire_Mario_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=198): CC BY-NC-SA
- [Grégoire_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=850): CC BY-SA
- [Hobo_by_Minetestian.png](http://minetest.fensta.bplaced.net/#id=112): CC BY-SA
- [Infantry_man_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=82): CC BY-SA
- [Iris_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=862): CC BY-SA
- [Iron_Man_MK._7_by_Jordach.png](http://minetest.fensta.bplaced.net/#id=6): CC BY-NC-SA
- [Jake_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=176): CC BY-NC-SA
- [Joker_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=178): CC BY-NC-SA
- [Julia_by_nelly.png](http://minetest.fensta.bplaced.net/#id=859): CC BY-SA
- [Ladyvioletkitty_by_lordphoenixmh.png](http://minetest.fensta.bplaced.net/#id=162): CC BY
- [Link_by_tux_peng.png](http://minetest.fensta.bplaced.net/#id=126): CC BY-NC-SA
- [lisa_by_hansuke123.png](http://minetest.fensta.bplaced.net/#id=88): CC BY-SA
- [Male_angel_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=895): CC BY-SA
- [Morgane_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=864): CC BY-SA
- [Naruto_by_LuxAtheris.png](http://minetest.fensta.bplaced.net/#id=136): CC BY-SA
- [NERD_by_DJOZZY.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA
- [Older_Man_Sam_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=21): CC BY-SA
- [philipbenr_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=54): CC BY-SA
- [skin_minecraft_repris_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=856): CC BY-SA
- [Space_Sam_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=37): CC BY-SA
- [Summer_by_lizzie.png](http://minetest.fensta.bplaced.net/#id=): CC BY-NC-SA
- [SuperSam_by_AMMOnym.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA
- [villiantest_III_by_marshrover.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA
- [War_Machine_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=169): CC BY-NC-SA
- [Witch_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=884): CC BY-SA
- [Zenohelds_by_sdzen.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 723 B

After

Width:  |  Height:  |  Size: 723 B

View File

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 453 B

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 737 B

After

Width:  |  Height:  |  Size: 737 B

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1006 B

View File

Before

Width:  |  Height:  |  Size: 909 B

After

Width:  |  Height:  |  Size: 909 B

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,24 @@
Original code by prestidigitator (WTFPL)
The MIT License (MIT)
Copyright © 2021 Jordan Irwin <antumdeluge@gmail.com>
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.

View File

@ -1,5 +1,7 @@
Wardrobe Minetest Mod
=====================
# Wardrobe Minetest Mod
Originally by [prestidigitator](https://forum.minetest.net/viewtopic.php?t=9680).
This mod provides a very simple way to change the skin on the default character
mesh. Unlike other skin-changing mods out there, it does not attempt to change
@ -31,8 +33,9 @@ higher resolution as long as they have an aspect ratio of 2:1. The author of
this mod created a very high resolution version of the default character and it
works well (but has not been included to simplify mod licensing).
Skins File Syntax
-----------------
---
## Skins File Syntax
A comment line starts with two dashes (like in Lua), but must be the only thing
on the line:
@ -67,12 +70,13 @@ particular world), prepend a minus sign (-) to the line. For example:
would remove the "skin_other_texture_file_name.png" skin no matter where it was
specified or what name it was given.
Mod Details
-----------
Required Minetest Version: >=0.4.9 (not tested in earlier versions)
---
### Mod Details
Dependencies: default, wool (both included in minetest_game)
Required Minetest Version: >=0.5.0
Dependencies: default, player_api, wool (included in minetest_game)
Recipies:
@ -80,24 +84,27 @@ Recipies:
* S - any stick
* L - any wool
```
wardrobe:
W S W
W L W
W L W
```
Git Repo: https://github.com/prestidigitator/minetest-mod-wardrobe
Git Repo: https://github.com/AntumMT/mod-wardrobe
Copyright and Licensing
-----------------------
---
## Copyright and Licensing
All contents, including source code, documentation, and images, are the
original creations of the mod author.
Author: prestidigitator (as registered on forum.minetest.net)
License: WTFPL (all content)
License: [MIT](LICENSE.txt)
Change History
--------------
---
## Change History
Version 1.0
@ -111,3 +118,12 @@ Version 1.1
* Auto-detection of player mesh name (thank you indriApollo).
* Removed warning caused by access of uninitialized global variale (even though
it was just a check for nil).
Version 1.2
* Released 2021-04-20
* License changed to MIT.
* Added player_api as dependency.
* External mods can register skins.
* Skins can be registered individually from within mod code.
* Number of displayed skins can be set in server configuration file.

View File

@ -1,2 +0,0 @@
default
wool

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,621 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64"
height="32"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="skinTemplate.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.203125"
inkscape:cx="32"
inkscape:cy="16"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="1918"
inkscape:window-y="-3"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid4860"
units="px"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1px"
spacingy="1px" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="template"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1020.3622)"
sodipodi:insensitive="true">
<flowRoot
xml:space="preserve"
id="flowRoot4001"
style="font-size:4px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
transform="translate(0,1020.3622)"><flowRegion
id="flowRegion4003"><rect
id="rect4005"
width="36.178391"
height="16.751614"
x="23.821686"
y="17.3503" /></flowRegion><flowPara
id="flowPara4007"></flowPara></flowRoot> <g
style="display:inline"
id="g4689"
transform="translate(-20,0)">
<path
style="fill:#ff00ff;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 20,1052.3622 16,0 0,-12 -4,0 0,-4 -8,0 0,4 -4,0 z"
id="path4691"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
id="path4693"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 0.25;stroke-dashoffset:0"
d="m 24,1040.3622 4,0 m 0,0 0,12 m 4,0 0,-12 m -8,0 0,12"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
<path
id="path4818-8"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 32,1040.3622 -4,0 m 0,-4 0,4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
id="g4695">
<text
sodipodi:linespacing="125%"
id="text4697"
y="1045.1437"
x="27.926758"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1"
y="1045.1437"
x="27.926758"
id="tspan4699"
sodipodi:role="line">Legs</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4701"
y="1039.4557"
x="26.000732"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
y="1039.4557"
x="26.000732"
id="tspan4703"
sodipodi:role="line">T</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4705"
y="1039.4557"
x="29.958252"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
y="1039.4557"
x="29.958252"
id="tspan4707"
sodipodi:role="line">B</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4709"
y="1049.4557"
x="25.941406"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
y="1049.4557"
x="25.941406"
id="tspan4711"
sodipodi:role="line">F</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4713"
y="1049.4557"
x="34"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
y="1049.4557"
x="34"
id="tspan4715"
sodipodi:role="line">H</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4717"
y="1049.4542"
x="22"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
y="1049.4542"
x="22"
id="tspan4719"
sodipodi:role="line">O</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4721"
y="1049.4557"
x="30"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
y="1049.4557"
x="30"
id="tspan4723"
sodipodi:role="line">I</tspan></text>
</g>
</g>
<g
style="display:inline"
id="g4128">
<path
sodipodi:nodetypes="ccccccccc"
inkscape:connector-curvature="0"
id="path3925"
d="m 64,1036.3622 0,-8 -8,0 0,-8 -16,0 0,8 -8,0 0,8 z"
style="fill:#8181ff;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
id="path3964"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.5, 0.5;stroke-dashoffset:0"
d="m 40,1028.3622 8,0 m 8,0 0,8 m -8,-8 0,8 m -8,-8 0,8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
<path
id="path4818-6"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 56,1028.3622 -8,0 m 0,-8 0,8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
id="g4180">
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
x="47.980957"
y="1029.4806"
id="text3973"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3975"
x="47.980957"
y="1029.4806"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">Helm</tspan></text>
<text
xml:space="preserve"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="44.000732"
y="1025.4557"
id="text3977"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3979"
x="44.000732"
y="1025.4557">T</tspan></text>
<text
xml:space="preserve"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="51.958252"
y="1025.4557"
id="text3981"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3983"
x="51.958252"
y="1025.4557">B</tspan></text>
<text
xml:space="preserve"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="35.896729"
y="1033.4557"
id="text3985"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3987"
x="35.896729"
y="1033.4557">R</tspan></text>
<text
xml:space="preserve"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="43.941406"
y="1033.4557"
id="text3989"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3991"
x="43.941406"
y="1033.4557">F</tspan></text>
<text
xml:space="preserve"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="51.860107"
y="1033.4557"
id="text3993"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3995"
x="51.860107"
y="1033.4557">L</tspan></text>
<text
xml:space="preserve"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="60"
y="1033.4557"
id="text3997"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3999"
x="60"
y="1033.4557">H</tspan></text>
</g>
</g>
<g
style="display:inline"
id="g4196"
transform="translate(-32,0)">
<path
style="fill:#90ff81;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 64,1036.3622 0,-8 -8,0 0,-8 -16,0 0,8 -8,0 0,8 z"
id="path4198"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
d="m 40,1028.3622 8,0 m 8,0 0,8 m -8,-8 0,8 m -8,-8 0,8"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.5, 0.5;stroke-dashoffset:0"
id="path4200"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
<path
id="path4818"
transform="translate(32,1020.3622)"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 24,8 -8,0 m 0,-8 0,8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
id="g4202">
<text
sodipodi:linespacing="125%"
id="text4204"
y="1029.4806"
x="47.989014"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:3px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1"
y="1029.4806"
x="47.989014"
id="tspan4206"
sodipodi:role="line">Head</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4208"
y="1025.4557"
x="44.000732"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="1025.4557"
x="44.000732"
id="tspan4210"
sodipodi:role="line">T</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4212"
y="1025.4557"
x="51.958252"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="1025.4557"
x="51.958252"
id="tspan4214"
sodipodi:role="line">B</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4216"
y="1033.4557"
x="35.896729"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="1033.4557"
x="35.896729"
id="tspan4218"
sodipodi:role="line">R</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4220"
y="1033.4557"
x="43.941406"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="1033.4557"
x="43.941406"
id="tspan4222"
sodipodi:role="line">F</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4224"
y="1033.4557"
x="51.860107"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="1033.4557"
x="51.860107"
id="tspan4226"
sodipodi:role="line">L</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4228"
y="1033.4557"
x="60"
style="font-size:3px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="1033.4557"
x="60"
id="tspan4230"
sodipodi:role="line">H</tspan></text>
</g>
</g>
<g
style="display:inline"
transform="translate(20,0)"
id="g4496">
<path
sodipodi:nodetypes="ccccccccc"
inkscape:connector-curvature="0"
id="path4232"
d="m 20,1052.3622 16,0 0,-12 -4,0 0,-4 -8,0 0,4 -4,0 z"
style="fill:#ff00ff;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0"
d="m 24,1040.3622 4,0 m 0,0 0,12 m 4,0 0,-12 m -8,0 0,12"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 0.25;stroke-dashoffset:0"
id="path4277" />
<path
id="path4818-1"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 32,1040.3622 -4,0 m 0,-4 0,4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
id="g4480">
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
x="28.062256"
y="1045.4344"
id="text4280"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282"
x="28.062256"
y="1045.4344"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">Arms</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="26.000732"
y="1039.4557"
id="text4280-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282-3"
x="26.000732"
y="1039.4557"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1">T</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="29.958252"
y="1039.4557"
id="text4280-6-3"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282-3-4"
x="29.958252"
y="1039.4557"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1">B</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="25.941406"
y="1049.4557"
id="text4280-6-3-8"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282-3-4-1"
x="25.941406"
y="1049.4557"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1">F</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="34"
y="1049.4557"
id="text4280-6-3-0"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282-3-4-2"
x="34"
y="1049.4557"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1">H</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="22"
y="1049.4542"
id="text4280-6-3-88"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282-3-4-23"
x="22"
y="1049.4542"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1">O</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="30"
y="1049.4557"
id="text4280-6-3-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4282-3-4-16"
x="30"
y="1049.4557"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1">I</tspan></text>
</g>
</g>
<g
style="display:inline"
id="g4670"
transform="translate(0,1000.3622)">
<path
sodipodi:nodetypes="ccccccccc"
inkscape:connector-curvature="0"
id="path4533"
d="m 16,52 24,0 0,-12 -4,0 0,-4 -16,0 0,4 -4,0 z"
style="fill:#00bdc0;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0"
d="m 32,40 0,12 m -4,-12 0,12 m -8,-12 8,0 m -8,0 0,12"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 0.5;stroke-dashoffset:0"
id="path4541" />
<path
id="path4818-2"
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 36,40 -8,0 m 0,-4 0,4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
id="g4654">
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
x="27.897461"
y="44.827637"
id="text4544"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546"
x="27.897461"
y="44.827637"
style="font-size:3px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">Body</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="24.000732"
y="39.093506"
id="text4544-0"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546-8"
x="24.000732"
y="39.093506"
style="font-size:3px;text-align:center;text-anchor:middle">T</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="31.958252"
y="39.093506"
id="text4544-0-7"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546-8-7"
x="31.958252"
y="39.093506"
style="font-size:3px;text-align:center;text-anchor:middle">B</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="17.896729"
y="49.093506"
id="text4544-0-1"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546-8-3"
x="17.896729"
y="49.093506"
style="font-size:3px;text-align:center;text-anchor:middle">R</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="23.941406"
y="49.093506"
id="text4544-0-16"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546-8-1"
x="23.941406"
y="49.093506"
style="font-size:3px;text-align:center;text-anchor:middle">F</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="29.860107"
y="49.093506"
id="text4544-0-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546-8-9"
x="29.860107"
y="49.093506"
style="font-size:3px;text-align:center;text-anchor:middle">L</tspan></text>
<text
xml:space="preserve"
style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="36"
y="49.093506"
id="text4544-0-60"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4546-8-19"
x="36"
y="49.093506"
style="font-size:3px;text-align:center;text-anchor:middle">H</tspan></text>
</g>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="drawing" />
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,343 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="New document 1">
<defs
id="defs4">
<linearGradient
id="linearGradient5302"
osb:paint="solid">
<stop
style="stop-color:#46341e;stop-opacity:1;"
offset="0"
id="stop5304" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.75"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<g
id="g5525-0"
transform="translate(6,0)" />
<g
id="g5783">
<g
id="g5762">
<rect
style="fill:#b48b5b;fill-opacity:1;stroke:none"
id="rect3753"
width="16"
height="16"
x="0"
y="1036.3622" />
<rect
style="fill:#46341e;fill-opacity:1;stroke:none"
id="rect3753-0"
width="14"
height="14"
x="1"
y="1037.3622" />
<rect
style="fill:#d7d7d7;fill-opacity:1;stroke:none"
id="rect3753-0-9"
width="14"
height="1"
x="1"
y="1039.3622" />
</g>
<g
id="g5775">
<rect
style="fill:#cdc0b2;fill-opacity:1;stroke:none"
id="rect3753-0-9-0"
width="1"
height="3"
x="2"
y="1038.3622" />
<rect
style="fill:#cdc0b2;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-4"
width="1"
height="3"
x="4"
y="1038.3622" />
<rect
y="1038.3622"
x="6"
height="3"
width="1"
id="rect5362"
style="fill:#cdc0b2;fill-opacity:1;stroke:none" />
<rect
style="fill:#cdc0b2;fill-opacity:1;stroke:none"
id="rect5364"
width="1"
height="3"
x="8"
y="1038.3622" />
<rect
y="1038.3622"
x="10"
height="3"
width="1"
id="rect5366"
style="fill:#cdc0b2;fill-opacity:1;stroke:none" />
<rect
style="fill:#cdc0b2;fill-opacity:1;stroke:none"
id="rect5368"
width="1"
height="3"
x="13"
y="1038.3622" />
</g>
<g
id="g5767">
<g
id="g5432">
<path
style="fill:#3c58c8;fill-opacity:1;stroke:none"
d="m 14,15 0,-3 -1,0 0,2 -1,0 0,1 z"
id="path5434"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
transform="translate(0,1036.3622)" />
<rect
style="fill:#c8c8c8;fill-opacity:1;stroke:none"
id="rect5436"
width="1"
height="1"
x="13"
y="1048.3622" />
</g>
<g
id="g5428"
transform="translate(1,0)">
<path
sodipodi:nodetypes="ccccccc"
transform="translate(0,1036.3622)"
inkscape:connector-curvature="0"
id="path5424"
d="m 14,15 0,-3 -1,0 0,2 -1,0 0,1 z"
style="fill:#5577ff;fill-opacity:1;stroke:none" />
<rect
y="1048.3622"
x="13"
height="1"
width="1"
id="rect5426"
style="fill:#e6e6e6;fill-opacity:1;stroke:none" />
</g>
</g>
<g
id="g5499">
<rect
style="fill:#ff0000;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47"
width="1"
height="5"
x="2"
y="1040.3622" />
<rect
style="fill:#ffff00;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-8"
width="1"
height="1"
x="2"
y="1043.3622" />
<rect
style="fill:#c80000;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-0-9"
width="1"
height="3"
x="2"
y="1045.3622" />
</g>
<g
transform="translate(2,0)"
id="g5525">
<rect
style="fill:#213c94;fill-opacity:1;stroke:none"
id="rect5505"
width="1"
height="8"
x="4"
y="1041.3622" />
<rect
style="fill:#293765;fill-opacity:1;stroke:none"
id="rect5505-9"
width="1"
height="8"
x="3"
y="1041.3622" />
</g>
<g
id="g5499-8"
transform="translate(2,0)">
<rect
style="fill:#5aff00;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-1"
width="1"
height="5"
x="2"
y="1040.3622" />
<rect
style="fill:#47c800;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-0-9-2"
width="1"
height="3"
x="2"
y="1045.3622" />
</g>
<g
id="g5499-85"
transform="translate(6,0)">
<rect
style="fill:#ff0000;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-3"
width="1"
height="5"
x="2"
y="1040.3622" />
<rect
style="fill:#3141d3;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-8-5"
width="1"
height="1"
x="2"
y="1043.3622" />
<rect
style="fill:#394184;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-0-9-8"
width="1"
height="3"
x="2"
y="1045.3622" />
<rect
style="fill:#3141d3;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-8-5-0"
width="1"
height="1"
x="2"
y="1041.3622" />
</g>
<g
transform="matrix(-1,0,0,1,15,-4)"
id="g5525-8">
<rect
style="fill:#213c94;fill-opacity:1;stroke:none"
id="rect5505-1"
width="1"
height="4"
x="4"
y="1045.3622" />
<rect
style="fill:#293765;fill-opacity:1;stroke:none"
id="rect5505-9-1"
width="1"
height="4"
x="3"
y="1045.3622" />
</g>
<g
id="g5499-8-1"
transform="translate(11,0)">
<rect
style="fill:#f000ff;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-1-0"
width="1"
height="5"
x="2"
y="1040.3622" />
<rect
style="fill:#bc00c8;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-0-9-2-3"
width="1"
height="3"
x="2"
y="1045.3622" />
</g>
<g
transform="translate(0.13374519,0.09950469)"
id="g5734">
<rect
style="fill:#bc00c8;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-0-9-2-3-4"
width="1"
height="1"
x="9.8662548"
y="1050.2627" />
<rect
y="1049.2627"
x="9.8662548"
height="1"
width="1"
id="rect5426-7"
style="fill:#b1b1b1;fill-opacity:1;stroke:none" />
</g>
<g
transform="translate(-1.8662548,0.09950469)"
id="g5734-5">
<rect
style="fill:#bc00c8;fill-opacity:1;stroke:none"
id="rect3753-0-9-0-47-0-9-2-3-4-1"
width="1"
height="1"
x="9.8662548"
y="1050.2627" />
<rect
y="1050.2627"
x="8.8662548"
height="1"
width="1"
id="rect5426-7-9"
style="fill:#979797;fill-opacity:1;stroke:none" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -1,236 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="wardrobe_wardrobeFront.svg"
inkscape:export-filename="/home/merlin/dev/mt/wardrobe/wardrobe_wardrobeFront.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<linearGradient
id="linearGradient5302"
osb:paint="solid">
<stop
style="stop-color:#46341e;stop-opacity:1;"
offset="0"
id="stop5304" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="35.885669"
inkscape:cx="7.7796302"
inkscape:cy="7.6898499"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<g
id="g5525-0"
transform="translate(6,0)" />
<g
id="g6128">
<rect
y="1036.3622"
x="0"
height="16"
width="16"
id="rect3753"
style="fill:#b48b5b;fill-opacity:1;stroke:none" />
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5926"
width="1"
height="16"
x="3"
y="1036.3622" />
<rect
y="1036.3622"
x="5"
height="16"
width="1"
id="rect5928"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5930"
width="1"
height="16"
x="7"
y="1036.3622" />
<rect
y="1036.3622"
x="10"
height="16"
width="1"
id="rect5932"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
<rect
y="1036.3622"
x="14"
height="16"
width="1"
id="rect5936"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
<g
id="g5975">
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5951"
width="1"
height="3"
x="8"
y="1047.3622" />
<rect
y="1043.3622"
x="8"
height="2"
width="1"
id="rect5971"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5973"
width="1"
height="3"
x="8"
y="1037.3622" />
</g>
<g
transform="matrix(1,0,0,-1,-5.9901478,2088.7244)"
id="g5980">
<rect
y="1047.3622"
x="8"
height="3"
width="1"
id="rect5982"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5984"
width="1"
height="2"
x="8"
y="1043.3622" />
<rect
y="1037.3622"
x="8"
height="3"
width="1"
id="rect5986"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
</g>
<g
id="g5975-9"
transform="translate(4,1.0000174)">
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5951-3"
width="1"
height="3"
x="8"
y="1047.3622" />
<rect
y="1041.3622"
x="8"
height="3"
width="1"
id="rect5971-2"
style="fill:#9a764c;fill-opacity:1;stroke:none" />
<rect
style="fill:#9a764c;fill-opacity:1;stroke:none"
id="rect5973-2"
width="1"
height="2"
x="8"
y="1037.3622" />
</g>
<rect
y="1042.3622"
x="5"
height="4"
width="1"
id="rect5928-7"
style="fill:#aa7b45;fill-opacity:1;stroke:none" />
<g
id="g6087">
<rect
style="fill:#aa7b45;fill-opacity:1;stroke:none"
id="rect5928-7-4"
width="1"
height="3"
x="10"
y="1047.3622" />
<rect
style="fill:#aa7b45;fill-opacity:1;stroke:none"
id="rect5928-7-4-0"
width="1"
height="3"
x="10"
y="1041.3622" />
<rect
style="fill:#aa7b45;fill-opacity:1;stroke:none"
id="rect5928-7-4-0-3"
width="1"
height="1"
x="10"
y="1037.3622" />
</g>
<rect
y="1036.3622"
x="1"
height="16"
width="1"
id="rect5936-9"
style="fill:#ba9973;fill-opacity:1;stroke:none" />
<rect
y="1036.3622"
x="13"
height="16"
width="1"
id="rect5936-9-3"
style="fill:#ba9973;fill-opacity:1;stroke:none" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="wardrobe_wardrobe_sides.svg"
inkscape:export-filename="/home/merlin/dev/mt/wardrobe/wardrobe_wardrobeFront.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<linearGradient
id="linearGradient5302"
osb:paint="solid">
<stop
style="stop-color:#46341e;stop-opacity:1;"
offset="0"
id="stop5304" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="35.885669"
inkscape:cx="7.7796302"
inkscape:cy="7.6898499"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<g
id="g5525-0"
transform="translate(6,0)" />
<rect
style="fill:#b48b5b;fill-opacity:1;stroke:none"
id="rect3753"
width="16"
height="16"
x="0"
y="1036.3622" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,15 +1,17 @@
local MOD_NAME = minetest.get_current_modname();
local MOD_PATH = minetest.get_modpath(MOD_NAME);
local WORLD_PATH = minetest.get_worldpath();
if MOD_NAME ~= "wardrobe" then
error("mod directory must be named 'wardrobe'");
end
local world_path = core.get_worldpath();
wardrobe = {};
wardrobe.name = core.get_current_modname();
wardrobe.path = core.get_modpath(wardrobe.name)
wardrobe.player_skin_db = world_path.."/playerSkins.txt"
wardrobe.skin_files = {wardrobe.path.."/skins.txt", world_path.."/skins.txt"};
wardrobe.playerSkins = {}
local initSkin, changeSkin, updateSkin = dofile(MOD_PATH.."/skinMethods.lua");
dofile(MOD_PATH.."/storage.lua");
dofile(MOD_PATH.."/wardrobe.lua");
dofile(wardrobe.path.."/settings.lua")
local initSkin, changeSkin, updateSkin = dofile(wardrobe.path.."/skinMethods.lua");
dofile(wardrobe.path.."/storage.lua");
dofile(wardrobe.path.."/wardrobe.lua");
-- API
@ -39,27 +41,27 @@ wardrobe.setPlayerSkin = updateSkin;
-- Name of the skin.
--
function wardrobe.changePlayerSkin(playerName, skin)
changeSkin(playerName, skin);
changeSkin(playerName, skin);
local player = minetest.get_player_by_name(playerName);
if player then updateSkin(player); end;
local player = core.get_player_by_name(playerName);
if player then updateSkin(player); end;
end
wardrobe.storage.loadSkins();
wardrobe.storage.loadPlayerSkins();
wardrobe.loadSkins();
wardrobe.loadPlayerSkins();
if initSkin then
minetest.register_on_joinplayer(
function(player)
minetest.after(1, initSkin, player)
end);
core.register_on_joinplayer(
function(player)
core.after(1, initSkin, player)
end);
end;
if not changeSkin then
error("No wardrobe skin change method registered. Check skinMethods.lua.");
error("No wardrobe skin change method registered. Check skinMethods.lua.");
end;
if not updateSkin then
error("No wardrobe skin update method registered. Check skinMethods.lua.");
error("No wardrobe skin update method registered. Check skinMethods.lua.");
end;

View File

@ -0,0 +1,4 @@
name = wardrobe
description = A wardrobe that can be used to register & set new skins for players.
version = 1.2
depends = default, player_api, wool

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

View File

@ -0,0 +1,5 @@
--- Number of skins shown per page.
--
-- default: 8
wardrobe.skins_per_page = tonumber(core.settings:get("wardrobe.skins_per_page")) or 8

View File

@ -0,0 +1,5 @@
## Number of skins shown per page.
#
# default: 8
wardrobe.skins_per_page (Skins per page) int 8

View File

@ -12,92 +12,92 @@ local SKIN_CHANGE_METHOD = '3d_armor';
local playerMesh = "character.b3d";
do -- autodetect version of player mesh used by default
if default and default.registered_player_models then
local haveCharName = false; -- 'character.*' has priority
local name = nil;
local nNames = 0;
if default and default.registered_player_models then
local haveCharName = false; -- 'character.*' has priority
local name = nil;
local nNames = 0;
for k in pairs(default.registered_player_models) do
if string.find(k, "^character\\.[^\\.]+$") then
if haveCharName then nNames = 2; break; end;
name = k;
nNames = 1;
haveCharName = true;
elseif not haveCharName then
name = k;
nNames = nNames + 1;
end;
end;
for k in pairs(default.registered_player_models) do
if string.find(k, "^character\\.[^\\.]+$") then
if haveCharName then nNames = 2; break; end;
name = k;
nNames = 1;
haveCharName = true;
elseif not haveCharName then
name = k;
nNames = nNames + 1;
end;
end;
if nNames == 1 then playerMesh = name; end;
end;
if nNames == 1 then playerMesh = name; end;
end;
end;
local function changeWardrobeSkin(playerName, skin)
local player = minetest.get_player_by_name(playerName);
if not player then
error("unknown player '"..playerName.."'");
end;
if skin and not wardrobe.skinNames[skin] then
error("unknown skin '"..skin.."'");
end;
local player = core.get_player_by_name(playerName);
if not player then
error("unknown player '"..playerName.."'");
end;
if skin and not wardrobe.skinNames[skin] then
error("unknown skin '"..skin.."'");
end;
wardrobe.playerSkins[playerName] = skin;
wardrobe.storage.savePlayerSkins();
wardrobe.playerSkins[playerName] = skin;
wardrobe.savePlayerSkins();
end;
local function defaultUpdateSkin(player)
local playerName = player:get_player_name();
if not playerName or playerName == "" then return; end;
local playerName = player:get_player_name();
if not playerName or playerName == "" then return; end;
local skin = wardrobe.playerSkins[playerName];
if not skin or not wardrobe.skinNames[skin] then return; end;
local skin = wardrobe.playerSkins[playerName];
if not skin or not wardrobe.skinNames[skin] then return; end;
player:set_properties(
{
visual = "mesh",
visual_size = { x = 1, y = 1 },
mesh = playerMesh,
textures = { skin }
});
player:set_properties(
{
visual = "mesh",
visual_size = { x = 1, y = 1 },
mesh = playerMesh,
textures = { skin }
});
end;
--- Method for updating the player skin, IF the dependent mod is enabled.
local SKIN_CHANGE_METHODS =
{
default =
{
required_mods = {},
{
default =
{
required_mods = {},
initSkin = defaultUpdateSkin,
initSkin = defaultUpdateSkin,
changeSkin = changeWardrobeSkin,
changeSkin = changeWardrobeSkin,
updateSkin = defaultUpdateSkin
},
updateSkin = defaultUpdateSkin
},
["3d_armor"] =
{
required_mods = { '3d_armor' },
["3d_armor"] =
{
required_mods = { '3d_armor' },
initSkin = nil,
initSkin = nil,
changeSkin = function(playerName, skin)
changeWardrobeSkin(playerName, skin);
armor.textures[playerName].skin = skin;
end,
changeSkin = function(playerName, skin)
changeWardrobeSkin(playerName, skin);
armor.textures[playerName].skin = skin;
end,
updateSkin = function(player)
armor:update_player_visuals(player);
end,
},
};
updateSkin = function(player)
armor:update_player_visuals(player);
end,
},
};
local methods = SKIN_CHANGE_METHODS[SKIN_CHANGE_METHOD];
if methods then
for _, mod in ipairs(methods.required_mods) do
if not minetest.get_modpath(mod) then methods = nil; break; end;
end;
for _, mod in ipairs(methods.required_mods) do
if not core.get_modpath(mod) then methods = nil; break; end;
end;
end;
if not methods then methods = SKIN_CHANGE_METHODS.default; end;

View File

@ -1,43 +1 @@
skin_character.png: Default Skin
Ashley_by_loupicate.png: Ashley
BlueZ_Sam_II_by_philipbenr.png: BlueZ Sam II
CaligoPL_by_CaligoPL.png: CaligoPL
Charizard_by_Ferdi_Napoli.png: Charizard
Charlotte_by_Sporax.png: Charlotte
Chloé_by_nelly.png: Chloé (by nelly)
Chloé_by_Sporax.png: Chloé (by Sporax)
Chop_by_Ferdi_Napoli.png: Chop
Coralie_by_loupicate.png: Coralie
Devil_by_viv100.png: Devil
Emma_by_Cidney7760.png: Emma
Female_angel_by_loupicate.png: Angel (female)
Finn_The_Adventured_by_Ferdi_Napoli.png: Finn
Fiona_by_loupicate.png: Fiona
Fire_Mario_by_Ferdi_Napoli.png: Fire Mario
Grégoire_by_Sporax.png: Grégoire
Hobo_by_Minetestian.png: Hobo
Infantry_man_by_philipbenr.png: Infantry Man
Iris_by_loupicate.png: Iris
Iron_Man_MK._7_by_Jordach.png: Iron Man
Jake_by_Ferdi_Napoli.png: Jake
Joker_by_Ferdi_Napoli.png: Joker
Julia_by_nelly.png: Julia
Ladyvioletkitty_by_lordphoenixmh.png: LadyVioletKitty
Link_by_tux_peng.png: Link
lisa_by_hansuke123.png: Lisa
Male_angel_by_loupicate.png: Angel (male)
Morgane_by_loupicate.png: Morgane
Naruto_by_LuxAtheris.png: Naruto
NERD_by_DJOZZY.png: NERD
Older_Man_Sam_by_philipbenr.png: Sam (older man)
philipbenr_by_philipbenr.png: PhilipBenR
skin_minecraft_repris_by_Sporax.png: Minecraft Repris
Space_Sam_by_philipbenr.png: Sam (space)
Summer_by_lizzie.png: Summer
SuperSam_by_AMMOnym.png: Sam (super)
villiantest_III_by_marshrover.png: VillianTest
War_Machine_by_Ferdi_Napoli.png: War Machine
Witch_by_loupicate.png: Witch
Zenohelds_by_sdzen.png: Zenohelds
tessas_skin.png: Tessa
character.png: Default Skin

View File

@ -1,74 +1,67 @@
wardrobe = wardrobe or {};
wardrobe.storage = wardrobe.storage or {};
local MOD_NAME = minetest.get_current_modname();
local MOD_PATH = minetest.get_modpath(MOD_NAME);
local WORLD_PATH = minetest.get_worldpath();
local SKIN_FILES = { MOD_PATH.."/skins.txt", WORLD_PATH.."/skins.txt" };
local PLAYER_SKIN_DB = WORLD_PATH.."/playerSkins.txt";
wardrobe.skins = {}
wardrobe.skinNames = {}
local function removePrefix(str, prefix)
local n = #prefix;
if #str >= n and string.sub(str, 1, n) == prefix then
return string.sub(str, n+1);
else
return str;
end
local n = #prefix;
if #str >= n and string.sub(str, 1, n) == prefix then
return string.sub(str, n+1);
else
return str;
end
end
local function removeSuffix(str, suffix)
local n = #suffix;
if #str >= n and string.sub(str, -n, -1) == suffix then
return string.sub(str, 1, -(n+1));
else
return str;
end
local n = #suffix;
if #str >= n and string.sub(str, -n, -1) == suffix then
return string.sub(str, 1, -(n+1));
else
return str;
end
end
local function trimTail(str)
local e = string.find(str, "%s+$");
return (e and string.sub(str, e-1)) or str;
local e = string.find(str, "%s+$");
return (e and string.sub(str, e-1)) or str;
end
local function parsePlayerSkinLine(line)
local k, v;
local p = string.find(line, "%S");
if p and not string.find(line, "^%-%-", p) then
local ss, se = string.find(line, "%s*:%s*", p);
if ss then
k = string.sub(line, p, ss-1);
v = trimTail(string.sub(line, se+1));
if k == "" then k = nil; end
if v == "" then v = nil; end
end
end
return k, v;
local k, v;
local p = string.find(line, "%S");
if p and not string.find(line, "^%-%-", p) then
local ss, se = string.find(line, "%s*:%s*", p);
if ss then
k = string.sub(line, p, ss-1);
v = trimTail(string.sub(line, se+1));
if k == "" then k = nil; end
if v == "" then v = nil; end
end
end
return k, v;
end
local function parseSkinLine(line)
local k, v, n, e;
local k, v, n, e;
local p = string.find(line, "%S");
if p then
n, e = string.find(line, "^%-%-?", p);
if not n or n == e then
if n then p = n+1; end
local ss, se = string.find(line, "%s*:%s*", p);
if ss then
k = string.sub(line, p, ss-1);
v = trimTail(string.sub(line, se+1));
if v == "" then v = nil; end
else
k = trimTail(string.sub(line, p));
end
if k == "" then k = nil; end
end
end
local p = string.find(line, "%S");
if p then
n, e = string.find(line, "^%-%-?", p);
if not n or n == e then
if n then p = n+1; end
local ss, se = string.find(line, "%s*:%s*", p);
if ss then
k = string.sub(line, p, ss-1);
v = trimTail(string.sub(line, se+1));
if v == "" then v = nil; end
else
k = trimTail(string.sub(line, p));
end
if k == "" then k = nil; end
end
end
return k, v, n;
return k, v, n;
end
--- Parses the files with the given paths for key/value pairs. Once a key is
@ -81,104 +74,175 @@ end
-- values.
--
local function loadSkinsFromFiles(filePaths)
local normKeys, negKeys, values = {}, {}, {}
local normKeys, values, negKeys = {}, {}, {}
for _, filePath in ipairs(filePaths) do
local file = io.open(filePath, "r");
if file then
for line in file:lines() do
local k, v, n = parseSkinLine(line)
if k then
if n then
normKeys[k] = nil;
values[k] = nil;
negKeys[k] = k;
elseif not negKeys[k] then
normKeys[k] = k;
if v then
values[k] = v;
end
end
end
end
file:close()
end
end
for _, filePath in ipairs(filePaths) do
local file = io.open(filePath, "r");
if file then
for line in file:lines() do
local k, v, n = parseSkinLine(line)
local keyList = {};
for k in pairs(normKeys) do
table.insert(keyList, k);
end
if k then
if n then
normKeys[k] = nil;
values[k] = nil;
negKeys[k] = k;
elseif not negKeys[k] then
normKeys[k] = k;
if v then
values[k] = v;
end
end
end
end
file:close()
end
end
return keyList, values;
local keyList = {};
for k in pairs(normKeys) do
table.insert(keyList, k);
end
return keyList, values;
end
--- Organizes outfit names alphabetically.
--
-- @function wardrobe.sortNames
function wardrobe.sortNames()
table.sort(wardrobe.skins, function(sL, sR)
return wardrobe.skinNames[sL] < wardrobe.skinNames[sR];
end);
end
--- Registers a single skin.
--
-- Does not sort automatically.
--
-- @function wardrobe.registerSkin
-- @param k Texture file name
-- @param v Name to display in wardrobe
function wardrobe.registerSkin(k, v)
table.insert(wardrobe.skins, k)
wardrobe.skinNames[k] = v
end
--- Loads skin names from skin files, storing the result in wardrobe.skins and
-- wardrobe.skinNames.
--
function wardrobe.storage.loadSkins()
local skins, skinNames = loadSkinsFromFiles(SKIN_FILES);
-- Overwrites any previously registered skins.
function wardrobe.loadSkins(skin_files)
skin_files = skin_files or wardrobe.skin_files
for i, skin in ipairs(skins) do
local name = skinNames[skin];
local skins, skinNames = loadSkinsFromFiles(skin_files);
if not name then
local s, e;
for i, skin in ipairs(skins) do
local name = skinNames[skin];
name = removeSuffix(
removePrefix(
removePrefix(skin, MOD_NAME.."_"),
"skin_"),
".png");
if not name then
local s, e;
if name == "" then
name = skin;
else
name = string.gsub(name, "_", " ");
end
end
name = removeSuffix(
removePrefix(
removePrefix(skin, wardrobe.name.."_"),
"skin_"),
".png");
skinNames[skin] = name;
end
if name == "" then
name = skin;
else
name = string.gsub(name, "_", " ");
end
end
table.sort(skins,
function(sL, sR)
return skinNames[sL] < skinNames[sR];
end);
skinNames[skin] = name;
end
wardrobe.skins = skins;
wardrobe.skinNames = skinNames;
-- overwrite registered skins
wardrobe.skins = skins;
wardrobe.skinNames = skinNames;
wardrobe.sortNames()
end
--- Loads additional skins from a file.
--
-- @function wardrobe.registerSkinFiles
-- @param skin_files
function wardrobe.registerSkinFiles(skin_files)
if type(skin_files) == "string" then
skin_files = {skin_files,}
end
local skins, skinNames = loadSkinsFromFiles(skin_files);
for i, skin in ipairs(skins) do
local name = skinNames[skin];
if not name then
local s, e;
name = removeSuffix(
removePrefix(
removePrefix(skin, wardrobe.name.."_"),
"skin_"),
".png");
if name == "" then
name = skin;
else
name = string.gsub(name, "_", " ");
end
end
skinNames[skin] = name;
end
-- add to registered skins
for _, sk in ipairs(skins) do
--[[
table.insert(wardrobe.skins, sk)
wardrobe.skinNames[sk] = skinNames[sk]
]]
wardrobe.registerSkin(sk, skinNames[sk])
end
wardrobe.sortNames()
end
--- Parses the player skins database file and stores the result in
-- wardrobe.playerSkins.
--
function wardrobe.storage.loadPlayerSkins()
local playerSkins = {};
function wardrobe.loadPlayerSkins(player_skin_db)
player_skin_db = player_skin_db or wardrobe.player_skin_db
local playerSkins = {};
local file = io.open(PLAYER_SKIN_DB, "r");
if file then
for line in file:lines() do
local name, skin = parsePlayerSkinLine(line);
if name then
playerSkins[name] = skin;
end
end
file:close();
end
local file = io.open(player_skin_db, "r");
if file then
for line in file:lines() do
local name, skin = parsePlayerSkinLine(line);
if name then
playerSkins[name] = skin;
end
end
file:close();
end
wardrobe.playerSkins = playerSkins;
wardrobe.playerSkins = playerSkins;
end
--- Writes wardrobe.playerSkins to the player skins database file.
--
function wardrobe.storage.savePlayerSkins()
local file = io.open(PLAYER_SKIN_DB, "w");
if not file then error("Couldn't write file '"..filePath.."'"); end
function wardrobe.savePlayerSkins(player_skin_db)
player_skin_db = player_skin_db or wardrobe.player_skin_db
for name, skin in pairs(wardrobe.playerSkins) do
file:write(name, ":", skin, "\n");
end
local file = io.open(player_skin_db, "w");
if not file then error("Couldn't write file '"..filePath.."'"); end
file:close();
for name, skin in pairs(wardrobe.playerSkins) do
file:write(name, ":", skin, "\n");
end
file:close();
end

View File

@ -1,40 +0,0 @@
[Ashley_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=885): CC BY-SA
[BlueZ_Sam_II_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=143): CC BY-SA
[CaligoPL_by_CaligoPL.png](http://minetest.fensta.bplaced.net/#id=99): CC BY-SA
[Charizard_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=172): CC BY-NC-SA
[Charlotte_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=852): CC BY-SA
[Chloé_by_nelly.png](http://minetest.fensta.bplaced.net/#id=847): CC BY-SA
[Chloé_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=851): CC BY-SA
[Chop_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=164): CC BY-NC-SA
[Coralie_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=894): CC BY-SA
[Devil_by_viv100.png](http://minetest.fensta.bplaced.net/#id=93): CC BY-SA
[Emma_by_Cidney7760.png](http://minetest.fensta.bplaced.net/#id=101): CC BY-SA
[Female_angel_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=890): CC BY-SA
[Finn_The_Adventured_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=175): CC BY-NC-SA
[Fiona_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=860): CC BY-SA
[Fire_Mario_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=198): CC BY-NC-SA
[Grégoire_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=850): CC BY-SA
[Hobo_by_Minetestian.png](http://minetest.fensta.bplaced.net/#id=112): CC BY-SA
[Infantry_man_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=82): CC BY-SA
[Iris_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=862): CC BY-SA
[Iron_Man_MK._7_by_Jordach.png](http://minetest.fensta.bplaced.net/#id=6): CC BY-NC-SA
[Jake_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=176): CC BY-NC-SA
[Joker_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=178): CC BY-NC-SA
[Julia_by_nelly.png](http://minetest.fensta.bplaced.net/#id=859): CC BY-SA
[Ladyvioletkitty_by_lordphoenixmh.png](http://minetest.fensta.bplaced.net/#id=162): CC BY
[Link_by_tux_peng.png](http://minetest.fensta.bplaced.net/#id=126): CC BY-NC-SA
[lisa_by_hansuke123.png](http://minetest.fensta.bplaced.net/#id=88): CC BY-SA
[Male_angel_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=895): CC BY-SA
[Morgane_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=864): CC BY-SA
[Naruto_by_LuxAtheris.png](http://minetest.fensta.bplaced.net/#id=136): CC BY-SA
[NERD_by_DJOZZY.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA
[Older_Man_Sam_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=21): CC BY-SA
[philipbenr_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=54): CC BY-SA
[skin_minecraft_repris_by_Sporax.png](http://minetest.fensta.bplaced.net/#id=856): CC BY-SA
[Space_Sam_by_philipbenr.png](http://minetest.fensta.bplaced.net/#id=37): CC BY-SA
[Summer_by_lizzie.png](http://minetest.fensta.bplaced.net/#id=): CC BY-NC-SA
[SuperSam_by_AMMOnym.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA
[villiantest_III_by_marshrover.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA
[War_Machine_by_Ferdi_Napoli.png](http://minetest.fensta.bplaced.net/#id=169): CC BY-NC-SA
[Witch_by_loupicate.png](http://minetest.fensta.bplaced.net/#id=884): CC BY-SA
[Zenohelds_by_sdzen.png](http://minetest.fensta.bplaced.net/#id=): CC BY-SA

View File

@ -1,88 +1,87 @@
local FORM_NAME = "wardrobe_wardrobeSkinForm";
local SKINS_PER_PAGE = 8;
local function showForm(player, page)
local playerName = player:get_player_name();
if not playerName or playerName == "" then return; end
local playerName = player:get_player_name();
if not playerName or playerName == "" then return; end
local n = #wardrobe.skins;
if n <= 0 then return; end
local nPages = math.ceil(n/SKINS_PER_PAGE);
local n = #wardrobe.skins;
if n <= 0 then return; end
local nPages = math.ceil(n/wardrobe.skins_per_page);
if not page or page > nPages then page = 1; end
local s = 1 + SKINS_PER_PAGE*(page-1);
local e = math.min(s+SKINS_PER_PAGE-1, n);
if not page or page > nPages then page = 1; end
local s = 1 + wardrobe.skins_per_page*(page-1);
local e = math.min(s+wardrobe.skins_per_page-1, n);
local fs = "size[5,10]";
fs = fs.."label[0,0;Change Into:]";
for i = s, e do
local slot = i-s+1;
local skin = wardrobe.skins[i];
local skinName = minetest.formspec_escape(wardrobe.skinNames[skin]);
fs = fs.."button_exit[0,"..slot..";5,1;s:"..skin..";"..skinName.."]";
end
fs = fs.."label[2,9;Page "..page.."/"..nPages.."]";
if page > 1 then
fs = fs.."button_exit[0,9;1,1;n:p"..(page-1)..";prev]";
end
if page < nPages then
fs = fs.."button_exit[4,9;1,1;n:p"..(page+1)..";next]";
end
local fs = "size[5,10]";
fs = fs.."label[0,0;Change Into:]";
for i = s, e do
local slot = i-s+1;
local skin = wardrobe.skins[i];
local skinName = core.formspec_escape(wardrobe.skinNames[skin]);
fs = fs.."button_exit[0,"..slot..";5,1;s:"..skin..";"..skinName.."]";
end
fs = fs.."label[2,9;Page "..page.."/"..nPages.."]";
if page > 1 then
fs = fs.."button_exit[0,9;1,1;n:p"..(page-1)..";prev]";
end
if page < nPages then
fs = fs.."button_exit[4,9;1,1;n:p"..(page+1)..";next]";
end
minetest.show_formspec(playerName, FORM_NAME, fs);
core.show_formspec(playerName, FORM_NAME, fs);
end
minetest.register_on_player_receive_fields(
function(player, formName, fields)
if formName ~= FORM_NAME then return; end
core.register_on_player_receive_fields(
function(player, formName, fields)
if formName ~= FORM_NAME then return; end
local playerName = player:get_player_name();
if not playerName or playerName == "" then return; end
local playerName = player:get_player_name();
if not playerName or playerName == "" then return; end
for fieldName in pairs(fields) do
if #fieldName > 2 then
local action = string.sub(fieldName, 1, 1);
local value = string.sub(fieldName, 3);
for fieldName in pairs(fields) do
if #fieldName > 2 then
local action = string.sub(fieldName, 1, 1);
local value = string.sub(fieldName, 3);
if action == "n" then
showForm(player, tonumber(string.sub(value, 2)));
return;
elseif action == "s" then
wardrobe.changePlayerSkin(playerName, value);
return;
end
end
end
end);
if action == "n" then
showForm(player, tonumber(string.sub(value, 2)));
return;
elseif action == "s" then
wardrobe.changePlayerSkin(playerName, value);
return;
end
end
end
end);
minetest.register_node(
"wardrobe:wardrobe",
{
description = "Wardrobe",
paramtype2 = "facedir",
tiles = {
"wardrobe_wardrobe_topbottom.png",
"wardrobe_wardrobe_topbottom.png",
"wardrobe_wardrobe_sides.png",
"wardrobe_wardrobe_sides.png",
"wardrobe_wardrobe_sides.png",
"wardrobe_wardrobe_front.png"
},
inventory_image = "wardrobe_wardrobe_front.png",
sounds = default.node_sound_wood_defaults(),
groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3 },
on_rightclick = function(pos, node, player, itemstack, pointedThing)
showForm(player, 1);
end
});
core.register_node(
"wardrobe:wardrobe",
{
description = "Wardrobe",
paramtype2 = "facedir",
tiles = {
"wardrobe_wardrobe_topbottom.png",
"wardrobe_wardrobe_topbottom.png",
"wardrobe_wardrobe_sides.png",
"wardrobe_wardrobe_sides.png",
"wardrobe_wardrobe_sides.png",
"wardrobe_wardrobe_front.png"
},
inventory_image = "wardrobe_wardrobe_front.png",
sounds = default.node_sound_wood_defaults(),
groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3 },
on_rightclick = function(pos, node, player, itemstack, pointedThing)
showForm(player, 1);
end
});
minetest.register_craft(
{
output = "wardrobe:wardrobe",
recipe = { { "group:wood", "group:stick", "group:wood" },
{ "group:wood", "group:wool", "group:wood" },
{ "group:wood", "group:wool", "group:wood" } }
});
core.register_craft(
{
output = "wardrobe:wardrobe",
recipe = { { "group:wood", "group:stick", "group:wood" },
{ "group:wood", "group:wool", "group:wood" },
{ "group:wood", "group:wool", "group:wood" } }
});

View File

@ -607,6 +607,14 @@ spawneggs.enable_node_spawn (Enable node spawn) bool true
trampoline.damage_absorb (Trampoline damage absorption) int 100 0 100
[*wardrobe]
## Number of skins shown per page.
#
# default: 8
wardrobe.skins_per_page (Skins per page) int 8
[*whitelist]
# Enables/Disables whitelist feature.