/// <summary>
        /// Sends the Create Character message to the server with a collection of properties
        /// to save to the new character.
        /// </summary>
        public virtual void CreateCharacter()
        {
            if (characterName == "")
            {
                return;
            }
            Dictionary <string, object> properties = new Dictionary <string, object>();

            properties.Add("characterName", characterName);
            if (gender == "Male")
            {
                properties.Add("prefab", race.maleCharacterPrefab.name);
            }
            else if (gender == "Female")
            {
                properties.Add("prefab", race.femaleCharacterPrefab.name);
            }
            properties.Add("race", race.raceName);
            properties.Add("aspect", aspect.className);
            properties.Add("gender", gender);
            if (PortraitManager.Instance.portraitType == PortraitType.Custom)
            {
                Sprite[] icons = null;//= { new Sprite() };
                icons = AtavismSettings.Instance.Avatars(race.raceName, gender, aspect.className);

                /* if (gender == "Male")
                 *   icons = AtavismSettings.Instance.meleAvatars;
                 * if (gender == "Female")
                 *   icons = AtavismSettings.Instance.femaleAvatars;*/
                if (icons != null && icons.Length > 0)
                {
                    if (avatarList == null)
                    {
                        Debug.LogError("CharacterSelectionCreationManager avatarList is null", gameObject);
                    }
                    else
                    {
                        if (icons.Length > avatarList.Selected())
                        {
                            if (icons[avatarList.Selected()] == null)
                            {
                                Debug.LogError("CharacterSelectionCreationManager icons for " + race.raceName + " " + gender + " " + aspect.className + " is null ; avatarList selected " + avatarList.Selected(), gameObject);
                            }
                            else
                            {
                                properties.Add("custom:portrait", icons[avatarList.Selected()].name);
                                //     properties.Add("portrait", icons[avatarList.Selected()].name);
                            }
                        }
                    }
                }
            }

            if (PortraitManager.Instance.portraitType == PortraitType.Class)
            {
                Sprite portraitSprite = PortraitManager.Instance.GetCharacterSelectionPortrait(gender, race.raceName, aspect.className, PortraitType.Class);
                properties.Add("custom:portrait", portraitSprite.name);
            }

            // If the character has the customisable hair, save the property

            /*if (character.GetComponent<CustomisedHair>() != null) {
             *  CustomisedHair customHair = character.GetComponent<CustomisedHair>();
             *  properties.Add("custom:" + customHair.hairPropertyName, customHair.ActiveHair.name);
             * }*/
#if AT_I2LOC_PRESET
            dialogMessage = I2.Loc.LocalizationManager.GetTranslation("Please wait...");
#else
            dialogMessage = "Please wait...";
#endif
            errorMessage      = "";
            characterSelected = AtavismClient.Instance.NetworkHelper.CreateCharacter(properties);
            if (characterSelected == null)
            {
                errorMessage = "Unknown Error";
            }
            else
            {
                if (!characterSelected.Status)
                {
                    if (characterSelected.ContainsKey("errorMessage"))
                    {
                        errorMessage = (string)characterSelected["errorMessage"];
                    }
                }
            }
            dialogMessage = "";
            if (errorMessage == "")
            {
                StartCharacterSelection();
                //nameUI.text = characterName;
                // Have to rename all the properties. This seems kind of pointless.
                Dictionary <string, object> newProps = new Dictionary <string, object>();
                foreach (string prop in properties.Keys)
                {
                    if (prop.Contains(":"))
                    {
                        string[] newPropParts = prop.Split(':');
                        if (newPropParts.Length > 2 && newPropParts[2] != null)
                        {
                            string newProp = "uma" + newPropParts[2];
                            newProps.Add(newProp, properties[prop]);
                        }
                    }
                }
                foreach (string prop in newProps.Keys)
                {
                    if (!characterSelected.ContainsKey(prop))
                    {
                        characterSelected.Add(prop, newProps[prop]);
                    }
                }
            }
            else
            {
#if AT_I2LOC_PRESET
                ShowDialog(I2.Loc.LocalizationManager.GetTranslation(errorMessage), true);
#else
                ShowDialog(errorMessage, true);
#endif
            }
        }
        public virtual void CharacterSelected(CharacterEntry entry)
        {
            characterSelected = entry;
            foreach (UGUICharacterSelectSlot charSlot in characterSlots)
            {
                charSlot.CharacterSelected(characterSelected);
            }
            if (character != null)
            {
                Destroy(character);
            }
            race   = GetRaceDataByName((string)characterSelected["race"]);
            gender = (string)characterSelected["gender"];
            Dictionary <string, object> appearanceProps = new Dictionary <string, object>();

            foreach (string key in entry.Keys)
            {
                if (key.StartsWith("custom:appearanceData:"))
                {
                    appearanceProps.Add(key.Substring(23), entry[key]);
                }
            }
            // Dna settings
            string prefabName = (string)characterSelected["model"];

            if (prefabName.Contains(".prefab"))
            {
                int resourcePathPos = prefabName.IndexOf("Resources/");
                prefabName = prefabName.Substring(resourcePathPos + 10);
                prefabName = prefabName.Remove(prefabName.Length - 7);
            }
            GameObject prefab = (GameObject)Resources.Load(prefabName);

            if (prefab != null)
            {
                character = (GameObject)Instantiate(prefab, spawnPosition.position, spawnPosition.rotation);
            }
            else
            {
                Debug.LogError("prefab = null model: " + prefabName + " Loading ExampleCharacter");
                prefab = (GameObject)Resources.Load("ExampleCharacter");
                if (prefab != null)
                {
                    character = (GameObject)Instantiate(prefab, spawnPosition.position, spawnPosition.rotation);
                }
            }
            //SetCharacter (prefab);
            // Set equipment
            if (characterSelected.ContainsKey("weaponDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("weaponDisplayID", (string)characterSelected["weaponDisplayID"]);
            }
            if (characterSelected.ContainsKey("weapon2DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("weapon2DisplayID", (string)characterSelected["weapon2DisplayID"]);
            }
            // UMA-equipment properties
            if (characterSelected.ContainsKey("legDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("legDisplayID", (string)characterSelected["legDisplayID"]);
            }
            if (characterSelected.ContainsKey("chestDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("chestDisplayID", (string)characterSelected["chestDisplayID"]);
            }
            if (characterSelected.ContainsKey("headDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("headDisplayID", (string)characterSelected["headDisplayID"]);
            }
            if (characterSelected.ContainsKey("feetDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("feetDisplayID", (string)characterSelected["feetDisplayID"]);
            }
            if (characterSelected.ContainsKey("handDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("handDisplayID", (string)characterSelected["handDisplayID"]);
            }
            if (characterSelected.ContainsKey("capeDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("capeDisplayID", (string)characterSelected["capeDisplayID"]);
            }
            if (characterSelected.ContainsKey("shoulderDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("shoulderDisplayID", (string)characterSelected["shoulderDisplayID"]);
            }
            if (characterSelected.ContainsKey("beltDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("beltDisplayID", (string)characterSelected["beltDisplayID"]);
            }
            if (characterSelected.ContainsKey("ringDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("ringDisplayID", (string)characterSelected["ringDisplayID"]);
            }
            if (characterSelected.ContainsKey("ring2DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("ring2DisplayID", (string)characterSelected["ring2DisplayID"]);
            }
            if (characterSelected.ContainsKey("earringDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("earringDisplayID", (string)characterSelected["earringDisplayID"]);
            }
            if (characterSelected.ContainsKey("earring2DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("earring2DisplayID", (string)characterSelected["earring2DisplayID"]);
            }
            if (characterSelected.ContainsKey("rangedDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("rangedDisplayID", (string)characterSelected["rangedDisplayID"]);
            }
            if (characterSelected.ContainsKey("neckDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("neckDisplayID", (string)characterSelected["neckDisplayID"]);
            }
            if (characterSelected.ContainsKey("slot1DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot1DisplayID", (string)characterSelected["slot1DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot2DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot2DisplayID", (string)characterSelected["slot2DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot3DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot3DisplayID", (string)characterSelected["slot3DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot4DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot4DisplayID", (string)characterSelected["slot4DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot5DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot5DisplayID", (string)characterSelected["slot5DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot6DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot6DisplayID", (string)characterSelected["slot6DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot7DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot7DisplayID", (string)characterSelected["slot7DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot8DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot8DisplayID", (string)characterSelected["slot8DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot9DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot9DisplayID", (string)characterSelected["slot9DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot10DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot10DisplayID", (string)characterSelected["slot10DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot11DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot11DisplayID", (string)characterSelected["slot11DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot12DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot12DisplayID", (string)characterSelected["slot12DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot13DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot13DisplayID", (string)characterSelected["slot13DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot14DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot14DisplayID", (string)characterSelected["slot14DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot15DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot15DisplayID", (string)characterSelected["slot15DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot16DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot16DisplayID", (string)characterSelected["slot16DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot17DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot17DisplayID", (string)characterSelected["slot17DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot18DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot18DisplayID", (string)characterSelected["slot18DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot19DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot19DisplayID", (string)characterSelected["slot19DisplayID"]);
            }
            if (characterSelected.ContainsKey("slot20DisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("slot20DisplayID", (string)characterSelected["slot20DisplayID"]);
            }
            if (characterSelected.ContainsKey("fashionDisplayID"))
            {
                character.GetComponent <AtavismMobAppearance>().UpdateEquipDisplay("fashionDisplayID", (string)characterSelected["fashionDisplayID"]);
            }



            // Name
            if (nameUI != null)
            {
                nameUI.text = (string)entry["characterName"];
            }
            if (TMPNameUI != null)
            {
                TMPNameUI.text = (string)entry["characterName"];
            }

            // Temp
            if (character != null && character.GetComponent <CustomisedHair>() != null)
            {
                CustomisedHair customHair = character.GetComponent <CustomisedHair>();
                if (characterSelected.ContainsKey(customHair.hairPropertyName))
                {
                    customHair.UpdateHairModel((string)characterSelected[customHair.hairPropertyName]);
                }
            }
        }