Início › Documentação › 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.
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)custom/client/hooks.luaO núcleo dispara-os no lado do cliente. Adiciona a tua lógica dentro de cada handler.
graffiti:hook:onTagAddedDisparado quando o cliente recebe uma tag nova para renderizar, seja ao guardar ou por sincronização de zona.
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:onTagRemovedDisparado quando o cliente remove uma tag do mundo local.
AddEventHandler('graffiti:hook:onTagRemoved', function(id, coords)
-- id — tag DB ID
-- coords — vector3 where the tag was
end)graffiti:hook:onCanvasModeChangedDisparado 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.
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)custom/server/hooks.luaO núcleo dispara-os no lado do servidor. Adiciona a tua lógica dentro de cada handler.
graffiti:hook:onTagCreatedDisparado quando um jogador guarda um graffiti com sucesso.
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:
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:onTagDeletedDisparado quando uma tag é eliminada, seja por um administrador ou por um jogador com um apagador.
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)custom/client/permissions.luaO 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) → booleanChamada no início de activateGraffiti(), antes de qualquer operação assíncrona.
function GraffitiPerms.canPaint(coords)
-- coords — vector3 player position when activating the spray
return true
endGraffitiPerms.canErase(coords) → booleanChamada mesmo antes de entrar no modo de apagar, depois de a tag alvo ser identificada.
function GraffitiPerms.canErase(coords)
-- coords — vector3 center of the tag to erase
return true
endGraffitiPerms.canShop(coords) → booleanChamada quando o jogador prime E perto de um ponto de loja, antes de abrir a NUI.
function GraffitiPerms.canShop(coords)
-- coords — vector3 shop location coordinates
return true
endcustom/server/permissions.luaVerificações definitivas feitas no servidor antes de cada ação. Estas bloqueiam mesmo a operação.
GraffitiPerms.isAdmin(src) → booleanChamada em todos os callbacks e comandos de administração. Valida contra Config.AdminGroups com três camadas de recurso:
IsPlayerAceAllowed (QBCore, QBX, qualquer framework baseada em ace)xPlayer.getGroup()Framework.GetIsFrameworkAdminfunction GraffitiPerms.isAdmin(src)
-- src — server ID
return true -- or your custom check
endGraffitiPerms.canPaint(src, coords) → booleanChamada em graffiti:server:startSession depois de validar a distância.
function GraffitiPerms.canPaint(src, coords)
-- src — server ID
-- coords — vector3 canvas center
return true
endGraffitiPerms.canErase(src, coords) → booleanChamada em graffiti:server:deleteWorldTag depois de ler as coordenadas da base de dados.
function GraffitiPerms.canErase(src, coords)
-- src — server ID
-- coords — vector3 tag coordinates
return true
endGraffitiPerms.canShop(src, coords) → booleanChamada em graffiti:server:shopBuy antes de verificar os fundos do jogador.
function GraffitiPerms.canShop(src, coords)
-- src — server ID
-- coords — vector3 player position at purchase time (may be nil)
return true
end