# Datos de Runtime

## Obtener Decentraland Time

Decentraland sigue un ciclo día/noche que tarda 2 horas en completarse, por lo que hay 12 ciclos completos cada día. Los jugadores también pueden cambiar la configuración para experimentar una hora específica fija del día, por ejemplo para ver siempre Decentraland con un cielo nocturno de las 10pm. Por esta razón, la hora en Decentraland puede variar de un jugador a otro.

Usa `getWorldTime()` para obtener la hora del día que el jugador está experimentando dentro de Decentraland.

```ts
import { getWorldTime } from '~system/Runtime'

executeTask(async () => {
  let time = await getWorldTime({})
  console.log(time.seconds)
})
```

{% hint style="info" %}
**💡 Tip**: El `getWorldTime()` la función es asíncrona. Ver [Funciones asíncronas](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/patrones-de-programacion/async-functions) si no estás familiarizado con ellas.
{% endhint %}

`getWorldTime()` devuelve un objeto con una `seconds` propiedad. Esta propiedad indica cuántos segundos han pasado (en tiempo de Decentraland) desde el inicio del día, asumiendo que el ciclo completo dura 24 horas. Divide el valor seconds por 60 para obtener minutos, y por 60 nuevamente para obtener las horas desde el inicio del día. Por ejemplo, si el `seconds` valor es *36000*, corresponde a *10 AM*.

En la hora de Decentraland, el sol siempre sale a las 6:15 y se pone a las 19:50.

Podrías usar esta información para cambiar la escena en consecuencia, por ejemplo para reproducir sonidos de aves cuando hay luz del día y grillos cuando está oscuro, o para encender los materiales emisivos de las farolas cuando está oscuro.

```ts
import { getWorldTime } from '~system/Runtime'

executeTask(async () => {
  let time = await getWorldTime({})
  console.log(time.seconds)
  if (time.seconds < 6.25 * 60 * 60 || time.seconds > 19.85 * 60 * 60) {
    // noche
    console.log('reproduciendo sonidos de grillos')
  } else {
    // día
    console.log('reproduciendo sonidos de aves')
  }
})
```

## Obtener datos del realm

Los jugadores en Decentraland existen en varios *realms*. Los jugadores en diferentes realms no pueden verse entre sí, interactuar ni chatear entre ellos, incluso si están parados en los mismos parcels. Dividir a los jugadores de esta manera permite a Decentraland manejar una cantidad ilimitada de jugadores sin encontrarse con limitaciones. También agrupa a los jugadores que están en regiones cercanas, para asegurar que los tiempos de ping entre jugadores que interactúan sean aceptables.

Si tu escena envía datos a un [servidor de terceros](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/redes/authoritative-servers) para sincronizar cambios entre jugadores en tiempo real, entonces a menudo es importante que los cambios solo se sincronicen entre jugadores que estén en el mismo realm. Debes manejar todos los cambios que pertenecen a un realm como separados de los de otro realm diferente. De lo contrario, los jugadores verán cosas cambiar de manera extraña, sin que nadie haga el cambio.

```ts
import { getRealm } from '~system/Runtime'

executeTask(async () => {
  const { realmInfo } = await getRealm({})
  console.log(`You are in the realm: `, realmInfo.realmName)
})
```

{% hint style="info" %}
**💡 Tip**: El `getRealm()` la función es asíncrona. Ver [Funciones asíncronas](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/patrones-de-programacion/async-functions) si no estás familiarizado con ellas.
{% endhint %}

Decentraland maneja sus comunicaciones entre jugadores (incluyendo posiciones de jugadores, chat, mensajes de messageBus y cambios de estado de smart items) a través de una red descentralizada de servidores de comunicación, cada uno de estos servidores se llama **Realm**. Cada uno de estos servidores puede soportar múltiples **rooms** (también llamadas **islands**), cada una agrupando un conjunto diferente de jugadores que están cerca unos de otros en el mapa de Decentraland.

El `getRealm()` la función devuelve la siguiente información:

