i modifyed a character-creator:
first lua-file
Code: Select all
character_creator = {}
character_creator.skins = dofile(minetest.get_modpath("character_creator") .. "/skins.lua")
local skinsdb
if minetest.get_modpath("skinsdb") and minetest.global_exists("skins") then
skinsdb = skins
end
local skin_default = {
gender = "Male",
height = 4,
width = 4,
skin = "skinwhite.png",
eyes = "eyeswhite.png^[multiply:#3f3f3f^eyesoverlay.png",
hair = "hairwhite.png^[multiply:#3f3f3f^hairoverlay.png",
shirt = "shirtwhite.png^[multiply:#ff0000",
pants = "pantswhite.png^[multiply:#0000ff",
}
local skins = character_creator.skins
local skins_array = {}
minetest.after(0, function()
local function associative_to_array(associative)
local array = {}
for key in pairs(associative) do
table.insert(array, key)
end
return array
end
skins_array = {
skin = associative_to_array(skins.skin),
hair = associative_to_array(skins.hair),
eyes = associative_to_array(skins.eyes),
shirt = associative_to_array(skins.shirt),
pants = associative_to_array(skins.pants),
}
end)
-- Saved skins_array indexes in this
local skin_indexes = {}
local function show_formspec(player)
local indexes = skin_indexes[player]
local formspec = "size[8,7.5]"
.. default.gui_bg
.. default.gui_bg_img
.. ""
-- Skin
.. "image_button[3.5,0.5;1,1;" .. skins_array.skin[indexes.skin] .. ";skin;]"
.. "image_button[1.5,0.5;1,1;gauche.png;skin_back;]"
.. "image_button[5.5,0.5;1,1;droite.png;skin_next;]"
-- Hair
.. "image_button[3.5,1.5;1,1;" .. skins_array.hair[indexes.hair] .. ";hair;]"
.. "image_button[1.5,1.5;1,1;gauche.png;hair_back;]"
.. "image_button[5.5,1.5;1,1;droite.png;hair_next;]"
-- Eyes
.. "image_button[3.5,2.5;1,1;" .. skins_array.eyes[indexes.eyes] .. ";eyes;]"
.. "image_button[1.5,2.5;1,1;gauche.png;eyes_back;]"
.. "image_button[5.5,2.5;1,1;droite.png;eyes_next;]"
-- Shirt
.. "image_button[3.5,3.5;1,1;" .. skins_array.shirt[indexes.shirt] .. ";shirt;]"
.. "image_button[1.5,3.5;1,1;gauche.png;shirt_back;]"
.. "image_button[5.5,3.5;1,1;droite.png;shirt_next;]"
-- Pants
.. "image_button[3.5,4.5;1,1;" .. skins_array.pants[indexes.pants] .. ";pants;]"
.. "image_button[1.5,4.5;1,1;gauche.png;pants_back;]"
.. "image_button[5.5,4.5;1,1;droite.png;pants_next;]"
-- Done
.. "image_button_exit[1.0,6.5;2,1;;main;Back to Game]"
minetest.show_formspec(player:get_player_name(), "character_creator", formspec)
end
local function load_skin(player)
skin_indexes[player] = {}
player:set_attribute("character_creator:gender", skin_default.gender)
player:set_attribute("character_creator:width", skin_default.width)
player:set_attribute("character_creator:height", skin_default.height)
local function load_data(data_name)
local key = player:get_attribute("character_creator:" .. data_name)
local index = table.indexof(skins_array[data_name], key)
if index == -1 then
index = table.indexof(skins_array[data_name], skin_default[data_name])
end
local indexes = skin_indexes[player]
indexes[data_name] = index
end
load_data("skin")
load_data("hair")
load_data("eyes")
load_data("shirt")
load_data("pants")
end
local function save_skin(player)
local function save_data(data_name)
local indexes = skin_indexes[player]
local index = indexes[data_name]
local key = skins_array[data_name][index]
player:set_attribute("character_creator:" .. data_name, key)
end
save_data("skin")
save_data("hair")
save_data("eyes")
save_data("shirt")
save_data("pants")
end
local function get_texture(player)
local indexes = skin_indexes[player]
local texture = ""
local gender = player:get_attribute("character_creator:gender")
local skin_key = skins_array.skin[indexes.skin]
local skin = skins.skin[skin_key]
texture = skin
local hair_key = skins_array.hair[indexes.hair]
local hair = skins.hair[hair_key]
texture = texture .. "^(" .. hair
local eyes_key = skins_array.eyes[indexes.eyes]
local eyes = skins.eyes[eyes_key]
texture = texture .. "^(" .. eyes
local shirt_key = skins_array.shirt[indexes.shirt]
local shirt = skins.shirt[shirt_key]
texture = texture .. "^(" .. shirt
local pants_key = skins_array.pants[indexes.pants]
local pants = skins.pants[pants_key]
texture = texture .. "^(" .. pants .."))))"
return texture
end
local function change_skin(player)
local texture = get_texture(player)
local width = tonumber(player:get_attribute("character_creator:width"))
local height = tonumber(player:get_attribute("character_creator:height"))
player:set_properties({
visual_size = {
x = width,
y = height
}
})
local name = player:get_player_name()
if minetest.get_modpath("multiskin") then
multiskin.layers[name].skin = texture
armor:set_player_armor(player)
multiskin:set_player_textures(player, { textures = { texture } })
elseif minetest.get_modpath("3d_armor") then
armor.textures[name].skin = texture
armor:set_player_armor(player)
else
player:set_properties({ textures = { texture } })
end
save_skin(player)
end
if skinsdb then
--change skin redefinition for skinsdb
function change_skin(player)
local playername = player:get_player_name()
local skinname = "character_creator:" .. playername
local skin_obj = skinsdb.get(skinname) or skinsdb.new(skinname)
skin_obj:set_meta("format", "1.0")
skin_obj:set_meta("visual_size_x", tonumber(player:get_attribute("character_creator:width")))
skin_obj:set_meta("visual_size_y", tonumber(player:get_attribute("character_creator:height")))
skin_obj:apply_skin_to_player(player)
skinsdb.assign_player_skin(player, "character_creator:" .. playername)
save_skin(player)
end
end
minetest.register_on_joinplayer(function(player)
load_skin(player)
if skinsdb then
local playername = player:get_player_name()
local skinname = "character_creator:" .. playername
local skin_obj = skinsdb.get(skinname) or skinsdb.new(skinname)
-- redefinitions
function skin_obj:set_skin(player)
if not player or not skin_indexes[player] then
return -- not loaded or disconnected
end
change_skin(player)
show_formspec(player)
end
function skin_obj:get_texture()
return get_texture(minetest.get_player_by_name(self:get_meta("playername")))
end
-- set data
skin_obj:set_preview("inventory_plus_character_creator.png")
skin_obj:set_meta("name", "Character Creator")
--skin_obj:set_meta("author", "???")
skin_obj:set_meta("license", "MIT / CC-BY-SA 3.0 Unported")
skin_obj:set_meta("playername", playername)
--check if active and start the update (avoid race condition for both register_on_joinplayer)
if skinsdb.get_player_skin(player):get_key() == skinname then
minetest.after(0, change_skin, player)
end
else
minetest.after(0, change_skin, player)
end
end)
minetest.register_on_leaveplayer(function(player)
if skinsdb then
local skinname = "character_creator:" .. player:get_player_name()
skinsdb.meta[skinname] = nil
end
skin_indexes[player] = nil
end)
local skin_temp = {}
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "character_creator" then
return
end
local indexes = skin_indexes[player]
if not skin_temp[player] then
skin_temp[player] = {
gender = player:get_attribute("character_creator:gender"),
width = player:get_attribute("character_creator:width"),
height = player:get_attribute("character_creator:height"),
indexes = table.copy(indexes)
}
end
-- Gender
do
if fields.male then
player:set_attribute("character_creator:gender", "Male")
player:set_attribute("character_creator:width", 4)
player:set_attribute("character_creator:height", 4)
end
if fields.female then
player:set_attribute("character_creator:gender", "Female")
player:set_attribute("character_creator:width", 4)
player:set_attribute("character_creator:height", 4)
end
end
-- Height
do
local height = tonumber(player:get_attribute("character_creator:height"))
if fields.taller and height < 1.25 then
player:set_attribute("character_creator:height", height + 0.05)
end
if fields.shorter and height > 0.75 then
player:set_attribute("character_creator:height", height - 0.05)
end
end
-- Width
do
local width = tonumber(player:get_attribute("character_creator:width"))
if fields.wider and width < 1.25 then
player:set_attribute("character_creator:width", width + 0.05)
end
if fields.thinner and width > 0.75 then
player:set_attribute("character_creator:width", width - 0.05)
end
end
-- Switch skin
do
local function switch_skin(data_name, next_index)
local index = indexes[data_name] + next_index
local max = #skins_array[data_name]
if index == 0 then
index = max
elseif index == (max + 1) then
index = 1
end
indexes[data_name] = index
end
for field in pairs(fields) do
if field:find("_back$") then
local data_name = field:match("(.+)_back$")
switch_skin(data_name, -1)
elseif field:find("_next$") then
local data_name = field:match("(.+)_next$")
switch_skin(data_name, 1)
end
end
end
-- Close or update
do
local quit = false
if fields.cancel then
local temp = skin_temp[player]
player:set_attribute("character_creator:gender", temp.gender)
player:set_attribute("character_creator:width", temp.width)
player:set_attribute("character_creator:height", temp.height)
skin_indexes[player] = table.copy(temp.indexes)
skin_temp[player] = nil
quit = true
elseif fields.quit then
skin_temp[player] = nil
quit = true
end
if not quit then
show_formspec(player)
end
end
change_skin(player)
end)
minetest.register_chatcommand("skin", {
func = function(name)
minetest.after(0.5, function()
local player = minetest.get_player_by_name(name)
if player then
show_formspec(player)
end
end)
end
})
minetest.register_chatcommand("say", {
params = "<text>",
description = "Send text to chat",
privs = { talk = true },
func = function(_, text)
minetest.chat_send_all(text)
return true, "Text was sent successfully"
end,
})
if minetest.global_exists("unified_inventory") then
unified_inventory.register_button("character_creator", {
type = "image",
image = "inventory_plus_character_creator.png",
action = show_formspec
})
elseif minetest.global_exists("inventory_plus") then
minetest.register_on_joinplayer(function(player)
inventory_plus.register_button(player, "character_creator", "Skin")
end)
minetest.register_on_player_receive_fields(function(player, _, fields)
if fields.player then
show_formspec(player)
end
end)
end
Code: Select all
return {
skin = {
["skinwhite.png"] = "skin_white.png",
["skinblack.png"] = "skin_black.png",
},
hair = {
["hairwhite.png"] = "hair_white.png",
["hairwhite.png^[multiply:#3f3f3f^hairoverlay.png"] = "hair_white.png^[multiply:#3f3f3f",
["hairwhite.png^[multiply:#ff0000^hairoverlay.png"] = "hair_white.png^[multiply:#ff0000",
["hairwhite.png^[multiply:#ff7f00^hairoverlay.png"] = "hair_white.png^[multiply:#ff7f00",
["hairwhite.png^[multiply:#ffff00^hairoverlay.png"] = "hair_white.png^[multiply:#ffff00",
["hairwhite.png^[multiply:#00ff00^hairoverlay.png"] = "hair_white.png^[multiply:#00ff00",
["hairwhite.png^[multiply:#0000ff^hairoverlay.png"] = "hair_white.png^[multiply:#0000ff",
["hairwhite.png^[multiply:#9f00ff^hairoverlay.png"] = "hair_white.png^[multiply:#9f00ff",
},
eyes = {
["eyeswhite.png"] = "eyes_white.png",
["eyeswhite.png^[multiply:#3f3f3f^eyesoverlay.png"] = "eyes_white.png^[multiply:#3f3f3f",
["eyeswhite.png^[multiply:#ff0000^eyesoverlay.png"] = "eyes_white.png^[multiply:#ff0000",
["eyeswhite.png^[multiply:#ff7f00^eyesoverlay.png"] = "eyes_white.png^[multiply:#ff7f00",
["eyeswhite.png^[multiply:#ffff00^eyesoverlay.png"] = "eyes_white.png^[multiply:#ffff00",
["eyeswhite.png^[multiply:#00ff00^eyesoverlay.png"] = "eyes_white.png^[multiply:#00ff00",
["eyeswhite.png^[multiply:#0000ff^eyesoverlay.png"] = "eyes_white.png^[multiply:#0000ff",
["eyeswhite.png^[multiply:#9f00ff^eyesoverlay.png"] = "eyes_white.png^[multiply:#9f00ff",
},
shirt = {
["shirtwhite.png"] = "shirt_white.png",
["shirtwhite.png^[multiply:#3f3f3f"] = "shirt_white.png^[multiply:#3f3f3f",
["shirtwhite.png^[multiply:#ff0000"] = "shirt_white.png^[multiply:#ff0000",
["shirtwhite.png^[multiply:#ff7f00"] = "shirt_white.png^[multiply:#ff7f00",
["shirtwhite.png^[multiply:#ffff00"] = "shirt_white.png^[multiply:#ffff00",
["shirtwhite.png^[multiply:#00ff00"] = "shirt_white.png^[multiply:#00ff00",
["shirtwhite.png^[multiply:#0000ff"] = "shirt_white.png^[multiply:#0000ff",
["shirtwhite.png^[multiply:#9f00ff"] = "shirt_white.png^[multiply:#9f00ff",
},
pants = {
["pantswhite.png"] = "pants_white.png",
["pantswhite.png^[multiply:#3f3f3f"] = "pants_white.png^[multiply:#3f3f3f",
["pantswhite.png^[multiply:#ff0000"] = "pants_white.png^[multiply:#ff0000",
["pantswhite.png^[multiply:#ff7f00"] = "pants_white.png^[multiply:#ff7f00",
["pantswhite.png^[multiply:#ffff00"] = "pants_white.png^[multiply:#ffff00",
["pantswhite.png^[multiply:#00ff00"] = "pants_white.png^[multiply:#00ff00",
["pantswhite.png^[multiply:#0000ff"] = "pants_white.png^[multiply:#0000ff",
["pantswhite.png^[multiply:#9f00ff"] = "pants_white.png^[multiply:#9f00ff",
},
}
The places, where the other four icons should be, are empty.
What´s wrong with it?
are menu-buttons unable to use textures with modifyers like "shirtwhite.png^[multiply:#ff0000"?