Qu'est-ce que le VDM (FiveM) ? Définition et prévention
Qu'est-ce que VDM ?
Le « Match à Mort en Véhicule » (MVD) désigne l'utilisation d'un véhicule comme arme pour percuter, tuer ou blesser intentionnellement d'autres joueurs sans justification de jeu de rôle appropriée. Sur les serveurs de jeu de rôle FiveM, le MVD enfreint la loi. règles fondamentales du serveur et perturbe l’expérience immersive que recherchent les joueurs.
Pourquoi VDM est important
Les serveurs de jeu de rôle fonctionnent selon le principe d'interaction réaliste. Lorsqu'un joueur percute délibérément d'autres joueurs avec son véhicule sans contexte de jeu de rôle, il :
- Pauses immersion pour tous les participants
- Empêche le développement significatif de l'histoire
- Crée des avantages de jeu injustes
- Cela conduit à la frustration des joueurs et au déclin de la population du serveur
Scénarios VDM courants
Effacer les violations VDM :
- Conduire sur les trottoirs pour heurter les piétons
- Percuter des véhicules à l'arrêt aux feux de circulation
- Utiliser des véhicules pour bloquer les entrées des hôpitaux
- Provoquer intentionnellement des collisions frontales
Zones grises nécessitant un contexte :
- Manœuvres policières lors des poursuites
- Attaques de véhicules liées à des gangs avec jeu de rôle antérieur
- Collisions accidentelles pendant les courses
- Interventions des véhicules d'urgence
Mise en œuvre technique : systèmes anti-VDM
Script de détection côté serveur
-- resources/anti-vdm/server.lua local vdmWarnings = {} local VDM_THRESHOLD = 3 local DAMAGE_THRESHOLD = 50 RegisterServerEvent('vdm:checkCollision') AddEventHandler('vdm:checkCollision', function(targetId, damage, speed) local source = source -- Valider l'entrée si ce n'est pas targetId ou pas damage ou pas speed puis renvoyer end -- Vérifier si damage et speed dépassent les seuils si damage > DAMAGE_THRESHOLD et speed > 30 alors local identifier = GetPlayerIdentifier(source, 0) -- Initialiser le nombre d'avertissements si ce n'est pas vdmWarnings[identifier] alors vdmWarnings[identifier] = 0 end vdmWarnings[identifier] = vdmWarnings[identifier] + 1 -- Journaliser l'incident local logData = { attacker = GetPlayerName(source), victim = GetPlayerName(targetId), damage = damage, speed = speed, timestamp = os.time() } TriggerEvent('vdm:logIncident', logData) -- Prendre des mesures en fonction des avertissements si vdmWarnings[identifier] >= VDM_THRESHOLD then DropPlayer(source, 'Expulsé pour violations VDM') vdmWarnings[identifier] = 0 else TriggerClientEvent('chat:addMessage', source, { args = {'^1[AVERTISSEMENT]', 'VDM détecté. Avertissement ' .. vdmWarnings[identifier] .. '/' .. VDM_THRESHOLD} }) end end end)
Surveillance côté client
-- resources/anti-vdm/client.lua local lastCollision = 0 local COLLISION_COOLDOWN = 5000 -- 5 secondes Citizen.CreateThread(function() while true do Citizen.Wait(0) local playerPed = PlayerPedId() if IsPedInAnyVehicle(playerPed, false) then local vehicle = GetVehiclePedIsIn(playerPed, false) if GetPedInVehicleSeat(vehicle, -1) == playerPed then if HasEntityCollidedWithAnything(vehicle) then local currentTime = GetGameTimer() if currentTime - lastCollision > COLLISION_COOLDOWN then local speed = GetEntitySpeed(vehicle) * 3.6 -- Convertir en km/h -- Vérifier les collisions avec des piétons local coords = GetEntityCoords(vehicle) local nearestPed = GetClosestPed(coords.x, coords.y, coords.z, 5.0, 1, 0, 0, 0, -1) si DoesEntityExist(closestPed) et IsEntityAPed(closestPed) alors local targetPlayer = NetworkGetPlayerIndexFromPed(closestPed) si targetPlayer ~= -1 alors local damage = GetEntityHealth(closestPed) TriggerServerEvent('vdm:checkCollision', GetPlayerServerId(targetPlayer), damage, speed) fin fin dernièreCollision = currentTime fin fin fin fin fin)
Configuration du serveur
Ajouts au fichier server.cfg FiveM :
# Configuration anti-VDM définir vdm_enabled true définir vdm_max_warnings 3 définir vdm_damage_threshold 50 définir vdm_speed_threshold 30 définir vdm_log_incidents true définir vdm_webhook "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE" # S'assurer que la ressource anti-vdm démarre garantir anti-vdm
Bonnes pratiques pour les administrateurs de serveur
1. Définition claire des règles
Créez des règles VDM spécifiques dans la documentation de votre serveur :
Règle 2.1 - Match à mort au véhicule (VDM) - L'utilisation de tout véhicule comme arme est interdite - Exceptions : Tactiques policières autorisées, événements sanctionnés - Sanction : 1ère infraction - Avertissement, 2ème - Bannissement de 24 heures, 3ème - Bannissement permanent
2. Protocole de formation du personnel
Former les modérateurs à identifier les VDM :
- Examiner les journaux de dommages
- Vérifiez la vitesse du joueur à l'impact
- Vérifier que le contexte du jeu de rôle existe
- Preuves documentaires (clips, captures d'écran)
3. Système de signalement des joueurs
-- Commande de rapport simple RegisterCommand('reportvdm', function(source, args, rawCommand) local targetId = tonumber(args[1]) local reason = table.concat(args, ' ', 2) if not targetId or not reason then TriggerClientEvent('chat:addMessage', source, { args = {'^1[ERROR]', 'Usage: /reportvdm [player_id] [reason]'} }) return end -- Créer un ticket de rapport local report = { reporter = GetPlayerName(source), reported = GetPlayerName(targetId), reason = reason, timestamp = os.date('%Y-%m-%d %H:%M:%S'), status = 'pending' } -- Stocker dans la base de données ou envoyer sur Discord TriggerEvent('vdm:createReport', rapport) fin, faux)
Défis courants de mise en œuvre
Faux positifs
- Détection de collision induite par le décalage
- Désynchronisation entre les joueurs
- Accidents légitimes
Solution:Implémenter les périodes de grâce et la vérification du contexte :
-- Vérifier si les joueurs sont dans un scénario actif fonction locale isInActiveRP(playerId) -- Vérifier la base de données pour les scénarios actifs -- Renvoyer vrai si le joueur est dans une poursuite policière, une course, etc. fin
Impact sur les performances
Surveiller l'utilisation des ressources du script :
-- Ajouter à fxmanifest.lua resource_monitor_mode 'yes'
Intégration avec les frameworks populaires
Cadre ESX
ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) -- Ajouter les violations VDM à l'enregistrement du joueur RegisterServerEvent('vdm:recordViolation') AddEventHandler('vdm:recordViolation', function(targetId) local xPlayer = ESX.GetPlayerFromId(source) MySQL.Async.execute('INSERT INTO vdm_violations SET identifier = @identifier, timestamp = @timestamp', { ['@identifier'] = xPlayer.identifier, ['@timestamp'] = os.time() }) end)
Cadre QBCore
local QBCore = exports['qb-core']:GetCoreObject() -- Intégration avec le menu d'administration QBCore.Commands.Add('checkvdm', 'Vérifier l'historique VDM du joueur', {{name = 'id', help = 'ID du joueur'}}, true, function(source, args) local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) if Player then -- Récupérer l'historique VDM MySQL.Async.fetchAll('SELECT * FROM vdm_logs WHERE citizenid = @citizenid', { ['@citizenid'] = Player.PlayerData.citizenid }, function(result) TriggerClientEvent('qb-admin:client:showVDMHistory', source, result) end) end end, 'admin')
Tester votre système anti-VDM
Suite de tests automatisés
-- tests/vdm_test.lua fonction locale testVDMDetection() -- Simuler un événement de collision local mockData = { attacker = 1, victim = 2, damage = 75, speed = 45 } TriggerEvent('vdm:checkCollision', mockData.victim, mockData.damage, mockData.speed) -- Vérifier que l'avertissement a été émis -- Vérifier si le journal a été créé -- Confirmer que le webhook a été déclenché fin
Indicateurs de performance
Efficacité du système de suivi :
-- Schéma de base de données CREATE TABLE vdm_metrics ( id INT AUTO_INCREMENT PRIMARY KEY, date DATE, total_incidents INT, avertissements_émis INT, joueurs_expulsés INT, faux_positifs INT );
Conclusion
La prévention VDM nécessite une mise en œuvre technique, des règles claires et une application cohérente pour maintenir des environnements de jeu de rôle de qualité sur les serveurs FiveM.






