- Assinar notificações de alteração de sessão do Multiplayer Session Directory (MPSD)
- Criar uma sessão do MPSD
- Definir um árbitro para uma sessão do MPSD
- Gerenciar a ativação do título
- Tornar o usuário disponível para entrada
- Enviar convites de jogo
- Entrar em uma sessão de jogo a partir de uma sessão de lobby
- Entrar em uma sessão do MPSD a partir de uma ativação do título
- Definir a atividade atual do usuário
- Atualizar uma sessão do MPSD
- Sair de uma sessão do MPSD
- Preencher vagas abertas na sessão durante o matchmaking
- Criar um tíquete de partida
- Obter o status do tíquete de partida
Assinar notificações de alteração de sessão do Multiplayer Session Directory (MPSD)
Assinar alterações em uma sessão exige que o jogador associado esteja ativo na sessão. O campo
connectionRequiredForActiveMembers também deve estar definido como true no objeto /constants/system/capabilities da sessão. Esse campo geralmente é definido no modelo de sessão. Para obter mais informações, veja Modelos de sessão multiplayer e Visão geral do Multiplayer Session Directory.-
Use o mesmo objeto
XblContextHandlepara todas as chamadas do mesmo usuário. As assinaturas estão vinculadas ao tempo de vida desse objeto. Se houver vários usuários locais, use um objetoXblContextHandleseparado para cada usuário. - Implemente manipuladores de eventos para XblMultiplayerAddSessionChangedHandler e XblMultiplayerSessionSubscriptionLostHandler.
-
Se estiver assinando alterações para mais de um usuário, adicione código ao manipulador de eventos
XblMultiplayerAddSessionChangedHandlerpara evitar trabalho desnecessário. Use a propriedade XblMultiplayerSessionChangeEventArgs::Branche a propriedade XblMultiplayerSessionChangeEventArgs::ChangeNumber. Usar essas propriedades permite acompanhar a última alteração vista e ignorar alterações mais antigas. - Chame XblMultiplayerSetSubscriptionsEnabled para permitir as assinaturas.
- Crie um objeto de sessão local e, em seguida, entre nessa sessão como ativo.
-
Faça chamadas para cada usuário a
XblMultiplayerAddSessionChangedHandler, passando o tipo de alteração de sessão sobre o qual deseja ser notificado. - Grave a sessão no MPSD conforme descrito na seção Atualizar uma sessão do MPSD deste tópico.

