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 de jeu de rôle 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
if not targetId or not damage or not speed then return end
-- Vérifier si les dégâts et la vitesse dépassent les seuils
if damage > DAMAGE_THRESHOLD and speed > 30 then
local identifier = GetPlayerIdentifier(source, 0)
-- Initialiser le compteur d'avertissements
if not vdmWarnings[identifier] then
vdmWarnings[identifier] = 0
end
vdmWarnings[identifier] = vdmWarnings[identifier] + 1
-- Enregistrer l'incident
local logData = {
attacker = GetPlayerName(source),
victim = GetPlayerName(targetId),
damage = damage,
speed = speed,
timestamp = os.time()
}
TriggerEvent('vdm:logIncident', logData)
-- Agir en fonction des avertissements
if vdmWarnings[identifier] >= VDM_THRESHOLD then
DropPlayer(source, 'Expulsé pour violations VDM')
vdmWarnings[identifier] = 0
else
TriggerClientEvent('chat:addMessage', source, {
args = {'^1[WARNING]', '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 la collision avec un piéton
local coords = GetEntityCoords(vehicle)
local closestPed = GetClosestPed(coords.x, coords.y, coords.z,
5.0, 1, 0, 0, 0, -1)
if DoesEntityExist(closestPed) and IsEntityAPed(closestPed) then
local targetPlayer = NetworkGetPlayerIndexFromPed(closestPed)
if targetPlayer ~= -1 then
local damage = GetEntityHealth(closestPed)
TriggerServerEvent('vdm:checkCollision',
GetPlayerServerId(targetPlayer),
damage, speed)
end
end
lastCollision = currentTime
end
end
end
end
end
end)
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
-- Simple reporting command
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
-- Create report ticket
local report = {
reporter = GetPlayerName(source),
reported = GetPlayerName(targetId),
reason = reason,
timestamp = os.date('%Y-%m-%d %H:%M:%S'),
status = 'pending'
}
-- Store in database or send to Discord
TriggerEvent('vdm:createReport', report)
end, false)
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 local function isInActiveRP(playerId) -- Vérifier la base de données pour les scénarios actifs -- Retourner vrai si le joueur est dans une poursuite policière, une course, etc. end
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 au dossier 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 admin
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
local function 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é
end
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, warnings_issued INT, players_kicked INT, false_positives 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.