Crée tesscriptsCoregratuit

Tu n'es pas obligé de tout acheter. Prends Kairo Core, le framework gratuit, et écris tes propres scripts. Ce guide t'accompagne du premier fichier jusqu'au script prêt à jouer.

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.

Le Core n'est pas une démo. C'est exactement le même framework que celui qui fait tourner le serveur Kairo complet. Rien n'est bridé, rien n'est réservé aux acheteurs.

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.

arborescence
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.

fxmanifest.lua
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.

server.cfg
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.lua
Config = {}Config.Bienvenue = 500Config.Compte = 'bank'
server/main.lua
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.

Astuce : pendant que tu développes, tape 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.

server/main.lua
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

server/main.lua
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.

server/main.lua
exports['kairo-core']:RegisterCallback('mon-script:solde', function(source)    local player = exports['kairo-core']:GetPlayer(source)    return player.money:get('bank')end)
client/main.lua
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.
server/main.lua
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.

server/main.lua
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

  1. 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.
  2. Préfixe tout. Événements, callbacks, commandes, clés de métadonnées : mon-script:quelquechose.
  3. 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.
  4. É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.
  5. Donne toujours une raison. money:add et money:remove prennent une raison : elle apparaît dans l'historique et dans kairo-logs. Tu remercieras ce réflexe le jour d'un litige.
  6. 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.

BoulangerieUn métier avec fabrication de pain, une vitrine et des livraisons en ville.
Location de scootersUn point de location, une caution prélevée, un retour automatique.
LoterieUn ticket acheté au comptoir, un tirage chaque soir annoncé à tout le serveur.
Courses de rueDes checkpoints, une mise d'entrée et un classement sauvegardé en base.
DistributeursDes ATM qui lisent et modifient le compte bank du joueur.
PrimesLa police pose une prime, le joueur qui livre le suspect l'encaisse.

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.

Pas trouvé ta réponse ? Écris-nous, on lit tout.