> For the complete documentation index, see [llms.txt](https://docs.privalo.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.privalo.dev/scripts/essentials/peds-menu/exports.md).

# EXPORTS

#### 4.1 Bridge editable

Todo lo sensible al framework vive en `bridge/server.lua` y `bridge/client.lua`, ambos en `escrow_ignore` (editables sin desencriptar).

**Server (`bridge/server.lua`)**

| Función                    | Descripción                                                                                          |
| -------------------------- | ---------------------------------------------------------------------------------------------------- |
| `PV_Framework()`           | `'qbx'` \| `'qb'` \| `'esx'` \| `'standalone'`                                                       |
| `PV_IsAdmin(src)`          | ACE `pv_peds.admin` o pertenencia a `AdminGroups`                                                    |
| `PV_CitizenId(src)`        | citizenid (QB/QBX) o identifier (ESX)                                                                |
| `PV_GetJob(src)`           | Nombre del job actual                                                                                |
| `PV_GetLicense(src)`       | Extrae `license:` de los identifiers                                                                 |
| `PV_GetIdentityBySrc(src)` | `{ name, citizenid, license, source, online }` unificado                                             |
| `PV_SearchPlayers(query)`  | Buscador universal por id/citizenid/license/nombre IC                                                |
| `PV_ResolveCitizens(list)` | Convierte lista de citizenids a `{name, license, source, online}`                                    |
| `PV_MatchesPed(src, ped)`  | ¿El player cumple los filtros del ped? (**sin** bypass admin — usado por el catálogo `catalogForMe`) |
| `PV_CanUsePed(src, ped)`   | ¿Puede aplicárselo? (**con** bypass admin — usado al aplicar)                                        |

Sobrescribe `PV_MatchesPed`/`PV_CanUsePed` si necesitas una regla custom (permisos por horas de juego, VIP, integrar con otro plugin).

**Client (`bridge/client.lua`)**

| Función                | Descripción                     |
| ---------------------- | ------------------------------- |
| `PV_Notify(msg, kind)` | Notificación uniforme (ox\_lib) |

#### 4.2 Exports

**Servidor**

| Export                       | Descripción                             |
| ---------------------------- | --------------------------------------- |
| `exports.pv_peds:GetPed(id)` | Devuelve la definición de un ped por id |
| `exports.pv_peds:GetPeds()`  | Todos los peds (tabla `[id]=def`)       |

**Cliente**

| Export                        | Descripción                   |
| ----------------------------- | ----------------------------- |
| `exports.pv_peds:Open()`      | Abre el panel del jugador     |
| `exports.pv_peds:OpenAdmin()` | Abre el panel de admin        |
| `exports.pv_peds:ResetPed()`  | Restablece al ped por defecto |

#### 4.3 Callbacks server disponibles (`lib.callback`)

| Callback                            | Devuelve                                         | Notas                                                     |
| ----------------------------------- | ------------------------------------------------ | --------------------------------------------------------- |
| `pv_peds:cb:catalog`                | `{ peds, categories }` completo                  | **Solo admin** — usado por `/pedsadmin`                   |
| `pv_peds:cb:catalogForMe`           | `{ peds, categories }` filtrado                  | Todos los players — solo los peds a los que tienen acceso |
| `pv_peds:cb:mine`                   | Definición del ped actual (o nil)                |                                                           |
| `pv_peds:cb:isAdmin`                | bool                                             |                                                           |
| `pv_peds:cb:canUse` (id)            | bool                                             | Con bypass admin                                          |
| `pv_peds:cb:use` (id)               | `{ ok, ped }`                                    | Aplica y persiste el assignment                           |
| `pv_peds:cb:savePed` (payload)      | `{ ok, ped }`                                    | **Solo admin**                                            |
| `pv_peds:cb:searchPlayers` (query)  | `[{ citizenid, name, license, source, online }]` | **Solo admin**                                            |
| `pv_peds:cb:resolveCitizens` (list) | Igual al anterior                                | **Solo admin**                                            |
| `pv_peds:cb:pedAssignees` (pedId)   | Lista de players con ESE ped aplicado            | **Solo admin**                                            |

#### 4.4 Eventos server que puedes emitir

| Evento                      | Payload                    | Notas                           |
| --------------------------- | -------------------------- | ------------------------------- |
| `pv_peds:sv:reset`          | *(none)*                   | Borra el assignment del citizen |
| `pv_peds:sv:deletePed`      | `id`                       | Solo admin                      |
| `pv_peds:sv:saveCategory`   | `{ id, label, icon, ord }` | Solo admin                      |
| `pv_peds:sv:deleteCategory` | `id`                       | Solo admin                      |

#### 4.5 Eventos cliente que emite el server

| Evento                    | Cuándo                                                | Qué hace el cliente                                                                                             |
| ------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `pv_peds:cl:catalogDirty` | Cuando el catálogo cambia en server (add/edit/delete) | Refetch inteligente: si el UI está abierto en modo `player` usa `catalogForMe`, si es `admin` usa `catalogFull` |
| `pv_peds:cl:openPlayer`   | `/peds`                                               | Abre panel jugador                                                                                              |
| `pv_peds:cl:openAdmin`    | `/pedsadmin`                                          | Abre panel admin                                                                                                |
| `pv_peds:cl:reset`        | `/resetped`                                           | Restablece skin                                                                                                 |

#### 4.6 Ejemplos

**Dar acceso extra a un jugador concreto a un ped restringido por trabajo**

Editor → elige el ped (`permission_type='job'`, `permission_value='police'`) → pestaña **Asignados** → buscador → escribe el nombre del player → click para añadir. Se guarda en `extra_citizens`. Ese player podrá usarlo aunque no sea policía. El resto de polis siguen pudiéndolo usar como antes.

**Auditar quién tiene el ped 'Bigfoot' aplicado ahora**

Editor → ped Bigfoot → pestaña **Asignados** → verás lista con nombre + citizenid + online/offline. Si alguien no debería tenerlo, elimínalo de `extra_citizens` o cambia el filtro; luego pídele que use `/resetped` (o hazlo tú vía `TriggerClientEvent('pv_peds:cl:reset', src)`).

**Dar el ped al usar un item**

```lua
-- server
exports.ox_inventory:registerHook('usingItem', function(payload)
    if payload.item.name == 'skin_coupon' then
        TriggerClientEvent('pv_peds:cl:openPlayer', payload.source)
        exports.ox_inventory:RemoveItem(payload.source, 'skin_coupon', 1)
    end
end)
```

**Añadir citizenid a `extra_citizens` desde otro script**

```lua
-- server
local pedId = 3
local newCid = 'ABC12345'
local ped = exports.pv_peds:GetPed(pedId)
if ped then
    local list = ped.extra_citizens or ''
    if not list:find(newCid, 1, true) then
        list = list == '' and newCid or (list..','..newCid)
        MySQL.execute('UPDATE pv_peds_defs SET extra_citizens=? WHERE id=?', { list, pedId })
        TriggerClientEvent('pv_peds:cl:catalogDirty', -1)
    end
end
```

#### 4.7 Añadir un nuevo idioma

1. Copia `locales/es.json` a `locales/<tuIdioma>.json` y traduce las claves.
2. En `config.lua`: `PVConfig.Locale = 'tuIdioma'`.
3. Restart. Ya está — el bridge, server, client y NUI lo leen automáticamente.

Si falta alguna clave, cae en `en.json` como fallback y, si tampoco existe, muestra la clave literal.


---

# 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 dynamically by asking a question.

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

```
GET https://docs.privalo.dev/scripts/essentials/peds-menu/exports.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
