tw.callback
Côté : Client + Server
Système de callbacks bidirectionnel client-serveur. Enregistrez un callback d'un côté, déclenchez-le depuis l'autre, avec support des appels synchrones et asynchrones.
Fonctions Client
tw.callback.register(name, handler)
Enregistre un callback côté client, déclenchable depuis le serveur.
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom unique du callback |
handler | function | Fonction handler. La valeur de retour est renvoyée à l'appelant |
Alias : tw.callback.registerCallback(name, handler)
tw.callback.triggerServer(name, cb, ...)
Déclenche un callback côté serveur depuis le client.
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom du callback serveur à déclencher |
cb | function ou nil | Callback pour le mode async, ou nil pour le mode synchrone (bloquant via Citizen.Await) |
... | any | Arguments passés au handler serveur |
Retour : Quand cb est nil, retourne la/les valeur(s) de retour du handler serveur de manière synchrone.
tw.callback.triggerClient(name, cb, ...)
Déclenche un callback local côté client (client-vers-client).
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom du callback client à déclencher |
cb | function ou nil | Callback pour le mode async, ou nil pour le mode synchrone |
... | any | Arguments passés au handler |
Fonctions Server
tw.callback.register(name, handler)
Enregistre un callback côté serveur. Le source du joueur appelant est toujours injecté comme premier argument.
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom unique du callback |
handler | function(source, ...) | Fonction handler. source est l'ID serveur du joueur |
tw.callback.register.latent(name, handler)
Enregistre un callback côté serveur avec des réponses à bande passante limitée (événements latents). Utile pour envoyer de gros payloads au client sans saturer le réseau.
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom unique du callback |
handler | function(source, ...) | Fonction handler avec livraison de réponse à bande passante limitée |
tw.callback.triggerServer(name, cb, ...)
Déclenche un callback serveur local (serveur-vers-serveur).
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom du callback serveur à déclencher |
cb | function ou nil | Callback pour le mode async, ou nil pour le mode synchrone |
... | any | Arguments passés au handler |
tw.callback.triggerClient(name, target, cb, ...)
Déclenche un callback côté client depuis le serveur.
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom du callback client à déclencher |
target | integer | ID serveur du joueur |
cb | function ou nil | Callback pour le mode async, ou nil pour le mode synchrone |
... | any | Arguments passés au handler client |
Exemples
Enregistrer sur le serveur, appeler depuis le client (async)
-- server.lua
tw.callback.register("getPlayerBalance", function(source)
local user = tw.fw:getUser(source)
return user:getMoney(0)
end)
-- client.lua
tw.callback.triggerServer("getPlayerBalance", function(balance)
print("Mon solde : $" .. balance)
end)Appel synchrone depuis le client
-- client.lua
local balance = tw.callback.triggerServer("getPlayerBalance", nil)
print("Mon solde : $" .. balance)Enregistrer sur le client, appeler depuis le serveur
-- client.lua
tw.callback.register("getPlayerCoords", function()
return GetEntityCoords(PlayerPedId())
end)
-- server.lua
tw.callback.triggerClient("getPlayerCoords", source, function(coords)
print("Le joueur est à : " .. coords)
end)Callback latent pour de grosses données
-- server.lua
tw.callback.register.latent("getAllShopItems", function(source)
return Config.ShopItems -- grosse table envoyée avec contrôle de bande passante
end)
-- client.lua
local items = tw.callback.triggerServer("getAllShopItems", nil)Notes
- Les appels synchrones (
cb = nil) utilisentCitizen.Awaitet bloquent le thread courant jusqu'à la réception de la réponse. - Le paramètre
sourceest automatiquement injecté sur les handlers côté serveur ; ne le passez pas manuellement depuis le client. - Utilisez
register.latentquand le payload de réponse est volumineux pour éviter la congestion réseau.

