summaryrefslogtreecommitdiff
path: root/u_skins/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'u_skins/init.lua')
-rw-r--r--u_skins/init.lua151
1 files changed, 151 insertions, 0 deletions
diff --git a/u_skins/init.lua b/u_skins/init.lua
new file mode 100644
index 0000000..abc73b0
--- /dev/null
+++ b/u_skins/init.lua
@@ -0,0 +1,151 @@
+-- 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 = {}
+u_skins.type = { SPRITE=0, MODEL=1 }
+u_skins.pages = {}
+u_skins.u_skins = {}
+
+u_skins.get_type = function(texture)
+ if not texture then return end
+ 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
+end
+
+u_skins.modpath = minetest.get_modpath("u_skins")
+dofile(u_skins.modpath.."/skinlist.lua")
+dofile(u_skins.modpath.."/meta.lua")
+dofile(u_skins.modpath.."/players.lua")
+
+
+u_skins.update_player_skin = function(player)
+ name = player:get_player_name()
+ if u_skins.get_type(u_skins.u_skins[name]) == u_skins.type.SPRITE then
+ 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},
+ })
+ elseif u_skins.get_type(u_skins.u_skins[name]) == u_skins.type.MODEL then
+ player:set_properties({
+ visual = "mesh",
+ textures = {u_skins.u_skins[name]..".png"},
+ visual_size = {x=1, y=1},
+ })
+ end
+ u_skins.save()
+end
+
+-- Display Current Skin
+unified_inventory.register_page("u_skins", {
+ get_formspec = function(player)
+ name = player:get_player_name()
+ 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
+ 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]"
+
+ 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
+ if meta.name then
+ formspec = formspec .. "label[2,.5;Name: "..meta.name.."]"
+ end
+ if meta.author then
+ formspec = formspec .. "label[2,1;Author: "..meta.author.."]"
+ end
+ if meta.description then
+ formspec = formspec .. "label[2,1.5;"..meta.description.."]"
+ end
+ if meta.comment then
+ formspec = formspec .. 'label[2,2;"'..meta.comment..'"]'
+ 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
+ formspec = formspec .. "image_button["..(index%8)..","..((math.floor(index/8))*2)..";1,2;"..skin
+ 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
+ formspec = formspec .. "button[0,4;1,.5;u_skins_page_"..(page-1)..";<<]"
+ else
+ formspec = formspec .. "button[0,4;1,.5;u_skins_page_"..page..";<<]"
+ end
+ formspec = formspec .. "button[.75,4;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
+ if index > 16 then
+ formspec = formspec .. "button[7,4;1,.5;u_skins_page_"..(page+1)..";>>]"
+ else
+ formspec = formspec .. "button[7,4;1,.5;u_skins_page_"..page..";>>]"
+ 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)
+ if not u_skins.u_skins[player:get_player_name()] then
+ u_skins.u_skins[player:get_player_name()] = "character_1"
+ end
+ u_skins.update_player_skin(player)
+end)
+