Was ist VDM?
Vehicle Deathmatch (VDM) bezeichnet den Einsatz eines Fahrzeugs als Waffe, um andere Spieler ohne entsprechende Rollenspielbegründung absichtlich zu rammen, zu töten oder zu verletzen. Auf FiveM-Rollenspielservern verstößt VDM gegen grundlegende Serverregeln und stört das Rollenspielerlebnis, das die Spieler suchen.
Warum VDM wichtig ist
Rollenspielserver basieren auf dem Prinzip realistischer Interaktion. Wenn ein Spieler sein Fahrzeug absichtlich in andere Fahrzeuge rammt, ohne dass ein Rollenspielkontext vorliegt, geschieht Folgendes:
- Unterbricht die Immersion aller Teilnehmer
- Verhindert eine sinnvolle Entwicklung der Geschichte
- Schafft unfaire Spielvorteile
- Führt zu Frustration bei den Spielern und einem Rückgang der Serverpopulation
Gängige VDM-Szenarien
Klare VDM-Verstöße:
- Auf Gehwege fahren und Fußgänger anfahren
- Rammen stehender Fahrzeuge an einer Ampel
- Einsatz von Fahrzeugen zur Blockierung von Krankenhauseingängen
- Vorsätzliches Herbeiführen von Frontalkollisionen
Grauzonen, die Kontext erfordern:
- Boxenmanöver der Polizei bei Verfolgungsjagden
- Bandenbezogene Fahrzeugangriffe mit vorherigem Rollenspiel
- Zufällige Kollisionen während des Rennens
- Einsätze von Einsatzfahrzeugen
Technische Umsetzung: Anti-VDM-Systeme
Serverseitiges Erkennungsskript
-- 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
-- Eingabe validieren
if not targetId or not damage or not speed then return end
-- Prüfen, ob Schaden und Geschwindigkeit die Schwellenwerte überschreiten
if damage > DAMAGE_THRESHOLD and speed > 30 then
local identifier = GetPlayerIdentifier(source, 0)
-- Warnungszähler initialisieren
if not vdmWarnings[identifier] then
vdmWarnings[identifier] = 0
end
vdmWarnings[identifier] = vdmWarnings[identifier] + 1
-- Vorfall protokollieren
local logData = {
attacker = GetPlayerName(source),
victim = GetPlayerName(targetId),
damage = damage,
speed = speed,
timestamp = os.time()
}
TriggerEvent('vdm:logIncident', logData)
-- Maßnahmen basierend auf Warnungen ergreifen
if vdmWarnings[identifier] >= VDM_THRESHOLD then
DropPlayer(source, 'Wegen VDM-Verstößen gekickt')
vdmWarnings[identifier] = 0
else
TriggerClientEvent('chat:addMessage', source, {
args = {'^1[WARNING]', 'VDM erkannt. Warnung ' ..
vdmWarnings[identifier] .. '/' .. VDM_THRESHOLD}
})
end
end
end)
Clientseitige Überwachung
-- resources/anti-vdm/client.lua
local lastCollision = 0
local COLLISION_COOLDOWN = 5000 -- 5 Sekunden
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 -- In km/h umrechnen
-- Auf Kollision mit Fußgänger prüfen
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)
Serverkonfiguration
Ergänzungen zu FiveM server.cfg:
# Anti-VDM-Konfiguration setze vdm_enabled true setze vdm_max_warnings 3 setze vdm_damage_threshold 50 setze vdm_speed_threshold 30 setze vdm_log_incidents true setze vdm_webhook "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE" # Stelle sicher, dass die Anti-VDM-Ressource startet, sichere Anti-VDM
Best Practices für Serveradministratoren
1. Klare Regeldefinition
Erstelle spezifische VDM-Regeln in deiner Serverdokumentation:
Regel 2.1 – Vehicle Deathmatch (VDM) – Die Verwendung von Fahrzeugen als Waffe ist verboten – Ausnahmen: Autorisierte Polizeitaktiken, genehmigte Veranstaltungen – Strafe: 1. Verstoß – Verwarnung, 2. – 24-Stunden-Verbot, 3. – Dauerhaftes Verbot
2. Schulungsprotokoll für Mitarbeiter
Schule Moderatoren, um VDM zu erkennen:
- Überprüfe die Schadensprotokolle
- Überprüfe die Geschwindigkeit des Spielers beim Aufprall
- Überprüfen, ob ein Rollenspielkontext vorhanden ist
- Dokumentbeweise (Clips, Screenshots)
3. Spielermeldesystem
-- 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)
Häufige Herausforderungen bei der Implementierung
Falsch-Positive
- Durch Verzögerung verursachte Kollisionserkennung
- Desynchronisierung zwischen Spielern
- Legitime Unfälle
Lösung: Implementiere Gnadenfristen und Kontextprüfungen:
-- Prüfen, ob Spieler in aktivem Szenario sind local function isInActiveRP(playerId) -- Datenbank auf aktive Szenarien prüfen -- Gib true zurück, wenn Spieler in Verfolgungsjagd, Rennen usw. ist end
Auswirkungen auf die Leistung
Überwache die Ressourcennutzung des Skripts:
-- Zu fxmanifest.lua resource_monitor_mode 'yes' hinzufügen
Integration mit gängigen Frameworks
ESX-Framework
ESX = nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
-- VDM-Verstöße zum Spielerprotokoll hinzufügen
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)
QBCore-Rahmenwerk
local QBCore = exports['qb-core']:GetCoreObject()
-- Integration mit Admin-Menü
QBCore.Commands.Add('checkvdm', 'Spieler-VDM-Verlauf prüfen', {{name = 'id', help = 'Spieler-ID'}}, true, function(source, args)
local Player = QBCore.Functions.GetPlayer(tonumber(args[1]))
if Player then
-- VDM-Verlauf abrufen
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')
Teste dein Anti-VDM-System
Automatisierte Testsuite
-- tests/vdm_test.lua
local function testVDMDetection()
-- Kollisionsereignis simulieren
local mockData = {
attacker = 1,
victim = 2,
damage = 75,
speed = 45
}
TriggerEvent('vdm:checkCollision', mockData.victim, mockData.damage, mockData.speed)
-- Prüfen, ob Warnung ausgegeben wurde
-- Prüfen, ob Protokoll erstellt wurde
-- Bestätigen, dass Webhook ausgelöst wurde
end
Leistungsmetriken
Verfolge die Systemwirksamkeit:
-- Datenbankschema CREATE TABLE vdm_metrics ( id INT AUTO_INCREMENT PRIMARY KEY, date DATE, total_incidents INT, warnings_issued INT, players_kicked INT, false_positives INT );
Abschluss
Die VDM-Prävention erfordert eine technische Implementierung, klare Regeln und eine konsequente Durchsetzung, um qualitativ hochwertige Rollenspielumgebungen auf FiveM-Servern aufrechtzuerhalten.