diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..3225a6e --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,21 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 +-- Allow shadowed variables (callbacks in callbacks) +redefined = false + +globals = { + "character_creator", + "armor", "multiskin" +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn", "indexof"}}, + + "minetest", "vector", + "ItemStack", + + "skins", "sfinv", "sfinv_buttons", "unified_inventory", + "inventory_plus" +} diff --git a/depends.txt b/depends.txt deleted file mode 100644 index 22a723e..0000000 --- a/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -3d_armor? -multiskin? -inventory_plus? -unified_inventory? -skinsdb? -sfinv_buttons? diff --git a/description.txt b/description.txt deleted file mode 100644 index 8697957..0000000 --- a/description.txt +++ /dev/null @@ -1 +0,0 @@ -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 8adab29..788e2da 100644 --- a/init.lua +++ b/init.lua @@ -1,9 +1,33 @@ +if not minetest.get_translator then + error("[character_creator] Translator API not found. " + .. "Please update Minetest to a recent version.") +end + character_creator = {} -character_creator.skins = dofile(minetest.get_modpath("character_creator") .. "/skins.lua") +-- Fill character_creator.skins +dofile(minetest.get_modpath("character_creator") .. "/skins.lua") + +-- Update with /path/to/i18n.py -p -s . +character_creator.S = minetest.get_translator("character_creator") +character_creator.FS = function(...) + return minetest.formspec_escape(character_creator.S(...)) +end +--local S = character_creator.S +local FS = character_creator.S local skinsdb if minetest.get_modpath("skinsdb") and minetest.global_exists("skins") then skinsdb = skins + + -- Create dummy skins with hand + if skins.skin_class.set_hand_from_texture then + for skin_name, skin_texture in pairs(character_creator.skins.skin) do + local hand_skin = skinsdb.new("character_creator:"..skin_name) + hand_skin:set_texture(skin_texture) + hand_skin:set_hand_from_texture() + hand_skin:set_meta("in_inventory_list", false) + end + end end local skin_default = { @@ -21,11 +45,10 @@ shoes = "Leather Shoes" } -local skins = character_creator.skins local skins_array = {} minetest.after(0, function() - local function associative_to_array(associative) + local function table_keys_to_array(associative) local array = {} for key in pairs(associative) do table.insert(array, key) @@ -33,16 +56,10 @@ 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) - } + -- part: skin, face, hair, .... + for part, def in pairs(character_creator.skins) do + skins_array[part] = table_keys_to_array(def) + end end) -- Saved skins_array indexes in this @@ -50,56 +67,42 @@ local function show_formspec(player) local indexes = skin_indexes[player] - - local formspec = "size[15,9.5]" - .. "no_prepend[]" - .. "bgcolor[#00000000]" + local order = { + "skin", "face", "hair", "hair_style", "eyes", + "tshirt", "pants", "shoes" + } + + local fs = { + "formspec_version[2]", + "size[13,9]", + "no_prepend[]", + "bgcolor[#00000000]", + "style_type[button;noclip=true]", -- Gender - .. "button[10,;2.5,.5;male;Male]" - .. "button[12.5,;2.5,.5;female;Female]" + "button[10, 0;2.5,.75;male;" .. FS("Male") .. "]", + "button[12.5,0;2.5,.75;female;" .. FS("Female") .. "]", -- Height - .. "button[10,1.1;2.5,.5;taller;Taller]" - .. "button[10,2;2.5,.5;shorter;Shorter]" + "button[10 ,1;2.5,.75;taller;" .. FS("Taller") .. "]", + "button[10 ,2;2.5,.75;shorter;" .. FS("Shorter") .. "]", -- Width - .. "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;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;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;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;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;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;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;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;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;done;Done]" - .. "button_exit[12.5,9;2.5,.5;cancel;Cancel]" - - minetest.show_formspec(player:get_player_name(), "character_creator", formspec) + "button[12.5,1;2.5,.75;wider;" .. FS("Wider") .. "]", + "button[12.5,2;2.5,.75;thinner;" .. FS("Thinner") .. "]", + } + local x = 11 + local y = 3 + + for _, part in ipairs(order) do + fs[#fs + 1] = + ("button[%g,%g;1,.75;%s_back;<<]"):format(x - 1, y, part) .. + ("button[%g,%g;3,.75;%s;%s]" ):format(x + 0, y, part, skins_array[part][indexes[part]]) .. + ("button[%g,%g;1,.75;%s_next;>>]"):format(x + 3, y, part) + y = y + 0.75 + end + table.insert(fs, + "button_exit[10,9.2;2.5,.75;done;" .. FS("Done") .. "]" .. + "button_exit[12.5,9.2;2.5,.75;cancel;" .. FS("Cancel") .. "]") + + minetest.show_formspec(player:get_player_name(), "character_creator", table.concat(fs)) end local function load_skin(player) @@ -142,6 +145,10 @@ local function save_skin(player) local player_meta = player:get_meta() + if player_meta == nil then + -- The player disconnected before this function was dispatched + return + end local function save_data(data_name) local indexes = skin_indexes[player] @@ -162,43 +169,42 @@ local function get_texture(player) local player_meta = player:get_meta() - local indexes = skin_indexes[player] - local texture = "" + if not player_meta then + -- The player disconnected before this function was dispatched + return "" + end + + local defs = {} + for part, selected in pairs(skin_indexes[player]) do + local key = skins_array[part][selected] + defs[part] = { + key = key, + -- Table reference to the selected hair/skin/... + val = character_creator.skins[part][key] + } + end + local gender = player_meta:get_string("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 + local face = defs.face.val[gender][defs.skin.key] + local hair = defs.hair.val[gender][defs.hair_style.key] + return table.concat({ + "(" .. defs.skin.val .. ")", + "(" .. face .. ")", + "(" .. defs.eyes.val .. ")", + "(" .. hair .. ")", + "(" .. defs.tshirt.val .. ")", + "(" .. defs.pants.val .. ")", + "(" .. defs.shoes.val .. ")", + }, "^") end local function change_skin(player) local player_meta = player:get_meta() + if player_meta == nil then + -- The player disconnected before this function was dispatched + return + end + local texture = get_texture(player) local width = player_meta:get_float("character_creator:width") @@ -211,15 +217,27 @@ } }) - 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}}) + local name = player:get_player_name() + minetest.after(0, function(name) + local player = minetest.get_player_by_name(name) + if player then + multiskin.layers[name].skin = texture + armor:set_player_armor(player) + multiskin:set_player_textures(player, {textures = {texture}}) + end + end, name) + elseif minetest.get_modpath("3d_armor") then - armor.textures[name].skin = texture - armor:set_player_armor(player) + local name = player:get_player_name() + minetest.after(0, function(name) + local player = minetest.get_player_by_name(name) + if player then + armor.textures[name].skin = texture + armor:set_player_armor(player) + end + end, name) + else player:set_properties({textures = {texture}}) end @@ -231,14 +249,19 @@ --change skin redefinition for skinsdb function change_skin(player) local player_meta = player:get_meta() + if player_meta == nil then + -- The player disconnected before this function was dispatched + return + end + 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", player_meta:get_float("character_creator:width")) skin_obj:set_meta("visual_size_y", player_meta:get_float("character_creator:height")) - skin_obj:apply_skin_to_player(player) - skinsdb.assign_player_skin(player, "character_creator:"..playername) + skinsdb.assign_player_skin(player, skinname) + skinsdb.update_player_skin(player) save_skin(player) end end @@ -260,9 +283,16 @@ function skin_obj:get_texture() return get_texture(minetest.get_player_by_name(self:get_meta("playername"))) end + function skin_obj:get_hand() + local player = minetest.get_player_by_name(self:get_meta("playername")) + local skin_key = skins_array.skin[skin_indexes[player].skin] + local hand_skin = skinsdb.get("character_creator:"..skin_key) + if hand_skin then + return hand_skin:get_hand() + end + 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") @@ -430,4 +460,22 @@ title = "Character Creator", action = show_formspec, }) -end + +elseif not skinsdb and not minetest.get_modpath("sfinv_buttons") + and minetest.global_exists("sfinv") and sfinv.enabled then + + local old_func = sfinv.pages["sfinv:crafting"].get + sfinv.override_page("sfinv:crafting", { + get = function(self, player, context) + local fs = old_func(self, player, context) + return fs .. "image_button[0,0;1,1;inventory_plus_character_creator.png;character_creator;]" + end + }) + + minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.character_creator then + show_formspec(player) + return true + end + end) +end diff --git a/locale/character_creator.de.tr b/locale/character_creator.de.tr new file mode 100644 index 0000000..26050de --- /dev/null +++ b/locale/character_creator.de.tr @@ -0,0 +1,11 @@ +# textdomain: character_creator + +### init.lua ### +Cancel=Abbrechen +Done=Fertig +Female=Weiblich +Male=Männlich +Shorter=Kürzer +Taller=Länger +Thinner=Schmaler +Wider=Breiter diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..74e0cd9 --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: character_creator + +### init.lua ### +Cancel= +Done= +Female= +Male= +Shorter= +Taller= +Thinner= +Wider= diff --git a/mod.conf b/mod.conf index 92ca239..e27f874 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ name = character_creator description = Allows the creation of customized character skins inside the game. license = MIT -optional_depends = 3d_armor, multiskin, inventory_plus, unified_inventory, skinsdb, sfinv_buttons +optional_depends = 3d_armor, multiskin, inventory_plus, unified_inventory, skinsdb, sfinv_buttons, sfinv diff --git a/readme.md b/readme.md index 20b73b0..5a4a4e1 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,38 @@ +# Character Creator + This mod is attributed to the Voxelands project. +It allows you to customize your skin. + +![Screenshot](screenshot.png) + +To change your skin, use either the chat commmand `/character_creator` +or a dedicated button in one of the supported inventory mods (see below). + +### Requirements + + * Minetest 5.0.0 or newer + +### Supported mods + + * multiskin + * 3d_armor + * sfinv (Minetest Game) + * unified_inventory + * sfinv_buttons + * inventory_plus + + +### License + +Code: MIT + +Textures: CC BY-SA 3.0 + +See also: [license.txt](license.txt) + +### Credits Voxelands creators: -sdzen -darkrose \ No newline at end of file + + * sdzen + * darkrose \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..cafa679 Binary files /dev/null and b/screenshot.png differ diff --git a/skins.lua b/skins.lua index ec422c2..e98c954 100644 --- a/skins.lua +++ b/skins.lua @@ -1,4 +1,7 @@ -return { +-- TODO: Check if the indices are backwards-compatible after "translation" +--local S = character_creator.S + +character_creator.skins = { skin = { ["Fair Skin"] = "cc_skin_fair.png", ["Green Skin"] = "cc_skin_green.png", @@ -249,6 +252,12 @@ ["Yellow T-Shirt"] = "cc_tshirt_yellow.png", ["Black T-Shirt"] = "cc_tshirt_black.png", ["Blue T-Shirt"] = "cc_tshirt_blue.png", + ["Brown Vest"] = "cc_vest_brown.png", + ["Green Vest"] = "cc_vest_green.png", + ["Blue Vest"] = "cc_vest_blue.png", + ["Brown Shirt"] = "cc_shirt_canvas_brown.png", + ["Green Shirt"] = "cc_shirt_canvas_green.png", + ["Blue Shirt"] = "cc_shirt_canvas_blue.png", }, pants = { @@ -260,11 +269,18 @@ ["White Pants"] = "cc_pants_white.png", ["Yellow Pants"] = "cc_pants_yellow.png", ["Black Pants"] = "cc_pants_black.png", + ["Brown Canvas Pants"] = "cc_pants_canvas_brown.png", + ["Green Canvas Pants"] = "cc_pants_canvas_green.png", + ["Blue Canvas Pants"] = "cc_pants_canvas_blue.png", }, shoes = { ["Leather Shoes"] = "cc_shoes_leather.png", ["Canvas Shoes"] = "cc_shoes_canvas.png", ["Fur Shoes"] = "cc_shoes_fur.png", + ["Brown Shoes"] = "cc_shoes_brown.png", + ["Green Shoes"] = "cc_shoes_green.png", + ["Blue Shoes"] = "cc_shoes_blue.png", + ["Black Shoes"] = "cc_shoes_black.png", } } diff --git a/textures/cc_face_alien_black_F.png b/textures/cc_face_alien_black_F.png index a56e28e..5f480eb 100644 Binary files a/textures/cc_face_alien_black_F.png and b/textures/cc_face_alien_black_F.png differ diff --git a/textures/cc_face_alien_dark_F.png b/textures/cc_face_alien_dark_F.png index 5dc1604..f6c6f7c 100644 Binary files a/textures/cc_face_alien_dark_F.png and b/textures/cc_face_alien_dark_F.png differ diff --git a/textures/cc_face_alien_fair_F.png b/textures/cc_face_alien_fair_F.png index 1dcb8ad..5b2a1a5 100644 Binary files a/textures/cc_face_alien_fair_F.png and b/textures/cc_face_alien_fair_F.png differ diff --git a/textures/cc_face_alien_fair_M.png b/textures/cc_face_alien_fair_M.png index 0deb145..65b4c61 100644 Binary files a/textures/cc_face_alien_fair_M.png and b/textures/cc_face_alien_fair_M.png differ diff --git a/textures/cc_face_alien_red_F.png b/textures/cc_face_alien_red_F.png index 8743372..32e5943 100644 Binary files a/textures/cc_face_alien_red_F.png and b/textures/cc_face_alien_red_F.png differ diff --git a/textures/cc_face_alien_red_M.png b/textures/cc_face_alien_red_M.png index 1e49ca4..53576c9 100644 Binary files a/textures/cc_face_alien_red_M.png and b/textures/cc_face_alien_red_M.png differ diff --git a/textures/cc_face_alien_tanned_F.png b/textures/cc_face_alien_tanned_F.png index eadd54e..53b171a 100644 Binary files a/textures/cc_face_alien_tanned_F.png and b/textures/cc_face_alien_tanned_F.png differ diff --git a/textures/cc_face_alien_tanned_M.png b/textures/cc_face_alien_tanned_M.png index ffa3fc0..b2cb6aa 100644 Binary files a/textures/cc_face_alien_tanned_M.png and b/textures/cc_face_alien_tanned_M.png differ diff --git a/textures/cc_face_dwarven_black_F.png b/textures/cc_face_dwarven_black_F.png index 1f2c4a5..1836ac5 100644 Binary files a/textures/cc_face_dwarven_black_F.png and b/textures/cc_face_dwarven_black_F.png differ diff --git a/textures/cc_face_dwarven_dark_F.png b/textures/cc_face_dwarven_dark_F.png index da83bec..fa0a0ea 100644 Binary files a/textures/cc_face_dwarven_dark_F.png and b/textures/cc_face_dwarven_dark_F.png differ diff --git a/textures/cc_face_dwarven_dark_M.png b/textures/cc_face_dwarven_dark_M.png index 296fa5f..134b7e5 100644 Binary files a/textures/cc_face_dwarven_dark_M.png and b/textures/cc_face_dwarven_dark_M.png differ diff --git a/textures/cc_face_dwarven_fair_F.png b/textures/cc_face_dwarven_fair_F.png index dd82acc..c15316b 100644 Binary files a/textures/cc_face_dwarven_fair_F.png and b/textures/cc_face_dwarven_fair_F.png differ diff --git a/textures/cc_face_dwarven_fair_M.png b/textures/cc_face_dwarven_fair_M.png index 70fed00..ef8048b 100644 Binary files a/textures/cc_face_dwarven_fair_M.png and b/textures/cc_face_dwarven_fair_M.png differ diff --git a/textures/cc_face_dwarven_red_F.png b/textures/cc_face_dwarven_red_F.png index 4d4b392..3f5d0b7 100644 Binary files a/textures/cc_face_dwarven_red_F.png and b/textures/cc_face_dwarven_red_F.png differ diff --git a/textures/cc_face_elven_black_F.png b/textures/cc_face_elven_black_F.png index c356291..14528d1 100644 Binary files a/textures/cc_face_elven_black_F.png and b/textures/cc_face_elven_black_F.png differ diff --git a/textures/cc_face_elven_black_M.png b/textures/cc_face_elven_black_M.png index 7f6f7ee..9510263 100644 Binary files a/textures/cc_face_elven_black_M.png and b/textures/cc_face_elven_black_M.png differ diff --git a/textures/cc_face_elven_dark_F.png b/textures/cc_face_elven_dark_F.png index 7536c75..ace880a 100644 Binary files a/textures/cc_face_elven_dark_F.png and b/textures/cc_face_elven_dark_F.png differ diff --git a/textures/cc_face_elven_dark_M.png b/textures/cc_face_elven_dark_M.png index db5c5fc..498a4ce 100644 Binary files a/textures/cc_face_elven_dark_M.png and b/textures/cc_face_elven_dark_M.png differ diff --git a/textures/cc_face_elven_fair_F.png b/textures/cc_face_elven_fair_F.png index 5f0c04c..6ea5db5 100644 Binary files a/textures/cc_face_elven_fair_F.png and b/textures/cc_face_elven_fair_F.png differ diff --git a/textures/cc_face_elven_fair_M.png b/textures/cc_face_elven_fair_M.png index d94cc7f..bd45466 100644 Binary files a/textures/cc_face_elven_fair_M.png and b/textures/cc_face_elven_fair_M.png differ diff --git a/textures/cc_face_elven_green_F.png b/textures/cc_face_elven_green_F.png index 0292f88..7e061f1 100644 Binary files a/textures/cc_face_elven_green_F.png and b/textures/cc_face_elven_green_F.png differ diff --git a/textures/cc_face_elven_green_M.png b/textures/cc_face_elven_green_M.png index d1becad..a324a5f 100644 Binary files a/textures/cc_face_elven_green_M.png and b/textures/cc_face_elven_green_M.png differ diff --git a/textures/cc_face_elven_red_F.png b/textures/cc_face_elven_red_F.png index 83fe3d5..eabd318 100644 Binary files a/textures/cc_face_elven_red_F.png and b/textures/cc_face_elven_red_F.png differ diff --git a/textures/cc_face_elven_red_M.png b/textures/cc_face_elven_red_M.png index 86f7210..1bacd23 100644 Binary files a/textures/cc_face_elven_red_M.png and b/textures/cc_face_elven_red_M.png differ diff --git a/textures/cc_face_elven_tanned_F.png b/textures/cc_face_elven_tanned_F.png index c78bff8..3a474b3 100644 Binary files a/textures/cc_face_elven_tanned_F.png and b/textures/cc_face_elven_tanned_F.png differ diff --git a/textures/cc_face_elven_white_M.png b/textures/cc_face_elven_white_M.png index f7e3c31..4e5a73e 100644 Binary files a/textures/cc_face_elven_white_M.png and b/textures/cc_face_elven_white_M.png differ diff --git a/textures/cc_face_human_fair_F.png b/textures/cc_face_human_fair_F.png index 130b071..f43c9bb 100644 Binary files a/textures/cc_face_human_fair_F.png and b/textures/cc_face_human_fair_F.png differ diff --git a/textures/cc_face_human_fair_M.png b/textures/cc_face_human_fair_M.png index 5d0ec52..f6531c6 100644 Binary files a/textures/cc_face_human_fair_M.png and b/textures/cc_face_human_fair_M.png differ diff --git a/textures/cc_face_human_red_M.png b/textures/cc_face_human_red_M.png index 8fa605e..b791662 100644 Binary files a/textures/cc_face_human_red_M.png and b/textures/cc_face_human_red_M.png differ diff --git a/textures/cc_face_human_tanned_F.png b/textures/cc_face_human_tanned_F.png index 98d2605..2e174ac 100644 Binary files a/textures/cc_face_human_tanned_F.png and b/textures/cc_face_human_tanned_F.png differ diff --git a/textures/cc_hair_long_black_F.png b/textures/cc_hair_long_black_F.png index a1f265d..df2d580 100644 Binary files a/textures/cc_hair_long_black_F.png and b/textures/cc_hair_long_black_F.png differ diff --git a/textures/cc_hair_long_black_M.png b/textures/cc_hair_long_black_M.png index aca9a97..3c451e6 100644 Binary files a/textures/cc_hair_long_black_M.png and b/textures/cc_hair_long_black_M.png differ diff --git a/textures/cc_hair_long_blonde_F.png b/textures/cc_hair_long_blonde_F.png index f165cad..da1fd40 100644 Binary files a/textures/cc_hair_long_blonde_F.png and b/textures/cc_hair_long_blonde_F.png differ diff --git a/textures/cc_hair_long_blonde_M.png b/textures/cc_hair_long_blonde_M.png index 36b2a43..6e39bf9 100644 Binary files a/textures/cc_hair_long_blonde_M.png and b/textures/cc_hair_long_blonde_M.png differ diff --git a/textures/cc_hair_long_blue_F.png b/textures/cc_hair_long_blue_F.png index 3c32224..37095bb 100644 Binary files a/textures/cc_hair_long_blue_F.png and b/textures/cc_hair_long_blue_F.png differ diff --git a/textures/cc_hair_long_blue_M.png b/textures/cc_hair_long_blue_M.png index 2205f75..f51ddbc 100644 Binary files a/textures/cc_hair_long_blue_M.png and b/textures/cc_hair_long_blue_M.png differ diff --git a/textures/cc_hair_long_green_F.png b/textures/cc_hair_long_green_F.png index 3a9a079..0c6d2b5 100644 Binary files a/textures/cc_hair_long_green_F.png and b/textures/cc_hair_long_green_F.png differ diff --git a/textures/cc_hair_long_green_M.png b/textures/cc_hair_long_green_M.png index 11b37ce..1baab36 100644 Binary files a/textures/cc_hair_long_green_M.png and b/textures/cc_hair_long_green_M.png differ diff --git a/textures/cc_hair_long_orange_F.png b/textures/cc_hair_long_orange_F.png index e35da82..f611ac4 100644 Binary files a/textures/cc_hair_long_orange_F.png and b/textures/cc_hair_long_orange_F.png differ diff --git a/textures/cc_hair_long_orange_M.png b/textures/cc_hair_long_orange_M.png index efdec01..1bc54d1 100644 Binary files a/textures/cc_hair_long_orange_M.png and b/textures/cc_hair_long_orange_M.png differ diff --git a/textures/cc_hair_long_purple_F.png b/textures/cc_hair_long_purple_F.png index 17db13a..60e4dcc 100644 Binary files a/textures/cc_hair_long_purple_F.png and b/textures/cc_hair_long_purple_F.png differ diff --git a/textures/cc_hair_long_purple_M.png b/textures/cc_hair_long_purple_M.png index 3a36bbc..2eeb0d1 100644 Binary files a/textures/cc_hair_long_purple_M.png and b/textures/cc_hair_long_purple_M.png differ diff --git a/textures/cc_hair_long_red_F.png b/textures/cc_hair_long_red_F.png index 0a473c6..2af4b47 100644 Binary files a/textures/cc_hair_long_red_F.png and b/textures/cc_hair_long_red_F.png differ diff --git a/textures/cc_hair_long_red_M.png b/textures/cc_hair_long_red_M.png index 8b21be8..66c9acf 100644 Binary files a/textures/cc_hair_long_red_M.png and b/textures/cc_hair_long_red_M.png differ diff --git a/textures/cc_hair_long_white_F.png b/textures/cc_hair_long_white_F.png index 116080a..1e6f797 100644 Binary files a/textures/cc_hair_long_white_F.png and b/textures/cc_hair_long_white_F.png differ diff --git a/textures/cc_hair_long_white_M.png b/textures/cc_hair_long_white_M.png index 568507d..aa97c9b 100644 Binary files a/textures/cc_hair_long_white_M.png and b/textures/cc_hair_long_white_M.png differ diff --git a/textures/cc_hair_medium_black_F.png b/textures/cc_hair_medium_black_F.png index db5a083..183a290 100644 Binary files a/textures/cc_hair_medium_black_F.png and b/textures/cc_hair_medium_black_F.png differ diff --git a/textures/cc_hair_medium_black_M.png b/textures/cc_hair_medium_black_M.png index 5a4e074..f40bb96 100644 Binary files a/textures/cc_hair_medium_black_M.png and b/textures/cc_hair_medium_black_M.png differ diff --git a/textures/cc_hair_medium_blonde_F.png b/textures/cc_hair_medium_blonde_F.png index bc013b3..06af8e6 100644 Binary files a/textures/cc_hair_medium_blonde_F.png and b/textures/cc_hair_medium_blonde_F.png differ diff --git a/textures/cc_hair_medium_blonde_M.png b/textures/cc_hair_medium_blonde_M.png index fbae27c..d68435d 100644 Binary files a/textures/cc_hair_medium_blonde_M.png and b/textures/cc_hair_medium_blonde_M.png differ diff --git a/textures/cc_hair_medium_blue_F.png b/textures/cc_hair_medium_blue_F.png index c7f9517..d633aff 100644 Binary files a/textures/cc_hair_medium_blue_F.png and b/textures/cc_hair_medium_blue_F.png differ diff --git a/textures/cc_hair_medium_blue_M.png b/textures/cc_hair_medium_blue_M.png index f92fd1a..cb78ee4 100644 Binary files a/textures/cc_hair_medium_blue_M.png and b/textures/cc_hair_medium_blue_M.png differ diff --git a/textures/cc_hair_medium_brown_M.png b/textures/cc_hair_medium_brown_M.png index 19c5f80..f34abc9 100644 Binary files a/textures/cc_hair_medium_brown_M.png and b/textures/cc_hair_medium_brown_M.png differ diff --git a/textures/cc_hair_medium_green_F.png b/textures/cc_hair_medium_green_F.png index f56e36f..491753d 100644 Binary files a/textures/cc_hair_medium_green_F.png and b/textures/cc_hair_medium_green_F.png differ diff --git a/textures/cc_hair_medium_green_M.png b/textures/cc_hair_medium_green_M.png index 290271a..b31c059 100644 Binary files a/textures/cc_hair_medium_green_M.png and b/textures/cc_hair_medium_green_M.png differ diff --git a/textures/cc_hair_medium_orange_F.png b/textures/cc_hair_medium_orange_F.png index afecab6..343857b 100644 Binary files a/textures/cc_hair_medium_orange_F.png and b/textures/cc_hair_medium_orange_F.png differ diff --git a/textures/cc_hair_medium_orange_M.png b/textures/cc_hair_medium_orange_M.png index 3abbabb..08b5090 100644 Binary files a/textures/cc_hair_medium_orange_M.png and b/textures/cc_hair_medium_orange_M.png differ diff --git a/textures/cc_hair_medium_purple_F.png b/textures/cc_hair_medium_purple_F.png index d00c00b..1a623e4 100644 Binary files a/textures/cc_hair_medium_purple_F.png and b/textures/cc_hair_medium_purple_F.png differ diff --git a/textures/cc_hair_medium_purple_M.png b/textures/cc_hair_medium_purple_M.png index 690adb0..083ed2f 100644 Binary files a/textures/cc_hair_medium_purple_M.png and b/textures/cc_hair_medium_purple_M.png differ diff --git a/textures/cc_hair_medium_red_F.png b/textures/cc_hair_medium_red_F.png index 5b663ad..b9843ce 100644 Binary files a/textures/cc_hair_medium_red_F.png and b/textures/cc_hair_medium_red_F.png differ diff --git a/textures/cc_hair_medium_red_M.png b/textures/cc_hair_medium_red_M.png index 4cd4447..39c6437 100644 Binary files a/textures/cc_hair_medium_red_M.png and b/textures/cc_hair_medium_red_M.png differ diff --git a/textures/cc_hair_medium_white_F.png b/textures/cc_hair_medium_white_F.png index cb01940..bc77c37 100644 Binary files a/textures/cc_hair_medium_white_F.png and b/textures/cc_hair_medium_white_F.png differ diff --git a/textures/cc_hair_medium_white_M.png b/textures/cc_hair_medium_white_M.png index 9b85fb9..5835198 100644 Binary files a/textures/cc_hair_medium_white_M.png and b/textures/cc_hair_medium_white_M.png differ diff --git a/textures/cc_hair_short_black_F.png b/textures/cc_hair_short_black_F.png index 6a89664..138352c 100644 Binary files a/textures/cc_hair_short_black_F.png and b/textures/cc_hair_short_black_F.png differ diff --git a/textures/cc_hair_short_black_M.png b/textures/cc_hair_short_black_M.png index e0fffc9..f6e1a3f 100644 Binary files a/textures/cc_hair_short_black_M.png and b/textures/cc_hair_short_black_M.png differ diff --git a/textures/cc_hair_short_blonde_F.png b/textures/cc_hair_short_blonde_F.png index 30068ea..fb7f216 100644 Binary files a/textures/cc_hair_short_blonde_F.png and b/textures/cc_hair_short_blonde_F.png differ diff --git a/textures/cc_hair_short_blonde_M.png b/textures/cc_hair_short_blonde_M.png index ac85e44..d4009e1 100644 Binary files a/textures/cc_hair_short_blonde_M.png and b/textures/cc_hair_short_blonde_M.png differ diff --git a/textures/cc_hair_short_blue_F.png b/textures/cc_hair_short_blue_F.png index 1f5e009..49c894f 100644 Binary files a/textures/cc_hair_short_blue_F.png and b/textures/cc_hair_short_blue_F.png differ diff --git a/textures/cc_hair_short_blue_M.png b/textures/cc_hair_short_blue_M.png index 43396c9..14935b2 100644 Binary files a/textures/cc_hair_short_blue_M.png and b/textures/cc_hair_short_blue_M.png differ diff --git a/textures/cc_hair_short_brown_F.png b/textures/cc_hair_short_brown_F.png index cf88021..0847074 100644 Binary files a/textures/cc_hair_short_brown_F.png and b/textures/cc_hair_short_brown_F.png differ diff --git a/textures/cc_hair_short_brown_M.png b/textures/cc_hair_short_brown_M.png index dff7cd6..6329bb9 100644 Binary files a/textures/cc_hair_short_brown_M.png and b/textures/cc_hair_short_brown_M.png differ diff --git a/textures/cc_hair_short_green_F.png b/textures/cc_hair_short_green_F.png index a1397ae..9a486f3 100644 Binary files a/textures/cc_hair_short_green_F.png and b/textures/cc_hair_short_green_F.png differ diff --git a/textures/cc_hair_short_green_M.png b/textures/cc_hair_short_green_M.png index a19bbcd..a97fa93 100644 Binary files a/textures/cc_hair_short_green_M.png and b/textures/cc_hair_short_green_M.png differ diff --git a/textures/cc_hair_short_orange_F.png b/textures/cc_hair_short_orange_F.png index 1f77e9d..c2698ae 100644 Binary files a/textures/cc_hair_short_orange_F.png and b/textures/cc_hair_short_orange_F.png differ diff --git a/textures/cc_hair_short_orange_M.png b/textures/cc_hair_short_orange_M.png index 0a2a81b..5b663d8 100644 Binary files a/textures/cc_hair_short_orange_M.png and b/textures/cc_hair_short_orange_M.png differ diff --git a/textures/cc_hair_short_purple_F.png b/textures/cc_hair_short_purple_F.png index 6f55a6e..5fe2d4e 100644 Binary files a/textures/cc_hair_short_purple_F.png and b/textures/cc_hair_short_purple_F.png differ diff --git a/textures/cc_hair_short_purple_M.png b/textures/cc_hair_short_purple_M.png index afc6efe..c46c9a4 100644 Binary files a/textures/cc_hair_short_purple_M.png and b/textures/cc_hair_short_purple_M.png differ diff --git a/textures/cc_hair_short_red_F.png b/textures/cc_hair_short_red_F.png index 5602b96..e1e3225 100644 Binary files a/textures/cc_hair_short_red_F.png and b/textures/cc_hair_short_red_F.png differ diff --git a/textures/cc_hair_short_red_M.png b/textures/cc_hair_short_red_M.png index 263ea35..bdc8864 100644 Binary files a/textures/cc_hair_short_red_M.png and b/textures/cc_hair_short_red_M.png differ diff --git a/textures/cc_hair_short_white_F.png b/textures/cc_hair_short_white_F.png index 7a5ad6c..4c7d2e8 100644 Binary files a/textures/cc_hair_short_white_F.png and b/textures/cc_hair_short_white_F.png differ diff --git a/textures/cc_hair_short_white_M.png b/textures/cc_hair_short_white_M.png index 3ea6a41..84b8ac8 100644 Binary files a/textures/cc_hair_short_white_M.png and b/textures/cc_hair_short_white_M.png differ diff --git a/textures/cc_hair_special_black_M.png b/textures/cc_hair_special_black_M.png index 3a3d2c4..926e1f7 100644 Binary files a/textures/cc_hair_special_black_M.png and b/textures/cc_hair_special_black_M.png differ diff --git a/textures/cc_hair_special_blonde_M.png b/textures/cc_hair_special_blonde_M.png index 1235228..60ee874 100644 Binary files a/textures/cc_hair_special_blonde_M.png and b/textures/cc_hair_special_blonde_M.png differ diff --git a/textures/cc_hair_special_blue_M.png b/textures/cc_hair_special_blue_M.png index e78e032..6535e21 100644 Binary files a/textures/cc_hair_special_blue_M.png and b/textures/cc_hair_special_blue_M.png differ diff --git a/textures/cc_hair_special_brown_M.png b/textures/cc_hair_special_brown_M.png index ff0139d..851fccb 100644 Binary files a/textures/cc_hair_special_brown_M.png and b/textures/cc_hair_special_brown_M.png differ diff --git a/textures/cc_hair_special_green_M.png b/textures/cc_hair_special_green_M.png index 8085c88..63f1c57 100644 Binary files a/textures/cc_hair_special_green_M.png and b/textures/cc_hair_special_green_M.png differ diff --git a/textures/cc_hair_special_orange_M.png b/textures/cc_hair_special_orange_M.png index 17460a1..ebbd697 100644 Binary files a/textures/cc_hair_special_orange_M.png and b/textures/cc_hair_special_orange_M.png differ diff --git a/textures/cc_hair_special_purple_M.png b/textures/cc_hair_special_purple_M.png index b31d73f..e5d7930 100644 Binary files a/textures/cc_hair_special_purple_M.png and b/textures/cc_hair_special_purple_M.png differ diff --git a/textures/cc_hair_special_red_M.png b/textures/cc_hair_special_red_M.png index 19f8df8..9ca1437 100644 Binary files a/textures/cc_hair_special_red_M.png and b/textures/cc_hair_special_red_M.png differ diff --git a/textures/cc_hair_special_white_M.png b/textures/cc_hair_special_white_M.png index 910dc80..61e46e7 100644 Binary files a/textures/cc_hair_special_white_M.png and b/textures/cc_hair_special_white_M.png differ diff --git a/textures/cc_pants_black.png b/textures/cc_pants_black.png index 297a728..6ea8f86 100644 Binary files a/textures/cc_pants_black.png and b/textures/cc_pants_black.png differ diff --git a/textures/cc_pants_canvas_blue.png b/textures/cc_pants_canvas_blue.png new file mode 100644 index 0000000..78b7f44 Binary files /dev/null and b/textures/cc_pants_canvas_blue.png differ diff --git a/textures/cc_pants_canvas_brown.png b/textures/cc_pants_canvas_brown.png new file mode 100644 index 0000000..3d5c840 Binary files /dev/null and b/textures/cc_pants_canvas_brown.png differ diff --git a/textures/cc_pants_canvas_green.png b/textures/cc_pants_canvas_green.png new file mode 100644 index 0000000..a2266f2 Binary files /dev/null and b/textures/cc_pants_canvas_green.png differ diff --git a/textures/cc_pants_white.png b/textures/cc_pants_white.png index 7f1b132..c53a02c 100644 Binary files a/textures/cc_pants_white.png and b/textures/cc_pants_white.png differ diff --git a/textures/cc_shirt_canvas_blue.png b/textures/cc_shirt_canvas_blue.png new file mode 100644 index 0000000..4d7e5c6 Binary files /dev/null and b/textures/cc_shirt_canvas_blue.png differ diff --git a/textures/cc_shirt_canvas_brown.png b/textures/cc_shirt_canvas_brown.png new file mode 100644 index 0000000..4ef33c0 Binary files /dev/null and b/textures/cc_shirt_canvas_brown.png differ diff --git a/textures/cc_shirt_canvas_green.png b/textures/cc_shirt_canvas_green.png new file mode 100644 index 0000000..9b2eb82 Binary files /dev/null and b/textures/cc_shirt_canvas_green.png differ diff --git a/textures/cc_shoes_black.png b/textures/cc_shoes_black.png new file mode 100644 index 0000000..d3282b3 Binary files /dev/null and b/textures/cc_shoes_black.png differ diff --git a/textures/cc_shoes_blue.png b/textures/cc_shoes_blue.png new file mode 100644 index 0000000..706e226 Binary files /dev/null and b/textures/cc_shoes_blue.png differ diff --git a/textures/cc_shoes_brown.png b/textures/cc_shoes_brown.png new file mode 100644 index 0000000..95e6e9e Binary files /dev/null and b/textures/cc_shoes_brown.png differ diff --git a/textures/cc_shoes_canvas.png b/textures/cc_shoes_canvas.png index 6bc2f95..7f9a30b 100644 Binary files a/textures/cc_shoes_canvas.png and b/textures/cc_shoes_canvas.png differ diff --git a/textures/cc_shoes_fur.png b/textures/cc_shoes_fur.png index 458be7a..082ca23 100644 Binary files a/textures/cc_shoes_fur.png and b/textures/cc_shoes_fur.png differ diff --git a/textures/cc_shoes_green.png b/textures/cc_shoes_green.png new file mode 100644 index 0000000..3e8da2e Binary files /dev/null and b/textures/cc_shoes_green.png differ diff --git a/textures/cc_skin_black.png b/textures/cc_skin_black.png index aec8e2d..1ab3f5e 100644 Binary files a/textures/cc_skin_black.png and b/textures/cc_skin_black.png differ diff --git a/textures/cc_skin_dark.png b/textures/cc_skin_dark.png index 72c6aa2..ec9c99c 100644 Binary files a/textures/cc_skin_dark.png and b/textures/cc_skin_dark.png differ diff --git a/textures/cc_skin_white.png b/textures/cc_skin_white.png index 0400471..10a8d77 100644 Binary files a/textures/cc_skin_white.png and b/textures/cc_skin_white.png differ diff --git a/textures/cc_vest_blue.png b/textures/cc_vest_blue.png new file mode 100644 index 0000000..8108f21 Binary files /dev/null and b/textures/cc_vest_blue.png differ diff --git a/textures/cc_vest_brown.png b/textures/cc_vest_brown.png new file mode 100644 index 0000000..2d043ba Binary files /dev/null and b/textures/cc_vest_brown.png differ diff --git a/textures/cc_vest_green.png b/textures/cc_vest_green.png new file mode 100644 index 0000000..89b1a45 Binary files /dev/null and b/textures/cc_vest_green.png differ diff --git a/textures/inventory_plus_character_creator.png b/textures/inventory_plus_character_creator.png index 6416bb0..40cb5ff 100644 Binary files a/textures/inventory_plus_character_creator.png and b/textures/inventory_plus_character_creator.png differ