cleanup, disable [multiskins] and [wardrobe]

This commit is contained in:
elite 2017-07-15 15:24:39 -04:00
parent 59ea915fab
commit 80e665c47a
32 changed files with 0 additions and 2185 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

View File

@ -1,7 +0,0 @@
## Generic ignorable patterns and files
*~
.*.swp
*bak*
tags
*.vim
*.png

View File

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2017
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,51 +0,0 @@
[mod] Multiskin [multiskin] [0.1.1]
===================================
**Minetest Version:** 0.4.16
**Depends:** default
Adds per-player support for version 1.8 minecraft skins.
On its own this mod acts as a replacement for the out-dated player_textures
mod by PilzAdam. Individual player textures can be placed in the mod's
textures directory and will be automatically assigned to a player by naming
the texture file as `player_<player_name>.png`
This mod also supports the following skin-switching mods which can be used
in conjuction with the multiskin default skins and chat commands.
```
[mod] Skins [skins] by Zeg9
[mod] Simple Skins [simple_skins] by TenPlus1
[mod] Unified Skins [u_skins] by SmallJoker
[mod] Wardrobe [wardrobe] by prestidigitator
```
Note that auto skin format detection is only available for these mods if
the multiskin mod is listed in the `secure.trusted_mods` setting.
Configuration
-------------
You can set the default skin by including the following settings in your
minetest.conf
Supported formats are `1.0` and `1.8`
```
multiskin_skin = <texture>
multiskin_format = <format>
```
Chat Commands
-------------
Requires `server` priv in multiplayer mode, no privs required in singleplayer.
```
/multiskin format <player_name> <format>
/multiskin set <player_name> <texture>
/multiskin unset <player_name>
/multiskin help
```
TODO
----
Document the api and add support to my 3d_armor and clothing mods.

View File

@ -1,2 +0,0 @@
default
sfinv?

View File

@ -1,2 +0,0 @@
Dual skin format player model.
Supports minecraft 1.0 and 1.8 skin formats on a per-player basis.

View File

