> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/contributor/contributor-pt/comunicacoes/messages.md).

# Mensagens

Mensagens em comms são dados binários *pacotes*, serializados usando [protocol buffers](https://github.com/protocolbuffers/protobuf). Eles transportam chat de texto e voz, atualizações posicionais, alterações de perfil e outras interações em tempo real.

{% hint style="info" %}
Você pode ver o protocolo comms em ação e experimentá-lo usando o código aberto [Comms Station](https://decentraland.github.io/comms-station/).
{% endhint %}

Todas as definições de mensagens estão disponíveis em [repositório do protocolo](https://github.com/decentraland/protocol), e cada tipo de mensagem abaixo tem um link para sua declaração.

**`Packet`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L8)

O `Packet` estrutura é o contêiner de todas as mensagens.

| Campo     | Tipo   | Valor                                                                                                                                                                                               |
| --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `message` | `enum` | <p>Um de <code>Chat</code>, <code>Voice</code>, <code>Position</code>, <code>AnnounceProfileVersion</code>,<br><code>ProfileRequest</code>, <code>ProfileResponse</code>, ou <code>Cena</code>.</p> |

### Chat de Texto e Voz

Os clientes conversam ao difundir mensagens de texto e clipes de áudio para todos os peers conectados (normalmente jogadores na mesma ilha).

Apenas dois `Packet` tipos estão envolvidos, um para cada caso de uso. Em circunstâncias típicas, os clientes difundem essas mensagens para todos os outros clientes em sua ilha, que é o grupo de jogadores próximos com os quais podem interagir.

***

**`Chat`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L56)

Envia uma mensagem de chat de texto para outros clientes.

| Campo       | Tipo     | Valor                                 |
| ----------- | -------- | ------------------------------------- |
| `message`   | `string` | Texto da mensagem                     |
| `timestamp` | `double` | Carimbo de data/hora UTC do remetente |

***

**`Voice`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L66)

Envia uma amostra de voz codificada para outros clientes.

| Campo             | Tipo     | Valor                                                          |
| ----------------- | -------- | -------------------------------------------------------------- |
| `encoded_samples` | `bytes`  | Dados de áudio codificados                                     |
| `codec`           | `enum`   | Apenas `VC_OPUS` (nenhum outro codec é suportado por enquanto) |
| `index`           | `uint32` | Um contador incremental definido pelo remetente                |

O `codec` campo é um `enum` valor. Codecs personalizados não são suportados.

### Movimento

Os clientes que controlam Avatars enviam e recebem atualizações posicionais dentro de sua ilha, a fim de sincronizar o movimento e a postura entre os jogadores.

***

**`Position`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L20)

Atualiza outros clientes sobre a posição e a orientação de um Avatar.

| Campo                                                                                                               | Tipo     | Valor                                           |
| ------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------- |
| <p><code>position\_x</code><br><code>position\_y</code><br><code>position\_z</code></p>                             | `float`  | Posição do Avatar no mapa do mundo              |
| <p><code>rotation\_x</code><br><code>rotation\_y</code><br><code>rotation\_z</code><br><code>rotation\_w</code></p> | `float`  | Quaternion de rotação do Avatar                 |
| `index`                                                                                                             | `uint32` | Um contador incremental definido pelo remetente |

Os clientes normalmente enviam `Position` atualizações com baixa frequência (como uma vez a cada 1 ou 2 segundos) e mudam para alta frequência (várias vezes por segundo) quando estão se movendo ou interagindo.

