2014-03-17 06:26:58 +01:00
-- Unified Skins for Minetest - based modified Bags from unfied_inventory and skins from inventory_plus
-- Copyright (c) 2012 cornernote, Dean Montgomery
-- License: GPLv3
u_skins = { }
2014-05-14 16:48:26 +02:00
u_skins.type = { SPRITE = 0 , MODEL = 1 , ERROR = 99 }
2014-03-17 06:26:58 +01:00
u_skins.pages = { }
u_skins.u_skins = { }
2014-05-14 16:48:26 +02:00
u_skins.file_save = false
2014-03-17 06:26:58 +01:00
u_skins.get_type = function ( texture )
2014-05-14 16:48:26 +02:00
if not texture then return u_skins.type . ERROR end
if not u_skins.meta [ texture ] then
return u_skins.type . ERROR
end
2014-03-17 06:26:58 +01:00
if string.sub ( texture , 0 , string.len ( " character " ) ) == " character " then
return u_skins.type . MODEL
end
if string.sub ( texture , 0 , string.len ( " player " ) ) == " player " then
return u_skins.type . SPRITE
end
2014-05-14 16:48:26 +02:00
return u_skins.type . ERROR
2014-03-17 06:26:58 +01:00
end
u_skins.modpath = minetest.get_modpath ( " u_skins " )
dofile ( u_skins.modpath .. " /skinlist.lua " )
dofile ( u_skins.modpath .. " /players.lua " )
u_skins.update_player_skin = function ( player )
2014-05-14 16:48:26 +02:00
local name = player : get_player_name ( )
local skin_type = u_skins.get_type ( u_skins.u_skins [ name ] )
if skin_type == u_skins.type . ERROR then
u_skins.u_skins [ name ] = " character_1 "
skin_type = u_skins.type . MODEL
end
if skin_type == u_skins.type . SPRITE then
2014-03-17 06:26:58 +01:00
player : set_properties ( {
visual = " upright_sprite " ,
textures = { u_skins.u_skins [ name ] .. " .png " , u_skins.u_skins [ name ] .. " _back.png " } ,
visual_size = { x = 1 , y = 2 } ,
} )
2014-05-14 16:48:26 +02:00
elseif skin_type == u_skins.type . MODEL then
2014-03-17 06:26:58 +01:00
player : set_properties ( {
visual = " mesh " ,
2014-04-17 11:03:20 +02:00
mesh = " character.x " ,
2014-03-17 06:26:58 +01:00
textures = { u_skins.u_skins [ name ] .. " .png " } ,
visual_size = { x = 1 , y = 1 } ,
} )
end
2014-05-14 16:48:26 +02:00
u_skins.file_save = true
2014-03-17 06:26:58 +01:00
end
-- Display Current Skin
unified_inventory.register_page ( " u_skins " , {
get_formspec = function ( player )
2014-05-14 16:48:26 +02:00
local name = player : get_player_name ( )
2014-03-17 06:26:58 +01:00
local formspec = " background[0.06,0.99;7.92,7.52;ui_misc_form.png] "
if u_skins.get_type ( u_skins.u_skins [ name ] ) == u_skins.type . MODEL then
2014-05-14 16:48:26 +02:00
formspec = formspec
.. " image[0,.75;1,2; " .. u_skins.u_skins [ name ] .. " _preview.png] "
--.. "image[1,.75;1,2;"..u_skins.u_skins[name].."_preview_back.png]"
.. " label[6,.5;Raw texture:] "
.. " image[6,1;2,1; " .. u_skins.u_skins [ name ] .. " .png] "
2014-03-17 06:26:58 +01:00
else
formspec = formspec
.. " image[0,.75;1,2; " .. u_skins.u_skins [ name ] .. " .png] "
.. " image[1,.75;1,2; " .. u_skins.u_skins [ name ] .. " _back.png] "
end
local meta = u_skins.meta [ u_skins.u_skins [ name ] ]
if meta then
2014-05-14 16:48:26 +02:00
if meta.name ~= " " then
formspec = formspec .. " label[2,.5;Name: " .. minetest.formspec_escape ( meta.name ) .. " ] "
2014-03-17 06:26:58 +01:00
end
2014-05-14 16:48:26 +02:00
if meta.author ~= " " then
formspec = formspec .. " label[2,1;Author: " .. minetest.formspec_escape ( meta.author ) .. " ] "
2014-03-17 06:26:58 +01:00
end
2014-05-14 16:48:26 +02:00
if meta.description ~= " " then
formspec = formspec .. " label[2,1.5; " .. minetest.formspec_escape ( meta.description ) .. " ] "
2014-03-17 06:26:58 +01:00
end
2014-05-14 16:48:26 +02:00
if meta.comment ~= " " then
formspec = formspec .. ' label[2,2;" ' .. minetest.formspec_escape ( meta.comment ) .. ' "] '
2014-03-17 06:26:58 +01:00
end
end
formspec = formspec .. " button[.75,3;6.5,.5;u_skins_page_0;Change] "
return { formspec = formspec }
end ,
} )
unified_inventory.register_button ( " u_skins " , {
type = " image " ,
image = " u_skins_button.png " ,
} )
-- Create all of the skin-picker pages.
for x = 0 , math.floor ( # u_skins.list / 16 + 1 ) do
unified_inventory.register_page ( " u_skins_page_ " .. x , {
get_formspec = function ( player )
page = u_skins.pages [ player : get_player_name ( ) ]
if page == nil then page = 0 end
local formspec = " background[0.06,0.99;7.92,7.52;ui_misc_form.png] "
local index = 0
local skip = 0 -- Skip u_skins, used for pages
-- skin thumbnails
for i , skin in ipairs ( u_skins.list ) do
if skip < page * 16 then skip = skip + 1 else
if index < 16 then
2014-05-14 16:48:26 +02:00
formspec = formspec .. " image_button[ " .. ( index % 8 ) .. " , " .. ( ( math.floor ( index / 8 ) ) * 2 - 0.2 ) .. " ;1,2; " .. skin
2014-03-17 06:26:58 +01:00
if u_skins.get_type ( skin ) == u_skins.type . MODEL then
formspec = formspec .. " _preview "
end
formspec = formspec .. " .png;u_skins_set_ " .. i .. " ;] "
end
index = index + 1
end
end
-- prev next page buttons
if page > 0 then
2014-05-14 16:48:26 +02:00
formspec = formspec .. " button[0,3.8;1,.5;u_skins_page_ " .. ( page - 1 ) .. " ;<<] "
2014-03-17 06:26:58 +01:00
else
2014-05-14 16:48:26 +02:00
formspec = formspec .. " button[0,3.8;1,.5;u_skins_page_ " .. page .. " ;<<] "
2014-03-17 06:26:58 +01:00
end
2014-05-14 16:48:26 +02:00
formspec = formspec .. " button[.75,3.8;6.5,.5;u_skins_page_ " .. page .. " ;Page " .. ( page + 1 ) .. " / " .. math.floor ( # u_skins.list / 16 + 1 ) .. " ] " -- a button is used so text is centered
2014-03-17 06:26:58 +01:00
if index > 16 then
2014-05-14 16:48:26 +02:00
formspec = formspec .. " button[7,3.8;1,.5;u_skins_page_ " .. ( page + 1 ) .. " ;>>] "
2014-03-17 06:26:58 +01:00
else
2014-05-14 16:48:26 +02:00
formspec = formspec .. " button[7,3.8;1,.5;u_skins_page_ " .. page .. " ;>>] "
2014-03-17 06:26:58 +01:00
end
return { formspec = formspec }
end ,
} )
end
-- click button handlers
minetest.register_on_player_receive_fields ( function ( player , formname , fields )
if fields.u_skins then
unified_inventory.set_inventory_formspec ( player , " craft " )
end
for field , _ in pairs ( fields ) do
if string.sub ( field , 0 , string.len ( " u_skins_set_ " ) ) == " u_skins_set_ " then
u_skins.u_skins [ player : get_player_name ( ) ] = u_skins.list [ tonumber ( string.sub ( field , string.len ( " u_skins_set_ " ) + 1 ) ) ]
u_skins.update_player_skin ( player )
unified_inventory.set_inventory_formspec ( player , " u_skins " )
end
if string.sub ( field , 0 , string.len ( " u_skins_page_ " ) ) == " u_skins_page_ " then
u_skins.pages [ player : get_player_name ( ) ] = tonumber ( string.sub ( field , string.len ( " u_skins_page_ " ) + 1 ) )
unified_inventory.set_inventory_formspec ( player , " u_skins_page_ " .. u_skins.pages [ player : get_player_name ( ) ] )
end
end
end )
-- set defaults
minetest.register_on_joinplayer ( function ( player )
2014-05-14 16:48:26 +02:00
local player_name = player : get_player_name ( )
if not u_skins.u_skins [ player_name ] then
u_skins.u_skins [ player_name ] = " character_1 "
end
if not u_skins.meta [ u_skins.u_skins [ player_name ] ] then
u_skins.u_skins [ player_name ] = " character_1 "
minetest.chat_send_player ( player_name , " Skin error: Your skin does no longer exist, please switch to an other! " )
2014-03-17 06:26:58 +01:00
end
u_skins.update_player_skin ( player )
end )