Core Docs
Présentation
Kairo Core est la base de tout le reste. Il charge les joueurs à la connexion, gère leurs comptes et leur argent, applique les permissions, sauvegarde les données en base et sécurise les échanges entre le client et le serveur.
Tous les modules kairo-* passent par Kairo Core pour récupérer un joueur, débiter de l'argent ou vérifier une permission. Si tu développes tes propres ressources, utilise la même API : elles fonctionneront avec tout l'écosystème sans adaptateur.
Kairo Core est volontairement léger : il ne contient ni interface, ni métier, ni inventaire. Ce sont des modules séparés, que tu installes seulement si tu en as besoin.
Installation
- Installe MariaDB 10.6 ou plus récent (ou MySQL 8) et crée une base vide, par exemple kairo.
- Télécharge Kairo Core depuis « Mes achats » et place le dossier kairo-core dans resources/[kairo]/.
- Renseigne la connexion à la base dans ton server.cfg avec la variable kairo_db (voir ci-dessous).
- Ajoute ensure kairo-core en premier, avant toutes les autres ressources Kairo.
- Démarre le serveur : les tables sont créées automatiquement. Le premier joueur qui se connecte reçoit son compte avec l'argent de départ défini dans la configuration.
# server.cfgset kairo_db "mysql://kairo:motdepasse@localhost/kairo?charset=utf8mb4"ensure kairo-coreensure kairo-inventoryensure kairo-hud
Configuration
Toute la configuration se trouve dans config.lua. Tu n'as jamais besoin de modifier les fichiers du cœur : les mises à jour remplacent le code, jamais ta configuration.
Les comptes d'argent sont déclarés dans Config.Accounts. Tu peux en ajouter autant que tu veux (argent sale, crypto…) : ils deviennent immédiatement utilisables avec player.money.
Les groupes associent un nom à une liste de permissions. Un joueur hérite des permissions de son groupe ; tu peux ensuite tester une permission précise avec player:hasPermission().
-- config.luaConfig = {}Config.Locale = 'fr'Config.SaveInterval = 300 -- sauvegarde auto, en secondesConfig.Accounts = { cash = { label = 'Liquide', start = 500 }, bank = { label = 'Banque', start = 2500 }, black = { label = 'Argent sale', start = 0 },}Config.Groups = { user = {}, mod = { 'kairo.kick', 'kairo.spectate' }, admin = { 'kairo.kick', 'kairo.spectate', 'kairo.ban', 'kairo.money' },}
API
Les exports s'appellent avec exports['kairo-core']:Nom(...). Les fonctions serveur ne sont jamais accessibles depuis le client.
GetPlayer
serveurexports['kairo-core']:GetPlayer(source)
Renvoie l'objet joueur d'un joueur connecté. C'est le point d'entrée de presque toutes les opérations.
| Paramètre | Type | Description |
|---|---|---|
source | number | ID serveur du joueur |
Retour Player ou nil si le joueur n'est pas (encore) chargé.
local player = exports['kairo-core']:GetPlayer(source)if not player then return endprint(player.name, player.identifier)
GetPlayerByIdentifier
serveurexports['kairo-core']:GetPlayerByIdentifier(identifier)
Retrouve un joueur connecté à partir de son identifiant (licence). Utile pour agir sur un joueur à partir d'une donnée enregistrée en base.
| Paramètre | Type | Description |
|---|---|---|
identifier | string | Identifiant du joueur, par exemple license:abc123… |
Retour Player ou nil si le joueur n'est pas connecté.
local target = exports['kairo-core']:GetPlayerByIdentifier(owner)if target then target:notify('Ton véhicule a été retrouvé')end
GetPlayers
serveurexports['kairo-core']:GetPlayers()
Liste tous les joueurs chargés. La table est indexée par ID serveur.
Retour table<number, Player>
for id, player in pairs(exports['kairo-core']:GetPlayers()) do player.money:add('bank', 100, 'bonus')end
player.money:add
serveurplayer.money:add(account, amount, reason)
Ajoute de l'argent sur un compte du joueur. Le montant doit être positif. La raison est transmise aux logs (Kairo Logs) si le module est installé.
| Paramètre | Type | Description |
|---|---|---|
account | string | Nom du compte déclaré dans Config.Accounts |
amount | number | Montant à ajouter (> 0) |
reason | string? | Motif facultatif, enregistré dans les journaux |
Retour boolean — true si l'opération a réussi.
player.money:add('bank', 500, 'paie')player.money:remove
serveurplayer.money:remove(account, amount, reason)
Retire de l'argent si le solde est suffisant. Rien n'est retiré si le solde est trop bas : teste toujours la valeur renvoyée.
| Paramètre | Type | Description |
|---|---|---|
account | string | Nom du compte |
amount | number | Montant à retirer (> 0) |
reason | string? | Motif facultatif |
Retour boolean — false si le solde est insuffisant.
if player.money:remove('cash', 250, 'achat') then -- donner l'objetelse player:notify('Pas assez d\'argent', 'error')end
player.money:get
serveurplayer.money:get(account)
Lit le solde actuel d'un compte.
| Paramètre | Type | Description |
|---|---|---|
account | string | Nom du compte |
Retour number
local bank = player.money:get('bank')player:hasPermission
serveurplayer:hasPermission(permission)
Vérifie si le joueur possède une permission, via son groupe.
| Paramètre | Type | Description |
|---|---|---|
permission | string | Nom de la permission, par exemple kairo.ban |
Retour boolean
if not player:hasPermission('kairo.ban') then return endplayer:notify
serveurplayer:notify(message, kind)
Envoie une notification au joueur. Utilise Kairo UI s'il est installé, sinon la notification native du jeu.
| Paramètre | Type | Description |
|---|---|---|
message | string | Texte affiché |
kind | string? | info, success, warning ou error (info par défaut) |
Retour rien
player:notify('Virement reçu', 'success')player:getMeta / setMeta
serveurplayer:getMeta(key) player:setMeta(key, value)
Lit ou écrit une métadonnée libre sur le joueur. Elle est sauvegardée avec lui et retrouvée à la prochaine connexion. Préfixe la clé avec le nom de ton script.
| Paramètre | Type | Description |
|---|---|---|
key | string | Nom de la donnée, par exemple mon-script:niveau |
value | any | Valeur à enregistrer (nombre, texte, booléen ou table) |
Retour getMeta : la valeur, ou nil si absente
if not player:getMeta('mon-script:bienvenue') then player:setMeta('mon-script:bienvenue', true)end
RegisterCallback
serveurexports['kairo-core']:RegisterCallback(name, handler)
Déclare une fonction serveur que le client peut appeler et dont il attend une réponse. Le serveur reste maître : le client ne fait que demander.
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom unique du callback |
handler | function(source, ...) | Fonction appelée, sa valeur de retour est renvoyée au client |
Retour rien
exports['kairo-core']:RegisterCallback('bank:balance', function(source) local player = exports['kairo-core']:GetPlayer(source) return player.money:get('bank')end)
TriggerCallback
clientexports['kairo-core']:TriggerCallback(name, ...)
Appelle un callback serveur et attend sa réponse (fonction bloquante, à utiliser dans un thread).
| Paramètre | Type | Description |
|---|---|---|
name | string | Nom du callback |
... | any | Arguments transmis au serveur |
Retour Ce que renvoie le handler serveur.
local balance = exports['kairo-core']:TriggerCallback('bank:balance')print('Solde : ' .. balance)
Événements
kairo:playerLoaded
serveurDéclenché quand un joueur est entièrement chargé (compte, argent, groupe).
AddEventHandler('kairo:playerLoaded', function(source, player) print(player.name .. ' est arrivé')end)
kairo:playerDropped
serveurDéclenché après la sauvegarde d'un joueur qui se déconnecte.
AddEventHandler('kairo:playerDropped', function(source, reason) print('Départ : ' .. reason)end)
kairo:moneyChanged
serveurDéclenché à chaque modification d'un compte.
AddEventHandler('kairo:moneyChanged', function(source, account, amount, balance) -- amount est négatif pour un retraitend)
kairo:client:loaded
clientCôté client, quand les données du joueur sont disponibles.
AddEventHandler('kairo:client:loaded', function(data) print('Groupe : ' .. data.group)end)
Commandes
| Commande | Description |
|---|---|
/kairo setgroup <id> <groupe> | Change le groupe d'un joueur (permission kairo.admin requise). |
/kairo givemoney <id> <compte> <montant> | Ajoute de l'argent sur un compte (permission kairo.money). |
/kairo save | Force la sauvegarde de tous les joueurs. |
FAQ
Puis-je utiliser Kairo Core avec des scripts écrits pour un autre framework ?
Ils ne fonctionneront pas tels quels : Kairo Core a sa propre API. La plupart des adaptations se résument à remplacer la récupération du joueur et les fonctions d'argent par celles de Kairo, ce qui prend généralement quelques minutes par script.
Comment ajouter un nouveau type d'argent ?
Ajoute une entrée dans Config.Accounts et redémarre. Le compte est créé à la volée pour chaque joueur, avec la valeur start comme solde initial.
Où sont stockées les données ?
Dans la base indiquée par kairo_db. Les joueurs sont sauvegardés à intervalle régulier (Config.SaveInterval) et à la déconnexion.