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); } }
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 && DofusServer._server_api.GetData <PlayerData>(x => x.AccountToken == _world_callback._client.CurrentToken && x.ServerId == server_data.ServerId) is IEnumerable <PlayerData> players) { NetworkContentElement characters_list_content = _characters_list_content(players, server_data); Send(false, _callback._client, _characters_list_message, characters_list_content); } }
// if no error public override void EndHandle() { Send(false, _callback._client, _character_creation_result, _character_creation_result_content("OK")); DofusServerWorldClientReceiveCallback _world_callback = _casted_callback <DofusServerWorldClientReceiveCallback>(); if (DofusServer._server_api.GetData(x => x.Port == _world_callback._server.Port) is ServerData server_data && DofusServer._server_api.GetData <PlayerData>(x => x.AccountToken == _world_callback._client.CurrentToken && x.ServerId == server_data.ServerId) is IEnumerable <PlayerData> players) { NetworkContentElement characters_list = CharactersListRequestMessageHandler._characters_list_content(players, server_data); Send(false, _callback._client, CharactersListRequestMessageHandler._characters_list_message, characters_list); // connect client } }
public override void Handle() { DofusServerWorldClientReceiveCallback _world_callback = _casted_callback <DofusServerWorldClientReceiveCallback>(); string token = _content["ticket"]; if (DofusServer._server_api.GetData <ServerAccountInformationData>(x => x.Token == token).FirstOrDefault() is ServerAccountInformationData _account) { ClientEntity connected = _world_callback._client_repository.GetResult(x => x.CurrentToken == token && x.IsRunning && x != _world_callback._client); if (connected != null) { _world_callback._client_disconnector.Handle(connected); } _world_callback._client.CurrentToken = token; NetworkElement authentication_accepted_message = BotofuProtocolManager.Protocol[ProtocolKeyEnum.Messages, x => x.name == "AuthenticationTicketAcceptedMessage"]; NetworkElement account_capabilities_message = BotofuProtocolManager.Protocol[ProtocolKeyEnum.Messages, x => x.name == "AccountCapabilitiesMessage"]; NetworkContentElement account_capabilities_content = new NetworkContentElement() { fields = { { "tutorialAvailable", true }, { "canCreateNewCharacter", true }, { "accountId", _account.Id }, { "breedsVisible", 262143 }, { "breedsAvailable", 262143 }, { "status", 0 } } }; Send(false, _callback._client, authentication_accepted_message, new NetworkContentElement()); Send(false, _callback._client, account_capabilities_message, account_capabilities_content); } else { // create account byte[] ticket_bytes = Convert.FromBase64String(token); // to do byte[] id = new byte[] { ticket_bytes[1], ticket_bytes[3], ticket_bytes[7], ticket_bytes[15], }; ServerAccountInformationData new_account = new ServerAccountInformationData() { Id = Math.Abs(BitConverter.ToInt32(id, 0)), Token = token, CreationDateTime = DateTime.Now, LastConnectionDateTime = DateTime.Now, TotalTimeSpentInGame = TimeSpan.FromMilliseconds(0), FriendsToken = new List <string>(), IgnoredsToken = new List <string>() }; DofusServer._server_api.UpdateData(new_account); Handle(); } }