# Restricted Actions

O `RestrictedActions` módulo permite que cenas acessem funcionalidades sensíveis (e portanto restritas). Está ligado ao [`permission`](https://github.com/decentraland/docs/blob/main/contributor/content/entity-types/scenes/README.md#permissions) sistema, que as cenas usam para solicitar o uso de métodos individuais.

```ts
const RestrictedActions = require("~system/RestrictedActions");
```

{% hint style="info" %}
Como implementador do World Explorer, seu runtime pode não aplicar permissões. Nós **fortemente** aconselhamos contra isso, pois coloca os jogadores em perigo.
{% endhint %}

A maior parte da funcionalidade restrita é fornecida por este módulo, mas também existem [global functions](https://github.com/decentraland/docs/blob/main/contributor/globals/README.md).

O módulo contém os seguintes métodos e tipos:

* [`function movePlayerTo`](#movePlayerTo)
* [`function teleportTo`](#teleportTo)
* [`function triggerEmote`](#triggerEmote)
* [`function changeRealm`](#changeRealm)
* [`function openExternalUrl`](#openExternalUrl)
* [`function openNftDialog`](#openNftDialog)
* [`function setCommunicationsAdapter`](#setCommunicationsAdapter)
* [`interface Vector3`](#Vector3)

### Methods

Cada um dos métodos abaixo está associado a uma [permission](https://github.com/decentraland/docs/blob/main/contributor/content/entity-types/scenes/README.md#permissions) que pode ser solicitada no manifesto da cena.

**`movePlayerTo`**

Desloca o jogador para uma nova posição relativa à atual e, opcionalmente, define o alvo da câmera com [vectors](#Vector3).

Exige a [`ALLOW_TO_MOVE_PLAYER_INSIDE_SCENE`](https://github.com/decentraland/docs/blob/main/contributor/content/entity-types/scenes/README.md#permissions) permission.

```ts
interface Request {
  newRelativePosition: Vector3;
  cameraTarget?: Vector3;
}

interface Response {
    // Uma vez que o jogador tenha se movido para a nova posição, e se o jogador não interrompeu o movimento, isto será verdadeiro.
  success: boolean;
}

function movePlayerTo(Request): Promise<Response>;
```

**`teleportTo`**

Reposiciona o jogador para uma localização absoluta no mundo dada por um [vectors](#Vector3).

Em vez de exigir uma permissão pré-aprovada, cada chamada a `teleportTo` deve ser aprovada pelo jogador.

```ts
interface Request {
  worldPosition: Vector3;
}

interface Response {}

function teleportTo(Request): Promise<Response>;
```

**`triggerEmote`**

Faz o avatar do jogador exibir uma animação de emote, usando um dos nomes predefinidos.

Exige a [`ALLOW_TO_TRIGGER_AVATAR_EMOTE`](https://github.com/decentraland/docs/blob/main/contributor/content/entity-types/scenes/README.md#permissions) permission.

```ts
interface Request {
  predefinedEmote: string;
}

interface Response {}

function triggerEmote(Request): Promise<Response>;
```

**`openExternalUrl`**

Oferece mostrar um site ao jogador, usando uma UI apropriada (que pode ser outra aplicação).

Exige a [`OPEN_EXTERNAL_LINK`](https://github.com/decentraland/docs/blob/main/contributor/content/entity-types/scenes/README.md#permissions) permission.

```ts
interface Request {
  url: string;
}

interface Response {
  // Se o jogador autorizou a abertura do link.
  success: boolean;
}

function openExternalUrl(Request): Promise<Response>;
```

**`openNftDialog`**

Mostra informações sobre um NFT ao jogador, usando uma UI apropriada.

```ts
interface Request {
  // O URN do NFT.
  urn: string;
}

interface Response {
  // Se o NFT foi localizado com sucesso e referenciou uma imagem ou vídeo.
  success: boolean;
}

function openNftDialog(Request): Promise<Response>;
```

**`changeRealm`**

Altera o World Explorer para outro servidor de conteúdo, usando sua URL base.

```ts
interface Request {
  // A URL do novo realm.
  realm: string;

  // Uma mensagem opcional para mostrar aos usuários quando eles tiverem que aprovar a mudança.
  message?: string;
}

interface Response {
  // Se a mudança de realm foi autorizada e bem-sucedida.
  success: boolean;
}

function changeRealm(Request): Promise<Response>;
```

### Types

O único tipo adicional usado pelos métodos deste módulo é o `Vector3`.

**`Vector3`**

Mantém uma posição 3D relativa ou absoluta.

```ts
interface Vector3 {
  x: number;
  y: number;
  z: number;
}
```
