# Publicação

## Antes de começar

Certifique-se do seguinte:

* A sua scene cumpre todas as [limitações da scene](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/optimizing/scene-limitations.md). A maioria destas é validada sempre que você executa uma Preview da sua scene.
* Você tem uma [Metamask](https://metamask.io/) account, com os seus parcels de LAND atribuídos a ela.
* Você possui a quantidade necessária de parcels de LAND adjacentes ou um Decentraland NAME. Caso contrário, você pode comprar LAND no [Market](https://market.decentraland.org) ou um NAME no [Builder](https://decentraland.org/builder/names).

{% hint style="warning" %}
\*\*📔 Note\*\*: scenes com múltiplos parcels só podem ser deployed em parcels adjacentes.
{% endhint %}

{% hint style="danger" %}
**❗Warning**: Ao planear eventos ao vivo, certifique-se de que não faz alterações de última hora na scene imediatamente antes do evento.

Após cada publish, um processo interno otimiza todos os modelos 3D antes de poderem ser rendered. Isso demora cerca de 15 minutos. Se você visitar a scene antes disso terminar, a scene pode parecer com problemas. Este processo é executado mesmo que todos os modelos 3D já tenham sido published anteriormente.
{% endhint %}

## Verificar os dados da scene

Ao fazer deploy, o CLI lê informações do *scene.json* file para determinar onde fazer deploy da sua scene.

Abra o *scene.json* file da sua scene e preencha os seguintes dados:

* **title**: O title é exibido na UI abaixo do mini-map, sempre que os jogadores entram na sua scene. Também aparece no pop-up de teleport.
* **description**: Uma description do que os jogadores encontrarão na sua scene. Isto é exibido no pop-up de teleport.
* **navmapThumbnail**: Uma image que representa a sua scene. Isto é exibido no pop-up de teleport. A image deve ser uma *.png* ou *.jpg* image de tamanho recomendado de *228x160* pixels.
* **Parcels**: As coordinates dos parcels que serão ocupados pela sua scene
* **Base**: As coordinates do parcel que será considerado a coordinate \[0,0] da scene. Se a sua scene tiver múltiplos parcels, deve ser o parcel inferior esquerdo (Sul-Oeste).
* **spawnPoints**: Um conjunto de coordinates dentro da scene (relativas ao parcel base da scene) onde os jogadores spawn. Por padrão, os jogadores spawn no *0,0,0* local da scene (canto inferior esquerdo). Use isto para iniciar os jogadores num local específico ou defina uma região para impedir que os jogadores se sobreponham uns aos outros quando aparecem pela primeira vez.
* **tags**: Um conjunto de tags que descrevem a sua scene. Estas ajudam os jogadores a explorar Decentraland, facilitando a localização de conteúdo do seu interesse. [Veja a lista de tags disponíveis](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/projects/scene-metadata.md#tags).
* **rating**: Isto é usado para classificar o conteúdo da sua scene com base na sua adequação para diferentes faixas etárias (`T` para Teens ou `A` para Adults). Isto ajuda a filtrar conteúdo para os jogadores.

{% hint style="warning" %}
**📔 Note**: Veja [scene metadata](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/projects/scene-metadata.md) para mais detalhes sobre como definir estes parâmetros.
{% endhint %}

## Para publicar a scene

### Usando o Scene Editor no Creator Hub

O Scene Editor no Creator Hub fornece uma forma fácil de publicar as suas scenes. Certifique-se de que já [instalou o Creator Hub](https://github.com/decentraland/docs/blob/main/creator/sdk7/scene-editor/get-started/editor-installation.md).

1. Abra o projeto da sua scene.
2. Clique no **Publish** button no canto superior direito.
3. Uma prompt perguntará se você quer publicar para um **WORLD** ou para **LAND**.
   * Selecione **PUBLISH TO WORLD** para tornar a sua scene disponível num dos seus [WORLDs](https://docs.decentraland.org/creator/content-creator-pt/worlds/about). Depois, selecione em qual dos seus NAMEs ou ENS Domains publicar.
   * Selecione **PUBLISH TO LAND** se você for dono da land ou tiver recebido permissões de deploy de um proprietário. Depois, selecione os parcels onde quer fazer deploy no mapa. Os parcels em que você tem permissão para fazer deploy aparecem a rosa.
   * Selecione **Servers alternativos** para publicar no [test server](#the-test-server) ou num [custom server](#custom-servers).

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a9b358ccf604ec11addf4852ce36c321e35745e0%2Fpublish-options.png?alt=media)

4. Isto abre uma nova tab no seu browser, mostrando detalhes sobre o upload. Aprove a transaction.
   * Para LAND numa account de browser da Metamask, confirme o deployment. Depois aprove a transaction na extensão de browser da Metamask.
   * Para LAND ligado a uma wallet que você pode usar via Wallet Connect, clique em **Connect wallet**, depois faça scan ao código QR com o seu dispositivo móvel e siga os passos no Wallet Connect.

### Via o CLI

1. Faça login na sua account Metamask com o mesmo public address associado aos seus parcels em Decentraland.
2. Execute `npm run deploy` a partir da pasta da scene.

{% hint style="info" %}
\*\*💡 Tip\*\*: Se houver files na pasta do seu projeto que você não quer fazer deploy, liste-os no file \_.dclignore\_ antes de fazer deploy.
{% endhint %}

3. Uma tab do browser será aberta, mostrando para quais parcels você está fazendo deploy. Clique em **Sign and Deploy**.
4. A Metamask abre, notificando que a sua signature foi solicitada. Clique em **Sign** para confirmar esta action.

{% hint style="info" %}
**💡 Tip**: Se você estiver a implementar um fluxo de continuous integration, em que as alterações na sua scene são deployed automaticamente, então pode definir a `export DCL_PRIVATE_KEY` variável de environment para a private key de uma account que tenha deploy permissions.
{% endhint %}

{% hint style="info" %}
**💡 Tip**: `npm run deploy` executa um `npm run build`, que verifica a scene para type errors de forma mais rigorosa do que executar `npm run start`. Se estes errors não puderem ser evitados (ex.: acontecem numa external library) e não afetarem a scene, você pode usar `npm run deploy --skip-build` para ignorar a `npm run build` step e fazer deploy da scene tal como está.
{% endhint %}

## Publicar para Worlds

Para publicar a sua scene num Decentraland World, você precisa de ter um Decentraland NAME ou um ENS domain. Veja [Publishing Options](https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/publishing-options#decentraland-worlds) para obter informações sobre como conseguir um.

### Configurar scene.json

Você precisa especificar sob que **name** o seu deployment será feito. Adicione a seguinte secção no seu `scene.json`:

```json
{
	"worldConfiguration": {
		"name": "my-name.dcl.eth"
	}
}
```

O **name** especificado em `scene.json` pode ser um Decentraland NAME ou um ENS Domain. Tem de ser owned pela wallet que assina o deployment, ou por qualquer wallet à qual tenha sido dada permission através de Access Control Lists (ACL).

Tenha o seguinte em mente:

* A wallet que assina o deployment deve own o NAME especificado no `scene.json` file
* A scene não tem limitações de parcels (desde janeiro de 2023)
* Todos os Worlds são automaticamente listados na página Places, a menos que opte por não o fazer conforme detalhado abaixo

### Worlds com múltiplas scenes

Por padrão, ao fazer deploy para um World via o CLI, a sua scene será tratada como um World com uma única scene. Se o seu World já contiver uma scene, fazer deploy de uma nova scene irá sobrescrever essa scene mais antiga, mesmo que as coordinates sejam diferentes.

Para fazer deploy como um World com múltiplas scenes, adicione o paramter `--multi-scene` ao comando de deploy:

`npm run deploy -- --multi-scene --target-content https://worlds-content-server.decentraland.org`

Ao usar este paramter, se a scene que está a publicar tiver coordinates diferentes das scenes existentes nesse World, estas scenes existirão todas em conjunto.

{% hint style="warning" %}
\*\*📔 Note\*\*: Se tiver direitos de operator num World que não lhe pertence, e tiver direitos apenas em parcels específicos desse World, então só poderá publicar nesses parcels e não poderá afetar o conteúdo de outros parcels do World.
{% endhint %}

### Optar por não aparecer na listagem Places

Se desejar optar por não ter os seus Worlds indexados no Places, pode adicionar a seguinte secção no seu `scene.json`:

```json
{
	"worldConfiguration": {
		"name": "my-name.dcl.eth",
		"placesConfig": {
			"optOut": true
		}
	}
}
```

### Usando o Scene Editor no Creator Hub

1. Abra o projeto da sua scene.
2. Clique no **Publish** button no canto superior direito.
3. Selecione **PUBLISH TO WORLD**.
4. Selecione em qual dos seus NAMEs ou ENS Domains publicar.

### Via o CLI

Use o seguinte comando:

```bash
npm run deploy -- --target-content https://worlds-content-server.decentraland.org
```

Depois de executar o comando, será solicitado que assine o deployment com a sua wallet e será executado um conjunto de validações para permitir ou rejeitar a scene.

### Aceder a um World

Depois de uma scene ser carregada para o Worlds server, pode acedê-la usando o Decentraland Explorer com o seguinte URL: `decentraland://?realm=NAME.dcl.eth`, onde `NAME` deve ser substituído pelo Decentraland NAME ou ENS Domain para o qual fez deploy.

Com o Decentraland já aberto, também pode saltar para um World escrevendo o `/goto NAME.dcl.eth` comando na caixa de chat.

Veja [Tornar descobrível](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/projects/make-discoverable.md) para mais informações sobre como tornar o seu World descobrível.

### Migrar um World para Genesis City

Se você for um proprietário de LAND e quiser fazer deploy de uma scene de World para Genesis City, pode fazê-lo fazendo deploy novamente da sua scene para a rede descentralizada Catalyst, que é o content server de Genesis City.

Coisas para lembrar:

* Remova a `worldConfiguration` secção de `scene.json`
* A limitação de tamanho para Worlds (dinâmica com base nas holdings) é diferente da dos parcels de LAND (15MB por parcel), por isso certifique-se de que a sua scene tem o tamanho correto para deployments para Genesis City!

## Publicar a partir de uma hardware wallet

Em vez de armazenar os seus tokens de LAND numa account Metamask, pode ser mais seguro guardá-los num dispositivo de hardware wallet, como um [Ledger](https://www.ledger.com/) ou num [Trezor](https://trezor.io/), que está fisicamente ligado ao seu computador.

Se estiver a usar um destes devices, pode ligar a hardware wallet à Metamask para permitir a assinatura de mensagens, mantendo os tokens mais seguros. Veja [este artigo da Metamask](https://metamask.zendesk.com/hc/en-us/articles/360020394612-How-to-connect-a-Trezor-or-Ledger-Hardware-Wallet) para instruções para conectar a sua account.

Assim que a sua hardware wallet puder ser usada via Metamask, pode fazer deploy seguindo os mesmos passos como se os seus tokens estivessem numa account Metamask.

## Sobrescrita de scene

Quando uma nova scene é deployed, ela sobrescreve o conteúdo mais antigo que existia nos parcels que ocupa.

Se uma scene que ocupa múltiplos parcels for apenas parcialmente sobrescrita por outra, todos os seus parcels são sobrescritos ou apagados.

Suponha que você fez deploy da sua scene *A* em dois parcels *\[100, 100]* e *\[100, 101]*. Depois vende o parcel *\[100, 101]* a um utilizador que possui land adjacente e que faz deploy de uma scene grande (*B*) em vários parcels, incluindo *\[100, 101]*.

A sua scene *A* não pode ser rendered parcialmente em apenas um parcel, por isso *\[100, 100]* não mostrará qualquer conteúdo. Você deve construir uma nova versão da scene *A* que ocupe apenas um parcel e fazer deploy apenas para o parcel *\[100, 100]*.

## O que são os content servers

Os content servers são uma network de servers pertencentes à comunidade com um filesystem content-addressed, o que significa que cada file é identificado pelo seu conteúdo, e não por um file name arbitrário.

Usamos os content servers para alojar e distribuir todo o conteúdo da scene de forma semelhante ao BitTorrent, mantendo a rede Decentraland distribuída.

1. Os content servers armazenam e distribuem todos os assets necessários para render as suas scenes.
2. O `npm run deploy` o comando associa estes assets ao parcel de LAND especificado no seu **scene.json** file. Sempre que fizer redeploy da sua scene, o CLI atualizará o seu smart contract de LAND, se necessário, para apontar para o conteúdo mais recente disponível nos content servers.

A informação em cada cópia do server é verificável, uma vez que cada scene é assinada pelo hash do proprietário do LAND. Isto significa que alguém a alojar uma cópia do server não conseguirá adulterar o conteúdo para mostrar algo ilegítimo. A comunidade também pode votar para aprovar ou remover qualquer um destes servers usando o DAO.

## O test server

Pode fazer deploy de conteúdo para o test catalyst server para executar testes completos com vários utilizadores, as scenes circundantes e um environment idêntico ao de produção. O test server é idêntico a todos os outros catalyst servers. A diferença é que o conteúdo deployed para este server não é propagado para os outros. No entanto, o conteúdo deployed para outros servers é propagado para este server, pelo que as scenes circundantes devem parecer como aparecerão em produção.

{% hint style="warning" %}
**📔 Note**: Para fazer deploy para parcels no test server, deve ter as mesmas permissions necessárias para fazer deploy para esses parcels na main network.
{% endhint %}

Os jogadores nunca são direcionados para este server; a única forma de aceder é fornecer explicitamente um URL parameter para se ligar a ele.

Se estiver a trabalhar num projeto confidencial que não queira revelar até ao lançamento, note que o test server é relativamente escondido dos jogadores, mas qualquer pessoa a usar explicitamente o URL do test server pode potencialmente encontrá-lo.

### Via o CLI

Para fazer deploy para o test server, execute:

`npm run deploy -- --target peer-testing.decentraland.org`

Para entrar no content server, adicione `&CATALYST=peer-testing.decentraland.org` ao URL do Decentraland

*<https://play.decentraland.org/?CATALYST=peer-testing.decentraland.org>*

## Servers personalizados

Pode fazer deploy de conteúdo para um custom server que não pertence à network oficial de catalyst servers mantida pelo DAO. Para isso, não precisa de ter quaisquer tokens LAND ou NAME, uma vez que pode configurar o server para usar qualquer lógica de validação que preferir para controlar quem pode fazer deploy e onde. Custom servers podem optar por incluir conteúdo dos servers oficiais (que você pode sobrescrever) ou começar do zero e publicar conteúdo totalmente novo.

Veja [Como executar o seu próprio Catalyst Node](https://github.com/decentraland/docs/blob/main/creator/sdk7/tutorials/how-to-run-a-catalyst.md) para mais informações sobre o que pode fazer com o seu próprio server e como configurá-lo.

{% hint style="warning" %}
**📔 Note**: Os jogadores terão de escrever manualmente um URL para aceder ao seu custom server. Certas validações de serviços como o [rewards server](https://github.com/decentraland/docs/blob/main/creator/sdk7/rewards/getting-started.md) ou o [quests server](https://github.com/decentraland/docs/blob/main/creator/sdk7/deprecated/quests/overview.md) podem falhar nestes contextos, uma vez que muitas vezes estes serviços exigem que o request venha de um server oficial.
{% endhint %}

Os jogadores nunca são direcionados para este server; a única forma de aceder é escrever explicitamente o URL para se ligar a ele.

### Via o CLI

Para fazer deploy para um custom server, execute:

`npm run deploy -- --target <CUSTOM SERVER DOMAIN>`

O URL para entrar na sua scene deployed no seu custom server dependerá do domain onde está alojado.

## Verificar o sucesso do deployment

Depois de fazer deploy da sua scene, estas alterações demorarão alguns minutos a ser propagadas por vários content servers da network. Se entrar em Decentraland logo após fazer deploy, poderá ainda ver a versão anterior do seu conteúdo, dependendo do realm em que entrar.

Depois de assinar para autorizar o deployment da sua scene, a signing dapp começará a mostrar confirmações de que a nova versão do seu conteúdo foi propagada por todos os servers da network.

Verá uma lista de cada um dos servers que compõem a content network da Decentraland. Para cada server, é especificado o timestamp da última alteração carregada nesse parcel. Cada server corresponde a um realm diferente. Pode ver como estes nomes de servers correspondem aos nomes de realm na [tela de monitorização do catalyst](https://decentraland.github.io/catalyst-monitor/).

Também pode obter esta informação a qualquer momento executando o seguinte comando na consola da command line:

`npx @dcl/opscli pointer-consistency --pointer 0,0`

{% hint style="warning" %}
**📔 Note**: Use as coordinates da sua scene em vez de `0,0`. Se a sua scene tiver múltiplos parcels, qualquer um dos seus parcels produzirá o mesmo output. Se as coordinates começarem com um número negativo, adicione um `\` no início das coordinates para impedir que o character seja mal interpretado pela command line. `-` character
{% endhint %}

## Deployments automáticos

Se faz alterações regularmente ao conteúdo da sua scene e quer implementar um pipeline de publicação simplificado, pode automatizar o deployment da sua scene através de uma ação do GitHub.

Para isso, primeiro deve guardar a sua scene num projeto GitHub. Depois pode configurar uma [ação do GitHub](https://docs.github.com/en/actions) com o seguinte script, que é executado sempre que há um merge para a `main` branch. O script instala quaisquer dependências, faz build do projeto e depois faz deploy para Decentraland.

```yaml
name: Deploy to DCL PROD

on:
  push:
    branches:
      - main

env:
  DCL_PRIVATE_KEY: ${{ secrets.DCL_PRIVATE_KEY }}

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install npm packages
        run: |
          npm install
      - name: Build scene
        run: |
          npm run build:ci
      - name: Deploy scene
        run: |
          npm run deploy:prod
```

> Importante: Para este processo ser executado, você deve definir a private key de uma wallet como uma variável de environment no GitHub, que é usada para assinar o deployment. Como sempre, tenha muito cuidado para manter as private keys seguras. NÃO use a private key da account que realmente possui os tokens de land, pois isso representaria riscos de segurança significativos. Em vez disso, delegue os operator rights a uma wallet descartável que não possua tokens valiosos. Se esta private key alguma vez for leaked, pode revogar facilmente esses operator rights da account e configurar uma nova wallet.
