public static EntityLookData Build(this BreedObjectData breed, HeadObjectData head, int[] colors, bool sex)
        {
            for (int i = 0; i < colors.Length; i++)
            {
                if (colors[i] == -1 && (sex ? i < breed.femaleColors.Length : i < breed.maleColors.Length))
                {
                    colors[i] = sex ? breed.femaleColors[i] : breed.maleColors[i];
                }
                colors[i] = (i + 1 & 255) << 24 | colors[i] & 16777215;
            }

            string breed_look = sex ? breed.femaleLook : breed.maleLook;

            string breed_look_pattern = @"(?<bonesId>\d+)\|(?<skin>\d+)\|\|(?<scale>\d+)";

            Match match = Regex.Match(breed_look, breed_look_pattern);

            short bonesId = short.Parse(match.Groups["bonesId"].Value);
            short skin    = short.Parse(match.Groups["skin"].Value);
            short scale   = short.Parse(match.Groups["scale"].Value);

            EntityLookData look = new EntityLookData()
            {
                BonesId       = bonesId,
                IndexedColors = colors,
                Skins         = new short[] { skin, short.Parse(head.skins) },
                Scales        = new short[] { scale },
                Subentities   = new SubEntityLookData[0]
            };

            return(look);
        }
Exemplo n.º 2
0
        public override void Handle()
        {
            DofusServerWorldClientReceiveCallback _world_callback = _casted_callback <DofusServerWorldClientReceiveCallback>();

            if (DofusServer._server_api.GetData(x => x.Port == _world_callback._server.Port) is ServerData server_data)
            {
                if (DofusServer._server_api.GetData <PlayerData>(x => x.AccountToken == _world_callback._client.CurrentToken).Count() >= 5)
                {
                    throw new CharacterCreationException("ERR_TOO_MANY_CHARACTERS");
                }

                string name = _content["name"];

                if (!Regex.IsMatch(name, @"(\w){3,20}"))
                {
                    throw new CharacterCreationException("ERR_INVALID_NAME");
                }

                if (DofusServer._server_api.GetData <PlayerData>(x => x.Name.ToLower() == name.ToLower()).Count() > 0)
                {
                    throw new CharacterCreationException("ERR_NAME_ALREADY_EXISTS");
                }

                int[] colors     = (_content["colors"] as dynamic[]).Select(x => x is int v ? v : -1).ToArray();
                byte  breed      = _content["breed"];
                bool  sex        = _content["sex"];
                short cosmeticId = _content["cosmeticId"];

                BreedObjectData breed_data = StaticValues.BREEDS.FirstOrDefault(x => x.Id == breed);
                HeadObjectData  head_data  = StaticValues.HEADS.FirstOrDefault(x => x.Id == cosmeticId);

                Random rnd    = new Random();
                int    rnd_id = -1;

                while (rnd_id == -1)
                {
                    rnd_id = rnd.Next(1, int.MaxValue - 1);
                    if (DofusServer._server_api.GetData <PlayerData>(x => x.Id == rnd_id).Count() > 0)
                    {
                        rnd_id = -1;
                    }
                }

                PlayerData _player = new PlayerData()
                {
                    Id               = rnd_id,
                    AccountToken     = _world_callback._client.CurrentToken,
                    Breed            = breed,
                    Name             = name,
                    Sex              = sex,
                    ServerId         = server_data.ServerId,
                    CreationDateTime = DateTime.Now,
                    Look             = breed_data.Build(head_data, colors, sex)
                };

                DofusServer._server_api.UpdateData(_player);
            }
        }