Analisando notificações de alteração de sessão duplicadas
Quando há vários usuários assinando notificações da mesma sessão, cada alteração nessa sessão dispara um shoulder tap para cada usuário. Todos esses shoulder taps, exceto um, são duplicados. Embora ainda recomendemos que um título assine notificações para cada usuário em uma sessão, o título deve ignorar todas as alterações sobre as quais já foi notificado. Você pode fazer isso usando as propriedadesBranch e ChangeNumber.
Para detectar vários shoulder taps, um título deve fazer o seguinte:
-
Armazenar o valor mais recente da propriedade
ChangeNumberpara cada valor da propriedadeBranchavaliado. -
Se um shoulder tap tiver um valor da propriedade
ChangeNumbermaior que o último valor armazenado para aquele valor da propriedadeBranch, processar o shoulder tap e, em seguida, atualizar o valor mais recente da propriedadeChangeNumber. -
Se um shoulder tap não tiver um valor da propriedade
ChangeNumbermaior para aquele valor da propriedadeBranch, ignorar o processamento do shoulder tap. Essa alteração de sessão já foi tratada.
Os valores da propriedade
ChangeNumber precisam ser acompanhados pelos valores da propriedade Branch, e não por sessão. O valor da propriedade Branch pode mudar durante o tempo de vida de uma sessão, redefinindo o valor da propriedade ChangeNumber.Criar uma sessão do MPSD
Por padrão, uma sessão do MPSD é criada quando o primeiro membro entra nela. Se a lógica do seu título esperar que o título exista ou não exista no momento da entrada, ela poderá passar um valor de modo de gravação apropriado ao método de gravação durante a atualização da sessão.
-
Crie um novo objeto
XblContextHandle. Seu título cria esse objeto uma vez, armazena-o e o reutiliza conforme necessário em todo o código-fonte. É necessário usar exatamente o mesmo contexto, especialmente ao trabalhar com assinaturas de sessão. -
Crie um novo
XblMultiplayerSessionHandlecom XblMultiplayerSessionCreateHandle para preparar todos os dados de sessão de que o MPSD precisa para criar uma nova sessão. - Faça as alterações necessárias antes de gravar a sessão no MPSD. Por exemplo, ao fazer um membro entrar na sessão com uma chamada a XblMultiplayerSessionJoin, o cliente adiciona dados de solicitação locais ocultos que instruem o MPSD a realizar a entrada na chamada para atualizar a sessão.
- Quando terminar de fazer as alterações locais, grave-as no MPSD conforme descrito na seção Atualizar uma sessão do MPSD deste tópico.
-
Receba do MPSD o novo objeto
XblMultiplayerSessionHandle, com muitos campos preenchidos. - Use o novo objeto de sessão daqui em diante. Descarte a cópia antiga, que contém uma solicitação oculta para criar uma nova sessão.
Exemplo
API Flat C- XAsyncBlock
- XblMultiplayerSessionCreateHandle
- XblMultiplayerSessionInitArgs
- XblMultiplayerSessionReference
- XblMultiplayerSessionWriteMode
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionResult
Definir um árbitro para uma sessão do MPSD
O título usa o procedimento a seguir para definir um árbitro para uma sessão que já foi criada.Os tokens de dispositivo dos membros (hosts em potencial) não ficam disponíveis até que os membros tenham entrado na sessão e incluído seus endereços seguros de dispositivo.
-
Recupere do MPSD os tokens de dispositivo dos candidatos a host chamando XblMultiplayerSessionMembers.
[!NOTE] Se a sessão tiver sido criada pelo matchmaking do SmartMatch, seus clientes poderão usar os candidatos a host disponíveis no MPSD chamando XblMultiplayerSessionHostCandidates.
- Selecione o host desejado na lista de candidatos a host.
- Chame XblMultiplayerSessionSetHostDeviceToken para definir o token de dispositivo no cache local do MPSD. Se a chamada para definir o token de dispositivo do host for bem-sucedida, o token de dispositivo local substituirá o token do host.
-
Se um código de status HTTP/412 for recebido ao tentar definir o token de dispositivo do host, consulte os dados da sessão. Veja se o token de dispositivo do host é do console local. Se não for do console local, outro console foi designado como árbitro.
[!NOTE] Seu cliente deve tratar o código de status HTTP/412 separadamente dos outros códigos HTTP, porque HTTP/412 não indica uma falha padrão. Para obter mais informações sobre esse código de status, veja Códigos de status de sessões multijogador.
-
Atualize a sessão no MPSD conforme descrito na seção Atualizar uma sessão do MPSD deste tópico.
[!NOTE] Se você não tiver um algoritmo melhor, o cliente poderá implementar um algoritmo guloso no qual cada candidato a host tenta se definir como host se ninguém mais tiver feito isso ainda. Para obter mais informações, veja a seção Árbitro da sessão no tópico Tópicos avançados de sessões multijogador.
Gerenciar a ativação do título
O XBOX One (ou posterior) dispara o eventoCoreApplicationView.Activated durante a ativação de protocolo.
No contexto da API multijogador, esse evento é disparado quando um usuário aceita um convite ou entra no jogo de outro usuário.
Essas ações disparam uma ativação à qual o título deve reagir levando o usuário que está entrando para o jogo com o usuário de destino.
Seu título deve esperar novos argumentos de ativação a qualquer momento e nunca deve ser codificado com base no comprimento.
-
Configure um manipulador de eventos para o evento
CoreApplicationView.Activated. Esse manipulador é disparado sempre que ocorre uma ativação de protocolo, mesmo que o título já esteja em execução. - Na ativação do título, inicie uma sessão e assine as notificações de alteração da sessão. Para obter mais informações, veja Assinar notificações de alteração de sessão do MPSD neste tópico.
- Faça o usuário entrar na sessão como ativo. Para obter mais informações, veja Entrar em uma sessão do MPSD a partir de uma ativação do título neste tópico.
- Defina a sessão de lobby como a sessão de atividade exposta por meio da interface do usuário do perfil. Para obter mais informações, veja Definir a atividade atual do usuário neste tópico.
- Faça o usuário entrar na sessão de jogo como ativo. O usuário agora pode se conectar aos pares e entrar no jogo ou no lobby.

