Example #1
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);
            }
        }
        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);
            }
        }
Example #3
0
        // 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
            }
        }
Example #4
0
        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();
            }
        }