> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dkscripts.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Danças que Chamam Outro Script

> Uma entrada do menu que dispara um evento ou export de outro script ao dançar e ao parar, com ou sem animação

Uma entrada do menu pode, em vez de tocar uma animação, **chamar um evento ou um export de outro script**: ao clicar em **Dançar**, chamar o export do seu script de emotes e, ao parar, o que cancela.

Também serve para **somar algo a uma dança com animação**: um som, um efeito.

## Exemplo

```lua theme={null}
inject.registerDance({
    id = "meu-voar",
    label = "Voar",
    category = "party",
    onPlay = {
        client = {
            export = "meu_script:startFly",
            args = { "rapido" },
        },
        server = {
            event = "meu_script:server:fly",
        },
    },
    onStop = {
        client = {
            export = "meu_script:stopFly",
        },
    },
})
```

## Como funciona

* **Sem `dict` e `clip`**, a dança é só uma **ação** e precisa de `onPlay`. **Com os dois**, ela é uma dança normal e `onPlay`/`onStop` rodam **além** da animação. Informar só um dos dois é erro
* `onPlay` e `onStop` têm uma parte `client` e/ou uma `server`
* Cada parte é `{ event = "nome" }` **ou** `{ export = "recurso:funcao" }`, com `args` opcional (até **8 valores**: texto, número ou booleano)

| Parte | Roda... | Recebe |
| - | - | - |
| `client` | No jogador que dança | `TriggerEvent(nome, idDaDanca, ...args)` ou `exports.recurso:funcao(idDaDanca, ...args)` |
| `server` | No servidor | O evento ou o export recebe `(src, idDaDanca, ...args)` |

## Funções no servidor

No servidor, a parte `server` também pode ser uma **função**, e o handler inteiro pode ser a função:

```lua theme={null}
inject.registerDance({
    id = "meu-voar",
    label = "Voar",
    onPlay = function(src, dance)
        print(("%d começou %s"):format(src, dance.id))
    end,
})
```

* Função só vale quando a dança é registrada por **código do servidor** (`inject.lua` ou o export `registerDance`) e **nunca vai ao jogador**
* A parte `client` aceita **só evento e export**, porque função não atravessa a rede
* Para um bloco de código no client, use os hooks `onPlay(dance)` e `onStop(dance)` de `config/client/hooks.lua`, que valem para **qualquer** dança, ou chame um evento seu

> [!NOTE]
>
> Em `config/shared/config.lua` valem evento e export nos dois lados. Esse arquivo é baixado pelo jogador, então o **nome do evento do servidor fica visível** a ele.

## Quando roda

| Handler | Roda quando... |
| - | - |
| `onPlay` | Depois que o **servidor aprovou**. Os `onBeforePlay` do client e do servidor continuam podendo negar |
| `onStop` | Ao parar (botão, <kbd>X</kbd>, `/parardanca`, export `stop`), ao trocar de dança, quando a dança injetada é removida ou o recurso dono dela para, no client quando o dk\_dances para e, no servidor, quando o jogador sai do servidor dançando |

## Ações sem animação

Uma ação não toca animação, então:

* O jogador fica **"dançando" até parar**. Se o outro script terminar sozinho, ele chama `exports.dk_dances:stop()` no client
* Bloqueios (veículo, queda etc.), cooldown, hooks e compartilhar **valem como nas outras danças**
* Uma ação **não tem prévia** (o botão não aparece), nem objetos (`props`) nem sincronia: não há animação para os outros verem

```lua theme={null}
-- No script que o onPlay chamou, quando o efeito acabar:
exports.dk_dances:stop()
```

Um erro no código do outro script **nunca derruba o dk\_dances**. Com `debugMode` ele aparece no console.

> **[Injetar animações](https://docs.dkscripts.com.br/scripts/dances/dev/inject.md)**
>
> Como registrar a dança, por arquivo ou por export.

> **[Hooks](https://docs.dkscripts.com.br/scripts/dances/dev/hooks.md)**
>
> Código para qualquer dança, no client e no server.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.