From 2a6e0d5b56eef3975dab6155e017ec2830f9ff3f Mon Sep 17 00:00:00 2001 From: Rui <rui.minetest@gmail.com> Date: Sun, 2 Apr 2017 14:30:36 +0900 Subject: [PATCH] Using set_attribute to save skin and some changes (#8) --- LICENSE.md | 28 --- README.md | 5 - depends.txt | 2 +- description.txt | 2 +- init.lua | 449 ++++++++++++++++++++++++++----------------- license.txt | 52 +++++ mod.conf | 2 +- readme.md | 5 + skins.lua | 494 ++++++++++++++++++++++++------------------------ 9 files changed, 579 insertions(+), 460 deletions(-) delete mode 100644 LICENSE.md delete mode 100644 README.md create mode 100644 license.txt create mode 100644 readme.md diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 5b7f13f..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,28 +0,0 @@ -License of source code ----------------------- - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - - Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> - - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. - - -License of textures --------------------------------------- - -Authors: darkrose, sdzen -Created for: Voxelands http://www.voxelands.com/ - -This does not apply to texture packs made by others. - -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/README.md b/README.md deleted file mode 100644 index 00d6f39..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This mod attribution to the Voxelands project. - -Voxelands creators: -sdzen -darkrose diff --git a/depends.txt b/depends.txt index f2db909..39bf229 100644 --- a/depends.txt +++ b/depends.txt @@ -1,4 +1,4 @@ 3d_armor? multiskin? inventory_plus? -unified_inventory? +unified_inventory? \ No newline at end of file diff --git a/description.txt b/description.txt index fdeb5f1..8697957 100644 --- a/description.txt +++ b/description.txt @@ -1 +1 @@ -Allows the creation of customized character skins inside the game. +Allows the creation of customized character skins inside the game. \ No newline at end of file diff --git a/init.lua b/init.lua index b6a11f4..6353a5a 100644 --- a/init.lua +++ b/init.lua @@ -1,236 +1,328 @@ ---[[ -TODO List - -Cape -Glasses(Accessories) -Face Style(Sam style, this style, MC style, etc.) -Colorize Textures -Skin Preview -Randomize Skin -]] - character_creator = {} -local cc = character_creator +character_creator.skins = dofile(minetest.get_modpath("character_creator") .. "/skins.lua") -local modpath = minetest.get_modpath("character_creator") -local datafile = minetest.get_worldpath() .. "/character_creator.mt" +local skin_default = { + gender = "Male", + height = 1, + width = 1, -dofile(modpath .. "/skins.lua") + skin = "Fair Skin", + face = "Human Face", + hair = "Brown Hair", + hair_style = "Medium Hair", + eyes = "Blue Eyes", + tshirt = "Green T-Shirt", + pants = "Blue Pants", + shoes = "Leather Shoes" +} -local function to_numberkey_table(tbl) - local tbl2 = {} - for str in pairs(tbl) do - tbl2[#tbl2 + 1] = str - end - return tbl2 -end +local skins = character_creator.skins +local skins_array = {} -local skins = {} minetest.after(0, function() - skins = { - skin = to_numberkey_table(cc.skin), - face = to_numberkey_table(cc.face), - hair = to_numberkey_table(cc.hair), - hair_style = to_numberkey_table(cc.hair_style), - eyes = to_numberkey_table(cc.eyes), - tshirt = to_numberkey_table(cc.tshirt), - pants = to_numberkey_table(cc.pants), - shoes = to_numberkey_table(cc.shoes) + 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), + face = associative_to_array(skins.face), + hair = associative_to_array(skins.hair), + hair_style = associative_to_array(skins.hair_style), + eyes = associative_to_array(skins.eyes), + tshirt = associative_to_array(skins.tshirt), + pants = associative_to_array(skins.pants), + shoes = associative_to_array(skins.shoes) } end) -local playerdata = {} +-- Saved skins_array indexes in this +local skin_indexes = {} -local function show_formspec(name) - local data = playerdata[name] - minetest.show_formspec(name, "character_creator", - "size[15,9.5]" .. - "bgcolor[#00000000]" .. +local function show_formspec(player) + local indexes = skin_indexes[player] + + local formspec = "size[15,9.5]" + .. "bgcolor[#00000000]" -- Gender - "button[10,;2.5,.5;cc_male;Male]" .. - "button[12.5,;2.5,.5;cc_female;Female]" .. + .. "button[10,;2.5,.5;male;Male]" + .. "button[12.5,;2.5,.5;female;Female]" -- Height - "button[10,1.1;2.5,.5;cc_taller;Taller]" .. - "button[10,2;2.5,.5;cc_shorter;Shorter]" .. + .. "button[10,1.1;2.5,.5;taller;Taller]" + .. "button[10,2;2.5,.5;shorter;Shorter]" -- Width - "button[12.5,1.1;2.5,.5;cc_wider;Wider]" .. - "button[12.5,2;2.5,.5;cc_thinner;Thinner]" .. + .. "button[12.5,1.1;2.5,.5;wider;Wider]" + .. "button[12.5,2;2.5,.5;thinner;Thinner]" -- Skin - "button[10,2.75;5,1;cc_skin;" .. skins.skin[data.skin] .. "]" .. - "button[10,2.75;1,1;cc_skin_back;<<]" .. - "button[14,2.75;1,1;cc_skin_next;>>]" .. + .. "button[10,2.75;5,1;skin;" .. skins_array.skin[indexes.skin] .. "]" + .. "button[10,2.75;1,1;skin_back;<<]" + .. "button[14,2.75;1,1;skin_next;>>]" -- Face - "button[10,3.5;5,1;cc_face;" .. skins.face[data.face] .. "]" .. - "button[10,3.5;1,1;cc_face_back;<<]" .. - "button[14,3.5;1,1;cc_face_next;>>]" .. + .. "button[10,3.5;5,1;face;" .. skins_array.face[indexes.face] .. "]" + .. "button[10,3.5;1,1;face_back;<<]" + .. "button[14,3.5;1,1;face_next;>>]" -- Hair - "button[10,4.25;5,1;cc_hair;" .. skins.hair[data.hair] .. "]" .. - "button[10,4.25;1,1;cc_hair_back;<<]" .. - "button[14,4.25;1,1;cc_hair_next;>>]" .. + .. "button[10,4.25;5,1;hair;" .. skins_array.hair[indexes.hair] .. "]" + .. "button[10,4.25;1,1;hair_back;<<]" + .. "button[14,4.25;1,1;hair_next;>>]" -- Hair Style - "button[10,5;5,1;cc_hair_style;" .. skins.hair_style[data.hair_style] .. "]" .. - "button[10,5;1,1;cc_hair_style_back;<<]" .. - "button[14,5;1,1;cc_hair_style_next;>>]" .. + .. "button[10,5;5,1;hair_style;" .. skins_array.hair_style[indexes.hair_style] .. "]" + .. "button[10,5;1,1;hair_style_back;<<]" + .. "button[14,5;1,1;hair_style_next;>>]" -- Eyes - "button[10,5.75;5,1;cc_eyes;" .. skins.eyes[data.eyes] .. "]" .. - "button[10,5.75;1,1;cc_eyes_back;<<]" .. - "button[14,5.75;1,1;cc_eyes_next;>>]" .. + .. "button[10,5.75;5,1;eyes;" .. skins_array.eyes[indexes.eyes] .. "]" + .. "button[10,5.75;1,1;eyes_back;<<]" + .. "button[14,5.75;1,1;eyes_next;>>]" -- T-Shirt - "button[10,6.5;5,1;cc_tshirt;" .. skins.tshirt[data.tshirt] .. "]" .. - "button[10,6.5;1,1;cc_tshirt_back;<<]" .. - "button[14,6.5;1,1;cc_tshirt_next;>>]" .. + .. "button[10,6.5;5,1;tshirt;" .. skins_array.tshirt[indexes.tshirt] .. "]" + .. "button[10,6.5;1,1;tshirt_back;<<]" + .. "button[14,6.5;1,1;tshirt_next;>>]" -- Pants - "button[10,7.25;5,1;cc_pants;" .. skins.pants[data.pants] .. "]" .. - "button[10,7.25;1,1;cc_pants_back;<<]" .. - "button[14,7.25;1,1;cc_pants_next;>>]" .. + .. "button[10,7.25;5,1;pants;" .. skins_array.pants[indexes.pants] .. "]" + .. "button[10,7.25;1,1;pants_back;<<]" + .. "button[14,7.25;1,1;pants_next;>>]" -- Shoes - "button[10,8;5,1;cc_shoes;" .. skins.shoes[data.shoes] .. "]" .. - "button[10,8;1,1;cc_shoes_back;<<]" .. - "button[14,8;1,1;cc_shoes_next;>>]" .. + .. "button[10,8;5,1;shoes;" .. skins_array.shoes[indexes.shoes] .. "]" + .. "button[10,8;1,1;shoes_back;<<]" + .. "button[14,8;1,1;shoes_next;>>]" -- Done - "button_exit[10,9;2.5,.5;cc_done;Done]" .. - "button_exit[12.5,9;2.5,.5;cc_cancel;Cancel]" - ) + .. "button_exit[10,9;2.5,.5;done;Done]" + .. "button_exit[12.5,9;2.5,.5;cancel;Cancel]" + + minetest.show_formspec(player:get_player_name(), "character_creator", formspec) end -local input = io.open(datafile, "r") -if input then - playerdata = minetest.deserialize(input:read("*all")) or {} - input:close() +local function load_skin(player) + skin_indexes[player] = {} + + if not player:get_attribute("character_creator:gender") then + player:set_attribute("character_creator:gender", skin_default.gender) + end + + if not player:get_attribute("character_creator:width") then + player:set_attribute("character_creator:width", skin_default.width) + end + + if not player:get_attribute("character_creator:height") then + player:set_attribute("character_creator:height", skin_default.height) + end + + 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("face") + load_data("eyes") + load_data("hair_style") + load_data("hair") + load_data("tshirt") + load_data("pants") + load_data("shoes") end -local skin_def = { - gender = "Male", - height = 1, - width = 1, - skin = 4, - face = 4, - hair = 8, - hair_style = 3, - eyes = 5, - tshirt = 4, - pants = 1, - shoes = 3 -} +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("face") + save_data("eyes") + save_data("hair_style") + save_data("hair") + save_data("tshirt") + save_data("pants") + save_data("shoes") +end local function change_skin(player) - local name = player:get_player_name() - local data = playerdata[name] - - local texture - local flag = pcall(function() - texture = cc.skin[skins.skin[data.skin]] .. "^" .. - cc.face[skins.face[data.face]][data.gender][skins.skin[data.skin]] .. "^" .. - cc.eyes[skins.eyes[data.eyes]] .. "^" .. - cc.hair[skins.hair[data.hair]][data.gender][skins.hair_style[data.hair_style]] .. "^" .. - cc.tshirt[skins.tshirt[data.tshirt]] .. "^" .. - cc.pants[skins.pants[data.pants]] .. "^" .. - cc.shoes[skins.shoes[data.shoes]] - end) + local indexes = skin_indexes[player] - if not flag then - playerdata[name] = table.copy(skin_def) - end + local texture = (function() + 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 = texture .. skin + + local face_key = skins_array.face[indexes.face] + local face = skins.face[face_key][gender][skin_key] + texture = texture .. "^" .. face + + local eyes_key = skins_array.eyes[indexes.eyes] + local eyes = skins.eyes[eyes_key] + texture = texture .. "^" .. eyes + + local hair_style = skins_array.hair_style[indexes.hair_style] + local hair_key = skins_array.hair[indexes.hair] + local hair = skins.hair[hair_key][gender][hair_style] + texture = texture .. "^" .. hair + + local tshirt_key = skins_array.tshirt[indexes.tshirt] + local tshirt = skins.tshirt[tshirt_key] + texture = texture .. "^" .. tshirt + + local pants_key = skins_array.pants[indexes.pants] + local pants = skins.pants[pants_key] + texture = texture .. "^" .. pants + + local shoes_key = skins_array.shoes[indexes.shoes] + local shoes = skins.shoes[shoes_key] + texture = texture .. "^" .. shoes + + return texture + end)() + + local width = tonumber(player:get_attribute("character_creator:width")) + local height = tonumber(player:get_attribute("character_creator:height")) player:set_properties({ - visual_size = {x=data.width, y=data.height} + 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}}) + 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}}) + player:set_properties({textures = {texture}}) end - -- Save data - local output = io.open(datafile, "w") - output:write(minetest.serialize(playerdata)) - output:close() + save_skin(player) end minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - playerdata[name] = playerdata[name] or table.copy(skin_def) - - for k, v in pairs(skin_def) do - if (k == "gender" and type(playerdata[name][k]) ~= "string") - or (k ~= "gender" and type(playerdata[name][k]) ~= "number") then - playerdata[name][k] = v - end - end - + load_skin(player) minetest.after(0, change_skin, player) end) -local function switch_data(tbl, currrent_data, param) - local data = currrent_data+param - if tbl[data] then - return data - elseif data == 0 then - return #tbl - else - return 1 - end -end - local skin_temp = {} - minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "character_creator" then return end - local name = player:get_player_name() - local data = playerdata[name] - - skin_temp[name] = skin_temp[name] or table.copy(data) - - if fields.cc_male then - data.gender = "Male" - data.width = 1 - data.height = 1 - elseif fields.cc_female then - data.gender = "Female" - data.width = 0.95 - data.height = 1 + 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", 1) + player:set_attribute("character_creator:height", 1) + end + + if fields.female then + player:set_attribute("character_creator:gender", "Female") + player:set_attribute("character_creator:width", 0.95) + player:set_attribute("character_creator:height", 1) + end end - if fields.cc_taller - and data.height < 1.25 then - data.height = data.height+0.05 - elseif fields.cc_shorter - and data.height > 0.75 then - data.height = data.height-0.05 + -- 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 - if fields.cc_wider - and data.width < 1.25 then - data.width = data.width+0.05 - elseif fields.cc_thinner - and data.width > 0.75 then - data.width = data.width-0.05 + -- 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 - for field in pairs(fields) do - local dataname = field:sub(4, -6) - if field:match("_back") then - data[dataname] = switch_data(skins[dataname], data[dataname], -1) - elseif field:match("_next") then - data[dataname] = switch_data(skins[dataname], data[dataname], 1) + -- 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 - if fields.cc_done or fields.quit then - skin_temp[name] = nil - elseif fields.cc_cancel then - playerdata[name] = table.copy(skin_temp[name]) - skin_temp[name] = nil - else - show_formspec(name) + -- 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) @@ -238,7 +330,12 @@ end) minetest.register_chatcommand("character_creator", { func = function(name) - minetest.after(.1, show_formspec, name) + minetest.after(0.5, function() + local player = minetest.get_player_by_name(name) + if player then + show_formspec(player) + end + end) end }) @@ -246,9 +343,7 @@ if minetest.global_exists("unified_inventory") then unified_inventory.register_button("character_creator", { type = "image", image = "inventory_plus_character_creator.png", - action = function(player) - show_formspec(player:get_player_name()) - end + action = show_formspec }) elseif minetest.global_exists("inventory_plus") then minetest.register_on_joinplayer(function(player) @@ -256,7 +351,7 @@ elseif minetest.global_exists("inventory_plus") then end) minetest.register_on_player_receive_fields(function(player, _, fields) if fields.character_creator then - show_formspec(player:get_player_name()) + show_formspec(player) end end) -end +end \ No newline at end of file diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..3fe225c --- /dev/null +++ b/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +MIT License + +Copyright (c) 2017 Rui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +License of textures +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + +Copyright (C) 2017 Voxelands http://www.voxelands.com/ +Copyright (C) 2017 darkrose +Copyright (C) 2017 sdzen + +You are free to: +Share - copy and redistribute the material in any medium or format +Adapt - remix, transform, and build upon the material +for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: +Attribution - You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. +ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. +No additional restrictions - You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +Notices: +You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mod.conf b/mod.conf index d50051d..a01ea61 100644 --- a/mod.conf +++ b/mod.conf @@ -1 +1 @@ -name = character_creator +name = character_creator \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..20b73b0 --- /dev/null +++ b/readme.md @@ -0,0 +1,5 @@ +This mod is attributed to the Voxelands project. + +Voxelands creators: +sdzen +darkrose \ No newline at end of file diff --git a/skins.lua b/skins.lua index 42e94c9..ec422c2 100644 --- a/skins.lua +++ b/skins.lua @@ -1,270 +1,270 @@ -local cc = character_creator - -cc.skin = { - ["Fair Skin"] = "cc_skin_fair.png", - ["Green Skin"] = "cc_skin_green.png", - ["Red Skin"] = "cc_skin_red.png", - ["Tanned Skin"] = "cc_skin_tanned.png", - ["White Skin"] = "cc_skin_white.png", - ["Black Skin"] = "cc_skin_black.png", - ["Dark Skin"] = "cc_skin_dark.png", -} +return { + skin = { + ["Fair Skin"] = "cc_skin_fair.png", + ["Green Skin"] = "cc_skin_green.png", + ["Red Skin"] = "cc_skin_red.png", + ["Tanned Skin"] = "cc_skin_tanned.png", + ["White Skin"] = "cc_skin_white.png", + ["Black Skin"] = "cc_skin_black.png", + ["Dark Skin"] = "cc_skin_dark.png", + }, -cc.face = { - ["Human Face"] = { - ["Male"] = { - ["Fair Skin"] = "cc_face_human_fair_M.png", - ["Green Skin"] = "cc_face_human_green_M.png", - ["Red Skin"] = "cc_face_human_red_M.png", - ["Tanned Skin"] = "cc_face_human_tanned_M.png", - ["White Skin"] = "cc_face_human_white_M.png", - ["Black Skin"] = "cc_face_human_black_M.png", - ["Dark Skin"] = "cc_face_human_dark_M.png", + face = { + ["Human Face"] = { + ["Male"] = { + ["Fair Skin"] = "cc_face_human_fair_M.png", + ["Green Skin"] = "cc_face_human_green_M.png", + ["Red Skin"] = "cc_face_human_red_M.png", + ["Tanned Skin"] = "cc_face_human_tanned_M.png", + ["White Skin"] = "cc_face_human_white_M.png", + ["Black Skin"] = "cc_face_human_black_M.png", + ["Dark Skin"] = "cc_face_human_dark_M.png", + }, + ["Female"] = { + ["Fair Skin"] = "cc_face_human_fair_F.png", + ["Green Skin"] = "cc_face_human_green_F.png", + ["Red Skin"] = "cc_face_human_red_F.png", + ["Tanned Skin"] = "cc_face_human_tanned_F.png", + ["White Skin"] = "cc_face_human_white_F.png", + ["Black Skin"] = "cc_face_human_black_F.png", + ["Dark Skin"] = "cc_face_human_dark_F.png", + } }, - ["Female"] = { - ["Fair Skin"] = "cc_face_human_fair_F.png", - ["Green Skin"] = "cc_face_human_green_F.png", - ["Red Skin"] = "cc_face_human_red_F.png", - ["Tanned Skin"] = "cc_face_human_tanned_F.png", - ["White Skin"] = "cc_face_human_white_F.png", - ["Black Skin"] = "cc_face_human_black_F.png", - ["Dark Skin"] = "cc_face_human_dark_F.png", - } - }, - ["Alien Face"] = { - ["Male"] = { - ["Fair Skin"] = "cc_face_alien_fair_M.png", - ["Green Skin"] = "cc_face_alien_green_M.png", - ["Red Skin"] = "cc_face_alien_red_M.png", - ["Tanned Skin"] = "cc_face_alien_tanned_M.png", - ["White Skin"] = "cc_face_alien_white_M.png", - ["Black Skin"] = "cc_face_alien_black_M.png", - ["Dark Skin"] = "cc_face_alien_dark_M.png", + ["Alien Face"] = { + ["Male"] = { + ["Fair Skin"] = "cc_face_alien_fair_M.png", + ["Green Skin"] = "cc_face_alien_green_M.png", + ["Red Skin"] = "cc_face_alien_red_M.png", + ["Tanned Skin"] = "cc_face_alien_tanned_M.png", + ["White Skin"] = "cc_face_alien_white_M.png", + ["Black Skin"] = "cc_face_alien_black_M.png", + ["Dark Skin"] = "cc_face_alien_dark_M.png", + }, + ["Female"] = { + ["Fair Skin"] = "cc_face_alien_fair_F.png", + ["Green Skin"] = "cc_face_alien_green_F.png", + ["Red Skin"] = "cc_face_alien_red_F.png", + ["Tanned Skin"] = "cc_face_alien_tanned_F.png", + ["White Skin"] = "cc_face_alien_white_F.png", + ["Black Skin"] = "cc_face_alien_black_F.png", + ["Dark Skin"] = "cc_face_alien_dark_F.png", + } }, - ["Female"] = { - ["Fair Skin"] = "cc_face_alien_fair_F.png", - ["Green Skin"] = "cc_face_alien_green_F.png", - ["Red Skin"] = "cc_face_alien_red_F.png", - ["Tanned Skin"] = "cc_face_alien_tanned_F.png", - ["White Skin"] = "cc_face_alien_white_F.png", - ["Black Skin"] = "cc_face_alien_black_F.png", - ["Dark Skin"] = "cc_face_alien_dark_F.png", - } - }, - ["Dwarven Face"] = { - ["Male"] = { - ["Fair Skin"] = "cc_face_dwarven_fair_M.png", - ["Green Skin"] = "cc_face_dwarven_green_M.png", - ["Red Skin"] = "cc_face_dwarven_red_M.png", - ["Tanned Skin"] = "cc_face_dwarven_tanned_M.png", - ["White Skin"] = "cc_face_dwarven_white_M.png", - ["Black Skin"] = "cc_face_dwarven_black_M.png", - ["Dark Skin"] = "cc_face_dwarven_dark_M.png", + ["Dwarven Face"] = { + ["Male"] = { + ["Fair Skin"] = "cc_face_dwarven_fair_M.png", + ["Green Skin"] = "cc_face_dwarven_green_M.png", + ["Red Skin"] = "cc_face_dwarven_red_M.png", + ["Tanned Skin"] = "cc_face_dwarven_tanned_M.png", + ["White Skin"] = "cc_face_dwarven_white_M.png", + ["Black Skin"] = "cc_face_dwarven_black_M.png", + ["Dark Skin"] = "cc_face_dwarven_dark_M.png", + }, + ["Female"] = { + ["Fair Skin"] = "cc_face_dwarven_fair_F.png", + ["Green Skin"] = "cc_face_dwarven_green_F.png", + ["Red Skin"] = "cc_face_dwarven_red_F.png", + ["Tanned Skin"] = "cc_face_dwarven_tanned_F.png", + ["White Skin"] = "cc_face_dwarven_white_F.png", + ["Black Skin"] = "cc_face_dwarven_black_F.png", + ["Dark Skin"] = "cc_face_dwarven_dark_F.png", + } }, - ["Female"] = { - ["Fair Skin"] = "cc_face_dwarven_fair_F.png", - ["Green Skin"] = "cc_face_dwarven_green_F.png", - ["Red Skin"] = "cc_face_dwarven_red_F.png", - ["Tanned Skin"] = "cc_face_dwarven_tanned_F.png", - ["White Skin"] = "cc_face_dwarven_white_F.png", - ["Black Skin"] = "cc_face_dwarven_black_F.png", - ["Dark Skin"] = "cc_face_dwarven_dark_F.png", + ["Elven Face"] = { + ["Male"] = { + ["Fair Skin"] = "cc_face_elven_fair_M.png", + ["Green Skin"] = "cc_face_elven_green_M.png", + ["Red Skin"] = "cc_face_elven_red_M.png", + ["Tanned Skin"] = "cc_face_elven_tanned_M.png", + ["White Skin"] = "cc_face_elven_white_M.png", + ["Black Skin"] = "cc_face_elven_black_M.png", + ["Dark Skin"] = "cc_face_elven_dark_M.png", + }, + ["Female"] = { + ["Fair Skin"] = "cc_face_elven_fair_F.png", + ["Green Skin"] = "cc_face_elven_green_F.png", + ["Red Skin"] = "cc_face_elven_red_F.png", + ["Tanned Skin"] = "cc_face_elven_tanned_F.png", + ["White Skin"] = "cc_face_elven_white_F.png", + ["Black Skin"] = "cc_face_elven_black_F.png", + ["Dark Skin"] = "cc_face_elven_dark_F.png", + } } }, - ["Elven Face"] = { - ["Male"] = { - ["Fair Skin"] = "cc_face_elven_fair_M.png", - ["Green Skin"] = "cc_face_elven_green_M.png", - ["Red Skin"] = "cc_face_elven_red_M.png", - ["Tanned Skin"] = "cc_face_elven_tanned_M.png", - ["White Skin"] = "cc_face_elven_white_M.png", - ["Black Skin"] = "cc_face_elven_black_M.png", - ["Dark Skin"] = "cc_face_elven_dark_M.png", - }, - ["Female"] = { - ["Fair Skin"] = "cc_face_elven_fair_F.png", - ["Green Skin"] = "cc_face_elven_green_F.png", - ["Red Skin"] = "cc_face_elven_red_F.png", - ["Tanned Skin"] = "cc_face_elven_tanned_F.png", - ["White Skin"] = "cc_face_elven_white_F.png", - ["Black Skin"] = "cc_face_elven_black_F.png", - ["Dark Skin"] = "cc_face_elven_dark_F.png", - } - } -} -cc.hair = { - ["Brown Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_brown_M.png", - ["Short Hair"] = "cc_hair_short_brown_M.png", - ["Styled Hair"] = "cc_hair_special_brown_M.png", - ["Long Hair"] = "cc_hair_long_brown_M.png", + hair = { + ["Brown Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_brown_M.png", + ["Short Hair"] = "cc_hair_short_brown_M.png", + ["Styled Hair"] = "cc_hair_special_brown_M.png", + ["Long Hair"] = "cc_hair_long_brown_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_brown_F.png", + ["Short Hair"] = "cc_hair_short_brown_F.png", + ["Styled Hair"] = "cc_hair_special_brown_F.png", + ["Long Hair"] = "cc_hair_long_brown_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_brown_F.png", - ["Short Hair"] = "cc_hair_short_brown_F.png", - ["Styled Hair"] = "cc_hair_special_brown_F.png", - ["Long Hair"] = "cc_hair_long_brown_F.png", - } - }, - ["Green Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_green_M.png", - ["Short Hair"] = "cc_hair_short_green_M.png", - ["Styled Hair"] = "cc_hair_special_green_M.png", - ["Long Hair"] = "cc_hair_long_green_M.png", + ["Green Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_green_M.png", + ["Short Hair"] = "cc_hair_short_green_M.png", + ["Styled Hair"] = "cc_hair_special_green_M.png", + ["Long Hair"] = "cc_hair_long_green_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_green_F.png", + ["Short Hair"] = "cc_hair_short_green_F.png", + ["Styled Hair"] = "cc_hair_special_green_F.png", + ["Long Hair"] = "cc_hair_long_green_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_green_F.png", - ["Short Hair"] = "cc_hair_short_green_F.png", - ["Styled Hair"] = "cc_hair_special_green_F.png", - ["Long Hair"] = "cc_hair_long_green_F.png", - } - }, - ["Orange Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_orange_M.png", - ["Short Hair"] = "cc_hair_short_orange_M.png", - ["Styled Hair"] = "cc_hair_special_orange_M.png", - ["Long Hair"] = "cc_hair_long_orange_M.png", + ["Orange Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_orange_M.png", + ["Short Hair"] = "cc_hair_short_orange_M.png", + ["Styled Hair"] = "cc_hair_special_orange_M.png", + ["Long Hair"] = "cc_hair_long_orange_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_orange_F.png", + ["Short Hair"] = "cc_hair_short_orange_F.png", + ["Styled Hair"] = "cc_hair_special_orange_F.png", + ["Long Hair"] = "cc_hair_long_orange_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_orange_F.png", - ["Short Hair"] = "cc_hair_short_orange_F.png", - ["Styled Hair"] = "cc_hair_special_orange_F.png", - ["Long Hair"] = "cc_hair_long_orange_F.png", - } - }, - ["Purple Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_purple_M.png", - ["Short Hair"] = "cc_hair_short_purple_M.png", - ["Styled Hair"] = "cc_hair_special_purple_M.png", - ["Long Hair"] = "cc_hair_long_purple_M.png", + ["Purple Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_purple_M.png", + ["Short Hair"] = "cc_hair_short_purple_M.png", + ["Styled Hair"] = "cc_hair_special_purple_M.png", + ["Long Hair"] = "cc_hair_long_purple_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_purple_F.png", + ["Short Hair"] = "cc_hair_short_purple_F.png", + ["Styled Hair"] = "cc_hair_special_purple_F.png", + ["Long Hair"] = "cc_hair_long_purple_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_purple_F.png", - ["Short Hair"] = "cc_hair_short_purple_F.png", - ["Styled Hair"] = "cc_hair_special_purple_F.png", - ["Long Hair"] = "cc_hair_long_purple_F.png", - } - }, - ["Red Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_red_M.png", - ["Short Hair"] = "cc_hair_short_red_M.png", - ["Styled Hair"] = "cc_hair_special_red_M.png", - ["Long Hair"] = "cc_hair_long_red_M.png", + ["Red Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_red_M.png", + ["Short Hair"] = "cc_hair_short_red_M.png", + ["Styled Hair"] = "cc_hair_special_red_M.png", + ["Long Hair"] = "cc_hair_long_red_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_red_F.png", + ["Short Hair"] = "cc_hair_short_red_F.png", + ["Styled Hair"] = "cc_hair_special_red_F.png", + ["Long Hair"] = "cc_hair_long_red_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_red_F.png", - ["Short Hair"] = "cc_hair_short_red_F.png", - ["Styled Hair"] = "cc_hair_special_red_F.png", - ["Long Hair"] = "cc_hair_long_red_F.png", - } - }, - ["White Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_white_M.png", - ["Short Hair"] = "cc_hair_short_white_M.png", - ["Styled Hair"] = "cc_hair_special_white_M.png", - ["Long Hair"] = "cc_hair_long_white_M.png", + ["White Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_white_M.png", + ["Short Hair"] = "cc_hair_short_white_M.png", + ["Styled Hair"] = "cc_hair_special_white_M.png", + ["Long Hair"] = "cc_hair_long_white_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_white_F.png", + ["Short Hair"] = "cc_hair_short_white_F.png", + ["Styled Hair"] = "cc_hair_special_white_F.png", + ["Long Hair"] = "cc_hair_long_white_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_white_F.png", - ["Short Hair"] = "cc_hair_short_white_F.png", - ["Styled Hair"] = "cc_hair_special_white_F.png", - ["Long Hair"] = "cc_hair_long_white_F.png", - } - }, - ["Black Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_black_M.png", - ["Short Hair"] = "cc_hair_short_black_M.png", - ["Styled Hair"] = "cc_hair_special_black_M.png", - ["Long Hair"] = "cc_hair_long_black_M.png", + ["Black Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_black_M.png", + ["Short Hair"] = "cc_hair_short_black_M.png", + ["Styled Hair"] = "cc_hair_special_black_M.png", + ["Long Hair"] = "cc_hair_long_black_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_black_F.png", + ["Short Hair"] = "cc_hair_short_black_F.png", + ["Styled Hair"] = "cc_hair_special_black_F.png", + ["Long Hair"] = "cc_hair_long_black_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_black_F.png", - ["Short Hair"] = "cc_hair_short_black_F.png", - ["Styled Hair"] = "cc_hair_special_black_F.png", - ["Long Hair"] = "cc_hair_long_black_F.png", - } - }, - ["Blonde Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_blonde_M.png", - ["Short Hair"] = "cc_hair_short_blonde_M.png", - ["Styled Hair"] = "cc_hair_special_blonde_M.png", - ["Long Hair"] = "cc_hair_long_blonde_M.png", + ["Blonde Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_blonde_M.png", + ["Short Hair"] = "cc_hair_short_blonde_M.png", + ["Styled Hair"] = "cc_hair_special_blonde_M.png", + ["Long Hair"] = "cc_hair_long_blonde_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_blonde_F.png", + ["Short Hair"] = "cc_hair_short_blonde_F.png", + ["Styled Hair"] = "cc_hair_special_blonde_F.png", + ["Long Hair"] = "cc_hair_long_blonde_F.png", + } }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_blonde_F.png", - ["Short Hair"] = "cc_hair_short_blonde_F.png", - ["Styled Hair"] = "cc_hair_special_blonde_F.png", - ["Long Hair"] = "cc_hair_long_blonde_F.png", + ["Blue Hair"] = { + ["Male"] = { + ["Medium Hair"] = "cc_hair_medium_blue_M.png", + ["Short Hair"] = "cc_hair_short_blue_M.png", + ["Styled Hair"] = "cc_hair_special_blue_M.png", + ["Long Hair"] = "cc_hair_long_blue_M.png", + }, + ["Female"] = { + ["Medium Hair"] = "cc_hair_medium_blue_F.png", + ["Short Hair"] = "cc_hair_short_blue_F.png", + ["Styled Hair"] = "cc_hair_special_blue_F.png", + ["Long Hair"] = "cc_hair_long_blue_F.png", + } } }, - ["Blue Hair"] = { - ["Male"] = { - ["Medium Hair"] = "cc_hair_medium_blue_M.png", - ["Short Hair"] = "cc_hair_short_blue_M.png", - ["Styled Hair"] = "cc_hair_special_blue_M.png", - ["Long Hair"] = "cc_hair_long_blue_M.png", - }, - ["Female"] = { - ["Medium Hair"] = "cc_hair_medium_blue_F.png", - ["Short Hair"] = "cc_hair_short_blue_F.png", - ["Styled Hair"] = "cc_hair_special_blue_F.png", - ["Long Hair"] = "cc_hair_long_blue_F.png", - } - } -} -cc.hair_style = { - ["Medium Hair"] = "medium", - ["Short Hair"] = "short", - ["Styled Hair"] = "styled", - ["Long Hair"] = "long", -} + hair_style = { + ["Medium Hair"] = "medium", + ["Short Hair"] = "short", + ["Styled Hair"] = "styled", + ["Long Hair"] = "long", + }, -cc.eyes = { - ["Blue Eyes"] = "cc_eyes_blue.png", - ["Brown Eyes"] = "cc_eyes_brown.png", - ["Green Eyes"] = "cc_eyes_green.png", - ["Orange Eyes"] = "cc_eyes_orange.png", - ["Purple Eyes"] = "cc_eyes_purple.png", - ["Red Eyes"] = "cc_eyes_red.png", - ["White Eyes"] = "cc_eyes_white.png", - ["Yellow Eyes"] = "cc_eyes_yellow.png", - ["Black Eyes"] = "cc_eyes_black.png", -} + eyes = { + ["Blue Eyes"] = "cc_eyes_blue.png", + ["Brown Eyes"] = "cc_eyes_brown.png", + ["Green Eyes"] = "cc_eyes_green.png", + ["Orange Eyes"] = "cc_eyes_orange.png", + ["Purple Eyes"] = "cc_eyes_purple.png", + ["Red Eyes"] = "cc_eyes_red.png", + ["White Eyes"] = "cc_eyes_white.png", + ["Yellow Eyes"] = "cc_eyes_yellow.png", + ["Black Eyes"] = "cc_eyes_black.png", + }, -cc.tshirt = { - ["Green T-Shirt"] = "cc_tshirt_green.png", - ["Orange T-Shirt"] = "cc_tshirt_orange.png", - ["Purple T-Shirt"] = "cc_tshirt_purple.png", - ["Red T-Shirt"] = "cc_tshirt_red.png", - ["White T-Shirt"] = "cc_tshirt_white.png", - ["Yellow T-Shirt"] = "cc_tshirt_yellow.png", - ["Black T-Shirt"] = "cc_tshirt_black.png", - ["Blue T-Shirt"] = "cc_tshirt_blue.png", -} + tshirt = { + ["Green T-Shirt"] = "cc_tshirt_green.png", + ["Orange T-Shirt"] = "cc_tshirt_orange.png", + ["Purple T-Shirt"] = "cc_tshirt_purple.png", + ["Red T-Shirt"] = "cc_tshirt_red.png", + ["White T-Shirt"] = "cc_tshirt_white.png", + ["Yellow T-Shirt"] = "cc_tshirt_yellow.png", + ["Black T-Shirt"] = "cc_tshirt_black.png", + ["Blue T-Shirt"] = "cc_tshirt_blue.png", + }, -cc.pants = { - ["Blue Pants"] = "cc_pants_blue.png", - ["Green Pants"] = "cc_pants_green.png", - ["Orange Pants"] = "cc_pants_orange.png", - ["Purple Pants"] = "cc_pants_purple.png", - ["Red Pants"] = "cc_pants_red.png", - ["White Pants"] = "cc_pants_white.png", - ["Yellow Pants"] = "cc_pants_yellow.png", - ["Black Pants"] = "cc_pants_black.png", -} + pants = { + ["Blue Pants"] = "cc_pants_blue.png", + ["Green Pants"] = "cc_pants_green.png", + ["Orange Pants"] = "cc_pants_orange.png", + ["Purple Pants"] = "cc_pants_purple.png", + ["Red Pants"] = "cc_pants_red.png", + ["White Pants"] = "cc_pants_white.png", + ["Yellow Pants"] = "cc_pants_yellow.png", + ["Black Pants"] = "cc_pants_black.png", + }, -cc.shoes = { - ["Leather Shoes"] = "cc_shoes_leather.png", - ["Canvas Shoes"] = "cc_shoes_canvas.png", - ["Fur Shoes"] = "cc_shoes_fur.png", + shoes = { + ["Leather Shoes"] = "cc_shoes_leather.png", + ["Canvas Shoes"] = "cc_shoes_canvas.png", + ["Fur Shoes"] = "cc_shoes_fur.png", + } } -- GitLab