Comandos#
Robberies Creator registra tres comandos en el juego para el staff y un comando de cooldown que también funciona desde la consola del servidor. Los tres primeros se pueden renombrar en /robberiesconfig → Commands (reinicia el recurso después de renombrarlos).
Comando | Quién | Descripción |
|---|---|---|
| Admins | Abre el creador: estadísticas, la lista de robos, el editor de nodos y la pantalla de admin. A cualquier otro se le dice que no tiene permiso, y la consola muestra cómo concederlo. |
| Admins, o el ace | Abre el panel de ajustes en vivo. El ace aparte te permite dar a un desarrollador los ajustes sin el creador. |
| Admins | Activa o desactiva el modo de desarrollo solo para ti: todos los minijuegos y quick checks se superan automáticamente. No se guarda: termina cuando te desconectas. |
| Admins y la consola del servidor | Borra los cooldowns de un robo en todos los alcances (por id o por nombre, sin distinguir mayúsculas) o todos los cooldowns con |
Los robos pueden añadir sus propios comandos: un disparador Command registra su comando de chat en cuanto el robo se guarda y se activa, para que cualquier jugador lo escriba.
# From the server console or txAdmin
robberies_clearcooldown all
robberies_clearcooldown "Fleeca Robbery"Eventos y exports#
Para otros recursos que necesitan detener un robo, comprobar un cooldown o hablar con un jugador mediante las propias notificaciones del creador.
Terminar el robo de un jugador
Desde el cliente, termina como fracaso el robo en el que está el jugador: desde un menú radial, una app del teléfono o tu propio script de cárcel.
-- client
TriggerServerEvent('qs-robberies:abortRobbery') -- "player aborted": always ends the robbery
TriggerServerEvent('qs-robberies:playerDied') -- "player died": follows Config.EndRobberyOnDeathCuando el robo termina, se saca a todo el grupo, se registra un intento fallido y se limpia todo lo que generó el robo.
playerDied hace lo mismo que una muerte real. Con Config.EndRobberyOnDeath = 'all' solo termina el robo cuando todo el grupo ha caído; si no, el jugador queda marcado como caído hasta que el juego lo vuelva a ver vivo. Las muertes durante un robo se detectan solas: solo necesitas este evento para una muerte que el juego no registra.
Notificaciones
-- server
TriggerClientEvent('qs-robberies:notify', source, 'The vault is open', 'success', 5000)
-- type: info · success · warning · error duration in msEscuchar los disparadores
Cada vez que se activa un disparador dentro de un robo en curso, se lanza un evento local de servidor que otro recurso de servidor puede escuchar:
-- server
AddEventHandler('qs-robberies:internal:triggerFired', function(info)
-- info.robberyId, info.instanceId, info.nodeId, info.triggerId, info.source, info.data
end)Exports
Servidor: si un robo está en cooldown para un jugador, comprobando sus cooldowns personales, de trabajo y de banda. Útil para una app del teléfono, un tablón de trabajos o un NPC que solo ofrece los robos que están listos.
-- server
local onCooldown, remaining = exports['qs-robberies-creator']:IsOnCooldown(robberyId, source)
if onCooldown then
print(('Ready again in %d seconds'):format(remaining or 0))
endCliente: vuelve a enviar el idioma actual a la interfaz, tras editar un idioma en tiempo de ejecución.
-- client
exports['qs-robberies-creator']:PushLocale()Nodos personalizados#
El verdadero punto de extensión. Añade tus propias acciones, condiciones y disparadores en Lua: aparecen en la paleta del creador con sus propios campos, se colocan y conectan como los nodos integrados, y se ejecutan en el servidor. Los archivos van en server/custom/nodes/ (editables, sin cifrar) y example.lua tiene uno de cada tipo para copiar.
Crea un archivo de nodo
Copia
server/custom/nodes/example.luaa un archivo nuevo en la misma carpeta y registra tu nodo:lua RegisterCustomNode({ kind = 'pay_step_bonus', -- unique id nodeType = 'action', -- 'action' | 'condition' | 'trigger' label = 'Step Bonus', category = 'rewards', -- which palette group it joins icon = 'IoCash', description = 'Pays whoever just completed the step.', fields = { { key = 'amount', type = 'number', label = 'Amount', default = 1000, min = 0 }, { key = 'account', type = 'account-picker', label = 'Account' }, }, handler = function(context, node) local player = RobberyState_GetVariable(context, 'interaction_source') or RobberyState_GetVariable(context, 'source') local amount = tonumber(node.data.amount) or 0 AddPlayerMoney(player, node.data.account or 'cash', amount) return true -- false takes the Fail path end, })Reinicia el recurso
El nodo aparece en la paleta, en la categoría que indicaste. Los errores en la definición se muestran en la consola al iniciar.
La definición#
Clave | Qué es |
|---|---|
| Obligatorio. Un id único. No debe coincidir con un nodo integrado. |
| Obligatorio. |
| Lo que muestra la paleta. |
|
|
| Un nombre del conjunto integrado: |
| El panel de propiedades. Cada valor se guarda en |
| Se ejecuta cuando el flujo llega al nodo. Una acción devuelve |
| Solo disparadores. Se llama cada vez que el robo se carga o se guarda. Llama a |
Tipos de campo#
Cada campo acepta key, label, description, default, required y visibleWhen = { key, value }. Están disponibles los mismos selectores que usan los nodos integrados:
Tipo | Muestra |
|---|---|
| Campos simples. |
| El selector de ubicación del juego. |
| Los ítems de tu inventario, y las cuentas, trabajos y rangos de tu framework. |
| Otro nodo del robo (un ped generado, un blip), o una variable del robo. |
| Las bibliotecas con vista previa. |
Leer el robo#
Los handlers reciben el context del robo. Lee y escribe su estado con RobberyState_GetVariable(context, key) y RobberyState_SetVariable(context, key, value):
Clave | Valor |
|---|---|
| El id de servidor del líder. Solo cambia si el líder se desconecta y el liderazgo pasa a otro. |
| El miembro del grupo que hizo el paso más reciente: un aviso, un minijuego, una barra de progreso, una escena. |
| Una variable escrita por Set Variable o Count Item, con |
| Cuándo empezó, si es un Test Start de admin y dónde se activó el último disparador. |
-- "whoever just did this step", falling back to the leader
local player = RobberyState_GetVariable(context, 'interaction_source')
or RobberyState_GetVariable(context, 'source')También están disponibles las funciones auxiliares del bridge del framework: AddItem, RemoveItem, HasItem, GetItemCount, AddPlayerMoney, GetPlayerMoney, GetPlayerJob y CountPlayersWithJob, así que un nodo personalizado funciona igual en ESX, QBCore y Qbox.
Un disparador personalizado#
Empezar un robo desde tu propio script (un contrato del teléfono, un tablón de trabajos, un NPC hacker) es un disparador personalizado. Como setup se vuelve a ejecutar cada vez que se guarda el robo, registra el evento una sola vez y solo guarda en él la función start:
local starters = {}
-- Your script: TriggerEvent('myscript:startHeist', playerId, 'bank_job')
AddEventHandler('myscript:startHeist', function(playerId, tag)
local start = starters[tag]
if start then start(playerId) end
end)
RegisterCustomNode({
kind = 'script_start',
nodeType = 'trigger',
label = 'Started by Script',
category = 'triggers',
icon = 'IoTerminal',
fields = {
{ key = 'tag', type = 'text', label = 'Tag', placeholder = 'bank_job' },
},
setup = function(robbery, node, start)
starters[node.data.tag or robbery.id] = start
end,
})Custom_StartRobbery(robberyId, playerId, nodeId) hace lo mismo desde cualquier parte del servidor, si ya conoces los ids del robo y del nodo.
Sobre los mensajes#
Todo lo que leen los jugadores viene de locales/, en veinte idiomas. Cuando escribas tus propios nodos, envía tu texto mediante el mismo evento de notificación para que se vea como el resto del robo, y mantén los textos en tu propio archivo de idioma.



