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:radiusvaut 0 pour toute la carte.coordsest la position du staff pour une commande en jeu, celle passée àStart, ounildepuis la console. - Serveur,
ended: fin normale ou arrêt. Après un arrêt, les joueurs sentent encore la retombée pendantConfig.Shake.FadeOutsecondes. - Client,
started: seulement chez les joueurs touchés. Pour un joueur qui se connecte pendant un séisme sur toute la carte,durationest 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), ounil;init(): récupère ton objet partagé, renvoietruesi tout est prêt ;isStaff(src, groups): renvoietruesi le joueursrcfait partie d'un desgroupsdeConfig.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
- Sauvegarde
config.luaet le dossierlocales/. Si tu les as modifiés, garde aussibridge/ethtml/img/logo.png. - Retélécharge la ressource depuis ton Keymaster et remplace le dossier
kp_earthquakeen entier. Ne mélange jamais anciens et nouveaux fichiers. - 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 danslocales/. - Dans la console du serveur :
refresh
ensure kp_earthquake
- Vérifie la console : la nouvelle version s'affiche sous le logo, et aucun message
config:n'apparaît.