> For the complete documentation index, see [llms.txt](https://docs.cuxial.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cuxial.com/scripts/es/ocio/cuxial-domino/developers.md).

# Exports y eventos

API pública de Cuxial Domino: exports de servidor para gestionar mesas y eventos para seguir las partidas.

Crea y borra mesas, averigua dónde está sentado un jugador y reacciona a rondas, partidas y apuestas desde tus propios recursos. Toda la API es de servidor.

## Exports de servidor

### GetTables

Devuelve todas las mesas.

```lua
local tables = exports.cuxial_domino:GetTables()
```

**Devuelve:** `table[]`, ordenada por `id`. Cada entrada es el resumen de una mesa:

| Campo              | Tipo          | Descripción                                                    |
| ------------------ | ------------- | -------------------------------------------------------------- |
| `id`               | number        | Id de la mesa.                                                 |
| `name`             | string \| nil | Nombre dado a la mesa.                                         |
| `pos`              | table         | `{ x, y, z }`.                                                 |
| `heading`          | number        | Orientación de la mesa.                                        |
| `maxPlayers`       | number        | De `1` a `4`.                                                  |
| `teamMode`         | boolean       | `true` en las mesas de 4 por parejas.                          |
| `tableModel`       | string        | Modelo de la mesa.                                             |
| `scoreMode`        | string        | `'classic'` o `'fives'`.                                       |
| `betMin`, `betMax` | number \| nil | Límites de apuesta de la mesa. `nil` usa los límites globales. |
| `seated`           | number        | Jugadores sentados ahora mismo.                                |
| `inGame`           | boolean       | `true` mientras se juega una ronda.                            |

```lua
for _, t in ipairs(exports.cuxial_domino:GetTables()) do
    print(t.id, t.name, t.seated, t.inGame)
end
```

### GetTable

Devuelve el resumen de una mesa.

```lua
local tbl = exports.cuxial_domino:GetTable(id)
```

| Parámetro | Tipo   | Descripción    |
| --------- | ------ | -------------- |
| `id`      | number | Id de la mesa. |

**Devuelve:** el resumen de la mesa, o `nil` si la mesa no existe.

```lua
local tbl = exports.cuxial_domino:GetTable(3)
if tbl and not tbl.inGame then print('La mesa 3 está libre') end
```

### CreateTable

Crea una mesa y la guarda en la base de datos.

```lua
local id, err = exports.cuxial_domino:CreateTable(data)
```

| Parámetro                    | Tipo    | Descripción                                                                                                                     |
| ---------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `data.pos`                   | table   | `{ x, y, z }`. Obligatorio. Usa las coordenadas de un jugador de pie en el sitio: la mesa se coloca un metro por debajo de `z`. |
| `data.heading`               | number  | Orientación. `0.0` por defecto.                                                                                                 |
| `data.maxPlayers`            | number  | De `1` a `4`. `4` por defecto.                                                                                                  |
| `data.teamMode`              | boolean | Parejas. Solo se aplica con `maxPlayers = 4`.                                                                                   |
| `data.style`                 | string  | `'luxury'`, `'wood'` o `'classic'`. `'luxury'` por defecto.                                                                     |
| `data.tableModel`            | string  | Nombre de un modelo. Si se indica, sustituye a `style`.                                                                         |
| `data.scoreMode`             | string  | `'classic'` o `'fives'`. `'classic'` por defecto.                                                                               |
| `data.name`                  | string  | Nombre de la mesa. Se corta a 60 caracteres.                                                                                    |
| `data.betMin`, `data.betMax` | number  | Límites de apuesta. Hacen falta los dos; con solo uno, la mesa usa los límites globales.                                        |

**Devuelve:** el `id` de la mesa nueva, o `nil` y un motivo. El motivo es `'err_too_close'` cuando hay otra mesa a menos de `table.minDistanceBetween`, y `'err_table_not_found'` cuando falta `data` o `data.pos`.

```lua
local id, err = exports.cuxial_domino:CreateTable({
    pos = { x = 195.0, y = -934.0, z = 30.7 },
    heading = 90.0,
    maxPlayers = 4,
    teamMode = true,
    style = 'wood',
    scoreMode = 'classic',
    name = 'Plaza central',
    betMin = 100,
    betMax = 5000,
})
if not id then print('No se pudo crear la mesa: ' .. tostring(err)) end
```

### DeleteTable

Borra una mesa. Levanta a los jugadores sentados y devuelve cualquier apuesta ya cobrada.

```lua
local ok = exports.cuxial_domino:DeleteTable(id)
```

| Parámetro | Tipo   | Descripción    |
| --------- | ------ | -------------- |
| `id`      | number | Id de la mesa. |

**Devuelve:** `boolean`. `false` si la mesa no existe.

```lua
exports.cuxial_domino:DeleteTable(3)
```

### GetPlayerTable

Devuelve dónde está sentado un jugador.

```lua
local tableId, seat = exports.cuxial_domino:GetPlayerTable(source)
```

| Parámetro | Tipo   | Descripción                 |
| --------- | ------ | --------------------------- |
| `source`  | number | Id de servidor del jugador. |

**Devuelve:** el id de la mesa y el número de asiento (de `1` a `4`), o `nil` si el jugador no está sentado.

```lua
local tableId, seat = exports.cuxial_domino:GetPlayerTable(source)
if tableId then print(('Sentado en la mesa %d, asiento %d'):format(tableId, seat)) end
```

### IsSeated

Indica si un jugador está sentado en una mesa.

```lua
local seated = exports.cuxial_domino:IsSeated(source)
```

**Devuelve:** `boolean`.

```lua
if exports.cuxial_domino:IsSeated(source) then return end
```

### on

Registra una función para uno de los eventos listados más abajo.

```lua
local handle = exports.cuxial_domino:on(event, fn)
```

| Parámetro | Tipo     | Descripción                                                   |
| --------- | -------- | ------------------------------------------------------------- |
| `event`   | string   | Nombre del evento sin prefijo, por ejemplo `'matchFinished'`. |
| `fn`      | function | Recibe los datos del evento.                                  |

**Devuelve:** un identificador numérico, o `nil` si los argumentos no son válidos.

```lua
local handle = exports.cuxial_domino:on('matchFinished', function(payload)
    print(('Mesa %d: gana el asiento %s'):format(payload.tableId, tostring(payload.winnerSeat)))
end)
```

### off

Quita una función registrada con `on`.

```lua
local removed = exports.cuxial_domino:off(handle)
```

**Devuelve:** `boolean`.

```lua
exports.cuxial_domino:off(handle)
```

## Eventos de servidor

Cada evento se dispara también como evento local de servidor con el nombre `cuxial_domino:<evento>`. Es la forma más sencilla de escuchar:

```lua
AddEventHandler('cuxial_domino:betPaid', function(payload)
    print(('La mesa %d pagó un bote de $%d'):format(payload.tableId, payload.total))
end)
```

| Evento          | Datos                               | Cuándo                                                                                                                   |
| --------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `tableCreated`  | `{ id, table, by }`                 | Se crea una mesa. `table` es su resumen. `by` es el id de servidor del miembro del staff, o `nil` si se creó por export. |
| `tableRemoved`  | `{ id, by }`                        | Se borra una mesa.                                                                                                       |
| `playerSeated`  | `{ tableId, seat, source }`         | Un jugador se sienta.                                                                                                    |
| `playerLeft`    | `{ tableId, seat, source, reason }` | Un jugador deja la mesa.                                                                                                 |
| `roundStarted`  | `{ tableId, seats, scoreMode }`     | Empieza una ronda. `seats` es la lista de asientos que juegan, IA incluida.                                              |
| `tilePlayed`    | `{ tableId, seat, tile, side }`     | Se coloca una ficha, por un jugador o por la IA. `tile` es `{ a, b }`.                                                   |
| `bonus`         | `{ tableId, seat, points, kind }`   | Se anota un bono de partida clásica.                                                                                     |
| `roundEnded`    | `{ tableId, winnerSeat, reason }`   | Termina una ronda. `winnerSeat` puede ser `nil`.                                                                         |
| `matchFinished` | `{ tableId, winnerSeat, scores }`   | Termina una partida. `scores` asocia cada asiento con sus puntos.                                                        |
| `betPaid`       | `{ tableId, winnerSeat, total }`    | Se paga el bote al ganador. `total` es el bote completo.                                                                 |

### Valores

| Campo               | Valores                                                                                                                                                                                                                  |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `playerLeft.reason` | `'left'` (por decisión propia), `'disconnected'`, `'inactive'` (turnos agotados)                                                                                                                                         |
| `tilePlayed.side`   | `'start'`, `'left'`, `'right'`; en All Fives también `'top'` y `'bottom'`                                                                                                                                                |
| `bonus.kind`        | `'round_pass'`, `'opening_pass'`, `'capicua'`                                                                                                                                                                            |
| `roundEnded.reason` | `'domino'` (un jugador se quedó sin fichas), `'blocked'`, `'fives_target'` y `'bonus_target'` (objetivo alcanzado durante la ronda), `'player_left'` (ronda cancelada), `'last_standing'`, `'solo_left'`, `'no_players'` |

{% hint style="info" %}
Los asientos se numeran de `1` a `4`. Las mesas de 2 jugadores usan los asientos `1` y `3`. En las mesas de 1 jugador el jugador es el asiento `1` y la IA el `2`. En las mesas por parejas, los asientos `1` y `3` juegan contra el `2` y el `4`.
{% endhint %}

## Cliente

Cuxial Domino no tiene exports de cliente ni eventos públicos de cliente.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.cuxial.com/scripts/es/ocio/cuxial-domino/developers.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
