Inicio › Documentación › Personalización · origen_graffiti

Personalización · origen_graffiti

La carpeta custom/ te permite ampliar origen_graffiti sin tocar el núcleo. Todos los ficheros de aquí son escrow_ignore: sobreviven a las actualizaciones.

text
custom/
├── client/
│   ├── hooks.lua        — client-side event hooks
│   └── permissions.lua  — client-side permission checks (UX feedback)
└── server/
    ├── hooks.lua        — server-side event hooks
    └── permissions.lua  — server-side permission checks (authoritative)

Hooks del cliente — custom/client/hooks.lua

El núcleo los lanza en el lado del cliente. Añade tu lógica dentro de cada handler.

graffiti:hook:onTagAdded

Se lanza cuando el cliente recibe un tag nuevo para renderizar, ya sea al guardar o por sincronización de zona.

lua
AddEventHandler('graffiti:hook:onTagAdded', function(row)
    -- row.id         — DB tag ID
    -- row.coords     — vector3 center
    -- row.created_by — license identifier
    -- row.image_url  — public image URL
    -- row.created_at — UTC timestamp string
end)

graffiti:hook:onTagRemoved

Se lanza cuando el cliente elimina un tag del mundo local.

lua
AddEventHandler('graffiti:hook:onTagRemoved', function(id, coords)
    -- id     — tag DB ID
    -- coords — vector3 where the tag was
end)

graffiti:hook:onCanvasModeChanged

Se lanza cuando el jugador local entra o sale del modo lienzo (sesión de pintura activa). Útil para ocultar o mostrar el HUD, menús radiales, etc.

lua
AddEventHandler('graffiti:hook:onCanvasModeChanged', function(active, context)
    -- active          — boolean (true = enter canvas, false = exit canvas)
    -- context.state   — current state string
    -- context.sessionId
    -- context.isOwner — boolean
end)

Hooks del servidor — custom/server/hooks.lua

El núcleo los lanza en el lado del servidor. Añade tu lógica dentro de cada handler.

graffiti:hook:onTagCreated

Se lanza cuando un jugador guarda un grafiti correctamente.

lua
AddEventHandler('graffiti:hook:onTagCreated', function(src, data)
    -- src              — server ID of the player
    -- data.id          — DB tag ID
    -- data.coords      — vector3 center
    -- data.created_by  — license identifier
    -- data.image_url   — public image URL (Fivemanage)
    -- data.created_at  — UTC timestamp string
end)

Ejemplo — registrar la creación de grafitis:

lua
AddEventHandler('graffiti:hook:onTagCreated', function(src, data)
    print(('[graffiti] Player %s painted tag #%d at %s'):format(
        data.created_by, data.id, tostring(data.coords)
    ))
end)

graffiti:hook:onTagDeleted

Se lanza cuando se elimina un tag, ya sea por un administrador o por un jugador con un borrador.

lua
AddEventHandler('graffiti:hook:onTagDeleted', function(src, id, coords)
    -- src    — server ID of the player
    -- id     — deleted tag DB ID
    -- coords — vector3 where the tag was
end)

Permisos del cliente — custom/client/permissions.lua

El núcleo los llama antes de cada acción para dar respuesta inmediata al usuario. Si devuelven false, la acción se cancela en el cliente.

Las comprobaciones del cliente son solo para la experiencia de usuario: se pueden saltar. Los permisos del servidor son siempre la barrera definitiva.

GraffitiPerms.canPaint(coords) → boolean

Se llama al inicio de activateGraffiti(), antes de cualquier operación asíncrona.

lua
function GraffitiPerms.canPaint(coords)
    -- coords — vector3 player position when activating the spray
    return true
end

GraffitiPerms.canErase(coords) → boolean

Se llama justo antes de entrar en el modo de borrado, una vez identificado el tag objetivo.

lua
function GraffitiPerms.canErase(coords)
    -- coords — vector3 center of the tag to erase
    return true
end

GraffitiPerms.canShop(coords) → boolean

Se llama cuando el jugador pulsa E cerca de un punto de tienda, antes de abrir la NUI.

lua
function GraffitiPerms.canShop(coords)
    -- coords — vector3 shop location coordinates
    return true
end

Permisos del servidor — custom/server/permissions.lua

Comprobaciones definitivas que se hacen en el servidor antes de cada acción. Estas sí bloquean la operación.

GraffitiPerms.isAdmin(src) → boolean

Se llama en todos los callbacks y comandos de administración. Valida contra Config.AdminGroups con tres capas de respaldo:

  1. Permisos Ace de FiveM — IsPlayerAceAllowed (QBCore, QBX, cualquier framework basado en ace)
  2. Grupo de ESX — xPlayer.getGroup()
  3. Respaldo del bridge — Framework.GetIsFrameworkAdmin
lua
function GraffitiPerms.isAdmin(src)
    -- src — server ID
    return true -- or your custom check
end

GraffitiPerms.canPaint(src, coords) → boolean

Se llama en graffiti:server:startSession después de validar la distancia.

lua
function GraffitiPerms.canPaint(src, coords)
    -- src    — server ID
    -- coords — vector3 canvas center
    return true
end

GraffitiPerms.canErase(src, coords) → boolean

Se llama en graffiti:server:deleteWorldTag después de leer las coordenadas de la base de datos.

lua
function GraffitiPerms.canErase(src, coords)
    -- src    — server ID
    -- coords — vector3 tag coordinates
    return true
end

GraffitiPerms.canShop(src, coords) → boolean

Se llama en graffiti:server:shopBuy antes de comprobar los fondos del jugador.

lua
function GraffitiPerms.canShop(src, coords)
    -- src    — server ID
    -- coords — vector3 player position at purchase time (may be nil)
    return true
end