Tornar o usuário disponível para entrada
Para tornar o usuário disponível para entrada, o título deve fazer o seguinte:- Criar um objeto de sessão e, em seguida, modificar os atributos conforme necessário.
- Fazer o usuário entrar na sessão como ativo. Para obter mais informações, veja Entrar em uma sessão do MPSD a partir de uma ativação do título neste tópico.
- Determinar se o usuário foi designado como árbitro da sessão.
- Se o usuário não for o árbitro, ir para a etapa 7.
- Se o usuário for o árbitro, chamar XblMultiplayerSessionSetHostDeviceToken.
- Tentar gravar a sessão usando uma chamada a XblMultiplayerWriteSessionAsync.
- Definir a sessão como a sessão ativa. Para obter mais informações, veja Definir a atividade atual do usuário neste tópico.

Enviar convites de jogo
O título pode permitir que um jogador envie convites de jogo das maneiras a seguir.- Enviar os convites para a sessão de lobby.
- Enviar os convites usando a interface do usuário genérica de convite da plataforma XBOX com a referência da sessão de jogo.
- Tornar o jogo de quem convida disponível para entrada de jogadores. Para obter mais informações, veja Tornar o usuário disponível para entrada neste tópico.
- Determinar se os convites serão enviados pela sessão de lobby ou usando a interface do usuário de convite.
- Se a sessão de lobby estiver sendo usada, enviar os convites usando uma chamada a XblMultiplayerSendInvitesAsync. Esse método pode exigir a criação de uma lista de jogadores na interface do usuário do jogo chamando XGameUiShowPlayerPickerAsync.
- Se a interface do usuário de convite estiver sendo usada, chamar XGameUiShowSendGameInviteAsync para mostrar a interface do usuário de convite.
- Tratar o XblMultiplayerAddSessionChangedHandler para o jogador local depois que o jogador remoto entrar.
- Para o jogador remoto, implementar um código de ativação do título. Para obter mais informações, veja Gerenciar a ativação do título neste tópico.