@ -1,264 +0,0 @@
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local dir_list = minetest.get_dir_list(modpath.."/textures")
local default_skin = minetest.setting_get("multiskin_skin") or "character.png"
local default_format = minetest.setting_get("multiskin_format") or "1.0"
local player_skins = {}
local player_format = {}
local player_textures = {}
local skin_previews = {}
local skin_format = {[default_skin]=default_format}
local function get_skin_format(file)
file:seek("set", 1)
if file:read(3) == "PNG" then
file:seek("set", 16)
local ws = file:read(4)
local hs = file:read(4)
local w = ws:sub(3, 3):byte() * 256 + ws:sub(4, 4):byte()
local h = hs:sub(3, 3):byte() * 256 + hs:sub(4, 4):byte()
if w >= 64 then
if w == h then
return "1.8"
elseif w == h * 2 then
return "1.0"
end
end
end
end
for _, fn in pairs(dir_list) do
local file = io.open(modpath.."/textures/"..fn, "rb")
if file then
skin_format[fn] = get_skin_format(file)
file:close()
end
end
-- 3rd party skin-switcher support
-- may be removed from future versions as these mods do not
-- use the proper api method for setting player textures
--
-- Auto skin format detection for 3rd party mods requires
-- that multiskin is included in 'trusted mods'
local env = minetest.request_insecure_environment()
local skin_mod = modname
local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"}
for _, mod in pairs(skin_mods) do
local path = minetest.get_modpath(mod)
if path then
local dir_list = minetest.get_dir_list(path.."/textures")
for _, fn in pairs(dir_list) do
if fn:find("_preview.png$") then
skin_previews[fn] = true
elseif env then
local file = env.io.open(path.."/textures/"..fn, "rb")
if file then
skin_format[fn] = get_skin_format(file)
file:close()
end
end
end
skin_mod = mod
end
end
env = nil
local function get_player_skin(player)
local name = player:get_player_name()
if name then
local skin = nil
if skin_mod == "skins" or skin_mod == "simple_skins" then
skin = skins.skins[name]
elseif skin_mod == "u_skins" then
skin = u_skins.u_skins[name]
elseif skin_mod == "wardrobe" then
local skins = wardrobe.playerSkins or {}
if skins[name] then
return skins[name]
end
end
if skin then
return skin..".png"
end
for _, fn in pairs(dir_list) do
if fn == "player_"..name..".png" then
return fn
end
end
end
return default_skin
end
multiskin = {
model = "multiskin.b3d",
skins = player_skins,
textures = player_textures,
}
multiskin.set_player_skin = function(player, skin)
local name = player:get_player_name()
local format = skin_format[skin]
if format then
player_format[name] = format
player:set_attribute("multiskin_format", format)
end
player_skins[name].skin = skin
player:set_attribute("multiskin_skin", skin)
end
multiskin.set_player_format = function(player, format)
local name = player:get_player_name()
player_format[name] = format
player:set_attribute("multiskin_format", format)
end
multiskin.add_preview = function(texture)
skin_previews[texture] = true
end
multiskin.get_preview = function(player)
local skin = player:get_attribute("multiskin_skin")
if skin then
local preview = skin:gsub(".png$", "_preview.png")
if skin_previews[preview] then
return preview
end
end
end
multiskin.update_player_visuals = function(player)
local name = player:get_player_name()
if not name or not player_skins[name] then
return
end
local anim = default.player_get_animation(player) or {}
if anim.model == "character.b3d" then
default.player_set_model(player, multiskin.model)
elseif anim.model ~= multiskin.model then
return
end
local textures = player_textures[name] or {}
local skin = player_skins[name].skin or "blank.png"
local cape = player_skins[name].cape
local layers = {}
for k, v in pairs(player_skins[name]) do
if k ~= "skin" and k ~= "cape" then
table.insert(layers, v)
end
end
local overlay = table.concat(layers, "^")
local format = player_format[name] or default_format
if format == "1.8" then
if overlay ~= "" then
skin = skin.."^"..overlay
end
textures[1] = cape or "blank.png"
textures[2] = skin
else
if cape then
skin = skin.."^"..cape
end
if overlay == "" then
overlay = "blank.png"
end
textures[1] = skin
textures[2] = overlay
end
default.player_set_textures(player, table.copy(textures))
end
default.player_register_model("multiskin.b3d", {
animation_speed = 30,
textures = {
"blank.png",
"blank.png",
},
animations = {
stand = {x=0, y=79},
lay = {x=162, y=166},
walk = {x=168, y=187},
mine = {x=189, y=198},
walk_mine = {x=200, y=219},
sit = {x=81, y=160},
},
})
minetest.register_on_joinplayer(function(player)
minetest.after(0, function(player)
local name = player:get_player_name()
local skin = player:get_attribute("multiskin_skin") or
get_player_skin(player)
local anim = default.player_get_animation(player) or {}
player_textures[name] = anim.textures or {}
player_skins[name] = {skin=skin}
player_format[name] = player:get_attribute("multiskin_format")
multiskin.set_player_skin(player, skin)
multiskin.update_player_visuals(player)
end, player)
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if name then
player_skins[name] = nil
player_format[name] = nil
player_textures[name] = nil
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name()
for field, _ in pairs(fields) do
if string.find(field, "skins_set") then
minetest.after(0, function(player)
local name = player:get_player_name()
local skin = get_player_skin(player)
multiskin.set_player_skin(player, skin)
multiskin.update_player_visuals(player)
end, player)
end
end
end)
minetest.register_chatcommand("multiskin", {
params = "<cmd> [name] [args]",
description = "Multiskin player skin and format management",
func = function(name, param)
if not minetest.is_singleplayer() and
not minetest.check_player_privs(name, {server=true}) then
return false, "Insufficient privileges"
end
local cmd, player_name, args = string.match(param, "^([^ ]+) (.-) (.+)$")
if not args then
cmd, player_name = string.match(param, "([^ ]+) (.+)")
end
local player = nil
if player_name then
player = minetest.get_player_by_name(player_name)
else
cmd = string.match(param, "([^ ]+)")
end
if cmd == "help" then
local msg = "\nUsage: /multiskin <cmd> [name] [args]\n\n"..
" format <player_name> <format> (1.0 or 1.8)\n"..
" set <player_name> <texture>\n"..
" unset <player_name>\n"..
" help (show this message)\n\n"
minetest.chat_send_player(name, msg)
elseif cmd == "format" and player and args then
multiskin.set_player_format(player, args)
multiskin.update_player_visuals(player)
elseif cmd == "set" and player and args then
multiskin.set_player_skin(player, args)
multiskin.update_player_visuals(player)
elseif cmd == "unset" and player then
player_skins[player_name].skin = get_player_skin(player)
player:set_attribute("multiskin_skin", nil)
multiskin.update_player_visuals(player)
else
return false, "Invalid parameters, see /multiskin help"
end
end,
})

View File

@ -1 +0,0 @@
name = multiskin

View File

@ -1 +0,0 @@
Place your player skins here named as `player_<player_name>.png`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

View File

View File

@ -1,113 +0,0 @@
Wardrobe Minetest Mod
=====================
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
the character mesh, does not provide for the old 2D billboard-type character
appearance, and does not depend on any kind of inventory extension mods. It
also does not rely on running external scripts, downloading skins from a
server, or anything of that nature.
Changing skins is done via a new "wardrobe" node, which brings up a form with
skin names when you right-click on it (like a chest or furnace). Choosing a
skin instantly changes your character's appearance, and this change is kept if
you log out (unless the skin is removed from the server, in which case your
appearance will revert to the default when you log in).
The list of skins is static and determined when the server starts based on two
files: <modsPath>/wardrobe/skins.txt and <worldPath>/skins.txt. Both files
have the same syntax (see "Skins File Syntax" below). The simplest way to add
a skin is to either drop the image into the <modsPath>/wardrobe/textures
directory or add them to a texture pack, then add the simple name of the
texture file to one of these skins.txt files.
For convenience, some SVG images have been included with this mod. One
("skinTemplate.svg") shows the exact layout of a Minetest skin for the default
character model, and should be useful for creating new skins. This layout is
also (mostly?) compatible with Minecraft skins. The others can be used to
create higher resolution textures for the wardrobe object, in case you are
using a texture pack with resolutions greater than 16x16. Skins too may be
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
-----------------
A comment line starts with two dashes (like in Lua), but must be the only thing
on the line:
-- This is a comment and has no effect.
Except for empty lines and comments, each line names a texture (file) and a
name, separated by optional whitespace and a colon (:):
texture_file_name.png: My Skin
skin_other_texture_file_name.png: Other Skin
The first string (e.g. "texture_file_name.png") will be passed to the minetest
API just like any other node or item texture. Generally it is simply the whole
file name of an image in a mod "texture" directory or texture pack. The second
string (e.g. "My Skin") is presented to the player in-world as the name of the
texture. If this name is omitted, as in:
texture_file_name.png
skin_other_texture_file_name.png
Then a name is constructed by removing any ".png" suffix any optional "skin_"
or "wardrobe_skin_" prefix, and replacing underscores with spaces. So the
above skins would be named "texture file name" and "other texture file name",
respectively.
To remove a skin that was added elsewhere (for example, to a remove a skin in a
particular world), prepend a minus sign (-) to the line. For example:
-skin_other_texture_file_name.png
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)
Dependencies: default, wool (both included in minetest_game)
Recipies:
* W - any wood (same kinds you can make a chest from)
* 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
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)
Change History
--------------
Version 1.0
* Released 2014-07-05
* First working version
Version 1.1
* Released 2015-04-24
* Removed farming as a dependency; wool is from wool.
* 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).

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,65 +0,0 @@
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
wardrobe = {};
local initSkin, changeSkin, updateSkin = dofile(MOD_PATH.."/skinMethods.lua");
dofile(MOD_PATH.."/storage.lua");
dofile(MOD_PATH.."/wardrobe.lua");
-- API
--- Updates the visual appearance of a player's skin according to whatever skin
-- has been set for the player.
--
-- @param player
-- The Player object for the player.
--
wardrobe.updatePlayerSkin = updateSkin;
--- Compatibility method.
--
-- Identical to wardrobe.updatePlayerSkin(player).
--
wardrobe.setPlayerSkin = updateSkin;
--- Changes the skin set for a named player.
--
-- Player need not be logged in. Automatically updates the player's visual
-- appearance accordingly if they ARE logged in.
--
-- @param playerName
-- Name of the player.
-- @param skin
-- Name of the skin.
--
function wardrobe.changePlayerSkin(playerName, skin)
changeSkin(playerName, skin);
local player = minetest.get_player_by_name(playerName);
if player then updateSkin(player); end;
end
wardrobe.storage.loadSkins();
wardrobe.storage.loadPlayerSkins();
if initSkin then
minetest.register_on_joinplayer(
function(player)
minetest.after(1, initSkin, player)
end);
end;
if not changeSkin then
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.");
end;

