# Datos de runtime

## Obtener hora de Decentraland

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 del día fija específica; por ejemplo, para ver siempre Decentraland con un cielo nocturno de las 10 p. m. Por esta razón, la hora de 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" %}
**💡 Consejo**: La `getWorldTime()` función es asíncrona. Consulta [Funciones asíncronas](/creator/content-creator-es/scenes-sdk7/patrones-de-programacion/async-functions.md) 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 de seconds por 60 para obtener los 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 a. m.*.

En el tiempo 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 pájaros cuando hay luz de día y grillos cuando está oscuro, o para encender los materiales emisivos en 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('playing cricket sounds')
  } else {
    // día
    console.log('playing bird sounds')
  }
})
```

## Obtener datos del realm

Los jugadores en decentraland existen en varios *realms*. Los jugadores en diferentes realms no pueden verse, interactuar ni chatear entre sí, 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 encontrar limitaciones. También empareja a los jugadores que están en regiones cercanas, para garantizar que los tiempos de ping entre los jugadores que interactúan sean aceptables.

Si tu escena envía datos a un [servidor de 3rd party](/creator/content-creator-es/scenes-sdk7/redes/authoritative-servers.md) para sincronizar los 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 tratar todos los cambios que pertenecen a un realm como separados de los de otro realm diferente. De lo contrario, los jugadores verán que las cosas cambian de una forma inquietante, sin que nadie haga el cambio.

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

executeTask(async () => {
  const { realmInfo } = await getRealm({})
  console.log(`Estás en el realm: `, realmInfo.realmName)
})
```

{% hint style="info" %}
**💡 Consejo**: La `getRealm()` función es asíncrona. Consulta [Funciones asíncronas](/creator/content-creator-es/scenes-sdk7/patrones-de-programacion/async-functions.md) si no estás familiarizado con ellas.
{% endhint %}

Decentraland gestiona sus comunicaciones entre jugadores (incluidas las posiciones de los jugadores, el chat, los mensajes de messageBus y los cambios de estado de los smart items) a través de una red descentralizada de servidores de comunicación; cada uno de estos servidores se llama un **Realm**. Cada uno de estos servidores puede soportar múltiples **rooms** (también llamados **islands**), cada uno agrupando un conjunto diferente de jugadores que están cerca entre sí 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 comunicaciones, eliminando todos los parámetros de consulta (credenciales)
* `isPreview`: *(boolean)* True si la escena se está ejecutando como una vista previa local, en lugar de estar publicada en Decentraland.
* `isConnectedSceneRoom`: *(boolean)* True si el usuario está conectado al room de la escena.

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

A medida que los jugadores se mueven por el mapa, pueden cambiar de room para agruparse con aquellos jugadores que ahora están más cerca de ellos. Los rooms también ajustan sus límites de forma dinámica para adaptarse a un grupo manejable de personas, así que aunque un jugador permanezca quieto, a medida que los jugadores entren y salgan del world, el jugador podría encontrarse en otro room. Los jugadores en un mismo `room` se comunican, y compartirán mensajes a través de MessageBus incluso si están demasiado lejos para verse entre sí. Los jugadores en un mismo servidor pero en rooms diferentes actualmente no se están comunicando, pero podrían comunicarse a medida que se mueven por el mapa y cambian de room.

Consulta [onRealmChangedObservable](/creator/content-creator-es/scenes-sdk7/interactividad/event-listeners.md#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 todavía no haya un room asignado para el jugador. El explorer eventualmente asignará un room al jugador, pero esto a veces puede ocurrir un par de segundos después de que la escena se haya cargado.
{% endhint %}

## Obtener plataforma del jugador

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

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

```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
}
```

Es probable que los jugadores que usan la aplicación oficial de escritorio de Decentraland tengan una experiencia mucho más fluida que aquellos en el navegador, ya que el navegador impone limitaciones de rendimiento sobre cuánta capacidad de procesamiento de la máquina puede usar la pestaña del navegador. También les faltarán muchas funciones como el control de cámara, luces dinámicas, congelar el movimiento del jugador, mejoras de UI, etc.

## El componente EngineInfo

El `EngineInfo`componente hace un seguimiento de los datos sobre el ciclo de vida de la escena, lo que 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 agrega 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`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**: La `EngineInfo` component debe importarse mediante

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

Consulta [Imports](/creator/content-creator-es/scenes-sdk7/primeros-pasos/coding-scenes.md#imports) para ver cómo manejar esto fácilmente.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/interactividad/runtime-data.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