{% hint style="info" %}
Ao enviar atualizações posicionais, a velocidade costuma ser melhor do que a confiabilidade. O desempenho percebido é melhor quando a entrega é mais rápida, mesmo se uma `Position` mensagem ocasionalmente for descartada ou reordenada. Alguns transportes (por ex. [LiveKit](https://github.com/decentraland/docs/tree/main/contributor/communications/transport-types/livekit/README.md)) podem alternar entre modos rápidos e confiáveis por mensagem.
{% endhint %}

As transmissões de baixa frequência são recomendadas como uma solução simples para entregar atualizações a clientes que perderam a conectividade momentaneamente ou não conseguiram captar uma mensagem enquanto ingressavam na ilha.

O `index` campo é um contador incremental, definido pelo remetente para que os receptores possam ordenar atualizações que cheguem fora de ordem.

### Compartilhamento de Perfil

Os clientes dentro de uma ilha podem solicitar as informações do Avatar de outros jogadores, a fim de renderizar seus Avatars, exibir seus nomes e imagens, etc.

Como as alterações de perfil são raras (comparadas com atualizações posicionais, por exemplo), o sistema foi projetado para simplificar a tarefa de manter um cache de perfil local e buscar perfis apenas quando necessário.

Há 3 [`Packet`](#Packet) tipos envolvidos: um [`ProfileRequest`](#ProfileRequest)/[`ProfileResponse`](#ProfileResponse) par usado pelos clientes para compartilhar perfis sob demanda, e a [`AnnounceProfileVersion`](#AnnounceProfileVersion) mensagem para informar aos pares qual é a versão mais recente, para que possam decidir se devem solicitá-la.

Os clientes normalmente difundem `AnnounceProfileVersion` mensagens periodicamente, além de imediatamente quando seu perfil muda.

```mermaid
sequenceDiagram
    participante Client1 como Client 1
    participante Client2 como Client 2
    participante Client3 como Client 3
    
    Nota sobre Client1: Difundir versão do perfil
    Client1->>Client1: AnnounceProfileVersion(v1)
    Client1->>Client1: AnnounceProfileVersion(v1)
    
    Nota sobre Client3: Solicitar perfil
    Client3->>Client1: ProfileRequest(@client 1)
    Client1->>Client3: ProfileResponse(v1)
    
    Client1->>Client1: AnnounceProfileVersion(v1)
    
    Nota sobre Client1: Perfil atualizado
    Client1->>Client1: AnnounceProfileVersion(v2)
    
    Nota sobre Client2,Client3: Vários clientes solicitam
    Client2->>Client1: ProfileRequest(@client 1)
    Client3->>Client1: ProfileRequest(@client 1)
    Client1->>Client2: ProfileResponse(v2)
    Client1->>Client3: ProfileResponse(v2)
```

***

**`AnnounceProfileVersion`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L34)

Sinaliza aos outros clientes que há uma [entidade de perfil](https://github.com/decentraland/docs/tree/main/contributor/content/entity-types/profiles/README.md) que eles podem solicitar.

| Campo             | Tipo     | Valor                                                |
| ----------------- | -------- | ---------------------------------------------------- |
| `profile_version` | `uint32` | Um número de versão incrementado a cada modificação. |

Os receptores que armazenam perfis em cache podem usar o `profile_version` número para decidir se sua cópia local está atualizada, ou se precisam enviar uma [`ProfileRequest`](#ProfileRequest).

***

**`ProfileRequest`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L41)

Solicita um perfil de uma versão especificada de um peer específico.

| Campo             | Tipo     | Valor                                  |
| ----------------- | -------- | -------------------------------------- |
| `address`         | string   | O endereço de identificação do perfil. |
| `profile_version` | `uint32` | A versão desejada do perfil.           |

Os receptores podem responder com [`ProfileResponse`](#ProfileResponse) mensagens para fornecer o perfil solicitado.

***

**`ProfileResponse`** [**↗ fonte**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc4/comms.proto#L46)

Envia um perfil em resposta a um [`ProfileRequest`](#ProfileRequest).

| Campo                | Tipo     | Valor                                                                         |
| -------------------- | -------- | ----------------------------------------------------------------------------- |
| `serialized_profile` | string   | Entidade de perfil serializada em JSON.                                       |
| `base_url`           | `uint32` | URL base para um endpoint do sistema de arquivos, recomendada pelo remetente. |

O `serialized_profile` campo contém a serialização em JSON de uma [entidade de perfil](https://github.com/decentraland/docs/tree/main/contributor/content/entity-types/profiles/README.md).

Se o remetente quiser recomendar um servidor de conteúdo para baixar entidades referenciadas em seu perfil (como wearables), ele pode definir o `base_url` campo como dica. Os clientes podem usar ou ignorar esta URL livremente.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/contributor/contributor-pt/comunicacoes/messages.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
