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); }
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); } }