Surveillance anti triche
Code : shared/surveillance.lua (règles pures, testées par tests/test_surveillance.lua), server/surveillance/surveillance.lua, client/surveillance/surveillance.lua (envoi unique de la liste des ressources). Écran : panel › Joueurs › Surveillance (web/js/pages/surveillance.js) et console web (même module web/js/pages/surveillance_view.js). Tables : tlr_surv_profiles (410), tlr_surv_alerts (411), tlr_surv_config (412). Migrations 413 à 429 réservées.
Rien n'a été testé dans RedM : À VÉRIFIER EN JEU, en particulier les natives serveur (GetEntityHealth, GetEntityMaxHealth, GetSelectedPedWeapon, GetVehiclePedIsIn, GetEntityPopulationType) et les évènements weaponDamageEvent, explosionEvent, entityCreating (OneSync obligatoire).
Principe
Le serveur relève lui même position, santé et arme de chaque joueur (toutes les 2 s par défaut) et compare avec ce qu'il sait (inventaire, armes portées, journal). Le client n'est jamais cru. Chaque détection produit une alerte horodatée avec ses preuves (position, arme, santé, argent, latence...). Les alertes alimentent un score de risque par joueur.
Score de risque
Somme des poids des alertes non ignorées des 14 derniers jours, chaque poids divisé par deux toutes les 72 h (réglable). Le score est multiplié par 2 pour un compte neuf (première connexion depuis moins de 7 jours et moins de 10 h de jeu), par 1,5 si une seule des deux conditions est vraie. Les comptes déjà présents à l'installation du module ne sont pas considérés comme neufs faute d'historique de temps de jeu. Niveaux : faible (> 0), moyen (≥ 40), élevé (≥ 100).
Réactions graduées
Alerte aux admins (notification en jeu + console), alerte et capture, gel automatique, expulsion, bannissement. Chaque détection a un seuil, un nombre de répétitions sur 10 minutes avant d'appliquer sa réaction (avant : simple alerte), et une réaction. Le bannissement automatique n'est permis que pour les détections certaines (aujourd'hui : évènement injecté) ; ailleurs il retombe sur l'expulsion, même si quelqu'un le force en base. Une alerte par détection et par joueur toutes les 30 s au plus. Exemptés (droit tlr.surv.exempt ou bouton Exempter) : alertes seulement, jamais de sanction. Toute personne ayant accès au panel (tlr.panel.open) est exemptée d’office. Durée du bannissement automatique : Paramètres › Surveillance (0 = définitif).
Droits : tlr.surv.read (voir, recevoir les alertes), tlr.surv.act (geler, ignorer ; expulser et bannir exigent en plus tlr.players.kick / tlr.players.ban), tlr.surv.config (seuils, exemptions). Personne n'agit sur un rang égal ou supérieur.
Fenêtres de grâce
Aucun jugement de déplacement pendant 10 s après tout évènement client du serveur dont le nom contient teleport, revive, respawn, spawn, jail, prison, noclip, bring, goto, setcoords, warp, train ou hotair (tous modules confondus), et pendant 30 s après le chargement du personnage. Un module peut aussi appeler TLR.Surveillance.grace(src, secondes) ou l'export SurveillanceGrace. Un nouveau mode de déplacement scripté doit soit porter un de ces mots, soit appeler la grâce.
Détections, limites et cas légitimes exclus
| Détection | Mesure | Exclu | Limites, faux positifs possibles |
|---|---|---|---|
| Téléportation impossible | distance entre deux relevés (250 m) | véhicule (train, diligence, montgolfière), grâce, staff ayant tlr.admin.self | téléportation d'un autre script dont l'évènement ne porte aucun mot clé ; grosse perte réseau (relevé tardif) |
| Vitesse impossible | m/s entre deux relevés (45) | idem, écart < 1 s | chute d'une falaise, ragdoll projeté par une explosion ; 3 répétitions requises |
| Vol ou noclip | relevés consécutifs en montée de plus de 4 m (4) | véhicule, grâce | ascenseur ou monte charge scripté ; le serveur ne connaît pas la hauteur du sol, un vol à altitude constante n'est pas vu |
| Santé anormale | santé au dessus du maximum du jeu (50 points) | aucun | un script de soin qui monte la santé au delà du maximum (toniques spéciaux) |
| Invincibilité | coups reçus sans perte de santé (6 relevés) | grâce | coups à 0 dégât, armures de scripts tiers ; repose sur weaponDamageEvent |
| Arme non possédée | arme en main absente des armes portées connues du serveur (2 relevés) | mains nues, lasso, canne à pêche, lanternes, torche, jumelles, appareil photo, détecteur, marteau ; grâce | arme donnée par un script tiers sans passer par TLR.Weapons ; arme ramassée sur un PNJ si un module le permet |
| Munitions incohérentes | réserve rapportée par le client au dessus de celle stockée (5 balles) | : | branchée sur le journal ammo.reserve.higher existant ; latence lors d'un rechargement |
| Argent sans transaction | hausse des objets dollar et cent non passée par l'inventaire (50 $ par 30 s) | tout mouvement via TLR.Inventory (add, remove, applyDeltas, pickup, drop...) ou un rechargement venu des modules du cœur (boutiques, coffres, inventaire, artisanat, RPC) | un script tiers qui écrit l'inventaire en base puis recharge : ajouter son dossier à RELOAD_OK |
| Objets sans transaction | même principe sur les autres objets (5 unités) | idem | idem |
| Rafale de requêtes | refus RPC (débit, action inconnue, permission) par minute (15) | : | interface boguée qui boucle sur une action refusée |
| Événement injecté | appel d'un évènement appât qu'aucun client honnête n'envoie (tlr:economy:server:addMoney, tlr:inventory:server:addItem, tlr:admin:server:setGroup, tlr:jobs:server:setJob, tlr:weapons:server:giveWeapon) | : | certaine tant qu'aucun script n'utilise ces noms : ne jamais les réutiliser |
| Entités en masse | entités créées par script (population 7) par 10 s (25) | population ambiante | scripts légitimes qui posent beaucoup d'objets d'un coup chez un joueur (décors, camp) : monter le seuil |
| Explosions en masse | explosions attribuées au joueur par 10 s (4) | : | dynamite en rafale lors d'un évènement de mine ou de braquage |
| Ressource inconnue | ressources démarrées chez le client et absentes du serveur | _cfx_internal | simple indice : un menu de triche injecté ne s'enregistre pas comme ressource, et un client modifié peut mentir |
Écran
Joueurs triés par score (nouveaux comptes en avant à score égal), en ligne et hors ligne avec alertes récentes. Fiche : score, relevé actuel, historique des alertes avec preuves, boutons Observer (caméra d'observation ; depuis la console, capture), Geler / Dégeler, Expulser, Bannir, Ignorer l'alerte, Marquer traitée, Exempter. Onglet Réglages des détections : activation, seuil, répétitions, réaction.
Source : tlr_core/docs/SURVEILLANCE.md