# Publicación

## Antes de empezar

Asegúrate de lo siguiente:

* Tu scene cumple con todas las [limitaciones de la scene](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/optimizing/scene-limitations.md). La mayoría de estas se validan cada vez que ejecutas una Preview de tu scene.
* Tienes una [Metamask](https://metamask.io/) cuenta, con tus parcelas de LAND asignadas a ella.
* Posees la cantidad necesaria de parcelas de LAND adyacentes o un Decentraland NAME. De lo contrario, puedes comprar LAND en el [Mercado](https://market.decentraland.org) o un NAME en el [Builder](https://decentraland.org/builder/names).

{% hint style="warning" %}
\*\*📔 Nota\*\*: Las scenes de varias parcelas solo se pueden desplegar en parcelas adyacentes.
{% endhint %}

{% hint style="danger" %}
**❗Advertencia**: Al planificar eventos en vivo, asegúrate de no hacer cambios de última hora en la scene justo antes del evento.

Después de cada publicación, un proceso interno optimiza todos los modelos 3D antes de que puedan renderizarse. Esto tarda alrededor de 15 minutos. Si visitas la scene antes de que esto termine, la scene puede aparecer rota. Este proceso se ejecuta incluso si los modelos 3D ya se publicaron anteriormente.
{% endhint %}

## Revisar datos de la scene

Al desplegar, la CLI lee información del *archivo scene.json* para determinar dónde desplegar tu scene.

Abre el *archivo scene.json* archivo de tu scene y completa los siguientes datos:

* **título**: El título se muestra en la UI debajo del minimapa, cada vez que los jugadores entran en tu scene. También se muestra en el popup de teletransporte.
* **descripción**: Una descripción de lo que los jugadores encontrarán en tu scene. Esto se muestra en el popup de teletransporte.
* **navmapThumbnail**: Una imagen que representa tu scene. Esto se muestra en el popup de teletransporte. La imagen debe ser una *.png* o *.jpg* imagen, con un tamaño recomendado de *228x160* píxeles.
* **Parcels**: Las coordenadas de las parcelas que ocupará tu scene
* **Base**: Las coordenadas de la parcela que se considerará la coordenada \[0,0] de la scene. Si tu scene tiene varias parcelas, debería ser la parcela inferior izquierda (suroeste).
* **spawnPoints**: Un conjunto de coordenadas dentro de la scene (relativas a la parcela base de la scene) donde aparecen los jugadores. De forma predeterminada, los jugadores aparecen en la *0,0,0* ubicación de la scene (esquina inferior izquierda). Usa esto para iniciar a los jugadores en una ubicación específica, o define una región para evitar que los jugadores se superpongan entre sí cuando aparezcan por primera vez.
* **tags**: Un conjunto de etiquetas que describen tu scene. Estas ayudan a los jugadores a explorar Decentraland, facilitando encontrar contenido que les interese. [Consulta la lista de etiquetas disponibles](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/projects/scene-metadata.md#tags).
* **rating**: Se usa para clasificar el contenido de tu scene según su adecuación para distintos grupos de edad (`T` para adolescentes o `A` para adultos). Ayuda a filtrar contenido para los jugadores.

{% hint style="warning" %}
**📔 Nota**: Consulta [metadatos de la scene](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/projects/scene-metadata.md) para más detalles sobre cómo configurar estos parámetros.
{% endhint %}

## Para publicar la scene

### Usando el Scene Editor en Creator Hub

El Scene Editor en Creator Hub ofrece una forma sencilla de publicar tus scenes. Asegúrate de haber [instalado Creator Hub](https://github.com/decentraland/docs/blob/main/creator/sdk7/scene-editor/get-started/editor-installation.md).

1. Abre el proyecto de tu scene.
2. Haz clic en el botón **Publish** en la esquina superior derecha.
3. Aparecerá un aviso preguntando si deseas publicar en un **WORLD** o en **LAND**.
   * Selecciona **PUBLISH TO WORLD** para hacer que tu scene esté disponible en uno de tus [WORLDs](https://docs.decentraland.org/creator/content-creator-es/worlds/about). Luego selecciona en cuál de tus NAMEs o dominios ENS publicar.
   * Selecciona **PUBLISH TO LAND** si posees land, o si un propietario te ha dado permisos de despliegue. Luego selecciona las parcelas en el mapa donde quieres desplegarlo. Las parcelas en las que tienes अनुमति para desplegar se muestran en rosa.
   * Selecciona **Servidores alternativos** para publicar en el [servidor de prueba](#the-test-server) o en un [servidor personalizado](#custom-servers).

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

4. Esto abre una nueva pestaña en tu navegador, mostrando detalles sobre la carga. Aprueba la transacción.
   * Para LAND en una cuenta de navegador de Metamask, confirma el despliegue. Luego aprueba la transacción en la extensión de navegador de Metamask.
   * Para LAND vinculado a una wallet que puedes usar mediante Wallet Connect, haz clic en **Connect wallet**, luego escanea el código QR con tu dispositivo móvil y sigue los pasos en Wallet Connect.

### A través de la CLI

1. Inicia sesión en tu cuenta de Metamask con la misma dirección pública asociada a tus parcelas en Decentraland.
2. Ejecuta `npm run deploy` desde la carpeta de la scene.

{% hint style="info" %}
\*\*💡 Consejo\*\*: Si hay archivos en la carpeta de tu proyecto que no quieres desplegar, enuméralos en el archivo \_.dclignore\_ antes de desplegar.
{% endhint %}

3. Se abrirá una pestaña del navegador, mostrando a qué parcelas estás desplegando. Haz clic en **Sign and Deploy**.
4. Metamask se abrirá, notificándote que se requiere tu firma. Haz clic en **Sign** para confirmar esta acción.

{% hint style="info" %}
**💡 Consejo**: Si estás implementando un flujo de integración continua, donde los cambios en tu scene se despliegan automáticamente, entonces puedes configurar la variable de entorno `export DCL_PRIVATE_KEY` con la clave privada de una cuenta que tenga permisos de despliegue.
{% endhint %}

{% hint style="info" %}
**💡 Consejo**: `npm run deploy` ejecuta un `npm run build`, que revisa la scene en busca de errores de tipo de forma más estricta que al ejecutar `npm run start`. Si estos errores no pueden evitarse (p. ej.: ocurren en una biblioteca externa) y no afectan a la scene, puedes usar `npm run deploy --skip-build` para omitir el `npm run build` paso y desplegar la scene tal como está.
{% endhint %}

## Publicar en Worlds

Para publicar tu scene en un Decentraland World, necesitas poseer un Decentraland NAME o un dominio ENS. Consulta [Opciones de publicación](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/publishing-options#decentraland-worlds) para obtener información sobre cómo conseguir uno.

### Configurar scene.json

Debes especificar bajo qué **nombre** se hará tu despliegue. Añade la siguiente sección en tu `archivo scene.json`:

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

El **nombre** especificado en el `archivo scene.json` puede ser un Decentraland NAME o un dominio ENS. Debe pertenecer a la wallet que firma el despliegue, o a cualquier wallet a la que se le haya otorgado permiso mediante listas de control de acceso (ACL).

Ten en cuenta lo siguiente:

* La wallet que firma el despliegue debe poseer el NAME especificado en el `archivo scene.json` archivo
* La scene no tiene limitaciones de parcelas (desde enero de 2023)
* Todos los Worlds se incluyen automáticamente en la página Places, a menos que optes por excluirte, como se detalla más abajo

### Worlds de varias scenes

De forma predeterminada, al desplegar a un World mediante la CLI, tu scene se tratará como un World de una sola scene. Si tu World ya contiene una scene, desplegar una nueva scene sobrescribirá esa scene anterior, incluso si las coordenadas son diferentes.

Para desplegar como un World de varias scenes, añade el parámetro `--multi-scene` al comando de despliegue:

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

Al usar este parámetro, si la scene que estás publicando tiene coordenadas diferentes a las scenes existentes en ese World, todas esas scenes coexistirán.

{% hint style="warning" %}
\*\*📔 Nota\*\*: Si tienes derechos de operador sobre un World que no posees, y solo te conceden derechos sobre parcelas específicas de ese World, entonces solo podrás publicar en esas parcelas y no podrás afectar al contenido de otras parcelas del World.
{% endhint %}

### Excluirse del listado de Places

Si deseas excluir que tus Worlds se indexen en Places, puedes añadir la siguiente sección en tu `archivo scene.json`:

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

### Usando el Scene Editor en Creator Hub

1. Abre el proyecto de tu scene.
2. Haz clic en el botón **Publish** en la esquina superior derecha.
3. Selecciona **PUBLISH TO WORLD**.
4. Selecciona en cuál de tus NAMEs o dominios ENS publicar.

### A través de la CLI

Usa el siguiente comando:

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

Una vez que ejecutes el comando, se te pedirá firmar el despliegue con tu wallet y se ejecutará un conjunto de validaciones para permitir o rechazar la scene.

### Acceder a un World

Una vez que una scene se sube al servidor de Worlds, puedes acceder a ella usando el Decentraland Explorer con la siguiente URL: `decentraland://?realm=NAME.dcl.eth`, donde `NAME` debe reemplazarse por el Decentraland NAME o el dominio ENS al que desplegaste.

Con Decentraland ya abierto, también puedes ir a un World escribiendo el `/goto NAME.dcl.eth` comando en el chatbox.

Consulta [Hacer descubrible](https://github.com/decentraland/docs/blob/main/creator/sdk7/sdk7/projects/make-discoverable.md) para más información sobre cómo hacer que tu World sea descubrible.

### Migrar un World a Genesis City

Si eres propietario de LAND y deseas desplegar una scene de World en Genesis City, puedes hacerlo volviendo a desplegar tu scene en la red descentralizada de Catalyst, que es el servidor de contenido de Genesis City.

Cosas para recordar:

* Elimina la `worldConfiguration` sección de `archivo scene.json`
* La limitación de tamaño para Worlds (dinámica según las posesiones) es diferente de la de las parcelas LAND (15 MB por parcela), así que asegúrate de que el tamaño de tu scene sea el correcto para despliegues en Genesis City.

## Publicar desde una hardware wallet

En lugar de almacenar tus tokens de LAND en una cuenta de Metamask, puede que te resulte más seguro guardarlos en una hardware wallet, como una [Ledger](https://www.ledger.com/) o en un [Trezor](https://trezor.io/), que esté conectada físicamente a tu ordenador.

Si usas uno de estos dispositivos, puedes vincular la hardware wallet a Metamask para permitir la firma de mensajes, manteniendo los tokens más seguros. Consulta [este artículo de Metamask](https://metamask.zendesk.com/hc/en-us/articles/360020394612-How-to-connect-a-Trezor-or-Ledger-Hardware-Wallet) para obtener instrucciones para conectar tu cuenta.

Una vez que tu hardware wallet pueda usarse a través de Metamask, puedes desplegar siguiendo los mismos pasos que si tus tokens estuvieran en una cuenta de Metamask.

## Sobrescritura de scene

Cuando se despliega una nueva scene, sobrescribe el contenido anterior que existía en las parcelas que ocupa.

Si una scene que ocupa varias parcelas es sobrescrita solo parcialmente por otra, todas sus parcelas son sobrescritas o borradas.

Supón que desplegaste tu scene *A* en dos parcelas *\[100, 100]* y *\[100, 101]*. Luego vendes la parcela *\[100, 101]* a un usuario que posee land adyacente y que despliega una scene grande (*B*) en varias parcelas, incluida *\[100, 101]*.

Tu scene *A* no puede renderizarse parcialmente en una sola parcela, así que *\[100, 100]* no mostrará ningún contenido. Debes crear una nueva versión de la scene *A* que ocupe solo una parcela y desplegarla solo en la parcela *\[100, 100]*.

## ¿Qué son los servidores de contenido?

Los servidores de contenido son una red de servidores propiedad de la comunidad con un sistema de archivos de direccionamiento por contenido, lo que significa que cada archivo se identifica por su contenido, no por un nombre de archivo arbitrario.

Usamos los servidores de contenido para alojar y distribuir todo el contenido de la scene de una manera similar a BitTorrent, manteniendo distribuida la red de Decentraland.

1. Los servidores de contenido almacenan y distribuyen todos los assets necesarios para renderizar tus scenes.
2. El `npm run deploy` El comando vincula estos assets a la parcela LAND especificada en tu **archivo scene.json** archivo. Cada vez que vuelvas a desplegar tu scene, la CLI actualizará tu smart contract de LAND, si es necesario, para apuntar al contenido más reciente disponible en los servidores de contenido.

La información en cada copia del servidor es verificable, ya que cada scene está firmada por el hash del propietario de LAND. Esto significa que alguien que aloje una copia del servidor no podrá manipular el contenido para mostrar algo ilegítimo. La comunidad también puede votar para aprobar o eliminar cualquiera de estos servidores usando la DAO.

## El servidor de pruebas

Puedes desplegar contenido en el servidor de Catalyst de pruebas para ejecutar pruebas completas con múltiples usuarios, las scenes circundantes y un entorno idéntico al de producción. El servidor de pruebas es idéntico a todos los demás servidores de Catalyst. La diferencia es que el contenido desplegado en este servidor no se propaga a los demás. Sin embargo, el contenido desplegado en otros servidores sí se propaga a este servidor, por lo que las scenes circundantes deberían verse como se verán en producción.

{% hint style="warning" %}
**📔 Nota**: Para desplegar en parcelas en el servidor de pruebas, debes tener los mismos permisos requeridos para desplegar en esas parcelas en la red principal.
{% endhint %}

Los jugadores nunca son dirigidos a este servidor; la única forma de acceder es proporcionar explícitamente un parámetro de URL para conectarse a él.

Si estás trabajando en un proyecto confidencial que no quieres revelar hasta el lanzamiento, ten en cuenta que el servidor de pruebas está relativamente oculto para los jugadores, pero cualquiera que use explícitamente la URL del servidor de pruebas podría encontrarse con él.

### A través de la CLI

Para desplegar en el servidor de pruebas, ejecuta:

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

Para entrar en el servidor de contenido, añade `&CATALYST=peer-testing.decentraland.org` a la URL de Decentraland

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

## Servidores personalizados

Puedes desplegar contenido en un servidor personalizado que no pertenezca a la red oficial de servidores de Catalyst mantenida por la DAO. Para ello, no necesitas poseer ningún token de LAND o NAME, ya que puedes configurar el servidor para usar la lógica de validación que prefieras para controlar quién puede desplegar en qué lugar. Los servidores personalizados pueden optar por incluir contenido de los servidores oficiales (que puedes sobrescribir), o empezar desde cero y publicar contenido completamente nuevo.

Consulta [Cómo ejecutar tu propio nodo de Catalyst](https://github.com/decentraland/docs/blob/main/creator/sdk7/tutorials/how-to-run-a-catalyst.md) para más información sobre lo que puedes hacer con tu propio servidor y cómo configurarlo.

{% hint style="warning" %}
**📔 Nota**: Los jugadores tendrán que escribir manualmente una URL para acceder a tu servidor personalizado. Ciertas validaciones de servicios como el [servidor de recompensas](https://github.com/decentraland/docs/blob/main/creator/sdk7/rewards/getting-started.md) o el [servidor de quests](https://github.com/decentraland/docs/blob/main/creator/sdk7/deprecated/quests/overview.md) pueden fallar en estos contextos, ya que a menudo estos servicios requieren que la solicitud provenga de un servidor oficial.
{% endhint %}

Los jugadores nunca son dirigidos a este servidor; la única forma de acceder es escribir explícitamente la URL para conectarse a él.

### A través de la CLI

Para desplegar en un servidor personalizado, ejecuta:

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

La URL para entrar en tu scene desplegada en tu servidor personalizado dependerá del dominio donde esté alojada.

## Verificar que el despliegue fue exitoso

Una vez que hayas desplegado tu scene, estos cambios tardarán unos minutos en propagarse por los distintos servidores de contenido de la red. Si entras en Decentraland justo después de desplegar, es posible que aún veas la versión anterior de tu contenido, según el realm en el que entres.

Después de firmar para autorizar el despliegue de tu scene, la dapp de firma empezará a mostrar confirmaciones de que la nueva versión de tu contenido se ha propagado por todos los servidores de la red.

Verás una lista de cada uno de los servidores que forman la red de contenido de Decentraland. Para cada servidor, se especifica la marca temporal del último cambio subido en esa parcela. Cada servidor corresponde a un realm diferente. Puedes ver cómo estos nombres de servidor se asignan a los nombres de los realms en la [pantalla del monitor de catalyst](https://decentraland.github.io/catalyst-monitor/).

También puedes obtener esta información en cualquier momento ejecutando el siguiente comando en la consola de línea de comandos:

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

{% hint style="warning" %}
**📔 Nota**: Usa las coordenadas de tu scene en lugar de `0,0`. Si tu scene tiene varias parcelas, cualquiera de sus parcelas producirá la misma salida. Si las coordenadas comienzan con un número negativo, añade una `\` al inicio de las coordenadas para evitar que el carácter `-` sea interpretado incorrectamente por la línea de comandos.
{% endhint %}

## Despliegues automáticos

Si realizas cambios con regularidad en el contenido de tu scene y quieres implementar un flujo de publicación optimizado, puedes automatizar el despliegue de tu scene mediante una acción de GitHub.

Para ello, primero debes almacenar tu scene en un proyecto de GitHub. Luego puedes configurar una [acción de GitHub](https://docs.github.com/en/actions) con el siguiente script, que se ejecuta cada vez que hay un merge en la `rama` main. El script instala las dependencias, compila el proyecto y luego lo despliega en 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 que este proceso se ejecute, debes establecer la clave privada de una wallet como variable de entorno en GitHub, la cual se usa para firmar el despliegue. Como siempre, ten mucho cuidado de mantener seguras las claves privadas. NO uses la clave privada de la cuenta que realmente posee los tokens de land, ya que eso supondría importantes riesgos de seguridad. En su lugar, delega los derechos de operador a una wallet desechable que no posea tokens valiosos. Si esta clave privada llegara a filtrarse, puedes revocar fácilmente esos derechos de operador de la cuenta y configurar una nueva wallet.
