Libre à toi
Kairo n'est pas une boîte fermée. Il y a deux façons de monter ton serveur, et tu peux passer de l'une à l'autre quand tu veux.
Tout prendre
Le serveur Kairo contient le Core et tous nos scripts : inventaire, HUD, métiers, garages, logs, interface, anticheat. Tu l'installes et tu ouvres.
Tout construire
Tu prends seulement Kairo Core, gratuit, et tu écris tes scripts toi-même. Tu peux aussi acheter un ou deux modules et coder le reste.
Pourquoi partir du Core
Écrire un serveur FiveM de zéro, c'est réécrire les mêmes choses que tout le monde avant de pouvoir faire ce qui t'intéresse. Le Core les fait pour toi :
- Les joueurs : chargement, sauvegarde automatique, identifiants, déconnexions propres.
- L'argent : comptes cash, bank et black, ajout et retrait avec une raison, historique.
- Les permissions : groupes, droits par commande, vérification en une ligne.
- Les callbacks : le client demande, le serveur répond, sans bricoler d'événements aller-retour.
- La base de données : connexion, requêtes préparées, migrations au démarrage.
Toi, tu écris la partie intéressante : ton métier, ton mini-jeu, ton système d'entreprise.
Structure d'un script
Un script Kairo est une ressource FiveM normale. Un dossier, un manifeste, du code client et du code serveur. Garde cette organisation et tout le monde s'y retrouvera, toi compris dans six mois.
resources/[mes-scripts]/mon-script/├─ fxmanifest.lua├─ config.lua├─ client/│ └─ main.lua└─ server/ └─ main.lua
Le manifeste
La ligne importante est dependency 'kairo-core' : le serveur refusera de démarrer ton script si le Core n'est pas là, au lieu de planter plus loin avec une erreur obscure.
fx_version 'cerulean'game 'gta5'lua54 'yes'name 'mon-script'version '1.0.0'dependency 'kairo-core'shared_script 'config.lua'client_script 'client/main.lua'server_script 'server/main.lua'
Le server.cfg
Le Core démarre toujours en premier, puis tes scripts.
ensure kairo-coreensure [mes-scripts]
Ton premier script
On va faire un salaire de bienvenue : chaque nouveau joueur reçoit 500 $ en banque la première fois qu'il se connecte. Court, mais ça touche aux joueurs, à l'argent et aux notifications.
Config = {}Config.Bienvenue = 500Config.Compte = 'bank'
AddEventHandler('kairo:playerLoaded', function(source, player) if player:getMeta('bienvenue:recue') then return end player.money:add(Config.Compte, Config.Bienvenue, 'prime de bienvenue') player:setMeta('bienvenue:recue', true) player:notify('Bienvenue ! ' .. Config.Bienvenue .. ' $ ont été versés sur ton compte.', 'success')end)
Mets le dossier dans resources, ajoute-le au server.cfg, redémarre. C'est tout. La métadonnée est sauvegardée avec le joueur, il ne touchera la prime qu'une fois.
restart mon-script dans la console serveur. Pas besoin de relancer tout le serveur à chaque modification.Joueurs et argent
Côté serveur, tout part de GetPlayer(source). Tu obtiens un objet joueur avec son argent, ses permissions et ses métadonnées.
RegisterCommand('payer', function(source, args) local player = exports['kairo-core']:GetPlayer(source) local cible = exports['kairo-core']:GetPlayer(tonumber(args[1])) local montant = tonumber(args[2]) if not cible or not montant or montant <= 0 then return player:notify('Usage : /payer id montant', 'error') end if player.money:get('cash') < montant then return player:notify('Pas assez d\'argent sur toi.', 'error') end player.money:remove('cash', montant, 'paiement à ' .. cible.name) cible.money:add('cash', montant, 'paiement de ' .. player.name) cible:notify(player.name .. ' t\'a donné ' .. montant .. ' $', 'success')end)
Règle d'or : l'argent se manipule uniquement côté serveur. Le client peut demander, jamais décider. Le Core n'expose d'ailleurs aucune fonction d'argent au client.
Les permissions
RegisterCommand('annonce', function(source, args) local player = exports['kairo-core']:GetPlayer(source) if not player:hasPermission('annonce') then return end TriggerClientEvent('chat:addMessage', -1, { args = { 'Annonce', table.concat(args, ' ') } })end)
Client et serveur
Ton interface côté client a souvent besoin d'une info que seul le serveur connaît : le solde du joueur, le contenu d'un coffre, un classement. Les callbacks du Core font l'aller-retour proprement.
exports['kairo-core']:RegisterCallback('mon-script:solde', function(source) local player = exports['kairo-core']:GetPlayer(source) return player.money:get('bank')end)
RegisterCommand('solde', function() local solde = exports['kairo-core']:TriggerCallback('mon-script:solde') print('Ton solde : ' .. solde .. ' $')end)
Préfixe toujours tes callbacks et tes événements avec le nom de ton script. Deux scripts qui enregistrent getData, c'est un bug garanti.
Écouter les événements
Le Core prévient les autres scripts de ce qui se passe. Tu n'as pas à surveiller les joueurs en boucle : tu t'abonnes et tu réagis.
kairo:playerLoaded: un joueur est entièrement chargé.kairo:playerDropped: un joueur est parti, ses données sont sauvegardées.kairo:moneyChanged: un compte a bougé, avec le montant et le nouveau solde.kairo:client:loaded: côté client, les données du joueur sont prêtes.
AddEventHandler('kairo:moneyChanged', function(source, account, amount, balance) if account == 'black' and amount > 50000 then print(('[alerte] %s a reçu %d $ sale d\'un coup'):format(source, amount)) endend)
Mixer avec nos scripts
Si tu as acheté un module Kairo, ton script peut s'en servir. Tous nos scripts exposent leurs fonctions de la même façon que le Core. Exemple : ta boulangerie qui donne du pain avec kairo-inventory et vérifie le métier avec kairo-jobs.
RegisterNetEvent('boulangerie:cuire', function() local source = source local job = exports['kairo-jobs']:GetJob(source) if job.name ~= 'boulanger' then return end if not exports['kairo-inventory']:CanCarry(source, 'pain', 5) then return exports['kairo-core']:GetPlayer(source):notify('Inventaire plein', 'error') end exports['kairo-inventory']:RemoveItem(source, 'farine', 1) exports['kairo-inventory']:AddItem(source, 'pain', 5)end)
Et si tu n'as pas le module, rien ne t'empêche d'écrire ton propre inventaire ou ton propre système de métiers sur le Core. Il est fait pour ça.
Bonnes pratiques
- Ne fais jamais confiance au client. Un événement serveur peut être déclenché par n'importe qui avec un menu de triche. Vérifie la distance, le métier, l'argent, à chaque fois.
- Préfixe tout. Événements, callbacks, commandes, clés de métadonnées :
mon-script:quelquechose. - Mets les réglages dans config.lua. Prix, positions, délais. Le jour où tu veux changer un prix, tu ne fouilles pas le code.
- Évite les boucles à Wait(0). Une boucle qui tourne à chaque frame pour tous les joueurs, c'est des millisecondes perdues. Attends plus longtemps quand le joueur est loin.
- Donne toujours une raison.
money:addetmoney:removeprennent une raison : elle apparaît dans l'historique et dans kairo-logs. Tu remercieras ce réflexe le jour d'un litige. - Teste à deux. Beaucoup de bugs n'apparaissent qu'avec plusieurs joueurs : un deuxième client en local suffit.
Idées de scripts
Besoin d'inspiration pour commencer ? Voici des scripts qui se font en une soirée ou un week-end avec le Core.
Partager ou vendre
Ce que tu écris sur Kairo Core t'appartient. Tu peux le garder pour ton serveur, le donner à la communauté ou le vendre.
- Indique
dependency 'kairo-core'dans ton manifeste et précise la version du Core testée. - Si ton script utilise un de nos modules, dis-le clairement : l'acheteur devra l'avoir aussi.
- Tu ne peux pas inclure le code de nos scripts payants dans ce que tu distribues. Le Core, lui, se télécharge gratuitement ici.
Des questions ?
Kairo Core est vraiment gratuit ?
Oui. Tu le télécharges, tu le mets sur ton serveur, tu construis dessus. Pas d'abonnement, pas de clé, pas de limite de joueurs.
Je suis obligé d'acheter vos scripts ?
Non. Le Core suffit pour faire tourner un serveur et écrire tout le reste toi-même. Nos scripts servent à gagner du temps, pas à débloquer le framework.
Je peux mélanger mes scripts et les vôtres ?
Oui. Ils utilisent tous la même API. Ton script peut appeler kairo-inventory, et kairo-jobs voit l'argent que ton script a donné.
Il faut savoir coder en Lua ?
Pour écrire tes propres scripts, oui, un minimum. Si tu sais faire une boucle, une fonction et une table, tu peux suivre ce guide jusqu'au bout.
Je peux vendre les scripts que j'écris ?
Oui. Ce que tu écris t'appartient. Tu peux les vendre ou les partager, tant que tu ne redistribues pas le code de nos propres scripts.
Mon script ne démarre pas, je fais quoi ?
Vérifie que ensure kairo-core est placé avant ton script dans server.cfg, puis regarde la console F8 et la console serveur. Si tu bloques, écris-nous.
Le Core est mis à jour ?
Oui. Les mises à jour gardent l'API compatible. Quand un export change, l'ancien continue de marcher pendant au moins une version majeure.
Où trouver toutes les fonctions disponibles ?
Dans la documentation de Kairo Core : chaque export, chaque événement, avec ses paramètres et un exemple.