Développeurs

Tout ce qu'il faut pour piloter le séisme depuis une autre ressource, brancher ton framework et mettre la ressource à jour.

Exports serveur

Export Arguments Retour
Start(opts) opts : table, voir plus bas id (nombre) si le séisme part, sinon false, err
Stop() aucun true si un séisme tournait, sinon false
IsActive() aucun true pendant un séisme, sinon false

Les options de Start :

Clé Type Par défaut Bornes
magnitude nombre entier Config.Defaults.Magnitude 1 à 5
duration secondes Config.Defaults.Duration 5 à Config.Limits.MaxDuration
radius mètres, 0 = toute la carte Config.Defaults.Radius 0 à Config.Limits.MaxRadius
coords vector3 aucune obligatoire si radius est plus grand que 0

err vaut 'bad_magnitude', 'bad_duration', 'bad_radius', 'already' (un séisme tourne déjà), 'cooldown' (délai de Config.Limits.Cooldown), 'nobody' (aucun joueur dans le rayon) ou 'no_coords' (rayon sans épicentre). Ce sont les clés des textes de locales/.

Les exports ne vérifient aucune permission : c'est à ta ressource de le faire. Le délai entre deux séismes s'applique, et le log Discord part avec « Console » comme auteur.

-- Séisme de magnitude 4 pendant 30 s autour d'un point, depuis un script de ton serveur
local id, err = exports.kp_earthquake:Start({
    magnitude = 4,
    duration = 30,
    radius = 400,
    coords = vector3(215.0, -810.0, 30.7),
})
if not id then
    print('Séisme refusé : ' .. err)
end

-- Plus tard
if exports.kp_earthquake:IsActive() then
    exports.kp_earthquake:Stop() -- calme le sol en Config.Shake.FadeOut secondes
end

Events

Ce sont des events locaux : écoute-les avec AddEventHandler, jamais avec RegisterNetEvent.

Côté Event Arguments
Serveur kp_earthquake:started id, magnitude, duration, radius, coords
Serveur kp_earthquake:ended id
Client kp_earthquake:started id, magnitude, duration
Client kp_earthquake:ended id
  • Serveur, started : radius vaut 0 pour toute la carte. coords est la position du staff pour une commande en jeu, celle passée à Start, ou nil depuis la console.
  • Serveur, ended : fin normale ou arrêt. Après un arrêt, les joueurs sentent encore la retombée pendant Config.Shake.FadeOut secondes.
  • Client, started : seulement chez les joueurs touchés. Pour un joueur qui se connecte pendant un séisme sur toute la carte, duration est le nombre de secondes restantes.
  • Client, ended : la secousse est finie sur ce client, retombée comprise.
-- Serveur : prévenir les services d'urgence
AddEventHandler('kp_earthquake:started', function(id, magnitude, duration, radius, coords)
    print(('Séisme #%d, magnitude %d, %d s'):format(id, magnitude, duration))
end)

-- Client : couper ton HUD de vitesse pendant la secousse
AddEventHandler('kp_earthquake:started', function(id, magnitude, duration)
    -- ...
end)
AddEventHandler('kp_earthquake:ended', function(id)
    -- ...
end)

Pour les anticheats

Un seul event réseau part du client vers le serveur : kp_earthquake:check, sans argument, envoyé au chargement du joueur. Il revérifie la permission et fait rejoindre un séisme en cours sur toute la carte, rien d'autre.

Pendant un séisme, le client pousse la voiture que conduit le joueur (ApplyForceToEntityCenterOfMass), peut éjecter un pilote de deux-roues (KnockPedOffVehicle) ou faire tomber un joueur à pied (SetPedToRagdoll), déclenche des alarmes de voitures vides et fait fuir des passants proches. Si ton anticheat surveille les forces sur les véhicules ou les chutes, ignore ces cas entre kp_earthquake:started et kp_earthquake:ended, ou teste exports.kp_earthquake:IsActive() côté serveur.

Le bridge

Le dossier bridge/ est ouvert. Tous les fichiers de bridge/framework/ sont chargés par le fxmanifest.lua.

Fichier Rôle
bridge/framework/esx.lua Groupes staff et nom RP avec ESX Legacy
bridge/framework/qbcore.lua Groupes staff (principaux ACE qbcore.<groupe>) et nom RP avec QBCore
bridge/framework/custom.lua Ton framework, à remplir
bridge/notify.lua Affichage des notifications, fonction Notify(kind, title, message, opts)
bridge/locale.lua Lecture des textes : ta langue, puis l'anglais

Brancher ton framework

Mets Config.Framework = 'custom' et remplis bridge/framework/custom.lua :

  • resource : le nom de la ressource de ton framework (le script vérifie qu'elle est démarrée), ou nil ;
  • init() : récupère ton objet partagé, renvoie true si tout est prêt ;
  • isStaff(src, groups) : renvoie true si le joueur src fait partie d'un des groups de Config.Permission.Groups ;
  • getName(src) : renvoie le nom RP du joueur pour les logs Discord, ou ''.
Frameworks = Frameworks or {}

local Core

Frameworks.custom = {
    resource = 'my_core',

    init = function()
        local ok, obj = pcall(function() return exports['my_core']:GetCore() end)
        Core = ok and obj or nil
        return Core ~= nil
    end,

    isStaff = function(src, groups)
        local player = Core and Core.GetPlayer(src)
        if not player then return false end
        for _, group in ipairs(groups) do
            if player.group == group then return true end
        end
        return false
    end,

    getName = function(src)
        local player = Core and Core.GetPlayer(src)
        return player and player.name or ''
    end,
}

my_core, GetCore, GetPlayer, group et name sont des exemples : remplace-les par les fonctions de ton framework. Une erreur dans ces fonctions ne fait jamais planter le script, elle compte comme un refus.

Brancher tes notifications

Garde Config.Notify.Type = 'native' et, dans bridge/notify.lua, remplace les trois lignes du dernier else de Notify() par l'appel à ton système. kind vaut 'success', 'error', 'info', 'alert' ou 'request'.

Mettre à jour

  1. Sauvegarde config.lua et le dossier locales/. Si tu les as modifiés, garde aussi bridge/ et html/img/logo.png.
  2. Retélécharge la ressource depuis ton Keymaster et remplace le dossier kp_earthquake en entier. Ne mélange jamais anciens et nouveaux fichiers.
  3. Reprends tes réglages dans le nouveau config.lua, ligne par ligne. Ne recolle pas l'ancien fichier par-dessus : il lui manquerait les nouvelles options. Fais de même pour tes textes dans locales/.
  4. Dans la console du serveur :
refresh
ensure kp_earthquake
  1. Vérifie la console : la nouvelle version s'affiche sous le logo, et aucun message config: n'apparaît.