Spare 20 % mit WELCOMEAngebote ansehen
fivem vdm

Was ist VDM (FiveM)? Definition & Prävention

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.

Schreibe einen Kommentar