remove again skinsdb5 and backport modpack changes
|
@ -9,11 +9,13 @@ local animation_blend = 0
|
||||||
|
|
||||||
player_api.registered_models = {}
|
player_api.registered_models = {}
|
||||||
player_api.registered_skins = {}
|
player_api.registered_skins = {}
|
||||||
|
|
||||||
-- Local for speed.
|
-- Local for speed.
|
||||||
local models = player_api.registered_models
|
local models = player_api.registered_models
|
||||||
local skins = player_api.registered_skins
|
local skins = player_api.registered_skins
|
||||||
local registered_skin_modifiers = {}
|
local registered_skin_modifiers = {}
|
||||||
local registered_on_skin_change = {}
|
local registered_on_skin_change = {}
|
||||||
|
local registered_skin_dyn_values = {}
|
||||||
|
|
||||||
function player_api.register_model(name, def)
|
function player_api.register_model(name, def)
|
||||||
-- compatibility defaults
|
-- compatibility defaults
|
||||||
|
@ -29,19 +31,44 @@ function player_api.register_model(name, def)
|
||||||
models[name] = def
|
models[name] = def
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local skin_meta = { __index = function( skin, key )
|
||||||
|
local dyn_values = registered_skin_dyn_values[key]
|
||||||
|
if not dyn_values then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local return_value
|
||||||
|
for _, hook in ipairs(dyn_values) do
|
||||||
|
return_value = hook(skin, return_value)
|
||||||
|
end
|
||||||
|
return return_value
|
||||||
|
end }
|
||||||
|
|
||||||
|
-- Add new skin
|
||||||
function player_api.register_skin(name, def)
|
function player_api.register_skin(name, def)
|
||||||
def.name = name
|
def.name = name
|
||||||
skins[name] = def
|
if not def.textures and def.texture then
|
||||||
|
def.textures = { def.texture }
|
||||||
|
def.texture = nil
|
||||||
|
end
|
||||||
|
skins[name] = setmetatable(def, skin_meta)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Modifier function is called before a skin is applied to the player
|
||||||
function player_api.register_skin_modifier(modifier_func)
|
function player_api.register_skin_modifier(modifier_func)
|
||||||
table.insert(registered_skin_modifiers, modifier_func)
|
table.insert(registered_skin_modifiers, modifier_func)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Modifier is called after the skin was applied to the player
|
||||||
function player_api.register_on_skin_change(modifier_func)
|
function player_api.register_on_skin_change(modifier_func)
|
||||||
table.insert(registered_on_skin_change, modifier_func)
|
table.insert(registered_on_skin_change, modifier_func)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Modifer is called if a skin attribute "key" was requrested but does not exists for the skin
|
||||||
|
function player_api.register_skin_dyn_values(key, hook)
|
||||||
|
registered_skin_dyn_values[key] = registered_skin_dyn_values[key] or {}
|
||||||
|
table.insert(registered_skin_dyn_values[key], hook)
|
||||||
|
end
|
||||||
|
|
||||||
-- Player stats and animations
|
-- Player stats and animations
|
||||||
local player_model = {}
|
local player_model = {}
|
||||||
local player_textures = {}
|
local player_textures = {}
|
||||||
|
@ -63,13 +90,8 @@ end
|
||||||
|
|
||||||
-- Called when a player's appearance needs to be updated
|
-- Called when a player's appearance needs to be updated
|
||||||
function player_api.set_model(player, model_name)
|
function player_api.set_model(player, model_name)
|
||||||
local default_model = models[player_api.default_model]
|
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
local model = model_name and models[model_name]
|
local model = models[model_name]
|
||||||
if not model then
|
|
||||||
model_name = player_api.default_model
|
|
||||||
model = default_model
|
|
||||||
end
|
|
||||||
|
|
||||||
player:set_properties({
|
player:set_properties({
|
||||||
mesh = model.mesh,
|
mesh = model.mesh,
|
||||||
|
@ -94,9 +116,6 @@ function player_api.set_textures(player, textures)
|
||||||
elseif skin.textures then
|
elseif skin.textures then
|
||||||
textures = table.copy(skin.textures)
|
textures = table.copy(skin.textures)
|
||||||
skin_textures[name] = skin.textures
|
skin_textures[name] = skin.textures
|
||||||
elseif skin.texture then
|
|
||||||
textures = { skin.texture }
|
|
||||||
skin_textures[name] = { skin.texture }
|
|
||||||
else
|
else
|
||||||
textures = table.copy(model.textures)
|
textures = table.copy(model.textures)
|
||||||
skin_textures[name] = model.textures
|
skin_textures[name] = model.textures
|
||||||
|
@ -163,7 +182,7 @@ local textures_skin_suffix_blacklist = {
|
||||||
player_api.textures_skin_suffix_blacklist = textures_skin_suffix_blacklist
|
player_api.textures_skin_suffix_blacklist = textures_skin_suffix_blacklist
|
||||||
|
|
||||||
-- Read and analyze data in textures and metadata folder and register them
|
-- Read and analyze data in textures and metadata folder and register them
|
||||||
function player_api.read_textures_and_meta(hook)
|
function player_api.read_textures_and_meta()
|
||||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||||
for _, fn in pairs(minetest.get_dir_list(modpath..'/textures/')) do
|
for _, fn in pairs(minetest.get_dir_list(modpath..'/textures/')) do
|
||||||
local nameparts = fn:sub(1, -5):split("_")
|
local nameparts = fn:sub(1, -5):split("_")
|
||||||
|
@ -171,9 +190,13 @@ function player_api.read_textures_and_meta(hook)
|
||||||
if ( prefix == 'player' and nameparts[2] or prefix == 'character' ) then
|
if ( prefix == 'player' and nameparts[2] or prefix == 'character' ) then
|
||||||
if not textures_skin_suffix_blacklist[nameparts[#nameparts]] then
|
if not textures_skin_suffix_blacklist[nameparts[#nameparts]] then
|
||||||
|
|
||||||
local skin = {texture = fn}
|
|
||||||
local skin_id = table.concat(nameparts,'_')
|
local skin_id = table.concat(nameparts,'_')
|
||||||
|
|
||||||
|
local skin = {
|
||||||
|
texture = fn,
|
||||||
|
filename = modpath.."/textures/"..skin_id..".png"
|
||||||
|
}
|
||||||
|
|
||||||
-- get metadata from file
|
-- get metadata from file
|
||||||
local file = io.open(modpath.."/meta/"..skin_id..".txt", "r")
|
local file = io.open(modpath.."/meta/"..skin_id..".txt", "r")
|
||||||
if file then
|
if file then
|
||||||
|
@ -208,10 +231,6 @@ function player_api.read_textures_and_meta(hook)
|
||||||
skin.description = table.concat(nameparts,' ')
|
skin.description = table.concat(nameparts,' ')
|
||||||
end
|
end
|
||||||
|
|
||||||
-- process hook
|
|
||||||
if hook then
|
|
||||||
hook(modpath..'/textures/'..fn, skin)
|
|
||||||
end
|
|
||||||
player_api.register_skin(skin_id, skin)
|
player_api.register_skin(skin_id, skin)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,3 +36,13 @@ player_api.register_skin("sprite", {
|
||||||
|
|
||||||
player_api.default_model = "character.b3d"
|
player_api.default_model = "character.b3d"
|
||||||
player_api.default_skin = "character"
|
player_api.default_skin = "character"
|
||||||
|
|
||||||
|
-- Apply default model to all skins
|
||||||
|
player_api.register_skin_dyn_values("model_name", function(skin, othermod_value)
|
||||||
|
return othermod_value or player_api.default_model
|
||||||
|
end )
|
||||||
|
|
||||||
|
-- Some compatibility bits
|
||||||
|
player_api.register_skin_dyn_values("texture", function(skin, othermod_value)
|
||||||
|
return othermod_value or ( skin.textures and skin.textures[1] )
|
||||||
|
end )
|
||||||
|
|
|
@ -7,6 +7,8 @@ textures Skin textures table
|
||||||
|
|
||||||
## Other mods require or use additional attirubes that can be added in registration
|
## Other mods require or use additional attirubes that can be added in registration
|
||||||
format Skins format. "1.0" (default) or "1.8"
|
format Skins format. "1.0" (default) or "1.8"
|
||||||
|
filename Full path to the skin file
|
||||||
|
hand_node Node name stored in players "hand" inventory to skin the hand
|
||||||
|
|
||||||
## formspecs related
|
## formspecs related
|
||||||
description Descriptive skin name to be shown in formspecs
|
description Descriptive skin name to be shown in formspecs
|
||||||
|
|
|
@ -20,7 +20,7 @@ local skins_formspec_main = function(name, context)
|
||||||
local selected = 1
|
local selected = 1
|
||||||
for i = 1, #skins_list do
|
for i = 1, #skins_list do
|
||||||
local skin = skins_list[i]
|
local skin = skins_list[i]
|
||||||
formspec = formspec .. (skin.description or skin.name)
|
formspec = formspec .. minetest.formspec_escape(skin.description or skin.name)
|
||||||
if i < #skins_list then
|
if i < #skins_list then
|
||||||
formspec = formspec .. ","
|
formspec = formspec .. ","
|
||||||
end
|
end
|
||||||
|
@ -31,13 +31,16 @@ local skins_formspec_main = function(name, context)
|
||||||
formspec = formspec .. ";" .. selected .. ";false]"
|
formspec = formspec .. ";" .. selected .. ";false]"
|
||||||
if selected_skin then
|
if selected_skin then
|
||||||
if selected_skin.description then
|
if selected_skin.description then
|
||||||
formspec = formspec .. "label[0.0,0.0;" .. "Current skin: " .. selected_skin.description .. "]"
|
formspec = formspec .. "label[0.0,0.0;" .. "Current skin: " ..
|
||||||
|
minetest.formspec_escape(selected_skin.description) .. "]"
|
||||||
end
|
end
|
||||||
if selected_skin.author then
|
if selected_skin.author then
|
||||||
formspec = formspec .. "label[0.0,0.5;" .. "Author: " .. selected_skin.author .. "]"
|
formspec = formspec .. "label[0.0,0.5;" .. "Author: " ..
|
||||||
|
minetest.formspec_escape(selected_skin.author) .. "]"
|
||||||
end
|
end
|
||||||
if selected_skin.license then
|
if selected_skin.license then
|
||||||
formspec = formspec .. "label[0.0,1;" .. "License: " .. selected_skin.license .. "]"
|
formspec = formspec .. "label[0.0,1;" .. "License: " ..
|
||||||
|
minetest.formspec_escape(selected_skin.license) .. "]"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return formspec
|
return formspec
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
# Skinsdb Interface
|
|
||||||
|
|
||||||
## skinsdb5.get_skinlist_for_player(playername)
|
|
||||||
Get all allowed skins for player. All public and all player's private skins. If playername not given only public skins returned
|
|
||||||
|
|
||||||
## skinsdb5.get_skinlist_with_meta(key, value)
|
|
||||||
Get all skins with metadata key is set to value. Example:
|
|
||||||
skinsdb5.get_skinlist_with_meta("playername", playername) - Get all private skins (w.o. public) for playername
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
# skinsdb5
|
|
||||||
|
|
||||||
This Minetest mod offers changeable player skins with a graphical interface for multiple inventory mods.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- player_api Skins management compatible, as proposed for minetest_game-0.5
|
|
||||||
- Skin change menu for sfinv (in minetest_game) and [unified_inventory](https://forum.minetest.net/viewtopic.php?t=12767)
|
|
||||||
- Own skin change menu and command line using chat command /skinsdb (set | show | list | list private | list public | ui)
|
|
||||||
- Skin previews supported in selection
|
|
||||||
- Additional information for each skin
|
|
||||||
- Support for different skins lists: public and a per-player list are currently implemented
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
If nothing else is specified, it is licensed as GPLv3.
|
|
||||||
|
|
||||||
### Credits
|
|
||||||
|
|
||||||
- RealBadAngel (unified_inventory)
|
|
||||||
- Zeg9 (skinsdb)
|
|
||||||
- cornernote (source code)
|
|
||||||
- Krock (source code)
|
|
||||||
- bell07 (source code)
|
|
|
@ -1,37 +0,0 @@
|
||||||
local function skins_sort(skinslist)
|
|
||||||
table.sort(skinslist, function(a,b)
|
|
||||||
local a_sortid = a.sort_id or ""
|
|
||||||
local b_sortid = b.sort_id or ""
|
|
||||||
if a_sortid ~= b_sortid then
|
|
||||||
return a_sortid < b_sortid
|
|
||||||
else
|
|
||||||
return tostring(a.description or a.name or "") < tostring(b.description or b.name or "")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Get skinlist for player. If no player given, public skins only selected
|
|
||||||
function skinsdb5.get_skinlist_for_player(playername)
|
|
||||||
local skinslist = {}
|
|
||||||
for _, skin in pairs(player_api.registered_skins) do
|
|
||||||
if skin.in_inventory_list ~= false and
|
|
||||||
(not skin.playername or (playername and skin.playername:lower() == playername:lower())) then
|
|
||||||
table.insert(skinslist, skin)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
skins_sort(skinslist)
|
|
||||||
return skinslist
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Get skinlist selected by metadata
|
|
||||||
function skinsdb5.get_skinlist_with_meta(key, value)
|
|
||||||
assert(key, "key parameter for skinsdb5.get_skinlist_with_meta() missed")
|
|
||||||
local skinslist = {}
|
|
||||||
for _, skin in pairs(player_api.registered_skins) do
|
|
||||||
if skin[key] == value then
|
|
||||||
table.insert(skinslist, skin)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
skins_sort(skinslist)
|
|
||||||
return skinslist
|
|
||||||
end
|
|
|
@ -1,104 +0,0 @@
|
||||||
local S = minetest.get_translator("skinsdb")
|
|
||||||
|
|
||||||
local function show_selection_formspec(player)
|
|
||||||
local context = skinsdb5.get_formspec_context(player)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local skin = player_api.get_skin(player)
|
|
||||||
local formspec = "size[8,8]"..skinsdb5.get_skin_info_formspec(skin)
|
|
||||||
formspec = formspec..skinsdb5.get_skin_selection_formspec(player, context, 3.5)
|
|
||||||
minetest.show_formspec(name, 'skinsdb_show_ui', formspec)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_chatcommand("skinsdb", {
|
|
||||||
params = "[set] <skin key> | show [<skin key>] | list | list private | list public | [ui]",
|
|
||||||
description = S("Show, list or set player's skin"),
|
|
||||||
func = function(name, param)
|
|
||||||
local player = minetest.get_player_by_name(name)
|
|
||||||
if not player then
|
|
||||||
return false, S("Player not found")
|
|
||||||
end
|
|
||||||
|
|
||||||
-- parse command line
|
|
||||||
local command, parameter
|
|
||||||
local words = param:split(" ")
|
|
||||||
local word = words[1]
|
|
||||||
if word == 'set' or word == 'list' or word == 'show' or word == 'ui' then
|
|
||||||
command = word
|
|
||||||
parameter = words[2]
|
|
||||||
elseif player_api.registered_skins[word] then
|
|
||||||
command = 'set'
|
|
||||||
parameter = word
|
|
||||||
elseif not word then
|
|
||||||
command = 'ui'
|
|
||||||
else
|
|
||||||
return false, S("unknown command").." "..word..", "..S("see /help skinsdb for supported parameters")
|
|
||||||
end
|
|
||||||
|
|
||||||
if command == "set" then
|
|
||||||
if parameter then
|
|
||||||
if player_api.registered_skins[parameter] then
|
|
||||||
player_api.set_skin(player, parameter)
|
|
||||||
return true, S("skin set to").." "..parameter
|
|
||||||
else
|
|
||||||
return false, S("invalid skin").." "..parameter
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return false, S("requires skin key")
|
|
||||||
end
|
|
||||||
elseif command == "list" then
|
|
||||||
local list
|
|
||||||
if parameter == "private" then
|
|
||||||
list = skinsdb5.get_skinlist_with_meta("playername", name)
|
|
||||||
elseif parameter == "public" then
|
|
||||||
list = skinsdb5.get_skinlist_for_player()
|
|
||||||
elseif not parameter then
|
|
||||||
list = skinsdb5.get_skinlist_for_player(name)
|
|
||||||
else
|
|
||||||
return false, S("unknown parameter"), parameter
|
|
||||||
end
|
|
||||||
|
|
||||||
local current_skin_key = player_api.get_skin(player)
|
|
||||||
for _, skin in ipairs(list) do
|
|
||||||
local info = skin.name.." - "
|
|
||||||
..S("Name").."="..(skin.description or skin.name or "").." "
|
|
||||||
..S("Author").."="..(skin.author or "").." "
|
|
||||||
..S("License").."="..(skin.license or "")
|
|
||||||
if skin.name == current_skin_key then
|
|
||||||
info = minetest.colorize("#00FFFF", info)
|
|
||||||
end
|
|
||||||
minetest.chat_send_player(name, info)
|
|
||||||
end
|
|
||||||
elseif command == "show" then
|
|
||||||
local skin
|
|
||||||
if parameter then
|
|
||||||
skin = parameter
|
|
||||||
else
|
|
||||||
skin = player_api.get_skin(player)
|
|
||||||
end
|
|
||||||
if not skin then
|
|
||||||
return false, S("invalid skin")
|
|
||||||
end
|
|
||||||
local formspec = "size[8,3]"..skinsdb5.get_skin_info_formspec(skin)
|
|
||||||
minetest.show_formspec(name, 'skinsdb_show_skin', formspec)
|
|
||||||
elseif command == "ui" then
|
|
||||||
show_selection_formspec(player)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
||||||
if formname ~= "skinsdb_show_ui" then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local context = skinsdb5.get_formspec_context(player)
|
|
||||||
|
|
||||||
local action = skinsdb5.on_skin_selection_receive_fields(player, context, fields)
|
|
||||||
if action == 'set' then
|
|
||||||
minetest.close_formspec(player:get_player_name(), formname)
|
|
||||||
elseif action == 'page' then
|
|
||||||
show_selection_formspec(player)
|
|
||||||
end
|
|
||||||
end)
|
|
|
@ -1,132 +0,0 @@
|
||||||
local S = minetest.get_translator("skinsdb")
|
|
||||||
|
|
||||||
function skinsdb5.get_formspec_context(player)
|
|
||||||
if player then
|
|
||||||
local playername = player:get_player_name()
|
|
||||||
skinsdb5.ui_context[playername] = skinsdb5.ui_context[playername] or {}
|
|
||||||
return skinsdb5.ui_context[playername]
|
|
||||||
else
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Show skin info
|
|
||||||
function skinsdb5.get_skin_info_formspec(skin_name)
|
|
||||||
local skin = player_api.registered_skins[skin_name]
|
|
||||||
if not skin then
|
|
||||||
return ""
|
|
||||||
end
|
|
||||||
local texture = skin.texture or (skin.textures and skin.textures[1])
|
|
||||||
if not skin.preview and texture then
|
|
||||||
skin.preview = skinsdb5.get_preview(texture, skin.format)
|
|
||||||
end
|
|
||||||
local formspec = ""
|
|
||||||
if skin.preview then
|
|
||||||
formspec = formspec.."image[0,.75;1,2;"..skin.preview.."]"
|
|
||||||
end
|
|
||||||
if texture then
|
|
||||||
local raw_size = skin.format == "1.8" and "2,2" or "2,1"
|
|
||||||
formspec = formspec.."label[6,.5;"..S("Raw texture")..":]image[6,1;"..raw_size..";"..texture.."]"
|
|
||||||
end
|
|
||||||
formspec = formspec.."label[2,.5;"..S("Name")..": "..minetest.formspec_escape(skin.description or skin.name).."]"
|
|
||||||
if skin.author then
|
|
||||||
formspec = formspec.."label[2,1;"..S("Author")..": "..minetest.formspec_escape(skin.author).."]"
|
|
||||||
end
|
|
||||||
if skin.license then
|
|
||||||
formspec = formspec.."label[2,1.5;"..S("License")..": "..minetest.formspec_escape(skin.license).."]"
|
|
||||||
end
|
|
||||||
return formspec
|
|
||||||
end
|
|
||||||
|
|
||||||
function skinsdb5.get_skin_selection_formspec(player, context, y_delta)
|
|
||||||
local skins_list = skinsdb5.get_skinlist_for_player(player:get_player_name())
|
|
||||||
local current_skin = player_api.registered_skins[player_api.get_skin(player)]
|
|
||||||
context.skins_list = {}
|
|
||||||
context.total_pages = 1
|
|
||||||
context.dropdown_values = nil
|
|
||||||
|
|
||||||
for i, skin in ipairs(skins_list) do
|
|
||||||
local page = math.floor((i-1) / 16)+1
|
|
||||||
local page_index = (i-1)%16+1
|
|
||||||
context.total_pages = page
|
|
||||||
context.skins_list[i] = {
|
|
||||||
name = skin.name,
|
|
||||||
page = page,
|
|
||||||
page_index = page_index
|
|
||||||
}
|
|
||||||
|
|
||||||
if not context.skins_page and skin.name == current_skin then
|
|
||||||
context.skins_page = page
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context.skins_page = context.skins_page or 1
|
|
||||||
local current_page = context.skins_page
|
|
||||||
local formspec = ""
|
|
||||||
for i = (current_page-1)*16+1, current_page*16 do
|
|
||||||
local skin = skins_list[i]
|
|
||||||
if not skin then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
if not skin.preview then
|
|
||||||
local texture = skin.texture or (skin.textures and skin.textures[1])
|
|
||||||
if texture then
|
|
||||||
skin.preview = skinsdb5.get_preview(texture, skin.format)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local index_p = context.skins_list[i].page_index
|
|
||||||
local x = (index_p-1) % 8
|
|
||||||
local y
|
|
||||||
if index_p > 8 then
|
|
||||||
y = y_delta + 1.9
|
|
||||||
else
|
|
||||||
y = y_delta
|
|
||||||
end
|
|
||||||
formspec = formspec.."image_button["..x..","..y..";1,2;"..
|
|
||||||
(skin.preview or "")..";skins_set$"..i..";]"..
|
|
||||||
"tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin.description or skin.name).."]"
|
|
||||||
end
|
|
||||||
|
|
||||||
if context.total_pages > 1 then
|
|
||||||
local page_prev = current_page - 1
|
|
||||||
local page_next = current_page + 1
|
|
||||||
if page_prev < 1 then
|
|
||||||
page_prev = context.total_pages
|
|
||||||
end
|
|
||||||
if page_next > context.total_pages then
|
|
||||||
page_next = 1
|
|
||||||
end
|
|
||||||
local page_list = ""
|
|
||||||
context.dropdown_values = {}
|
|
||||||
for pg=1, context.total_pages do
|
|
||||||
local pagename = S("Page").." "..pg.."/"..context.total_pages
|
|
||||||
context.dropdown_values[pagename] = pg
|
|
||||||
if pg > 1 then page_list = page_list.."," end
|
|
||||||
page_list = page_list..pagename
|
|
||||||
end
|
|
||||||
formspec = formspec
|
|
||||||
.."button[0,"..(y_delta+4.0)..";1,.5;skins_page$"..page_prev..";<<]"
|
|
||||||
.."dropdown[0.9,"..(y_delta+3.88)..";6.5,.5;skins_selpg;"..page_list..";"..context.skins_page.."]"
|
|
||||||
.."button[7,"..(y_delta+4.0)..";1,.5;skins_page$"..page_next..";>>]"
|
|
||||||
end
|
|
||||||
return formspec
|
|
||||||
end
|
|
||||||
|
|
||||||
function skinsdb5.on_skin_selection_receive_fields(player, context, fields)
|
|
||||||
for field, _ in pairs(fields) do
|
|
||||||
local current = field:split("$", 2)
|
|
||||||
if current[1] == "skins_set" then
|
|
||||||
player_api.set_skin(player, context.skins_list[tonumber(current[2])].name)
|
|
||||||
return 'set'
|
|
||||||
elseif current[1] == "skins_page" then
|
|
||||||
context.skins_page = tonumber(current[2])
|
|
||||||
return 'page'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if fields.skins_selpg then
|
|
||||||
context.skins_page = tonumber(context.dropdown_values[fields.skins_selpg])
|
|
||||||
return 'page'
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,29 +0,0 @@
|
||||||
-- Rework 2018-2020 by bell07
|
|
||||||
-- License: GPLv3
|
|
||||||
|
|
||||||
skinsdb5 = {}
|
|
||||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
|
||||||
skinsdb5.modpath = modpath
|
|
||||||
|
|
||||||
dofile(modpath.."/api.lua")
|
|
||||||
dofile(modpath.."/preview.lua")
|
|
||||||
dofile(modpath.."/formspecs.lua")
|
|
||||||
dofile(modpath.."/chatcommands.lua")
|
|
||||||
|
|
||||||
-- Unified inventory page/integration
|
|
||||||
if minetest.get_modpath("unified_inventory") then
|
|
||||||
dofile(modpath.."/unified_inventory_page.lua")
|
|
||||||
end
|
|
||||||
|
|
||||||
if minetest.get_modpath("sfinv") then
|
|
||||||
dofile(modpath.."/sfinv_page.lua")
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Update skin on join
|
|
||||||
skinsdb5.ui_context = {}
|
|
||||||
minetest.register_on_leaveplayer(function(player)
|
|
||||||
skinsdb5.ui_context[player:get_player_name()] = nil
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Read current mod textures- and meta- folder
|
|
||||||
player_api.read_textures_and_meta()
|
|
|
@ -1,19 +0,0 @@
|
||||||
# textdomain: skinsdb
|
|
||||||
# Translation by Xanthin
|
|
||||||
|
|
||||||
Raw texture=Rohtextur
|
|
||||||
Name=Name
|
|
||||||
Author=Autor
|
|
||||||
Change=Wechseln
|
|
||||||
Page=Seite
|
|
||||||
License=Lizenz
|
|
||||||
Description=Beschreibung
|
|
||||||
Show, list or set player's skin=Anzeigen oder setzen der Spieler-Skins
|
|
||||||
Player not found=Spieler nicht da
|
|
||||||
unknown command=unbekannter Befehl
|
|
||||||
see /help skinsdb for supported parameters=Lese /help für erlaubte Parameter
|
|
||||||
skin set to=Skin ist jetzt
|
|
||||||
invalid skin=unbekannter Skin
|
|
||||||
requires skin key=Skin key benötigt
|
|
||||||
unknown parameter=unbekannter Parameter
|
|
||||||
Skins=Aussehen
|
|
|
@ -1,18 +0,0 @@
|
||||||
# textdomain: skinsdb
|
|
||||||
|
|
||||||
Raw texture=Texture
|
|
||||||
Name=Nom
|
|
||||||
Author=Auteur
|
|
||||||
Change=Changer
|
|
||||||
Page=Page
|
|
||||||
License=Licence
|
|
||||||
Description=Description
|
|
||||||
Show, list or set player's skin=Afficher, lister ou définir le skin du joueur
|
|
||||||
Player not found=Joueur non trouvé
|
|
||||||
unknown command=commande inconnue
|
|
||||||
see /help skinsdb for supported parameters=voir /help skinsdb pour les paramètres supportés
|
|
||||||
skin set to=skin définie sur
|
|
||||||
invalid skin=skin peau invalide
|
|
||||||
unknown parameter=paramètre inconnu
|
|
||||||
unknown skin=skin inconnue
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
# textdomain: skinsdb
|
|
||||||
# Malay translation by muhdnurhidayat
|
|
||||||
|
|
||||||
Raw texture=Tekstur mentah
|
|
||||||
Name=Nama
|
|
||||||
Author=Pencipta
|
|
||||||
Change=Ubah
|
|
||||||
Page=Halaman
|
|
||||||
License=Lesen
|
|
||||||
Description=Keterangan
|
|
||||||
Show, list or set player's skin=Tunjukkan, senaraikan atau tetapkan kulit pemain
|
|
||||||
Player not found=Pemain tidak dijumpai
|
|
||||||
unknown command=perintah tidak diketahui
|
|
||||||
see /help skinsdb for supported parameters=lihat /help skinsdb untuk parameter yang disokong
|
|
||||||
skin set to=kulit ditetapkan kepada
|
|
||||||
invalid skin=kulit tidak sah
|
|
||||||
unknown parameter=parameter tidak diketahui
|
|
||||||
unknown skin=kulit tidak diketahui
|
|
|
@ -1,20 +0,0 @@
|
||||||
# textdomain: skinsdb
|
|
||||||
#Translation by IFRFSX(BingFengFSX)
|
|
||||||
|
|
||||||
Raw texture=自然状态的纹理
|
|
||||||
Name=名称
|
|
||||||
Author=作者
|
|
||||||
Change=更换
|
|
||||||
Page=页面
|
|
||||||
License=许可证
|
|
||||||
Description=说明
|
|
||||||
Show, list or set player's skin=显示,列出或者设置玩家的皮肤
|
|
||||||
Player not found=玩家未找到
|
|
||||||
unknown command=未知命令
|
|
||||||
see /help skinsdb for supported parameters=有关skinsdb支持的参数,参见 /help
|
|
||||||
skin set to=皮肤设置为
|
|
||||||
invalid skin=无效皮肤
|
|
||||||
unknown parameter=未知参数
|
|
||||||
unknown skin=未知皮肤
|
|
||||||
Downloads the specified range of skins and shuts down the server=下载指定范围的皮肤并关闭服务器
|
|
||||||
Skins=皮肤
|
|
|
@ -1,19 +0,0 @@
|
||||||
# textdomain: skinsdb
|
|
||||||
#Translation by IFRFSX(BingFengFSX)
|
|
||||||
Raw texture=自然狀態的紋理
|
|
||||||
Name=名稱
|
|
||||||
Author=作者
|
|
||||||
Change=更換
|
|
||||||
Page=頁面
|
|
||||||
License=許可證
|
|
||||||
Description=說明
|
|
||||||
Show,list or set player's skin=顯示,列出或者設定玩家的皮膚
|
|
||||||
Player not found=玩家未找到
|
|
||||||
unknown command=未知命令
|
|
||||||
see /help skinsdb for supported parameters=有關skinsdb支持的參數,參見/help
|
|
||||||
skin set to=皮膚設定為
|
|
||||||
invalid skin=無效皮膚
|
|
||||||
unknown parameter=未知參數
|
|
||||||
unknown skin=未知皮膚
|
|
||||||
Downloads the specified range of skins and shuts down the server=下載指定範圍的皮膚並關閉服務器
|
|
||||||
Skins=皮膚
|
|
|
@ -1,20 +0,0 @@
|
||||||
# textdomain: skinsdb
|
|
||||||
|
|
||||||
Raw texture=
|
|
||||||
Name=
|
|
||||||
Author=
|
|
||||||
Change=
|
|
||||||
Page=
|
|
||||||
License=
|
|
||||||
Description=
|
|
||||||
Show, list or set player's skin=
|
|
||||||
Player not found=
|
|
||||||
unknown command=
|
|
||||||
see /help skinsdb for supported parameters=
|
|
||||||
skin set to=
|
|
||||||
invalid skin=
|
|
||||||
requires skin key=
|
|
||||||
unknown parameter=
|
|
||||||
unknown skin=
|
|
||||||
Downloads the specified range of skins and shuts down the server=
|
|
||||||
Skins=
|
|
|
@ -1,3 +0,0 @@
|
||||||
For each skin in textures folder a metadata file can be applied with ".txt" suffix.
|
|
||||||
character.png requires character.txt for example.
|
|
||||||
For file content see player_api/skin_api.txt for reference.
|
|
|
@ -1,4 +0,0 @@
|
||||||
name = skinsdb5
|
|
||||||
description = Player skin mod, supporting sfinv and unified_inventory
|
|
||||||
depends = player_api
|
|
||||||
optional_depends = sfinv,unified_inventory
|
|
|
@ -1,60 +0,0 @@
|
||||||
-- stohlen from https://github.com/GreenXenith/skinsdb/blob/master/skin_meta_api.lua
|
|
||||||
function skinsdb5.get_preview(texture, format)
|
|
||||||
local player_skin = "("..texture..")"
|
|
||||||
local skin = ""
|
|
||||||
|
|
||||||
-- Consistent on both sizes:
|
|
||||||
--Chest
|
|
||||||
skin = skin .. "([combine:16x32:-16,-12=" .. player_skin .. "^[mask:skindb_mask_chest.png)^"
|
|
||||||
--Head
|
|
||||||
skin = skin .. "([combine:16x32:-4,-8=" .. player_skin .. "^[mask:skindb_mask_head.png)^"
|
|
||||||
--Hat
|
|
||||||
skin = skin .. "([combine:16x32:-36,-8=" .. player_skin .. "^[mask:skindb_mask_head.png)^"
|
|
||||||
--Right Arm
|
|
||||||
skin = skin .. "([combine:16x32:-44,-12=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^"
|
|
||||||
--Right Leg
|
|
||||||
skin = skin .. "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^"
|
|
||||||
|
|
||||||
-- 64x skins have non-mirrored arms and legs
|
|
||||||
local left_arm
|
|
||||||
local left_leg
|
|
||||||
|
|
||||||
if format == "1.8" then
|
|
||||||
left_arm = "([combine:16x32:-24,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^"
|
|
||||||
left_leg = "([combine:16x32:-12,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))^"
|
|
||||||
else
|
|
||||||
left_arm = "([combine:16x32:-44,-12=" .. player_skin .. "^[mask:skindb_mask_rarm.png^[transformFX)^"
|
|
||||||
left_leg = "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png^[transformFX)^"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Left Arm
|
|
||||||
skin = skin .. left_arm
|
|
||||||
--Left Leg
|
|
||||||
skin = skin .. left_leg
|
|
||||||
|
|
||||||
-- Add overlays for 64x skins. these wont appear if skin is 32x because it will be cropped out
|
|
||||||
--Chest Overlay
|
|
||||||
skin = skin .. "([combine:16x32:-16,-28=" .. player_skin .. "^[mask:skindb_mask_chest.png)^"
|
|
||||||
--Right Arm Overlay
|
|
||||||
skin = skin .. "([combine:16x32:-44,-28=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^"
|
|
||||||
--Right Leg Overlay
|
|
||||||
skin = skin .. "([combine:16x32:0,-16=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^"
|
|
||||||
--Left Arm Overlay
|
|
||||||
skin = skin .. "([combine:16x32:-40,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^"
|
|
||||||
--Left Leg Overlay
|
|
||||||
skin = skin .. "([combine:16x32:4,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))"
|
|
||||||
|
|
||||||
-- Full Preview
|
|
||||||
skin = "(((" .. skin .. ")^[resize:64x128)^[mask:skindb_transform.png)"
|
|
||||||
return minetest.formspec_escape(skin)
|
|
||||||
end
|
|
||||||
|
|
||||||
player_api.register_on_skin_change(function(player, model_name, skin_name)
|
|
||||||
local skin = player_api.registered_skins[skin_name]
|
|
||||||
if not skin.preview then
|
|
||||||
local texture = skin.texture or (skin.textures and skin.textures[1])
|
|
||||||
if texture then
|
|
||||||
skin.preview = skinsdb5.get_preview(texture, skin.format)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
|
@ -1,29 +0,0 @@
|
||||||
local S = minetest.get_translator("skinsdb")
|
|
||||||
|
|
||||||
-- generate the current formspec
|
|
||||||
local function get_formspec(player, context)
|
|
||||||
local skin = player_api.get_skin(player)
|
|
||||||
local formspec = skinsdb5.get_skin_info_formspec(skin)
|
|
||||||
formspec = formspec..skinsdb5.get_skin_selection_formspec(player, context, 4)
|
|
||||||
return formspec
|
|
||||||
end
|
|
||||||
|
|
||||||
sfinv.register_page("skinsdb5:overview", {
|
|
||||||
title = S("Skins"),
|
|
||||||
get = function(self, player, context)
|
|
||||||
-- collect skins data
|
|
||||||
return sfinv.make_formspec(player, context, get_formspec(player, context))
|
|
||||||
end,
|
|
||||||
on_player_receive_fields = function(self, player, context, fields)
|
|
||||||
local action = skinsdb5.on_skin_selection_receive_fields(player, context, fields)
|
|
||||||
if action == "page" then
|
|
||||||
sfinv.set_player_inventory_formspec(player)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
player_api.register_on_skin_change(function(player, model_name, skin_name)
|
|
||||||
if sfinv.enabled then
|
|
||||||
sfinv.set_player_inventory_formspec(player)
|
|
||||||
end
|
|
||||||
end)
|
|
Before Width: | Height: | Size: 673 B |
|
@ -1,6 +0,0 @@
|
||||||
In this folder the skin files could be placed according the next file naming convention
|
|
||||||
character_[number].png - Public skin, available for all users
|
|
||||||
character_[name].png - Public skin, but named as "name" - usefull to enhance already provided skins like sam
|
|
||||||
player_[nick].png or player_[nick]_[number].png - one or multiple private skins for player "nick"
|
|
||||||
*_preview.png - Preview files for public and private skins - Optional, overrides the generated preview
|
|
||||||
|
|
Before Width: | Height: | Size: 114 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 118 B |
Before Width: | Height: | Size: 118 B |
Before Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 250 B |
Before Width: | Height: | Size: 6 KiB |
|
@ -1,57 +0,0 @@
|
||||||
local S = minetest.get_translator("skinsdb")
|
|
||||||
|
|
||||||
unified_inventory.register_page("skins", {
|
|
||||||
get_formspec = function(player)
|
|
||||||
local skin = player_api.get_skin(player)
|
|
||||||
local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]"..skinsdb5.get_skin_info_formspec(skin)..
|
|
||||||
"button[.75,3;6.5,.5;skins_page;"..S("Change").."]"
|
|
||||||
return {formspec=formspec}
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
unified_inventory.register_button("skins", {
|
|
||||||
type = "image",
|
|
||||||
image = "skins_button.png",
|
|
||||||
tooltip = S("Skins"),
|
|
||||||
})
|
|
||||||
|
|
||||||
local function get_formspec(player)
|
|
||||||
local context = skinsdb5.get_formspec_context(player)
|
|
||||||
local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]"..
|
|
||||||
skinsdb5.get_skin_selection_formspec(player, context, -0.2)
|
|
||||||
return formspec
|
|
||||||
end
|
|
||||||
|
|
||||||
unified_inventory.register_page("skins_page", {
|
|
||||||
get_formspec = function(player)
|
|
||||||
return {formspec=get_formspec(player)}
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
-- click button handlers
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
||||||
if fields.skins then
|
|
||||||
unified_inventory.set_inventory_formspec(player, "craft")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if formname ~= "" then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local context = skinsdb5.get_formspec_context(player)
|
|
||||||
local action = skinsdb5.on_skin_selection_receive_fields(player, context, fields)
|
|
||||||
if action == "set" then
|
|
||||||
unified_inventory.set_inventory_formspec(player, "skins")
|
|
||||||
elseif action == "page" then
|
|
||||||
unified_inventory.set_inventory_formspec(player, "skins_page")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
player_api.register_on_skin_change(function(player, model_name, skin_name)
|
|
||||||
local player_name = player:get_player_name()
|
|
||||||
-- refresh skins page if selected
|
|
||||||
if unified_inventory.current_page[player_name] == "skins" then
|
|
||||||
unified_inventory.set_inventory_formspec(player, "skins")
|
|
||||||
end
|
|
||||||
end)
|
|