View File

@ -1,104 +0,0 @@
-- Returns:
-- initSkin(player)
-- changeSkin(playerName, skin)
-- updateSkin(player)
local wardrobe = wardrobe or {};
--- Methods for initializing/changing/updating skin. Valid values are keys
-- from the SKIN_CHANGE_METHODS table (below). nil means use the default
-- method.
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;
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;
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;
wardrobe.playerSkins[playerName] = skin;
wardrobe.storage.savePlayerSkins();
end;
local function defaultUpdateSkin(player)
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;
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 = {},
initSkin = defaultUpdateSkin,
changeSkin = changeWardrobeSkin,
updateSkin = defaultUpdateSkin
},
["3d_armor"] =
{
required_mods = { '3d_armor' },
initSkin = nil,
changeSkin = function(playerName, skin)
changeWardrobeSkin(playerName, skin);
armor.textures[playerName].skin = skin;
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;
end;
if not methods then methods = SKIN_CHANGE_METHODS.default; end;
return methods.initSkin, methods.changeSkin, methods.updateSkin;

View File

@ -1 +0,0 @@
character.png: Default Skin

View File

@ -1,184 +0,0 @@
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";
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
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
end
local function trimTail(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;
end
local function parseSkinLine(line)
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
return k, v, n;
end
--- Parses the files with the given paths for key/value pairs. Once a key is
-- negated, it stays negated. Otherwise, the last (non-nil) value assigned to
-- a key wins.
--
-- @return A list of non-negated keys. This may include keys for which the
-- values are nil.
-- @return A map from key to value for all non-negated keys with non-nil
-- values.
--
local function loadSkinsFromFiles(filePaths)
local normKeys, negKeys, values = {}, {}, {}
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
local keyList = {};
for k in pairs(normKeys) do
table.insert(keyList, k);
end
return keyList, values;
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);
for i, skin in ipairs(skins) do
local name = skinNames[skin];
if not name then
local s, e;
name = removeSuffix(
removePrefix(
removePrefix(skin, MOD_NAME.."_"),
"skin_"),
".png");
if name == "" then
name = skin;
else
name = string.gsub(name, "_", " ");
end
end
skinNames[skin] = name;
end
table.sort(skins,
function(sL, sR)
return skinNames[sL] < skinNames[sR];
end);
wardrobe.skins = skins;
wardrobe.skinNames = skinNames;
end
--- Parses the player skins database file and stores the result in
-- wardrobe.playerSkins.
--
function wardrobe.storage.loadPlayerSkins()
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
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
for name, skin in pairs(wardrobe.playerSkins) do
file:write(name, ":", skin, "\n");
end
file:close();
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 B

View File

@ -1,88 +0,0 @@
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 n = #wardrobe.skins;
if n <= 0 then return; end
local nPages = math.ceil(n/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);
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
minetest.show_formspec(playerName, FORM_NAME, fs);
end
minetest.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
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);
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
});
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" } }
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB