public static void HandleCharacterSelectionWithRemodel(CharacterSelectionWithRemodelMessage message, WorldClient client)
        {
            if (!client.InGame)
            {
                CharacterRecord record = client.GetAccountCharacter((long)message.id);



                if (record.RemodelingMaskEnum.HasFlag(CharacterRemodelingEnum.CHARACTER_REMODELING_NAME))
                {
                    if (!CharacterRemodelingProvider.Instance.RemodelName(record, message.remodel.name))
                    {
                        client.Send(new CharacterCreationResultMessage((sbyte)CharacterCreationResultEnum.ERR_NAME_ALREADY_EXISTS));
                        return;
                    }
                }

                if (record.RemodelingMaskEnum.HasFlag(CharacterRemodelingEnum.CHARACTER_REMODELING_BREED))
                {
                    CharacterRemodelingProvider.Instance.RemodelBreed(record, message.remodel.breed, message.remodel.cosmeticId);
                }

                if (record.RemodelingMaskEnum.HasFlag(CharacterRemodelingEnum.CHARACTER_REMODELING_GENDER))
                {
                }

                if (record.RemodelingMaskEnum.HasFlag(CharacterRemodelingEnum.CHARACTER_REMODELING_COSMETIC))
                {
                    CharacterRemodelingProvider.Instance.RemodelCosmetic(record, message.remodel.cosmeticId);
                }

                if (record.RemodelingMaskEnum.HasFlag(CharacterRemodelingEnum.CHARACTER_REMODELING_COLORS))
                {
                    CharacterRemodelingProvider.Instance.RemodelColors(record, message.remodel.colors);
                }

                record.RemodelingMaskEnum = CharacterRemodelingEnum.CHARACTER_REMODELING_NOT_APPLICABLE;
                client.Character          = new Character(client, record, false);
                ProcessSelection(client);
            }
        }
Beispiel #2
0
        public static void HandleCharacterSelectionWithRemodelMessage(WorldClient client, CharacterSelectionWithRemodelMessage message)
        {
            var character = client.Characters.Where(x => !x.IsDeleted).First(entry => entry.Id == message.id);

            /* Check null */
            if (character == null)
            {
                client.Send(new CharacterSelectedErrorMessage());
                return;
            }

            var remodel = message.remodel;

            if (((character.MandatoryChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_NAME)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_NAME) ||
                ((character.PossibleChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_NAME)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_NAME))
            {
                /* Check if name is valid */
                if (!Regex.IsMatch(remodel.name, "^[A-Z][a-z]{2,9}(?:-[A-Z][a-z]{2,9}|[a-z]{1,10})$", RegexOptions.Compiled))
                {
                    client.Send(new CharacterCreationResultMessage((int)CharacterCreationResultEnum.ERR_INVALID_NAME));
                    return;
                }

                /* Check if name is free */
                if (CharacterManager.Instance.DoesNameExist(remodel.name))
                {
                    client.Send(new CharacterCreationResultMessage((int)CharacterCreationResultEnum.ERR_NAME_ALREADY_EXISTS));
                    return;
                }

                /* Set new name */
                character.Name = remodel.name;
            }

            if (((character.MandatoryChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_GENDER)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_GENDER) ||
                ((character.PossibleChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_GENDER)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_GENDER))
            {
                character.Sex = remodel.sex ? SexTypeEnum.SEX_FEMALE : SexTypeEnum.SEX_MALE;
            }

            if (((character.MandatoryChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_BREED)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_BREED) ||
                ((character.PossibleChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_BREED)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_BREED))
            {
                client.Character = new Character(character, client);
                client.Character.LoadRecord();

                BreedManager.ChangeBreed(client.Character, (PlayableBreedEnum)remodel.breed);
                client.Character.SaveNow();

                character        = client.Character.Record;
                client.Character = null;
            }

            if (((character.MandatoryChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COSMETIC)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COSMETIC) ||
                ((character.PossibleChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COSMETIC)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COSMETIC))
            {
                /* Get Head */
                var head = BreedManager.Instance.GetHead(remodel.cosmeticId);
                /* Get character Breed */
                var breed = BreedManager.Instance.GetBreed((int)character.Breed);

                if (breed == null || head.Breed != (int)character.Breed || head.Gender != (int)character.Sex)
                {
                    client.Send(new CharacterSelectedErrorMessage());
                    return;
                }

                character.Head        = head.Id;
                character.DefaultLook = breed.GetLook(character.Sex);
                character.DefaultLook.AddSkins(head.Skins);

                foreach (var scale in character.Sex == SexTypeEnum.SEX_MALE ? breed.MaleLook.Scales : breed.FemaleLook.Scales)
                {
                    character.DefaultLook.SetScales(scale);
                }
            }

            if (((character.MandatoryChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COLORS)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COLORS) ||
                ((character.PossibleChanges & (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COLORS)
                 == (sbyte)CharacterRemodelingEnum.CHARACTER_REMODELING_COLORS))
            {
                /* Get character Breed */
                var breed = BreedManager.Instance.GetBreed((int)character.Breed);

                if (breed == null)
                {
                    client.Send(new CharacterSelectedErrorMessage());
                    return;
                }

                /* Set Colors */
                var breedColors = character.Sex == SexTypeEnum.SEX_MALE ? breed.MaleColors : breed.FemaleColors;
                var m_colors    = new Dictionary <int, Color>();

                foreach (var color in remodel.colors)
                {
                    var index = color >> 24;
                    var c     = Color.FromArgb(color);

                    m_colors.Add(index, c);
                }

                var i = 1;
                foreach (var breedColor in breedColors)
                {
                    if (!m_colors.ContainsKey(i))
                    {
                        m_colors.Add(i, Color.FromArgb((int)breedColor));
                    }

                    i++;
                }

                character.DefaultLook.SetColors(m_colors.Select(x => x.Key).ToArray(), m_colors.Select(x => x.Value).ToArray());
            }

            character.MandatoryChanges = 0;
            character.PossibleChanges  = 0;

            WorldServer.Instance.DBAccessor.Database.Update(character);

            /* Common selection */
            CommonCharacterSelection(client, character);
        }