Développeurs

Tout ce qu'il faut pour piloter la fumée depuis une autre ressource, brancher ton framework ou ton inventaire, et mettre la ressource à jour.

Exports serveur

Export Arguments Retour
IsSmoking(source) ID du joueur true si ce joueur fume
Stop(source) ID du joueur true si sa fumée était allumée et vient d'être coupée
GetSettings(source) ID du joueur Copie de ses réglages, ou nil
-- Couper la fumée d'un joueur depuis une autre ressource (cinématique, zone interdite...)
if exports.kp_planesmoke:IsSmoking(source) then
    exports.kp_planesmoke:Stop(source)
end

L'état partagé

La fumée de chaque joueur vit dans son state bag kp_planesmoke, écrit uniquement par le serveur :

{
    size = 0.6,
    slots = {
        { pos = 'left', hex = '#2F80ED', r = 0.18, g = 0.5, b = 0.93, x = 0.0, y = 0.0, z = 0.0 },
        { pos = 'right', hex = '#E02020', r = 0.88, g = 0.13, b = 0.13, x = 0.0, y = 0.0, z = 0.0 },
    },
}

nil quand la fumée est éteinte. Tu peux le lire depuis un client avec Player(serverId).state.kp_planesmoke, jamais l'écrire : le serveur ignorerait la valeur et chaque client la revérifie avant de l'afficher.

Les events

Event Sens Rôle
kp_planesmoke:toggle client vers serveur Allume ou éteint, avec les réglages du joueur
kp_planesmoke:update client vers serveur Nouveaux réglages pendant que la fumée est allumée
kp_planesmoke:stop client vers serveur Arrêt automatique, n'agit que sur la fumée de l'émetteur
kp_planesmoke:state serveur vers client Réponse : allumé ou éteint, et le refus éventuel

Pour un anticheat : un client ne peut demander que son propre état. Le serveur vérifie l'accès, la présence dans un avion, la place pilote et le modèle, borne la taille et les déplacements, et limite les appels à un toutes les 500 ms. Les tentatives refusées partent sur Config.Discord.Webhook si tu le remplis.

Brancher ton framework

bridge/framework/custom.lua est ouvert. Mets Config.Framework = 'custom' et remplis deux fonctions :

Frameworks.custom = {
    resource = 'my_core',                -- nom de ta ressource, ou nil

    init = function() return true end,

    getJob = function(src)               -- nom du métier et grade, ou nil
        local player = exports.my_core:GetPlayer(src)
        return player and player.job, player and player.grade or 0
    end,

    getName = function(src)              -- nom du personnage pour le log, ou ''
        local player = exports.my_core:GetPlayer(src)
        return player and player.name or ''
    end,
}

Brancher ton inventaire

Copie bridge/inventory/ox_inventory.lua, renomme l'adaptateur, ajoute-le dans fxmanifest.lua et donne son nom à Config.Inventory. Le script n'utilise que exists, label, count et remove.

Mettre à jour

  1. Retélécharge la ressource depuis ton Keymaster.
  2. Garde de côté ton config.lua, tes locales/, ton html/img/logo.png et tes fichiers de bridge/ modifiés.
  3. Remplace le dossier kp_planesmoke, recopie tes fichiers par-dessus, puis compare ton config.lua avec le nouveau pour récupérer les options ajoutées.
  4. restart kp_planesmoke. Les réglages de tes joueurs sont gardés, ils sont enregistrés chez eux.