Entrar em uma sessão de jogo a partir de uma sessão de lobby
As sessões de jogo em dispositivos Windows 10 devem ter a funcionalidadeuserAuthorizationStyle definida como true se não forem sessões grandes. Como resultado, a propriedade joinRestriction não pode ser none, o que significa que não é possível entrar diretamente na sessão de forma pública.
Um cenário comum é criar uma sessão de lobby para reunir jogadores e, em seguida, mover esses jogadores para uma sessão de jogo ou uma sessão de matchmaking. Mas, se não for possível entrar publicamente na sessão de jogo, os clientes do jogo não poderão entrar nela, a menos que atendam à configuração de joinRestriction. Na maioria dos casos, isso é restritivo demais para esse cenário.
A solução é usar um identificador de transferência para vincular a sessão de lobby e a sessão de jogo. O título pode fazer isso da seguinte forma:
- Ao criar a sessão de jogo, use a API XblMultiplayerSetTransferHandleAsync para criar um identificador de transferência que vincule a sessão de lobby e a sessão de jogo.
- Armazene o GUID do identificador de transferência na sessão de lobby, em vez da referência de sessão da sessão de jogo.
- Quando o título quiser mover os membros da sessão de lobby para a sessão de jogo, cada cliente usará o identificador de transferência da sessão de lobby para entrar na sessão de jogo usando a API XblMultiplayerWriteSessionByHandleAsync.
- O MPSD consulta a sessão de lobby para verificar se os membros que estão tentando entrar na sessão de jogo usando o identificador de transferência também estão na sessão de lobby.
- Se os membros estiverem na sessão de lobby, eles poderão acessar a sessão de jogo.
Entrar em uma sessão do MPSD a partir de uma ativação do título
Quando um usuário escolhe entrar na atividade de um amigo ou aceitar um convite usando a interface do usuário do shell do XBOX, o título é ativado com parâmetros que indicam em qual sessão o usuário deseja entrar. O título deve tratar essa ativação e adicionar o usuário à sessão correspondente. Estas são as etapas que o título deve seguir.-
Implemente um manipulador de eventos para o evento
CoreApplicationView.Activated. Ele notifica as ativações do título. -
Quando o manipulador for disparado, examine a propriedade
IActivatedEventArgs.Kind. Se ela estiver definida comoProtocol, converta os argumentos do evento para a classeProtocolActivatedEventArgs. -
Examine o objeto
ProtocolActivatedEventArgs. Se o URI indicado na propriedadeProtocolActivatedEventArgs.Uricorresponder ainviteHandleAccept(correspondente a um convite aceito) ou aactivityHandleJoin(correspondente a uma entrada pela interface do usuário do shell), analise a cadeia de consulta do URI. Ela é formatada como uma cadeia de consulta de URI normal com pares de chave/valor; extraia os campos a seguir.- Para um convite aceito:
handleinvitedXuidsenderXuid
- Para uma entrada:
handlejoinerXuidjoineeXuid
- Para um convite aceito:
- Inicie o código multijogador do título, que deve incluir uma chamada a XblMultiplayerSetSubscriptionsEnabled.
-
Crie um objeto
XblMultiplayerSessionHandlelocal chamando XblMultiplayerSessionCreateHandle. -
Chame XblMultiplayerSessionJoin para entrar na sessão. Use as configurações de parâmetro a seguir para que a entrada seja definida como ativa.
memberCustomConstantsJson=nullinitializeRequested=falsejoinWithActiveStatus=true
- Chame XblMultiplayerSessionSetSessionChangeSubscription para receber shoulder taps quando a sessão for alterada após a entrada.
- Chame XblMultiplayerWriteSessionByHandleAsync usando o identificador obtido conforme descrito na etapa 3. O usuário agora é membro da sessão e pode usar os dados da sessão para se conectar ao jogo.
Definir a atividade atual do usuário
A atividade atual do usuário é exibida nas experiências do usuário do painel do XBOX para o título. A atividade de um usuário pode ser definida por meio de uma sessão ou por meio da ativação do título. Neste último caso, o usuário entra em uma sessão por meio do matchmaking ou iniciando um jogo.A atividade definida por meio de uma sessão pode ser excluída chamando XblMultiplayerClearActivityAsync.
Atualizar uma sessão do MPSD
Quando seu título atualiza uma sessão existente usando a API multijogador, lembre-se de que ele está trabalhando com uma cópia local até fazer uma chamada para gravar a sessão.
- Fazer as alterações necessárias na sessão atual, por exemplo, chamando XblMultiplayerSessionLeave.
-
Quando todas as alterações forem feitas, gravar as alterações locais no MPSD usando qualquer um destes métodos.
Defina o modo de gravação como XblMultiplayerSessionWriteMode
::SynchronizedUpdatese estiver gravando em uma parte compartilhada que outros títulos também podem modificar. Para obter mais informações, veja a seção Sincronização de atualizações de sessão no tópico Visão geral do Multiplayer Session Directory. O método de gravação grava a entrada no servidor e obtém a sessão mais recente, a partir da qual é possível descobrir os outros membros da sessão e os endereços seguros de dispositivo (SDAs) dos consoles deles. Para obter mais informações sobre como estabelecer uma conexão de rede entre esses consoles, veja Introdução ao Winsock no XBOX One. - Descartar o objeto de sessão local antigo. Usar o objeto de sessão recém-recuperado para que as ações futuras se baseiem no estado de sessão conhecido mais recente.
Sair de uma sessão do MPSD
Para permitir que um usuário saia de uma sessão, o título deve fazer o seguinte:- Chamar XblMultiplayerSessionLeave para a sessão de jogo.
- Atualizar a sessão de jogo no MPSD conforme descrito na seção Atualizar uma sessão do MPSD deste tópico.
-
Se necessário, chamar o método
XblMultiplayerSessionLeavepara a sessão de lobby e, em seguida, atualizar essa sessão. - Se necessário para a sessão de lobby, encerrar a API multijogador cancelando o registro com chamadas a XblMultiplayerRemoveSubscriptionLostHandler e XblMultiplayerRemoveSessionChangedHandler.

