Início › Documentação › Personalização · origen_graffiti

Personalização · origen_graffiti

A pasta custom/ permite-te alargar o origen_graffiti sem tocar no núcleo. Todos os ficheiros aqui são escrow_ignore: sobrevivem às atualizações.

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 do cliente — custom/client/hooks.lua

O núcleo dispara-os no lado do cliente. Adiciona a tua lógica dentro de cada handler.

graffiti:hook:onTagAdded

Disparado quando o cliente recebe uma tag nova para renderizar, seja ao guardar ou por sincronização 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

Disparado quando o cliente remove uma tag do mundo local.

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

graffiti:hook:onCanvasModeChanged

Disparado quando o jogador local entra ou sai do modo tela (sessão de pintura ativa). Útil para esconder ou mostrar o HUD, menus radiais, 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 do servidor — custom/server/hooks.lua

O núcleo dispara-os no lado do servidor. Adiciona a tua lógica dentro de cada handler.

graffiti:hook:onTagCreated

Disparado quando um jogador guarda um graffiti com sucesso.

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)

Exemplo — registar a criação de graffitis:

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

Disparado quando uma tag é eliminada, seja por um administrador ou por um jogador com um apagador.

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)

Permissões do cliente — custom/client/permissions.lua

O núcleo chama-as antes de cada ação para dar resposta imediata ao utilizador. Se devolverem false, a ação é cancelada no cliente.

As verificações do cliente servem apenas para a experiência de utilização: podem ser contornadas. As permissões do servidor são sempre a barreira definitiva.

GraffitiPerms.canPaint(coords) → boolean

Chamada no início de activateGraffiti(), antes de qualquer operação assíncrona.

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

GraffitiPerms.canErase(coords) → boolean

Chamada mesmo antes de entrar no modo de apagar, depois de a tag alvo ser identificada.

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

GraffitiPerms.canShop(coords) → boolean

Chamada quando o jogador prime E perto de um ponto de loja, antes de abrir a NUI.

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

Permissões do servidor — custom/server/permissions.lua

Verificações definitivas feitas no servidor antes de cada ação. Estas bloqueiam mesmo a operação.

GraffitiPerms.isAdmin(src) → boolean

Chamada em todos os callbacks e comandos de administração. Valida contra Config.AdminGroups com três camadas de recurso:

  1. Permissões Ace do FiveM — IsPlayerAceAllowed (QBCore, QBX, qualquer framework baseada em ace)
  2. Grupo do ESX — xPlayer.getGroup()
  3. Recurso do bridge — Framework.GetIsFrameworkAdmin
lua
function GraffitiPerms.isAdmin(src)
    -- src — server ID
    return true -- or your custom check
end

GraffitiPerms.canPaint(src, coords) → boolean

Chamada em graffiti:server:startSession depois de validar a distância.

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

GraffitiPerms.canErase(src, coords) → boolean

Chamada em graffiti:server:deleteWorldTag depois de ler as coordenadas da base de dados.

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

GraffitiPerms.canShop(src, coords) → boolean

Chamada em graffiti:server:shopBuy antes de verificar os fundos do jogador.

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