Hooks et actions serveur
Hooks client et serveur qui remplacent les presets du bridge, routines client déclenchables par le serveur et actions serveur sécurisées de Config.ServerActions avec leur contexte ctx.
But : brancher votre propre code là où aucun preset ne convient, et créer des actions contrôlées par le serveur.
Fichiers : config_client.lua (Config.ClientHooks) et config_server.lua (Config.ServerHooks, Config.ServerActions).
Principe des hooks
Un hook défini remplace le preset correspondant : le bridge appelle votre fonction et n’exécute plus le code du preset. Laissez un hook à nil (non défini) pour garder le preset choisi dans config.lua. Les hooks serveur sont appelés après les contrôles du moteur : inutile d’y revérifier la permission de l’action qui les déclenche.
Quelques hooks changent aussi la disponibilité d’une option : définir SendBill, GiveVehicleKeys ou RestoreAppearance rend l’option correspondante disponible même avec le sélecteur sur 'custom'.
Exception notable : avec Config.Medical.nativeHealFallback = true, le heal natif complémentaire s’applique après votre hook HealSelf ou HealPlayer.
Hooks client
| Hook | Signature | Retour | Utilisation |
|---|---|---|---|
Notify | Config.ClientHooks.Notify(message, ntype, duration) | rien | Toute notification client. ntype : info, success, error, warning, primary. |
TextInput | Config.ClientHooks.TextInput(title, label, maxLength) | la chaîne saisie ou nil | /me, emote forcée, /me forcé. |
InputDialog | Config.ClientHooks.InputDialog(title, rows) | un tableau de valeurs ou nil (format ox_lib inputDialog) | Formulaire de facture. |
Confirm | Config.ClientHooks.Confirm(title, text) | true pour confirmer ; toute autre valeur vaut refus | Invitation Pierre Feuille Ciseaux. |
ProgressBar | Config.ClientHooks.ProgressBar(data) | true si terminée ; toute autre valeur vaut annulation | Crochetage, réparation native, crevaison, coffre (format ox_lib progressBar). |
ShowTextUI | Config.ClientHooks.ShowTextUI(text) | rien | Texte affiché dans le coffre. |
HideTextUI | Config.ClientHooks.HideTextUI() | rien | Masque le texte du coffre. |
GetPlayerJob | Config.ClientHooks.GetPlayerJob() | { name = 'police', grade = 2 } ou nil | Filtres jobs d’affichage, facturation, crochetage, réparation. |
HasItem | Config.ClientHooks.HasItem(itemName, count) | booléen | Affichage du crochetage et de la réparation (item requis). |
PlayEmote | Config.ClientHooks.PlayEmote(emote) | rien | Type emote, copie et emote forcée. |
PlaySharedEmote | Config.ClientHooks.PlaySharedEmote(emote, targetServerId) | rien | Type shared_emote. |
GetCurrentEmote | Config.ClientHooks.GetCurrentEmote() | nom de l’emote (string) ou nil | Répond aux demandes de copie d’emote. |
CancelEmote | Config.ClientHooks.CancelEmote() | rien | Annulation d’emote. |
Me | Config.ClientHooks.Me(text) | rien | /me saisi, forcé et annonce PFC. |
ReviveSelf | Config.ClientHooks.ReviveSelf() | rien | self_revive avec selfMode = client. |
HealSelf | Config.ClientHooks.HealSelf() | rien | self_heal avec selfMode = client. Le heal natif complémentaire s’applique ensuite si activé. |
GiveVehicleKeys | Config.ClientHooks.GiveVehicleKeys(vehicle, plate, model) | rien | give_keys. Rend l’option give_keys disponible. |
LockpickVehicle | Config.ClientHooks.LockpickVehicle(vehicle) | true si réussi ; le véhicule est alors déverrouillé | Remplace la barre de progression du crochetage, après validation serveur. |
RepairVehicle | Config.ClientHooks.RepairVehicle(vehicle) | false pour signaler un échec ; toute autre valeur affiche repair_done | repair_vehicle, après validation serveur. |
OnTrunkEnter | Config.ClientHooks.OnTrunkEnter(vehicle) | rien | Après l’entrée dans le coffre. |
OnTrunkExit | Config.ClientHooks.OnTrunkExit(vehicle) | rien | Après la sortie du coffre (vehicle peut être nil). |
SendBill | Config.ClientHooks.SendBill(targetServerId, reason, amount, job) | rien | send_bill. Rend l’option send_bill disponible. |
RestoreAppearance | Config.ClientHooks.RestoreAppearance() | false pour signaler un échec | dev_restore_appearance. Rend l’option dev_restore_appearance disponible. |
SetLocalRain | Config.ClientHooks.SetLocalRain(enabled) | rien | Outils locaux : enabled = true active la pluie. Rend le menu météo disponible côté client. |
SetLocalFreeze | Config.ClientHooks.SetLocalFreeze(state) | rien | Outils locaux. Rend le menu météo disponible côté client. |
Hooks serveur
| Hook | Signature | Retour | Utilisation |
|---|---|---|---|
Notify | Config.ServerHooks.Notify(source, message, ntype, duration) | rien | Notifications envoyées par le serveur. |
HasGroup | Config.ServerHooks.HasGroup(source, group) | true si le joueur appartient au groupe | Niveaux admin/staff et listes de groupes. |
GetPlayerJob | Config.ServerHooks.GetPlayerJob(source) | { name = 'mechanic', grade = 0 } ou nil | Contrôle jobs des actions serveur. |
HasItem | Config.ServerHooks.HasItem(source, item, count) | true si possédé | Contrôle item des actions serveur. |
RemoveItem | Config.ServerHooks.RemoveItem(source, item, count) | rien | Réparation avec removeItem = true. |
RevivePlayer | Config.ServerHooks.RevivePlayer(source, targetId) | false pour signaler un échec | admin_revive et self_revive avec selfMode = server. |
HealPlayer | Config.ServerHooks.HealPlayer(source, targetId) | ignoré : heal_sent est toujours affiché | admin_heal et self_heal avec selfMode = server. |
ForceMe | Config.ServerHooks.ForceMe(source, targetId, text) | rien | force_me ; sans hook, le client ciblé exécute Bridge.Me. |
SetWeather | Config.ServerHooks.SetWeather(zone, weather) | false pour signaler un échec | zone vaut nil si useZones = false. Rend les actions météo disponibles côté serveur. |
SetTime | Config.ServerHooks.SetTime(hour, minute) | false pour signaler un échec | Heures prédéfinies. |
FreezeTime | Config.ServerHooks.FreezeTime(state) | false pour signaler un échec | Freeze ON/OFF. |
SetBlackout | Config.ServerHooks.SetBlackout(state) | false pour signaler un échec | Blackout ON/OFF/Toggle. |
GetBlackout | Config.ServerHooks.GetBlackout() | booléen | Toggle et info blackout. |
GenerateWeathers | Config.ServerHooks.GenerateWeathers() | false pour signaler un échec | Météo aléatoire. |
GetTime | Config.ServerHooks.GetTime() | { hour = 12, minutes = 0, seconds = 0 } ou nil | Info heure et freeze du preset av_weather. |
GetZoneInfo | Config.ServerHooks.GetZoneInfo(zone) | { zone, weather, fog, temperature, wind } ou nil | Info zone active. |
OnSuspiciousActivity | Config.ServerHooks.OnSuspiciousActivity(source, reason) | rien | Requête rejetée de façon suspecte ; remplace l’affichage console de logSuspicious. |
OnActionExecuted | Config.ServerHooks.OnActionExecuted(source, actionName, ctx) | rien | Après chaque action serveur exécutée sans erreur. |
Exemple : notifications personnalisées
mon_notify est un nom d’exemple de ressource.
Config.ClientHooks.Notify = function(message, ntype, duration)
exports['mon_notify']:Show(message, ntype, duration)
end
Config.ServerHooks.Notify = function(source, message, ntype, duration)
TriggerClientEvent('mon_notify:show', source, message, ntype, duration)
end
Routines client
Le serveur peut lancer une routine client whitelistée : TriggerClientEvent('ox_target:core:run', id, '<Routine>', ...). Routines documentées par l’archive : PlayEmote(emote), Me(text), ReviveSelf(), HealSelf(), NativeRevive(), NativeHeal(). Elles passent par le bridge, donc par vos hooks client. PlayEmote revalide le nom avec Config.Emotes ; Me tronque à 120 caractères.
Config.ServerHooks.RevivePlayer = function(source, targetId)
TriggerClientEvent('ox_target:core:run', targetId, 'NativeRevive')
end
Actions serveur personnalisées
Une action déclarée dans Config.ServerActions est appelée par une option type = 'server_action'. Le moteur exécute ses contrôles puis votre handler(ctx).
| Champ | Valeurs | Effet |
|---|---|---|
permission |
clé de Config.Permissions, 'everyone', 'staff', 'admin', liste de groupes, false ou function(source) |
Absent : tout le monde. |
jobs |
{ 'police' }, { police = 2 }, 'police' |
Métier vérifié côté serveur. |
item, itemCount |
nom d’item, entier (1 par défaut) | Possession vérifiée côté serveur ; rien n’est retiré automatiquement. |
feature |
clé de Config.Features |
Refus si la fonctionnalité vaut false. |
target |
'none' (défaut), 'player', 'vehicle', 'entity' |
Type de cible attendu et vérifié. |
allowSelf |
booléen | Avec target = 'player', autorise à se cibler soi-même. |
maxDistance |
mètres, ou false |
false : distance illimitée. Absent : Config.Distances.default. S’y ajoute Security.distanceTolerance. |
cooldown |
ms | Absent : Config.Security.actionCooldown. |
args |
liste de règles | Schéma des arguments envoyés par le client. |
handler |
function(ctx) |
Obligatoire. Sans lui, l’action est refusée à l’enregistrement. |
Les noms des actions intégrées (admin_revive, weather_set…) ne peuvent pas être réutilisés.
Règles d’arguments
| Type | Options |
|---|---|
{ type = 'string' } |
min (1 par défaut), max (255 par défaut), pattern (motif Lua), oneOf ({ valeur = true }). Les espaces de début et de fin sont retirés. |
{ type = 'number' } |
min, max, integer = true. NaN et infinis sont refusés. |
{ type = 'boolean' } |
— |
{ type = 'vector3' } |
Accepte un vector3 ou une table { x, y, z }. |
Chaque règle accepte optional = true. Un argument manquant non optionnel ou invalide fait refuser la requête (invalid_input) et la signale comme suspecte.
Objet ctx
| Champ | Contenu |
|---|---|
ctx.source |
ID serveur du joueur qui a déclenché l’action. |
ctx.action |
Nom de l’action. |
ctx.args |
Arguments validés (liste). |
ctx.target, ctx.targetPed |
Avec target = 'player' : ID serveur et ped de la cible. |
ctx.entity, ctx.netId |
Avec target = 'vehicle' ou 'entity' : entité serveur et network ID. |
ctx.notify(message, ntype) |
Notifie le joueur source. |
ctx.notifyTarget(message, ntype) |
Notifie le joueur ciblé (si target = 'player'). |
ctx.runClient(routine, ...) |
Lance une routine client sur le joueur source. |
ctx.runClientOn(id, routine, ...) |
Lance une routine client sur un autre joueur. |
Exemple complet
Côté serveur (config_server.lua) ; mon_script:afficherPermis est un nom d’exemple :
Config.ServerActions = {
check_license = {
permission = 'everyone',
jobs = { 'police' },
target = 'player',
maxDistance = 3.0,
cooldown = 2000,
args = { { type = 'string', oneOf = { quick = true, full = true } } },
handler = function(ctx)
TriggerClientEvent('mon_script:afficherPermis', ctx.target, ctx.source, ctx.args[1])
ctx.notify('Demande envoyée.', 'success')
end,
},
}
Côté client (config_interactions.lua) :
{ name = 'check_license', label = 'Vérifier les papiers', icon = 'fa-solid fa-id-card', jobs = { 'police' }, type = 'server_action', action = 'check_license', args = { 'quick' } },
Le client envoie l’ID serveur de la cible pour les listes Joueurs et Soi-même, et le network ID de l’entité pour les autres listes. Choisissez target en conséquence.
Journaliser
Config.ServerHooks.OnActionExecuted = function(source, actionName, ctx)
print(('[ox_target] %s a utilisé %s'):format(GetPlayerName(source), actionName))
end
D’autres ressources peuvent enregistrer des actions avec exports.ox_target:registerAction.
Erreurs fréquentes
- Action sans
permission: autorisée à tout le monde, ce qui est rarement voulu pour une action sensible. target = 'player'sur une option de véhicule : la requête envoie un network ID, refusé comme « cible joueur inexistante ».- Hook vide
function() end: le preset est remplacé par une fonction qui ne fait rien. - Handler qui modifie de l’argent ou un inventaire sans revérifier les montants : le moteur valide les types et bornes déclarés, pas la logique métier.