Preencher vagas abertas na sessão durante o matchmaking
Para preencher as vagas abertas em uma sessão de tíquete durante o matchmaking, o título deve seguir etapas semelhantes às seguintes:- Acessar o estado de sessão mais recente da sessão de tíquete criada durante o matchmaking.
- Adicionar os jogadores disponíveis para o jogo a partir da sessão de lobby.
- Determinar se a sessão de tíquete está cheia.
- Se a sessão estiver cheia, continuar o jogo.
-
Se a sessão ainda não estiver cheia, criar o tíquete de partida conforme descrito em Criar um tíquete de partida neste tópico. Certifique-se de criar o tíquete com o parâmetro
preserveSessiondefinido comoAlways. - Continuar com o matchmaking. Para obter mais informações, veja Visão geral do matchmaking.

Criar um tíquete de partida
Para criar um tíquete de partida, o batedor de matchmaking deve fazer o seguinte:-
Chamar XblMatchmakingCreateMatchTicketAsync, passando uma referência à sessão de tíquete. O método lê a sessão de tíquete do MPSD e inicia o matchmaking para os usuários da sessão. Internamente, o método chama
POST (/serviceconfigs/{scid}/hoppers/{hoppername}). -
Definir o parâmetro
preserveSessioncomoNeverse o serviço de matchmaking for combinar os membros da sessão em uma nova sessão ou em outra sessão existente. Definir o parâmetropreserveSessioncomoAlwayspara permitir que o título reutilize uma sessão de jogo existente como sessão de tíquete para continuar o jogo. O serviço de matchmaking poderá então garantir que a sessão enviada seja preservada e que todos os jogadores combinados sejam adicionados a essa sessão. -
Usar o XblCreateMatchTicketResponse
::EstimatedWaitTimeretornado no objetoCreateMatchTicketResponsepara definir as expectativas dos usuários quanto ao tempo de matchmaking. -
Usar o XblCreateMatchTicketResponse
::MatchTicketIdretornado no objeto de resposta para cancelar o matchmaking da sessão, se necessário, excluindo o tíquete. A exclusão do tíquete usa XblMatchmakingDeleteMatchTicketAsync.
Obter o status do tíquete de partida
Seu título deve fazer o seguinte para recuperar o status do tíquete de partida.-
Obter o objeto
XblMultiplayerSessionHandleda sessão de tíquete. - Chamar XblMultiplayerSessionMatchmakingServer para acessar o objeto XblMultiplayerMatchmakingServer usado no matchmaking.
-
Verificar o objeto
XblMultiplayerMatchmakingServerpara determinar o status do processo de matchmaking, o tempo de espera típico da sessão e a referência da sessão de destino, caso uma partida tenha sido encontrada.
