Explorer
KNOW-ANT-FIVEM-004

FiveM - Callbacks d'argent vides : argent free si non implementes

Domaine
fivem
Type
anti-pattern
Priorité
P2

Parent : [[INDEX-FIVEM-GAMEPLAY]]

FiveM - Callbacks d'argent vides : argent free si non implémentés

Problème

Le script expose des callbacks pour gérer l'argent (chips) du casino, mais ils sont des stubs vides (nil). Le développeur intégrateur DOIT les implémenter, mais sans implémentation par défaut, le joueur peut jouer gratuitement (pas de retrait de chips, pas de vérification de solde).

-- kgv-blackjack/server.lua (PROBLEMATIQUE)
local getChipsCallback = nil
local takeChipsCallback = nil
local giveChipsCallback = nil

exports("SetGetChipsCallback", function(cb) getChipsCallback = cb end)
exports("SetTakeChipsCallback", function(cb) takeChipsCallback = cb end)
exports("SetGiveChipsCallback", function(cb) giveChipsCallback = cb end)

function GetPlayerChips(source)
    if getChipsCallback then
        return getChipsCallback(source)
    else
        return 0 -- Pas de chips → le joueur ne peut pas jouer ?
        -- NON : le script ne vérifie pas si le callback est nil avant de laisser jouer
    end
end

Conséquences

  • Argent free : si le callback n'est pas implémenté, le joueur peut miser sans avoir de chips
  • Extraction gratuite : les gains sont crédités sans vérification de solde préalable
  • Perte de confiance : les casinos sont les premières cibles des cheaters

Solution

Correct

-- Validation obligatoire avant toute action
function GetPlayerChips(source)
    if not getChipsCallback then
        error("[kgv-blackjack] getChipsCallback non configuré ! Appel exports['kgv-blackjack']:SetGetChipsCallback()")
        return 0
    end
    return getChipsCallback(source)
end

function CanPlaceBet(source, amount)
    local chips = GetPlayerChips(source)
    if chips < amount then
        TriggerClientEvent('blackjack:insufficientFunds', source, amount - chips)
        return false
    end
    return true
end

-- Au démarrage, vérifier que les callbacks sont configurés
AddEventHandler('onResourceStart', function(resourceName)
    if GetCurrentResourceName() ~= resourceName then return end
    
    if not getChipsCallback or not takeChipsCallback or not giveChipsCallback then
        print('^1[ERROR] kgv-blackjack : callbacks d\'argent non configurés. Le casino est INACTIF.^0')
        -- Optionnel : arrêter le resource
        -- StopResource(GetCurrentResourceName())
    end
end)

Incorrect

-- Le joueur peut toujours jouer même sans chips
RegisterNetEvent('blackjack:bet')
AddEventHandler('blackjack:bet', function(amount)
    local src = source
    -- AUCUNE vérification de callback ou de solde
    StartGame(src, amount)
end)

Détection

Rechercher dans le code :

local \w+Callback = nil
exports\("Set\w+Callback"

Références

  • kgv-blackjack/server.lua L95-106