* `baseUrl`: *(string)* El dominio del servidor del realm
* `realmName`: *(string)* El nombre del servidor del realm
* `networkId`: *(number)* La red de Ethereum
* `commsAdapter`: *(string)* Adaptador de comms, eliminando todos los parámetros de consulta (credenciales)
* `isPreview`: *(boolean)* Verdadero si la escena se está ejecutando como una vista previa local, en lugar de estar publicada en Decentraland.
* `isConnectedSceneRoom`: *(boolean)* Verdadero si el usuario está conectado a la scene room.

{% hint style="warning" %}
**📔 Nota**: El `layer` la propiedad está obsoleta y debe evitarse.
{% endhint %}

A medida que los jugadores se mueven por el mapa, pueden cambiar de rooms para agruparse con aquellos jugadores que ahora están más cerca de ellos. Las rooms también desplazan sus fronteras dinámicamente para ajustarse a un grupo manejable de personas, así que incluso si un jugador permanece quieto, a medida que otros entran y salen del mundo, el jugador podría encontrarse en otra room. Los jugadores en un mismo `room` se comunican, y compartirán mensajes a través del MessageBus incluso si están demasiado lejos para verse. Los jugadores en un mismo servidor pero en diferentes rooms actualmente no se comunican, pero podrían llegar a comunicarse a medida que se mueven por el mapa y cambian de rooms.

Ver [onRealmChangedObservable](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/event-listeners#player-changes-realm-or-island) para saber cómo detectar cambios respecto al realm o isla del jugador.

{% hint style="warning" %}
**📔 Nota**: Cuando la escena se carga por primera vez, puede que aún no se haya asignado una room para el jugador. El Explorer eventualmente asignará una room al jugador, pero esto a veces puede ocurrir un par de segundos después de que la escena se haya cargado.
{% endhint %}

## Obtener la plataforma del jugador

Los jugadores pueden acceder a Decentraland a través de varias plataformas, incluyendo la aplicación oficial de escritorio, y versiones web y de escritorio obsoletas, así como [clientes experimentales alternativos](https://github.com/decentraland/protocol-squad) construidos para otros motores.

Usa `getExplorerInformation()` para saber en qué plataforma está ejecutando Decentraland el jugador actual.

```ts
import { getExplorerInformation } from '~system/Runtime';

executeTask(async () => {
  let data = await getExplorerInformation({})
  console.log("PLATFORM: ", data.platform, " AGENT: ", data.agent)
})
```

Al usar la aplicación oficial de escritorio de Decentraland, esta función debería devolver los siguientes datos:

```
{
    agent: unity-explorer,
    platform: desktop
}
```

Los jugadores que usan la aplicación oficial de escritorio de Decentraland probablemente tendrán una experiencia mucho más fluida que los que usan el navegador, ya que el navegador impone limitaciones de rendimiento sobre cuánto poder de procesamiento de la máquina puede usar la pestaña del navegador. Además, les faltarán muchas características como control de cámara, luces dinámicas, congelar el movimiento del jugador, mejoras de UI, etc.

## El componente EngineInfo

El `EngineInfo`el componente rastrea datos sobre el ciclo de vida de la escena, lo cual a veces puede ser útil para saber cuándo ocurre un evento en relación con la inicialización de la escena.

Este componente se añade a la `engine.RootEntity`.

```ts
engine.addSystem((deltaTime) => {
  const engineInfo = EngineInfo.getOrNull(engine.RootEntity)
  if (!engineInfo) return

  console.log(
    '--------------' +
      '\nframeNumber: ' +
      engineInfo.frameNumber +
      '\ntickNumber: ' +
      engineInfo.tickNumber +
      '\ntotalRuntime: ' +
      engineInfo.totalRuntime +
      '\n--------------'
  )
})
```

El `EngineInfo`el componente contiene los siguientes datos:

* `frame_number`: Contador de frames del engine
* `total_runtime`: Tiempo total de ejecución de esta escena en segundos
* `tick_number`: Contador de ticks de la escena según [ADR-148](https://adr.decentraland.org/adr/ADR-148)

{% hint style="warning" %}
**📔 Nota**: El `EngineInfo` component must be imported via

> `import { Vector3, Quaternion } from "@dcl/sdk/ecs"`

Ver [Imports](https://docs.decentraland.org/creator/content-creator-es/primeros-pasos/coding-scenes#imports) para ver cómo manejarlos fácilmente.
{% endhint %}
