Compare commits
31 Commits
minetest-0
...
b769824d24
Author | SHA1 | Date | |
---|---|---|---|
b769824d24 | |||
03d424fea7 | |||
c9fa5d92df | |||
af5e6fcecc | |||
2e39651821 | |||
da820d06cb | |||
cf712e5b54 | |||
c51905d44b | |||
b3ea5a9e1f | |||
e479e8e745 | |||
716a9a3f9a | |||
c53158d159 | |||
da6905fd02 | |||
8048cb08f1 | |||
77c00a0823 | |||
8799ba0bd5 | |||
b5ba66deca | |||
1fcd3c4a8c | |||
55704e1657 | |||
ec30267223 | |||
55dc55f2dd | |||
ada930c099 | |||
918df53f3b | |||
664a4a8d81 | |||
9525b87c4d | |||
abb5422948 | |||
aa82f804b8 | |||
165c20fcad | |||
555d682f04 | |||
e5714f272c | |||
fa92207f14 |
11
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
on: [push, pull_request]
|
||||||
|
name: build
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: lint
|
||||||
|
uses: Roang-zero1/factorio-mod-luacheck@master
|
||||||
|
with:
|
||||||
|
luacheckrc_url: ""
|
13
.luacheckrc
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
unused_args = false
|
||||||
|
allow_defined_top = true
|
||||||
|
max_line_length = 999
|
||||||
|
|
||||||
|
globals = {
|
||||||
|
"minetest", "unified_inventory", "core",
|
||||||
|
"player_api", "clothing", "armor", "sfinv",
|
||||||
|
}
|
||||||
|
|
||||||
|
read_globals = {
|
||||||
|
string = {fields = {"split", "trim"}},
|
||||||
|
table = {fields = {"copy", "getn"}},
|
||||||
|
}
|
12
API.md
@ -55,6 +55,16 @@ Get the skin texture for any reason. Note to apply them the skin:set_skin() shou
|
|||||||
|
|
||||||
Could be redefined for dynamic texture generation
|
Could be redefined for dynamic texture generation
|
||||||
|
|
||||||
|
## skin:set_hand(hand_node)
|
||||||
|
Set the hand node to be used with this skin
|
||||||
|
|
||||||
|
## skin:set_hand_from_texture()
|
||||||
|
Register and set hand node based on skin texture
|
||||||
|
Only works on mod load
|
||||||
|
|
||||||
|
## skin:get_hand()
|
||||||
|
Get hand node. Returns ItemStack
|
||||||
|
|
||||||
## skin:set_preview(texture)
|
## skin:set_preview(texture)
|
||||||
Set the skin preview - usually at the init time only
|
Set the skin preview - usually at the init time only
|
||||||
|
|
||||||
@ -67,7 +77,7 @@ Could be redefined for dynamic preview texture generation
|
|||||||
Hook for dynamic skins updates on select. Is called in skins.set_player_skin()
|
Hook for dynamic skins updates on select. Is called in skins.set_player_skin()
|
||||||
In skinsdb the default implementation for this function is empty.
|
In skinsdb the default implementation for this function is empty.
|
||||||
|
|
||||||
skin:apply_skin_to_player(player)
|
## skin:apply_skin_to_player(player)
|
||||||
Apply the skin to the player. Called in skins.update_player_skin() to update visuals
|
Apply the skin to the player. Called in skins.update_player_skin() to update visuals
|
||||||
|
|
||||||
## skin:set_meta(key, value)
|
## skin:set_meta(key, value)
|
||||||
|
18
README.md
@ -9,16 +9,20 @@ This Minetest mod offers changeable player skins with a graphical interface for
|
|||||||
- Skin change menu for sfinv (in minetest_game) and [unified_inventory](https://forum.minetest.net/viewtopic.php?t=12767)
|
- Skin change menu for sfinv (in minetest_game) and [unified_inventory](https://forum.minetest.net/viewtopic.php?t=12767)
|
||||||
- Skins change menu and command line using chat command /skinsdb (set | show | list | list private | list public | ui)
|
- Skins change menu and command line using chat command /skinsdb (set | show | list | list private | list public | ui)
|
||||||
- Supported by [smart_inventory](https://forum.minetest.net/viewtopic.php?t=16597) for the skin selection
|
- Supported by [smart_inventory](https://forum.minetest.net/viewtopic.php?t=16597) for the skin selection
|
||||||
|
- Supported by [i3](https://github.com/minetest-mods/i3) inventory mod
|
||||||
- Skin previews supported in selection
|
- Skin previews supported in selection
|
||||||
- Additional information for each skin
|
- Additional information for each skin
|
||||||
- Support for different skins lists: public and a per-player list are currently implemented
|
- Support for different skins lists: public and a per-player list are currently implemented
|
||||||
- Full [3d_armor](https://forum.minetest.net/viewtopic.php?t=4654) support
|
- Full [3d_armor](https://forum.minetest.net/viewtopic.php?t=4654) support
|
||||||
- Compatible to 1.0 and 1.8 Minecraft skins format
|
- Compatible to 1.0 and 1.8 Minecraft skins format
|
||||||
|
- Skinned hand in 1st person view (1.0 skins only)
|
||||||
|
|
||||||
|
|
||||||
## Installing skins
|
## Installing skins
|
||||||
|
|
||||||
### Download from the database
|
### Download from the [database](http://minetest.fensta.bplaced.net/)
|
||||||
|
|
||||||
|
#### Ingame Downloader
|
||||||
|
|
||||||
1) Get Minetest 5.1.0-dev-cb00632 or newer
|
1) Get Minetest 5.1.0-dev-cb00632 or newer
|
||||||
2) Start your world
|
2) Start your world
|
||||||
@ -28,6 +32,16 @@ This Minetest mod offers changeable player skins with a graphical interface for
|
|||||||
|
|
||||||
You might want to run `minetest` in a Terminal/Console window to check the log output instantly.
|
You might want to run `minetest` in a Terminal/Console window to check the log output instantly.
|
||||||
|
|
||||||
|
#### Python Download script
|
||||||
|
|
||||||
|
**Requirements:**
|
||||||
|
|
||||||
|
* Python 3
|
||||||
|
* `requests` library: `pip3 install requests`
|
||||||
|
|
||||||
|
Go to the updater folder of this mod and run `python3 update_skins.py`
|
||||||
|
The Script will download all the skins from the database for you.
|
||||||
|
|
||||||
### Manual addition
|
### Manual addition
|
||||||
|
|
||||||
1) Copy your skin textures to `textures` as documented in `textures/readme.txt`
|
1) Copy your skin textures to `textures` as documented in `textures/readme.txt`
|
||||||
@ -40,6 +54,7 @@ You might want to run `minetest` in a Terminal/Console window to check the log o
|
|||||||
## License:
|
## License:
|
||||||
- GPLv3
|
- GPLv3
|
||||||
- skin texture licenses: See "meta" folder
|
- skin texture licenses: See "meta" folder
|
||||||
|
- hand model: CC0
|
||||||
|
|
||||||
### Credits
|
### Credits
|
||||||
|
|
||||||
@ -49,3 +64,4 @@ You might want to run `minetest` in a Terminal/Console window to check the log o
|
|||||||
- Krock (source code)
|
- Krock (source code)
|
||||||
- bell07 (source code)
|
- bell07 (source code)
|
||||||
- stujones11 (player models)
|
- stujones11 (player models)
|
||||||
|
- jordan4ibanez (1st person view hand)
|
||||||
|
13
api.lua
@ -2,9 +2,11 @@
|
|||||||
local storage = minetest.get_mod_storage()
|
local storage = minetest.get_mod_storage()
|
||||||
|
|
||||||
function skins.get_player_skin(player)
|
function skins.get_player_skin(player)
|
||||||
if player:get_attribute("skinsdb:skin_key") then
|
local meta = player:get_meta()
|
||||||
storage:set_string(player:get_player_name(), player:get_attribute("skinsdb:skin_key"))
|
if meta:get("skinsdb:skin_key") then
|
||||||
player:set_attribute("skinsdb:skin_key", nil)
|
-- Move player data prior July 2018 to mod storage
|
||||||
|
storage:set_string(player:get_player_name(), meta:get_string("skinsdb:skin_key"))
|
||||||
|
meta:set_string("skinsdb:skin_key", "")
|
||||||
end
|
end
|
||||||
local skin = storage:get_string(player:get_player_name())
|
local skin = storage:get_string(player:get_player_name())
|
||||||
return skins.get(skin) or skins.get(skins.default)
|
return skins.get(skin) or skins.get(skins.default)
|
||||||
@ -32,7 +34,7 @@ function skins.assign_player_skin(player, skin)
|
|||||||
else
|
else
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
return true
|
return true, skin_obj
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update visuals
|
-- update visuals
|
||||||
@ -51,10 +53,11 @@ end
|
|||||||
|
|
||||||
-- Assign and update - should be used on selection externally
|
-- Assign and update - should be used on selection externally
|
||||||
function skins.set_player_skin(player, skin)
|
function skins.set_player_skin(player, skin)
|
||||||
local success = skins.assign_player_skin(player, skin)
|
local success, skin_obj = skins.assign_player_skin(player, skin)
|
||||||
if success then
|
if success then
|
||||||
skins.get_player_skin(player):set_skin(player)
|
skins.get_player_skin(player):set_skin(player)
|
||||||
skins.update_player_skin(player)
|
skins.update_player_skin(player)
|
||||||
|
minetest.log("action", player:get_player_name().." set skin to "..skin_obj:get_key(""))
|
||||||
end
|
end
|
||||||
return success
|
return success
|
||||||
end
|
end
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
local S = skins.S
|
local S = minetest.get_translator("skinsdb")
|
||||||
|
|
||||||
local function show_selection_formspec(player)
|
local function show_selection_formspec(player)
|
||||||
local context = skins.get_formspec_context(player)
|
local context = skins.get_formspec_context(player)
|
||||||
@ -36,12 +36,15 @@ minetest.register_chatcommand("skinsdb", {
|
|||||||
end
|
end
|
||||||
|
|
||||||
if command == "set" then
|
if command == "set" then
|
||||||
|
if parameter then
|
||||||
local success = skins.set_player_skin(player, parameter)
|
local success = skins.set_player_skin(player, parameter)
|
||||||
if success then
|
if success then
|
||||||
return true, S("skin set to").." "..parameter
|
return true, S("skin set to").." "..parameter
|
||||||
else
|
else
|
||||||
return false, S("invalid skin").." "..parameter
|
return false, S("invalid skin").." "..parameter
|
||||||
end
|
end
|
||||||
|
else return false, S("Requires skin key")
|
||||||
|
end
|
||||||
elseif command == "list" then
|
elseif command == "list" then
|
||||||
local list
|
local list
|
||||||
if parameter == "private" then
|
if parameter == "private" then
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
default
|
|
||||||
intllib?
|
|
||||||
unified_inventory?
|
|
||||||
3d_armor?
|
|
||||||
clothing?
|
|
||||||
sfinv?
|
|
104
formspecs.lua
@ -1,4 +1,5 @@
|
|||||||
local S = skins.S
|
local S = minetest.get_translator("skinsdb")
|
||||||
|
local ui = minetest.global_exists("unified_inventory") and unified_inventory
|
||||||
|
|
||||||
function skins.get_formspec_context(player)
|
function skins.get_formspec_context(player)
|
||||||
if player then
|
if player then
|
||||||
@ -11,36 +12,91 @@ function skins.get_formspec_context(player)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Show skin info
|
-- Show skin info
|
||||||
function skins.get_skin_info_formspec(skin)
|
function skins.get_skin_info_formspec(skin, perplayer_formspec)
|
||||||
local texture = skin:get_texture()
|
local texture = skin:get_texture()
|
||||||
local m_name = skin:get_meta_string("name")
|
local m_name = skin:get_meta_string("name")
|
||||||
local m_author = skin:get_meta_string("author")
|
local m_author = skin:get_meta_string("author")
|
||||||
local m_license = skin:get_meta_string("license")
|
local m_license = skin:get_meta_string("license")
|
||||||
|
local m_format = skin:get_meta("format")
|
||||||
-- overview page
|
-- overview page
|
||||||
local formspec = "image[0,.75;1,2;"..skin:get_preview().."]"
|
local raw_size = m_format == "1.8" and "2,2" or "2,1"
|
||||||
|
|
||||||
|
local lxoffs = 0.8
|
||||||
|
local cxoffs = 2
|
||||||
|
local rxoffs = 5.5
|
||||||
|
|
||||||
|
if type(perplayer_formspec) == "table" then -- we're using Unified Inventory
|
||||||
|
lxoffs = 1.5
|
||||||
|
cxoffs = 3.75
|
||||||
|
rxoffs = 7.5
|
||||||
|
end
|
||||||
|
|
||||||
|
local formspec = "image["..lxoffs..",.6;1,2;"..minetest.formspec_escape(skin:get_preview()).."]"
|
||||||
if texture then
|
if texture then
|
||||||
formspec = formspec.."label[6,.5;"..S("Raw texture")..":]"
|
formspec = formspec.."label["..rxoffs..",.5;"..S("Raw texture")..":]"
|
||||||
.."image[6,1;2,1;"..skin:get_texture().."]"
|
.."image["..rxoffs..",1;"..raw_size..";"..texture.."]"
|
||||||
end
|
end
|
||||||
if m_name ~= "" then
|
if m_name ~= "" then
|
||||||
formspec = formspec.."label[2,.5;"..S("Name")..": "..minetest.formspec_escape(m_name).."]"
|
formspec = formspec.."label["..cxoffs..",.5;"..S("Name")..": "..minetest.formspec_escape(m_name).."]"
|
||||||
end
|
end
|
||||||
if m_author ~= "" then
|
if m_author ~= "" then
|
||||||
formspec = formspec.."label[2,1;"..S("Author")..": "..minetest.formspec_escape(m_author).."]"
|
formspec = formspec.."label["..cxoffs..",1;"..S("Author")..": "..minetest.formspec_escape(m_author).."]"
|
||||||
end
|
end
|
||||||
if m_license ~= "" then
|
if m_license ~= "" then
|
||||||
formspec = formspec.."label[2,1.5;"..S("License")..": "..minetest.formspec_escape(m_license).."]"
|
formspec = formspec.."label["..cxoffs..",1.5;"..S("License")..": "..minetest.formspec_escape(m_license).."]"
|
||||||
end
|
end
|
||||||
return formspec
|
return formspec
|
||||||
end
|
end
|
||||||
|
|
||||||
function skins.get_skin_selection_formspec(player, context, y_delta)
|
function skins.get_skin_selection_formspec(player, context, perplayer_formspec)
|
||||||
context.skins_list = skins.get_skinlist_for_player(player:get_player_name())
|
context.skins_list = skins.get_skinlist_for_player(player:get_player_name())
|
||||||
context.total_pages = 1
|
context.total_pages = 1
|
||||||
|
local xoffs = 0
|
||||||
|
local yoffs = 4
|
||||||
|
local xspc = 1
|
||||||
|
local yspc = 2
|
||||||
|
local skinwidth = 1
|
||||||
|
local skinheight = 2
|
||||||
|
local xscale = 1 -- luacheck: ignore
|
||||||
|
local btn_y = 8.15
|
||||||
|
local drop_y = 8
|
||||||
|
local btn_width = 1
|
||||||
|
local droppos = 1
|
||||||
|
local droplen = 6.25
|
||||||
|
local btn_right = 7
|
||||||
|
local maxdisp = 16
|
||||||
|
|
||||||
|
local ctrls_height = 0.5
|
||||||
|
|
||||||
|
if type(perplayer_formspec) == "table" then -- it's being used under Unified Inventory
|
||||||
|
xoffs = perplayer_formspec.std_inv_x
|
||||||
|
xspc = ui.imgscale
|
||||||
|
yspc = ui.imgscale*2
|
||||||
|
skinwidth = ui.imgscale*0.9
|
||||||
|
skinheight = ui.imgscale*1.9
|
||||||
|
xscale = ui.imgscale
|
||||||
|
btn_width = ui.imgscale
|
||||||
|
droppos = xoffs + btn_width + 0.1
|
||||||
|
droplen = ui.imgscale * 6 - 0.2
|
||||||
|
btn_right = droppos + droplen + 0.1
|
||||||
|
|
||||||
|
if perplayer_formspec.pagecols == 4 then -- and we're in lite mode
|
||||||
|
yoffs = 1
|
||||||
|
maxdisp = 8
|
||||||
|
drop_y = yoffs + skinheight + 0.1
|
||||||
|
else
|
||||||
|
yoffs = 0.2
|
||||||
|
drop_y = yoffs + skinheight*2 + 0.2
|
||||||
|
end
|
||||||
|
|
||||||
|
btn_y = drop_y
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
for i, skin in ipairs(context.skins_list ) do
|
for i, skin in ipairs(context.skins_list ) do
|
||||||
local page = math.floor((i-1) / 16)+1
|
local page = math.floor((i-1) / maxdisp)+1
|
||||||
skin:set_meta("inv_page", page)
|
skin:set_meta("inv_page", page)
|
||||||
skin:set_meta("inv_page_index", (i-1)%16+1)
|
skin:set_meta("inv_page_index", (i-1)%maxdisp+1)
|
||||||
context.total_pages = page
|
context.total_pages = page
|
||||||
end
|
end
|
||||||
context.skins_page = context.skins_page or skins.get_player_skin(player):get_meta("inv_page") or 1
|
context.skins_page = context.skins_page or skins.get_player_skin(player):get_meta("inv_page") or 1
|
||||||
@ -48,22 +104,25 @@ function skins.get_skin_selection_formspec(player, context, y_delta)
|
|||||||
|
|
||||||
local page = context.skins_page
|
local page = context.skins_page
|
||||||
local formspec = ""
|
local formspec = ""
|
||||||
for i = (page-1)*16+1, page*16 do
|
|
||||||
|
for i = (page-1)*maxdisp+1, page*maxdisp do
|
||||||
local skin = context.skins_list[i]
|
local skin = context.skins_list[i]
|
||||||
if not skin then
|
if not skin then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
local index_p = skin:get_meta("inv_page_index")
|
local index_p = skin:get_meta("inv_page_index")
|
||||||
local x = (index_p-1) % 8
|
local x = ((index_p-1) % 8) * xspc + xoffs
|
||||||
local y
|
local y
|
||||||
if index_p > 8 then
|
if index_p > 8 then
|
||||||
y = y_delta + 1.9
|
y = yoffs + yspc
|
||||||
else
|
else
|
||||||
y = y_delta
|
y = yoffs
|
||||||
end
|
end
|
||||||
formspec = formspec.."image_button["..x..","..y..";1,2;"..
|
formspec = formspec..
|
||||||
skin:get_preview()..";skins_set$"..i..";]"..
|
string.format("image_button[%f,%f;%f,%f;%s;skins_set$%i;]",
|
||||||
|
x, y, skinwidth, skinheight,
|
||||||
|
minetest.formspec_escape(skin:get_preview()), i)..
|
||||||
"tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin:get_meta_string("name")).."]"
|
"tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin:get_meta_string("name")).."]"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -84,10 +143,13 @@ function skins.get_skin_selection_formspec(player, context, y_delta)
|
|||||||
if pg > 1 then page_list = page_list.."," end
|
if pg > 1 then page_list = page_list.."," end
|
||||||
page_list = page_list..pagename
|
page_list = page_list..pagename
|
||||||
end
|
end
|
||||||
formspec = formspec
|
formspec = formspec..
|
||||||
.."button[0,"..(y_delta+4.0)..";1,.5;skins_page$"..page_prev..";<<]"
|
string.format("button[%f,%f;%f,%f;skins_page$%i;<<]",
|
||||||
.."dropdown[0.9,"..(y_delta+3.88)..";6.5,.5;skins_selpg;"..page_list..";"..page.."]"
|
xoffs, btn_y, btn_width, ctrls_height, page_prev)..
|
||||||
.."button[7,"..(y_delta+4.0)..";1,.5;skins_page$"..page_next..";>>]"
|
string.format("button[%f,%f;%f,%f;skins_page$%i;>>]",
|
||||||
|
btn_right, btn_y, btn_width, ctrls_height, page_next)..
|
||||||
|
string.format("dropdown[%f,%f;%f,%f;skins_selpg;%s;%i]",
|
||||||
|
droppos, drop_y, droplen, ctrls_height, page_list, page)
|
||||||
end
|
end
|
||||||
return formspec
|
return formspec
|
||||||
end
|
end
|
||||||
|
46
init.lua
@ -3,19 +3,11 @@
|
|||||||
-- Copyright (c) 2012 cornernote, Dean Montgomery
|
-- Copyright (c) 2012 cornernote, Dean Montgomery
|
||||||
-- Rework 2017 by bell07
|
-- Rework 2017 by bell07
|
||||||
-- License: GPLv3
|
-- License: GPLv3
|
||||||
-- Boilerplate to support localized strings if intllib mod is installed.
|
|
||||||
|
|
||||||
skins = {}
|
skins = {}
|
||||||
skins.modpath = minetest.get_modpath(minetest.get_current_modname())
|
skins.modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||||
skins.default = "character"
|
skins.default = "character"
|
||||||
|
|
||||||
local S
|
|
||||||
if minetest.get_modpath("intllib") then
|
|
||||||
skins.S = intllib.Getter()
|
|
||||||
else
|
|
||||||
skins.S = function(s) return s end
|
|
||||||
end
|
|
||||||
|
|
||||||
dofile(skins.modpath.."/skin_meta_api.lua")
|
dofile(skins.modpath.."/skin_meta_api.lua")
|
||||||
dofile(skins.modpath.."/api.lua")
|
dofile(skins.modpath.."/api.lua")
|
||||||
dofile(skins.modpath.."/skinlist.lua")
|
dofile(skins.modpath.."/skinlist.lua")
|
||||||
@ -73,8 +65,6 @@ minetest.register_on_leaveplayer(function(player)
|
|||||||
skins.ui_context[player:get_player_name()] = nil
|
skins.ui_context[player:get_player_name()] = nil
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if minetest.global_exists("player_api") then
|
|
||||||
-- Minetest-5 and above compatible
|
|
||||||
player_api.register_model("skinsdb_3d_armor_character_5.b3d", {
|
player_api.register_model("skinsdb_3d_armor_character_5.b3d", {
|
||||||
animation_speed = 30,
|
animation_speed = 30,
|
||||||
textures = {
|
textures = {
|
||||||
@ -92,23 +82,21 @@ if minetest.global_exists("player_api") then
|
|||||||
sit = {x=81, y=160},
|
sit = {x=81, y=160},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
else
|
|
||||||
-- Minetest-0.4 compatible
|
-- Register default character.png if not part of this mod
|
||||||
default.player_register_model("skinsdb_3d_armor_character.b3d", {
|
local default_skin_obj = skins.get(skins.default)
|
||||||
animation_speed = 30,
|
if not default_skin_obj then
|
||||||
textures = {
|
default_skin_obj = skins.new(skins.default)
|
||||||
"blank.png",
|
default_skin_obj:set_texture("character.png")
|
||||||
"blank.png",
|
default_skin_obj:set_meta("format", '1.0')
|
||||||
"blank.png",
|
default_skin_obj:set_meta("_sort_id", 0)
|
||||||
"blank.png",
|
default_skin_obj:set_meta("name", "Sam")
|
||||||
},
|
default_skin_obj:set_hand_from_texture()
|
||||||
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},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Secure hand inventory slot
|
||||||
|
minetest.register_allow_player_inventory_action(function(player, action, inv, data)
|
||||||
|
if data.to_list == "hand" or data.from_list == "hand" or data.listname == "hand" then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
# 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
|
|
||||||
unknown parameter = unbekannter Parameter
|
|
@ -1,18 +0,0 @@
|
|||||||
# Template
|
|
||||||
|
|
||||||
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,17 +0,0 @@
|
|||||||
# 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
|
|
19
locale/skinsdb.de.tr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# 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
|
||||||
|
unknown parameter=unbekannter Parameter
|
||||||
|
Skins=Aussehen
|
||||||
|
Requires skin key=Benötigt Skin-Name
|
18
locale/skinsdb.fr.tr
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# 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
|
||||||
|
|
18
locale/skinsdb.ms.tr
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# 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
|
21
locale/skinsdb.ru.tr
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# textdomain: skinsdb
|
||||||
|
# Translation by Baytuch
|
||||||
|
|
||||||
|
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=смотрите /help skinsdb для просмотра параметров
|
||||||
|
skin set to=установлено скин
|
||||||
|
invalid skin=некорректный скин
|
||||||
|
unknown parameter=неопределенный параметр
|
||||||
|
unknown skin=неопределенный скин
|
||||||
|
Downloads the specified range of skins and shuts down the server=Загрузить массив скинов и остановить сервер
|
||||||
|
Skins=Скины
|
||||||
|
Requires skin key=Зависимый идентификатор скина
|
21
locale/skinsdb.uk.tr
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# textdomain: skinsdb
|
||||||
|
# Translation by Baytuch
|
||||||
|
|
||||||
|
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=дивіться /help skinsdb для перегляду параметрів
|
||||||
|
skin set to=встановлено скін
|
||||||
|
invalid skin=некоректний скін
|
||||||
|
unknown parameter=невизначений параметр
|
||||||
|
unknown skin=невизначений скін
|
||||||
|
Downloads the specified range of skins and shuts down the server=Завантажити масив скінів та зупинити сервер
|
||||||
|
Skins=Скіни
|
||||||
|
Requires skin key=Залежний ідентифікатор скіна
|
20
locale/skinsdb.zh_CN.tr
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# 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=皮肤
|
19
locale/skinsdb.zh_TW.tr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# 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,4 +1,4 @@
|
|||||||
# Template
|
# textdomain: skinsdb
|
||||||
|
|
||||||
Raw texture=
|
Raw texture=
|
||||||
Name=
|
Name=
|
||||||
@ -15,3 +15,6 @@ skin set to =
|
|||||||
invalid skin=
|
invalid skin=
|
||||||
unknown parameter=
|
unknown parameter=
|
||||||
unknown skin=
|
unknown skin=
|
||||||
|
Downloads the specified range of skins and shuts down the server=
|
||||||
|
Skins=
|
||||||
|
Requires skin key=
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
#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 = 下载指定范围的皮肤并关闭服务器
|
|
@ -1,3 +0,0 @@
|
|||||||
Sam 0
|
|
||||||
Jordach
|
|
||||||
CC BY-SA 3.0
|
|
4
mod.conf
@ -1 +1,5 @@
|
|||||||
name = skinsdb
|
name = skinsdb
|
||||||
|
description = Player skin mod, supporting unified_inventory, sfinv and smart_inventory
|
||||||
|
depends = player_api
|
||||||
|
optional_depends = unified_inventory,3d_armor,clothing,sfinv
|
||||||
|
min_minetest_version = 5.4.0
|
||||||
|
BIN
models/skinsdb_hand.b3d
Normal file
BIN
models/skinsdb_hand.blend
Normal file
@ -1,4 +1,4 @@
|
|||||||
local S = skins.S
|
local S = minetest.get_translator("skinsdb")
|
||||||
|
|
||||||
-- generate the current formspec
|
-- generate the current formspec
|
||||||
local function get_formspec(player, context)
|
local function get_formspec(player, context)
|
||||||
@ -9,7 +9,7 @@ local function get_formspec(player, context)
|
|||||||
end
|
end
|
||||||
|
|
||||||
sfinv.register_page("skins:overview", {
|
sfinv.register_page("skins:overview", {
|
||||||
title = "Skins",
|
title = S("Skins"),
|
||||||
get = function(self, player, context)
|
get = function(self, player, context)
|
||||||
-- collect skins data
|
-- collect skins data
|
||||||
return sfinv.make_formspec(player, context, get_formspec(player, context))
|
return sfinv.make_formspec(player, context, get_formspec(player, context))
|
||||||
|
@ -51,12 +51,91 @@ function skin_class:get_texture()
|
|||||||
return self._texture
|
return self._texture
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function skin_class:set_hand(hand)
|
||||||
|
self._hand = hand
|
||||||
|
end
|
||||||
|
|
||||||
|
local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true
|
||||||
|
function skin_class:set_hand_from_texture()
|
||||||
|
local hand = core.get_current_modname()..':'..self._texture:gsub('[%p%c%s]', '')
|
||||||
|
local hand_def = {}
|
||||||
|
for k,v in pairs(minetest.registered_items[""]) do
|
||||||
|
if k ~= "mod_origin" and k ~= "type" and k ~= "wield_image" then
|
||||||
|
hand_def[k] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hand_def.tiles = {self:get_texture()}
|
||||||
|
hand_def.visual_scale = 1
|
||||||
|
hand_def.wield_scale = {x=1,y=1,z=1}
|
||||||
|
hand_def.paramtype = "light"
|
||||||
|
hand_def.drawtype = "mesh"
|
||||||
|
hand_def.mesh = "skinsdb_hand.b3d"
|
||||||
|
hand_def.use_texture_alpha = ALPHA_CLIP
|
||||||
|
minetest.register_node(hand, hand_def)
|
||||||
|
self:set_hand(hand)
|
||||||
|
end
|
||||||
|
|
||||||
|
function skin_class:get_hand()
|
||||||
|
return self._hand
|
||||||
|
end
|
||||||
|
|
||||||
function skin_class:set_preview(value)
|
function skin_class:set_preview(value)
|
||||||
self._preview = value
|
self._preview = value
|
||||||
end
|
end
|
||||||
|
|
||||||
function skin_class:get_preview()
|
function skin_class:get_preview()
|
||||||
return self._preview or "player.png"
|
if self._preview then
|
||||||
|
return self._preview
|
||||||
|
end
|
||||||
|
|
||||||
|
local player_skin = "("..self:get_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 self:get_meta("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 skin
|
||||||
end
|
end
|
||||||
|
|
||||||
function skin_class:apply_skin_to_player(player)
|
function skin_class:apply_skin_to_player(player)
|
||||||
@ -73,13 +152,9 @@ function skin_class:apply_skin_to_player(player)
|
|||||||
|
|
||||||
local playername = player:get_player_name()
|
local playername = player:get_player_name()
|
||||||
local ver = self:get_meta("format") or "1.0"
|
local ver = self:get_meta("format") or "1.0"
|
||||||
if minetest.global_exists("player_api") then
|
|
||||||
-- Minetest-5 compatible
|
|
||||||
player_api.set_model(player, "skinsdb_3d_armor_character_5.b3d")
|
player_api.set_model(player, "skinsdb_3d_armor_character_5.b3d")
|
||||||
else
|
|
||||||
-- Minetest-0.4 compatible
|
|
||||||
default.player_set_model(player, "skinsdb_3d_armor_character.b3d")
|
|
||||||
end
|
|
||||||
local v10_texture = "blank.png"
|
local v10_texture = "blank.png"
|
||||||
local v18_texture = "blank.png"
|
local v18_texture = "blank.png"
|
||||||
local armor_texture = "blank.png"
|
local armor_texture = "blank.png"
|
||||||
@ -114,23 +189,12 @@ function skin_class:apply_skin_to_player(player)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if minetest.global_exists("player_api") then
|
|
||||||
-- Minetest-5 compatible
|
|
||||||
player_api.set_textures(player, {
|
player_api.set_textures(player, {
|
||||||
v10_texture,
|
v10_texture,
|
||||||
v18_texture,
|
v18_texture,
|
||||||
armor_texture,
|
armor_texture,
|
||||||
wielditem_texture,
|
wielditem_texture,
|
||||||
})
|
})
|
||||||
else
|
|
||||||
-- Minetest-0.4 compatible
|
|
||||||
default.player_set_textures(player, {
|
|
||||||
v10_texture,
|
|
||||||
v18_texture,
|
|
||||||
armor_texture,
|
|
||||||
wielditem_texture,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
player:set_properties({
|
player:set_properties({
|
||||||
visual_size = {
|
visual_size = {
|
||||||
@ -138,6 +202,14 @@ function skin_class:apply_skin_to_player(player)
|
|||||||
y = self:get_meta("visual_size_y") or 1
|
y = self:get_meta("visual_size_y") or 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local hand = self:get_hand()
|
||||||
|
if hand then
|
||||||
|
player:get_inventory():set_size("hand", 1)
|
||||||
|
player:get_inventory():set_stack("hand", 1, hand)
|
||||||
|
else
|
||||||
|
player:get_inventory():set_stack("hand", 1, "")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function skin_class:set_skin(player)
|
function skin_class:set_skin(player)
|
||||||
@ -149,5 +221,6 @@ end
|
|||||||
function skin_class:is_applicable_for_player(playername)
|
function skin_class:is_applicable_for_player(playername)
|
||||||
local assigned_player = self:get_meta("playername")
|
local assigned_player = self:get_meta("playername")
|
||||||
return assigned_player == nil or assigned_player == true or
|
return assigned_player == nil or assigned_player == true or
|
||||||
(assigned_player:lower() == playername:lower())
|
playername and (minetest.check_player_privs(playername, {server=true}) or
|
||||||
|
assigned_player:lower() == playername:lower())
|
||||||
end
|
end
|
||||||
|
13
skinlist.lua
@ -1,8 +1,7 @@
|
|||||||
|
|
||||||
local skins_dir_list = minetest.get_dir_list(skins.modpath.."/textures")
|
local skins_dir_list = minetest.get_dir_list(skins.modpath.."/textures")
|
||||||
|
|
||||||
for _, fn in pairs(skins_dir_list) do
|
for _, fn in pairs(skins_dir_list) do
|
||||||
local name, sort_id, assignment, is_preview, playername
|
local name, sort_id, is_preview, playername
|
||||||
local nameparts = string.gsub(fn, "[.]", "_"):split("_")
|
local nameparts = string.gsub(fn, "[.]", "_"):split("_")
|
||||||
|
|
||||||
-- check allowed prefix and file extension
|
-- check allowed prefix and file extension
|
||||||
@ -49,8 +48,12 @@ for _, fn in pairs(skins_dir_list) do
|
|||||||
skin_obj:set_meta("playername", playername)
|
skin_obj:set_meta("playername", playername)
|
||||||
end
|
end
|
||||||
local file = io.open(skins.modpath.."/textures/"..fn, "r")
|
local file = io.open(skins.modpath.."/textures/"..fn, "r")
|
||||||
skin_obj:set_meta("format", skins.get_skin_format(file))
|
local skin_format = skins.get_skin_format(file)
|
||||||
|
skin_obj:set_meta("format", skin_format)
|
||||||
file:close()
|
file:close()
|
||||||
|
if skin_format == "1.0" then
|
||||||
|
skin_obj:set_hand_from_texture()
|
||||||
|
end
|
||||||
file = io.open(skins.modpath.."/meta/"..name..".txt", "r")
|
file = io.open(skins.modpath.."/meta/"..name..".txt", "r")
|
||||||
if file then
|
if file then
|
||||||
local data = string.split(file:read("*all"), "\n", 3)
|
local data = string.split(file:read("*all"), "\n", 3)
|
||||||
@ -74,9 +77,9 @@ local function skins_sort(skinslist)
|
|||||||
local a_id = a:get_meta("_sort_id") or 10000
|
local a_id = a:get_meta("_sort_id") or 10000
|
||||||
local b_id = b:get_meta("_sort_id") or 10000
|
local b_id = b:get_meta("_sort_id") or 10000
|
||||||
if a_id ~= b_id then
|
if a_id ~= b_id then
|
||||||
return a:get_meta("_sort_id") < b:get_meta("_sort_id")
|
return a_id < b_id
|
||||||
else
|
else
|
||||||
return a:get_meta("name") < b:get_meta("name")
|
return (a:get_meta("name") or 'ZZ') < (b:get_meta("name") or 'ZZ')
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
-- Skins update script
|
-- Skins update script
|
||||||
|
|
||||||
local S = skins.S
|
local S = minetest.get_translator("skinsdb")
|
||||||
local _ID_ = "Lua Skins Updater"
|
local _ID_ = "Lua Skins Updater"
|
||||||
|
|
||||||
local internal = {}
|
local internal = {}
|
||||||
@ -75,7 +75,7 @@ end
|
|||||||
|
|
||||||
-- Insecure workaround since meta/ and textures/ cannot be written to
|
-- Insecure workaround since meta/ and textures/ cannot be written to
|
||||||
local function unsafe_file_write(path, contents)
|
local function unsafe_file_write(path, contents)
|
||||||
local f = ie.io.open(path, "w")
|
local f = ie.io.open(path, "wb")
|
||||||
f:write(contents)
|
f:write(contents)
|
||||||
f:close()
|
f:close()
|
||||||
end
|
end
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 673 B |
@ -7,6 +7,7 @@ One or multiple private skins for player "nick":
|
|||||||
player_[nick].png or
|
player_[nick].png or
|
||||||
player_[nick]_[number-or-name].png
|
player_[nick]_[number-or-name].png
|
||||||
|
|
||||||
Preview files for public and private skins:
|
Preview files for public and private skins.
|
||||||
|
Optional, overrides the generated preview
|
||||||
character_*_preview.png or
|
character_*_preview.png or
|
||||||
player_*_*_preview.png
|
player_*_*_preview.png
|
||||||
|
BIN
textures/skindb_mask_chest.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
textures/skindb_mask_head.png
Normal file
After Width: | Height: | Size: 139 B |
BIN
textures/skindb_mask_rarm.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
textures/skindb_mask_rleg.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
textures/skindb_transform.png
Normal file
After Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 250 B |
Before Width: | Height: | Size: 5.3 KiB |
@ -1,10 +1,13 @@
|
|||||||
local S = skins.S
|
local S = minetest.get_translator("skinsdb")
|
||||||
|
|
||||||
unified_inventory.register_page("skins", {
|
unified_inventory.register_page("skins", {
|
||||||
get_formspec = function(player)
|
get_formspec = function(player, perplayer_formspec)
|
||||||
local skin = skins.get_player_skin(player)
|
local skin = skins.get_player_skin(player)
|
||||||
local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]"..skins.get_skin_info_formspec(skin)..
|
local boffs = (type(perplayer_formspec) == "table") and 2 or 0.75
|
||||||
"button[.75,3;6.5,.5;skins_page;"..S("Change").."]"
|
|
||||||
|
local formspec = perplayer_formspec.standard_inv_bg..
|
||||||
|
skins.get_skin_info_formspec(skin, perplayer_formspec)..
|
||||||
|
"button["..boffs..",3;6.5,.5;skins_page;"..S("Change").."]"
|
||||||
return {formspec=formspec}
|
return {formspec=formspec}
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -12,18 +15,19 @@ unified_inventory.register_page("skins", {
|
|||||||
unified_inventory.register_button("skins", {
|
unified_inventory.register_button("skins", {
|
||||||
type = "image",
|
type = "image",
|
||||||
image = "skins_button.png",
|
image = "skins_button.png",
|
||||||
|
tooltip = S("Skins"),
|
||||||
})
|
})
|
||||||
|
|
||||||
local function get_formspec(player)
|
local function get_formspec(player, perplayer_formspec)
|
||||||
local context = skins.get_formspec_context(player)
|
local context = skins.get_formspec_context(player)
|
||||||
local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]"..
|
local formspec = perplayer_formspec.standard_inv_bg..
|
||||||
skins.get_skin_selection_formspec(player, context, -0.2)
|
skins.get_skin_selection_formspec(player, context, perplayer_formspec)
|
||||||
return formspec
|
return formspec
|
||||||
end
|
end
|
||||||
|
|
||||||
unified_inventory.register_page("skins_page", {
|
unified_inventory.register_page("skins_page", {
|
||||||
get_formspec = function(player)
|
get_formspec = function(player, perplayer_formspec)
|
||||||
return {formspec=get_formspec(player)}
|
return {formspec=get_formspec(player, perplayer_formspec)}
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
54
updater/update_skins.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import sys, requests, base64
|
||||||
|
|
||||||
|
download_preview = ( len (sys.argv) > 1 and sys.argv[1] == "with_preview" )
|
||||||
|
|
||||||
|
|
||||||
|
print("Downloading skins from minetest.fensta.bplaced.net ...")
|
||||||
|
# Requesting all skins and their raw texture using the API
|
||||||
|
r = requests.get('http://minetest.fensta.bplaced.net/api/v2/get.json.php?getlist&page=1&per_page=999999999')
|
||||||
|
|
||||||
|
if r.status_code != 200:
|
||||||
|
sys.exit("Request failed!")
|
||||||
|
|
||||||
|
data = r.json()
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
if download_preview:
|
||||||
|
print("Writing to file and downloading previews ...")
|
||||||
|
else:
|
||||||
|
print("Writing skins")
|
||||||
|
|
||||||
|
|
||||||
|
for json in data["skins"]:
|
||||||
|
id = str(json["id"])
|
||||||
|
|
||||||
|
# Texture file
|
||||||
|
raw_data = base64.b64decode(json["img"])
|
||||||
|
file = open("../textures/character_" + id + ".png", "wb")
|
||||||
|
file.write(bytearray(raw_data))
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
# Meta file
|
||||||
|
name = str(json["name"])
|
||||||
|
author = str(json["author"])
|
||||||
|
license = str(json["license"])
|
||||||
|
file = open("../meta/character_" + id + ".txt", "w")
|
||||||
|
file.write(name + "\n" + author + "\n" + license + "\n")
|
||||||
|
file.close()
|
||||||
|
print("Added #%s Name: %s Author: %s License: %s" % (id, name, author, license))
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
if download_preview:
|
||||||
|
# Downloading the preview of the skin
|
||||||
|
r2 = requests.get('http://minetest.fensta.bplaced.net/skins/1/' + id + ".png")
|
||||||
|
if r2.status_code == 200:
|
||||||
|
# Preview file
|
||||||
|
preview = r2.content
|
||||||
|
file = open("../textures/character_" + id + "_preview.png", "wb")
|
||||||
|
file.write(bytearray(preview))
|
||||||
|
file.close()
|
||||||
|
else:
|
||||||
|
print("Failed to download skin preview #" + id)
|
||||||
|
|
||||||
|
|
||||||
|
print("Fetched " + str(count) + " skins!")
|