6 Commits

Author SHA1 Message Date
d3c7fa71c0 Filename seperator setting to fix #54 (#83)
Adds a filename split seperator setting that lets you choose between old style `_` and `.` because dot is the only char that isn´t allowed in playername but in texturenames.
Default value is `_` to keep it compatible with older versions, while `.` offers a solution to fix #54.
2023-05-10 21:41:35 +02:00
1d1053dbc2 Remove mesh hand node when player exits (#84) 2023-02-15 21:07:27 +01:00
b49907c4b1 Add hand_monoid support (#81) 2023-01-15 14:16:44 +01:00
6db9a55f0c Add compatibility w/ animations of the emote mod (#82) 2023-01-15 14:15:45 +01:00
c0b6f761dc Add portuguese Brazilian language (#76)
Adds to the mod a language that translates to Portuguese
2022-12-15 18:48:51 +01:00
e275159dd0 Add uv wrapped 1.8 hand model (#74) 2022-10-05 21:15:03 +02:00
13 changed files with 85 additions and 15 deletions

View File

@ -10,4 +10,5 @@ globals = {
read_globals = {
string = {fields = {"split", "trim"}},
table = {fields = {"copy", "getn"}},
"hand_monoid",
}

3
API.md
View File

@ -59,7 +59,8 @@ Could be redefined for dynamic texture generation
Set the hand node to be used with this skin
## skin:set_hand_from_texture()
Register and set hand node based on skin texture
Register and set hand node based on skin texture.
Uses different model depending on get_meta("format") ("1.0" or "1.8")
Only works on mod load
## skin:get_hand()

View File

@ -8,6 +8,12 @@ skins = {}
skins.modpath = minetest.get_modpath(minetest.get_current_modname())
skins.default = "character"
-- see skindsdb/textures/readme.txt to avoid playername with underscore problem
skins.fsep = minetest.settings:get("skinsdb_fsep") or "_"
if skins.fsep == "_" then
minetest.log("warning", "skinsdb filename seperator is set to " .. skins.fsep .. ", see skindsdb/textures/readme.txt to avoid problems with playernames containing underscore")
end
dofile(skins.modpath.."/skin_meta_api.lua")
dofile(skins.modpath.."/api.lua")
dofile(skins.modpath.."/skinlist.lua")
@ -63,6 +69,13 @@ end)
minetest.register_on_leaveplayer(function(player)
skins.ui_context[player:get_player_name()] = nil
player:get_inventory():set_size("hand", 0)
end)
minetest.register_on_shutdown(function()
for _, player in pairs(minetest.get_connected_players()) do
player:get_inventory():set_size("hand", 0)
end
end)
player_api.register_model("skinsdb_3d_armor_character_5.b3d", {
@ -80,6 +93,10 @@ player_api.register_model("skinsdb_3d_armor_character_5.b3d", {
mine = {x=189, y=198},
walk_mine = {x=200, y=219},
sit = {x=81, y=160},
-- compatibility w/ the emote mod
wave = {x = 192, y = 196, override_local = true},
point = {x = 196, y = 196, override_local = true},
freeze = {x = 205, y = 205, override_local = true},
},
})

20
locale/skinsdb.pt_BR.tr Normal file
View File

@ -0,0 +1,20 @@
# textdomain: skinsdb
Raw texture=Textura crua
Name=Nome
Author=Autor
Change=Mudar
Page=Página
License=Licença
Description=Descrição
Show, list or set player's skin=Mostrar, listar ou definir a skin do jogador
Player not found=Jogador não encontrado
unknown command=Comando desconhecido
see /help skinsdb for supported parameters= consulte /help skinsdb para obter os parâmetros suportados
skin set to=Aparência definida para
invalid skin=Aparência inválida
unknown parameter=parâmetro desconhecido
unknown skin=Aparência desconhecida
Downloads thespecified range of skins and shuts down the server= Baixa o intervalo especificado de capas e desliga o servidor
Skins=Aparência
Requires skin key=Requer chave de aparência

View File

@ -1,5 +1,5 @@
name = skinsdb
description = Player skin mod, supporting unified_inventory, sfinv and smart_inventory
depends = player_api
optional_depends = unified_inventory,3d_armor,clothing,sfinv
optional_depends = unified_inventory,3d_armor,clothing,sfinv,hand_monoid
min_minetest_version = 5.4.0

BIN
models/skinsdb_hand_18.b3d Normal file

Binary file not shown.

Binary file not shown.

3
settingtypes.txt Normal file
View File

@ -0,0 +1,3 @@
# texture filename seperator, default "_"
# see skindsdb/textures/readme.txt to avoid playername with underscore problem
skinsdb_fsep (texture filename seperator) enum _ _,.

View File

@ -1,5 +1,7 @@
skins.meta = {}
local has_hand_monoid = minetest.get_modpath("hand_monoid")
local skin_class = {}
skin_class.__index = skin_class
skins.skin_class = skin_class
@ -69,7 +71,11 @@ function skin_class:set_hand_from_texture()
hand_def.wield_scale = {x=1,y=1,z=1}
hand_def.paramtype = "light"
hand_def.drawtype = "mesh"
if(self:get_meta("format") == "1.0") then
hand_def.mesh = "skinsdb_hand.b3d"
else
hand_def.mesh = "skinsdb_hand_18.b3d"
end
hand_def.use_texture_alpha = ALPHA_CLIP
minetest.register_node(hand, hand_def)
self:set_hand(hand)
@ -204,6 +210,13 @@ function skin_class:apply_skin_to_player(player)
})
local hand = self:get_hand()
if has_hand_monoid then
if hand then
hand_monoid.monoid:add_change(player, {name = hand}, "skinsdb:hand")
else
hand_monoid.monoid:del_change(player, "skinsdb:hand")
end
else
if hand then
player:get_inventory():set_size("hand", 1)
player:get_inventory():set_stack("hand", 1, hand)
@ -211,6 +224,7 @@ function skin_class:apply_skin_to_player(player)
player:get_inventory():set_stack("hand", 1, "")
end
end
end
function skin_class:set_skin(player)
-- The set_skin is used on skins selection

View File

@ -2,7 +2,7 @@ local skins_dir_list = minetest.get_dir_list(skins.modpath.."/textures")
for _, fn in pairs(skins_dir_list) do
local name, sort_id, is_preview, playername
local nameparts = string.gsub(fn, "[.]", "_"):split("_")
local nameparts = string.gsub(fn, "[.]", skins.fsep):split(skins.fsep)
-- check allowed prefix and file extension
if (nameparts[1] == 'player' or nameparts[1] == 'character') and
@ -51,9 +51,7 @@ for _, fn in pairs(skins_dir_list) do
local skin_format = skins.get_skin_format(file)
skin_obj:set_meta("format", skin_format)
file:close()
if skin_format == "1.0" then
skin_obj:set_hand_from_texture()
end
file = io.open(skins.modpath.."/meta/"..name..".txt", "r")
if file then
local data = string.split(file:read("*all"), "\n", 3)

View File

@ -88,7 +88,7 @@ local function safe_single_skin(skin)
skin.license
}
local name = "character_" .. skin.id
local name = "character" .. skins.fsep .. skin.id
-- core.safe_file_write does not work here
unsafe_file_write(
@ -101,7 +101,7 @@ local function safe_single_skin(skin)
core.decode_base64(skin.img)
)
fetch_url(preview_url:format(skin.id), function(preview)
unsafe_file_write(skins_path .. name .. "_preview.png", preview)
unsafe_file_write(skins_path .. name .. skins.fsep .. "preview.png", preview)
end)
core.log("action", ("%s: Completed skin %s"):format(_ID_, name))
end

View File

@ -1,5 +1,17 @@
In this folder the skin files could be placed according the following file naming convention.
skinsdb uses an underscore as default seperator for filename splitting which can cause problems with playernames containing "_",
see https://github.com/minetest-mods/skinsdb/issues/54.
The config setting skinsdb_fsep (texture filename seperator) was added as a workaround which also offers "."(dot) as seperator,
dot is the only character which is allowed in textures but not in playernames.
To keep compatibility with older versions underscore is the default value.
fresh install:
you should change the seperator to "." to avoid that problem.
existing install:
- change the filenames according to the naming convention with dot as seperator instead of underscore
- change the texture filename seperator in settings or add "skinsdb_fsep = ." to your minetest.conf before starting your server
Public skin available for all users:
character_[number-or-name].png

View File

@ -1,5 +1,9 @@
import sys, requests, base64
# filename seperator to use, either default "-" or ".". see skinsdb/textures/readme.txt
#fsep = "_"
fsep = "."
download_preview = ( len (sys.argv) > 1 and sys.argv[1] == "with_preview" )
@ -24,7 +28,7 @@ for json in data["skins"]:
# Texture file
raw_data = base64.b64decode(json["img"])
file = open("../textures/character_" + id + ".png", "wb")
file = open("../textures/character" + fsep + id + ".png", "wb")
file.write(bytearray(raw_data))
file.close()
@ -44,7 +48,7 @@ for json in data["skins"]:
if r2.status_code == 200:
# Preview file
preview = r2.content
file = open("../textures/character_" + id + "_preview.png", "wb")
file = open("../textures/character_" + id + fsep + "preview.png", "wb")
file.write(bytearray(preview))
file.close()
else: