FiveM-Gebietssystem für Gangs: Revierkämpfe skripten
Erstelle ein funktionierendes Gebietssystem für Gangs in FiveM. Zonen, Eroberungen, Belohnungen, Drogenhandel und beliebte Skripte für intensive Revierkämpfe.
Agency Scripts
Gründer und leitender Entwickler bei Agency Scripts
Ein Gebietssystem gestalten
Gebietssysteme für Gangs gehören zu den spannendsten Mechaniken, die du einem FiveM-Roleplay-Server hinzufügen kannst. Sie bieten kriminellen Organisationen einen konkreten Grund, miteinander zu konkurrieren, zusammenzuarbeiten und in das Wachstum ihrer Fraktion zu investieren. Ein Gebietssystem unterteilt die Karte in Zonen, die Gangs beanspruchen und kontrollieren können. Dafür erhält die Gang, der das Gebiet gehört, bestimmte Vorteile innerhalb seiner Grenzen. Die Entscheidungen, die du hier triffst, prägen das gesamte kriminelle Roleplay-Erlebnis auf deinem Server. Überlege dir, wie viele Zonen du erstellen willst, wie groß die einzelnen Zonen sein sollen, welche Vorteile die Kontrolle einer Zone bietet, wie oft Gebiete umkämpft werden können und was passiert, wenn eine Gang ihr gesamtes Gebiet verliert. Bei zu wenigen Zonen können sich nur die größten Gangs beteiligen. Zu viele Zonen verteilen die Konflikte dagegen zu stark und machen einzelne Gebiete bedeutungslos. Ein ausgewogener Ansatz sind 15-25 Zonen in Bereichen, die bereits für kriminelles Roleplay relevant sind, etwa an Orten für den Drogenverkauf, in Lagerhausvierteln und in Wohngebieten mit niedrigen Einkommen.
Datenstruktur für Gebiete
Die Datenschicht muss Gebietseigentümer, Eroberungsstatus und die mit jedem Gebiet verbundenen Vorteile erfassen. Speichere die Gebietskonfigurationen in einer Konfigurationsdatei und die Eigentümerdaten in der Datenbank, damit du Zonenlayouts ändern kannst, ohne persistente Daten anzufassen. Jede Zone benötigt eine eindeutige Kennung, Grenzkoordinaten zur Definition ihres Bereichs, den aktuellen Besitzer und einen Zeitstempel der letzten Eroberung. Mit polygonbasierten Grenzen kannst du Zonen präzise entlang von Straßen und markanten Orten formen. Einfache Zonen mit festem Radius sind jedoch leichter zu implementieren und performanter:
Config.Territories = {
['grove_street'] = {
label = 'Grove Street',
center = vector3(105.5, -1942.5, 20.8),
radius = 150.0, -- Simple radius approach
blip = { sprite = 543, scale = 1.2 },
perks = { 'drug_selling_boost', 'reduced_police_alert' },
captureTime = 300, -- Seconds to capture
cooldown = 3600, -- Seconds before re-capture
},
['ballas_territory'] = {
label = 'Forum Drive',
center = vector3(78.0, -1812.0, 29.0),
radius = 120.0,
blip = { sprite = 543, scale = 1.0 },
perks = { 'weapon_discount', 'safe_stash' },
captureTime = 300,
cooldown = 3600,
},
}
-- Database table for ownership
--[[
CREATE TABLE IF NOT EXISTS gang_territories (
zone_id VARCHAR(50) PRIMARY KEY,
owner_gang VARCHAR(50) DEFAULT NULL,
captured_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
capture_count INT DEFAULT 0,
last_war_at TIMESTAMP DEFAULT NULL
);
]]
Ergänze eine capture_count Spalte, die erfasst, wie oft ein Gebiet den Besitzer gewechselt hat. Diese Daten kannst du für Analysen nutzen und damit besonders hart umkämpfte Zonen ermitteln. So kannst du bei Bedarf den Cooldown-Timer oder den Schwierigkeitsgrad der Eroberung für bestimmte Bereiche anpassen.
Eroberungsmechanik
Die Eroberungsmechanik ist der Gameplay-Kreislauf, der das gesamte Gebietssystem antreibt. Wenn eine rivalisierende Gang ein Gebiet betritt und einen Eroberungsversuch startet, beginnt ein Timer. Die Angreifer müssen bis zum Ablauf durchhalten, während die verteidigende Gang eine Benachrichtigung erhält und reagieren kann. Besonders spannende Eroberungssysteme verlangen, dass die angreifende Gang während der gesamten Eroberungsdauer eine Mindestanzahl von Mitgliedern in der Zone hält. So entstehen natürliche Schauplätze für Konfrontationen. Sinkt die Zahl der Angreifer unter den Schwellenwert, pausiert der Eroberungsfortschritt oder beginnt zu verfallen. Hier ist eine serverseitige Implementierung der grundlegenden Eroberungslogik:
local activeCaptures = {}
RegisterNetEvent('territory:server:startCapture', function(zoneId)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local gang = Player.PlayerData.gang.name
if gang == 'none' then return end
local zone = Config.Territories[zoneId]
if not zone then return end
-- Check cooldown
local territory = MySQL.query.await(
'SELECT * FROM gang_territories WHERE zone_id = ?', {zoneId}
)
if territory and territory[1] then
local lastWar = territory[1].last_war_at
if lastWar and (os.time() - lastWar) < zone.cooldown then
TriggerClientEvent('QBCore:Notify', src, 'Territory on cooldown', 'error')
return
end
if territory[1].owner_gang == gang then
TriggerClientEvent('QBCore:Notify', src, 'You already own this', 'error')
return
end
end
-- Check minimum gang members in zone
local membersInZone = GetGangMembersInZone(gang, zoneId)
if #membersInZone < Config.MinCaptureMembers then
TriggerClientEvent('QBCore:Notify', src,
'Need ' .. Config.MinCaptureMembers .. ' members in zone', 'error')
return
end
activeCaptures[zoneId] = {
attackingGang = gang,
startTime = os.time(),
progress = 0,
}
-- Alert defending gang
local defender = territory and territory[1] and territory[1].owner_gang
if defender then
AlertGangMembers(defender, 'Your territory is under attack: ' .. zone.label)
end
TriggerClientEvent('territory:client:captureStarted', -1, zoneId, gang)
end)
Führe einen serverseitigen Thread aus, der alle paar Sekunden den Eroberungsfortschritt aktualisiert und prüft, ob die Mindestanzahl an Angreifern eingehalten wird und keine Cooldown-Regeln verletzt wurden. Sobald die Eroberung abgeschlossen ist, aktualisiere die Datenbank, benachrichtige alle relevanten Spieler und wende den neuen Besitz serverweit an. Übertrage die Gebietsänderung an alle verbundenen Clients, damit sie ihre Karten-Blips in Echtzeit aktualisieren können.
Karten-Blips und visuelles Feedback
Gebiets-Blips auf der Minikarte und der Kartenansicht im Pausenmenü sind unverzichtbar, damit Spieler sehen, welche Bereiche von welchen Gangs kontrolliert werden. Jedes Gebiet sollte einen farbigen Blip anzeigen, der zur Farbe der besitzenden Gang passt. Gebiete ohne Besitzer sollten neutral grau oder weiß dargestellt werden. Läuft gerade eine Eroberung, sollte der Blip blinken oder zu einer umkämpften Farbe wechseln, um Spieler auf dem gesamten Server darauf aufmerksam zu machen. Verwende AddBlipForRadius für Gebietsbereiche, da damit eine kreisförmige Überlagerung auf der Karte angezeigt wird, die die Grenzen des Gebiets klar darstellt:
function CreateTerritoryBlip(zoneId, data, ownerGang)
local zone = Config.Territories[zoneId]
if not zone then return end
-- Remove existing blip if any
if territoryBlips[zoneId] then
RemoveBlip(territoryBlips[zoneId].radius)
RemoveBlip(territoryBlips[zoneId].icon)
end
-- Radius blip for territory area
local radiusBlip = AddBlipForRadius(
zone.center.x, zone.center.y, zone.center.z, zone.radius
)
local gangColor = GetGangBlipColor(ownerGang) -- Returns blip color ID
SetBlipColour(radiusBlip, gangColor)
SetBlipAlpha(radiusBlip, 80)
-- Center icon blip
local iconBlip = AddBlipForCoord(zone.center.x, zone.center.y, zone.center.z)
SetBlipSprite(iconBlip, zone.blip.sprite)
SetBlipScale(iconBlip, zone.blip.scale)
SetBlipColour(iconBlip, gangColor)
SetBlipAsShortRange(iconBlip, true)
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName(zone.label .. ' [' .. (ownerGang or 'Unclaimed') .. ']')
EndTextCommandSetBlipName(iconBlip)
territoryBlips[zoneId] = { radius = radiusBlip, icon = iconBlip }
end
Zusätzlich zu Karten-Blips kannst du visuelle Hinweise in der Spielwelt hinzufügen, zum Beispiel farbigen Rauch, Graffiti-Objekte oder Gang-Flaggen, die nach einer Eroberung an wichtigen Punkten innerhalb eines Gebiets erscheinen. Diese Umgebungsdetails lassen Spieler tiefer in die Geschichte der Gangkriege eintauchen und machen Gebietsgrenzen greifbar, auch wenn die Minikarte nicht sichtbar ist. Du kannst den CreateObject nativ verwenden, um gangspezifische Objekte an vordefinierten Positionen innerhalb jeder Zone zu platzieren.
Gang-Vorteile und Belohnungen
Gebietsvorteile motivieren Gangs dazu, ihr Revier zu erobern und zu verteidigen. Ohne sinnvolle Belohnungen wird die Gebietskontrolle zu einer Neuheit, mit der sich Spieler einmal beschäftigen und die sie anschließend ignorieren. Die besten Vorteile bieten wirtschaftliche und strategische Boni, die sich summieren, wenn eine Gang mehr Gebiete kontrolliert. Zu den wirtschaftlichen Vorteilen können höhere Drogeneinnahmen in der Zone, Zugang zu exklusiven Schwarzmarkthändlern, niedrigere Preise in Gang-Geschäften oder passive Einnahmen gehören, die regelmäßig auf das gemeinsame Bankkonto der Gang eingezahlt werden. Strategische Vorteile könnten kürzere Respawn-Zeiten im Gebiet, weniger Polizeialarme bei Straftaten in der Zone, Zugang zu versteckten Lagerplätzen für Waffen und Drogen oder die Möglichkeit umfassen, gangspezifische Fallen und Verteidigungsanlagen aufzustellen. Implementiere Vorteile als serverseitige Prüfungen, die aktiviert werden, wenn ein Spieler mit der richtigen Gangzugehörigkeit innerhalb eines Gebiets, das seiner Gang gehört, eine Aktion ausführt. Halte das Vorteilssystem modular, damit du neue Vorteile einfach hinzufügen oder bestehende anhand von Spielerfeedback anpassen kannst, ohne die gesamte Codebasis umzustrukturieren.
Revierkriege und Zeitplanung
Strukturierte Revierkriege bringen ein zeitlich geplantes Wettbewerbselement ins Gebietssystem und verhindern ständige kleinere Scharmützel, die für Spieler anstrengend werden können. Anstatt Eroberungen jederzeit zuzulassen, kannst du Gebietskämpfe auf bestimmte Zeitfenster beschränken, etwa Freitag- und Samstagabende. So entstehen erwartete Events, auf die sich Spieler vorbereiten und für die sie ihre gesamte Gang zusammenrufen. Alternativ kannst du ein System zur Kriegserklärung implementieren, bei dem eine Gang einer anderen Gang über eine Spielmechanik offiziell den Krieg erklären muss. Darauf folgt eine Vorbereitungszeit von 30-Minuten, bevor Gebiete angegriffen werden können. Dadurch erhält die verteidigende Gang Zeit, ihre Mitglieder zusammenzurufen und die Verteidigung vorzubereiten. Das führt zu größeren und dramatischeren Kämpfen. Erfasse Kriegsstatistiken wie Abschüsse, Tode, gewonnene und verlorene Gebiete sowie verursachten Schaden. Kündige die Ergebnisse anschließend serverweit an, wenn der Kriegszeitraum endet. Eine Rangliste oder ein Kriegsverlauf, den Spieler einsehen können, sorgt für Wettbewerb zwischen den Gangs, auch außerhalb aktiver Kriegszeiten, und schafft Geschichten, die Teil der Serverhistorie werden.
Maßnahmen gegen Exploits
Gebietssysteme sind besonders anfällig für Exploits, da sie sich direkt auf die Spielwirtschaft und die Machtverhältnisse auswirken. Der häufigste Exploit ist das heimliche Erobern: Ein Gangmitglied loggt sich zu einer Zeit mit wenigen Spielern ein und nimmt unbemerkt Gebiete ein, ohne auf Widerstand zu treffen. Verhindere das, indem du eine Mindestspielerzahl auf dem Server voraussetzt, bevor Eroberungen gestartet werden können. Sende außerdem Discord-Webhook-Benachrichtigungen, sobald eine Eroberung beginnt, damit Verteidiger reagieren können, auch wenn sie gerade nicht online sind. Ein weiterer Exploit besteht darin, die Gangzugehörigkeit schnell zu wechseln, um Gebiete für mehrere Gruppen zu erobern. Erzwinge eine Abklingzeit von mindestens 24 realen Stunden beim Gangwechsel und entziehe beim Verlassen einer Gang sofort alle gebietsbezogenen Berechtigungen. Begrenze die Anzahl der Eroberungsversuche pro Gang, um zu verhindern, dass Versuche als Störaktion wiederholt gestartet werden. Prüfe technisch alle Interaktionen mit Gebieten serverseitig. Vertraue niemals darauf, dass der Client meldet, ob sich ein Spieler innerhalb einer Zonengrenze befindet. Verwende stattdessen serverseitige Positionsprüfungen mit GetEntityCoords(GetPlayerPed(src)) um den Standort der Spieler während der Eroberungs-Ticks zu überprüfen. Protokolliere jeden Eroberungsversuch sowie jeden Erfolg und Fehlschlag mit Zeitstempel und Spielerkennungen, damit du verdächtige Muster untersuchen und mit eindeutigen Belegen gegen Exploiter vorgehen kannst.
Integration mit anderen Systemen
Ein Gebietssystem entfaltet sein volles Potenzial, wenn es mit anderen Gameplay-Systemen auf deinem Server verbunden ist. Verknüpfe Gebiete mit deinem Drogenhandelssystem, sodass die Kontrolle über ein Drogensperrgebiet die Verkaufspreise erhöht oder das Risiko einer Einmischung durch NPCs senkt. Verbinde es mit deinem Housing-System, damit Ganggebiete niedrigere Grundsteuern oder exklusive sichere Häuser bieten. Integriere es in dein Polizeisystem, indem Gebiete die Priorität von Einsätzen beeinflussen. Straftaten in von Gangs kontrollierten Gebieten könnten beispielsweise zu verzögerten oder weniger dringenden Polizeialarmen führen und so die tatsächliche Herausforderung simulieren, gangkontrollierte Viertel zu überwachen. Binde Gebietsdaten in dein Telefon- oder Benachrichtigungssystem ein, damit Gang-Anführer den Gebietsstatus prüfen, den Eroberungsverlauf ansehen und von überall auf der Karte die Verteidigung koordinieren können. Wenn dein Server über ein Fortschritts- oder Reputationssystem verfügt, verknüpfe die Gebietskontrolle mit Reputationsgewinnen für Gangs, durch die Aktivitäten und Ausrüstung höherer Stufen freigeschaltet werden. Je mehr Systeme den Gebietsbesitz berücksichtigen, desto wirkungsvoller und mitreißender wird diese Mechanik. So wird aus einem eigenständigen Minispiel ein zentraler Bestandteil des kriminellen Roleplay-Ökosystems deines Servers.