System terytoriów gangów FiveM: Skryptowanie wojen o strefy
Zbuduj działający system terytoriów gangów w FiveM. Strefy, przejęcia, nagrody, powiązania z kontrolą narkotyków i najlepsze skrypty gangów do głębokich wojen roleplay.
Agency Scripts
Założyciel i główny deweloper w Agency Scripts
Projektowanie systemu terytoriów
Systemy terytoriów gangów to jedna z najbardziej angażujących mechanik, jakie możesz dodać do serwera FiveM roleplay, ponieważ dają organizacjom przestępczym realny powód do rywalizacji, współpracy i inwestowania w rozwój swojej frakcji. W swojej istocie system terytoriów dzieli mapę na strefy, które gangi mogą przejmować i kontrolować, zapewniając kontrolującemu gangowi określone korzyści w ich granicach. Decyzje projektowe, które tutaj podejmiesz, kształtują całe doświadczenie przestępczego roleplayu na twoim serwerze. Musisz przemyśleć, ile stref stworzyć, jak duże powinny być, jakie korzyści daje kontrola nad strefą, jak często strefy mogą być przejmowane oraz co się stanie, gdy gang straci całe swoje terytorium. Zbyt mała liczba stref sprawia, że tylko największe gangi mogą brać w tym udział, natomiast zbyt duża rozprasza konflikt i sprawia, że pojedyncze terytoria tracą na znaczeniu. Zrównoważonym podejściem jest stworzenie 15-25 stref w miejscach, które już mają znaczenie dla przestępczego roleplayu, takich jak punkty sprzedaży narkotyków, dzielnice magazynowe i osiedla komunalne.
Struktura danych terytoriów
Warstwa danych musi śledzić przynależność stref, stan przejęcia oraz korzyści przypisane do każdego terytorium. Przechowuj definicje terytoriów w pliku konfiguracyjnym, a dane o właścicielach w bazie danych, dzięki czemu układy stref można modyfikować bez ingerencji w dane trwałe. Każda strefa wymaga unikalnego identyfikatora, współrzędnych granic definiujących jej obszar, aktualnego właściciela oraz znacznika czasu ostatniego przejęcia. Granice oparte na wielokątach zapewniają precyzyjną kontrolę nad kształtami stref, które naturalnie pokrywają się z ulicami i punktami orientacyjnymi, chociaż proste strefy oparte na promieniu są łatwiejsze w implementacji i bardziej wydajne:
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
);
]]
Rozważ dodanie capture_count kolumna śledząca, ile razy strefa zmieniła właściciela, co możesz wykorzystać do analityki oraz identyfikacji zbyt zażarcie spornych stref, co może wskazywać na potrzebę dostosowania czasu odnowienia lub trudności przejęcia dla tych obszarów.
Mechanika przejmowania
Mechanika przejmowania to pętla rozgrywki napędzająca cały system terytoriów. Gdy rywalizujący gang wkracza na terytorium i rozpoczyna próbę przejęcia, rusza timer, podczas którego napastnicy muszą przetrwać do końca, a gang broniący otrzymuje alerty i może zareagować. Najbardziej angażujące systemy przejmowania wymagają od gangu atakującego utrzymania minimalnej liczby członków w strefie przez cały czas trwania przejęcia, co tworzy naturalne punkty konfrontacji. Jeśli liczba napastników spadnie poniżej progu, postęp przejmowania zatrzymuje się lub zaczyna spadać. Oto implementacja kluczowej logiki przejmowania po stronie serwera:
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)
Uruchom wątek po stronie serwera, który wykonuje cykl co kilka sekund, aby aktualizować postęp przejmowania, sprawdzając, czy zachowana jest minimalna liczba atakujących i czy nie doszło do naruszenia czasu odnowienia. Po zakończeniu przejmowania zaktualizuj bazę danych, powiadom odpowiednich graczy i zastosuj nową własność na całym serwerze. Roześlij informację o zmianie terytorium do wszystkich połączonych klientów, aby mogli zaktualizować swoje blipy na mapie w czasie rzeczywistym.
Blipy na mapie i wizualne informacje zwrotne
Blipy terytoriów na minimapie i mapie menu pauzy są kluczowe, aby pokazać graczom, które obszary są kontrolowane przez poszczególne gangi. Każde terytorium powinno wyświetlać kolorowy blip zgodny z kolorem gangu będącego właścicielem, podczas gdy terytoria niczyje powinny być neutralnie szare lub białe. Kiedy trwa przejmowanie, blip powinien migać lub zmienić kolor na sporny, aby przyciągnąć uwagę graczy na całym serwerze. Użyj AddBlipForRadius dla stref terytorialnych, ponieważ tworzy na mapie okrągłą nakładkę obszaru, która jasno komunikuje granice strefy:
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
Poza blipami na mapie rozważ dodanie wizualnych wskaźników w świecie gry, takich jak kolorowy dym, rekwizyty graffiti czy flagi gangów, które pojawiają się w kluczowych punktach terytorium po jego przejęciu. Te elementy otoczenia zanurzają graczy w narracji wojen gangów i sprawiają, że granice terytorium stają się namacalne nawet wtedy, gdy minimapa nie jest widoczna. Możesz użyć CreateObject native do spawnowania rekwizytów przypisanych do gangu w określonych lokalizacjach w każdej strefie.
Perki i nagrody dla gangów
Bonusy za terytoria to to, co motywuje gangi do walki i obrony swojej strefy. Bez sensownych nagród kontrola nad terytorium staje się ciekawostką, z którą gracze wchodzą w interakcję raz, a potem ją ignorują. Najlepsze bonusy zapewniają przewagi ekonomiczne i strategiczne, które kumulują się, gdy gang kontroluje więcej terytoriów. Bonusy ekonomiczne mogą obejmować procentowy wzrost zysków ze sprzedaży narkotyków w strefie, dostęp do ekskluzywnych handlarzy na czarnym rynku, niższe ceny w sklepach powiązanych z gangiem lub generowanie pasywnego dochodu, który regularnie trafia na wspólne konto bankowe gangu. Bonusy strategiczne mogą obejmować krótszy czas odradzania się na terytorium, zmniejszone generowanie powiadomień dla policji za przestępstwa popełnione w strefie, dostęp do ukrytych schowków na broń i narkotyki lub możliwość rozstawiania pułapek i struktur obronnych specyficznych dla gangu. Wdrażaj bonusy jako weryfikacje server-side, które aktywują się, gdy gracz z odpowiednią przynależnością do gangu wykonuje akcję na terytorium należącym do jego gangu. Dbaj o modułowość systemu bonusów, aby łatwo dodawać nowe bonusy lub modyfikować istniejące na podstawie opinii graczy, bez przebudowywania całej bazy kodu.
Wydarzenia i harmonogram wojen o terytorium
Ustrukturyzowane wydarzenia wojen o terytoria wprowadzają zaplanowany element rywalizacji do systemu stref, zapobiegając ciągłym, drobnym potyczkom, które mogą być wyczerpujące dla graczy. Zamiast pozwalać na przejęcia o dowolnej porze, możesz ograniczyć bitwy o terytoria do określonych okien czasowych, takich jak piątkowe i sobotnie wieczory, tworząc wyczekiwane wydarzenia, które gracze planują i na które stawiają się w pełnym składzie. Alternatywnie wdróż system wypowiadania wojny, w którym gang musi formalnie wypowiedzieć wojnę innemu gangowi poprzez mechanikę w grze, co uruchamia 30-minutowy okres przygotowawczy przed otwarciem walki o terytoria. Daje to broniącemu się gangowi czas na zebranie członków i przygotowanie obrony, co prowadzi do większych i bardziej widowiskowych starć. Śledź statystyki wojenne, takie jak zabójstwa, zgony, zdobyte i utracone terytoria oraz zadane obrażenia, a następnie ogłaszaj wyniki na całym serwerze po zakończeniu okresu wojny. Tabela wyników lub system historii wojen, który gracze mogą przeglądać, dodaje element rywalizacji rankingowej, utrzymując zaangażowanie gangów pomiędzy aktywnymi okresami wojen i tworząc historie, które stają się częścią dziejów serwera.
Środki anti-exploit
Systemy terytoriów są głównym celem exploitów, ponieważ bezpośrednio wpływają na ekonomię w grze i układ sił. Najczęstszym exploitem jest przejmowanie zombie (zombie capturing), gdzie członek gangu loguje się w godzinach niskiej frekwencji, aby po cichu przejąć terytoria bez oporu. Zapobiegaj temu, wymagając minimalnej liczby graczy na serwerze przed rozpoczęciem przejmowania oraz wysyłając powiadomienia webhook na Discordzie przy każdym starcie przejęcia, aby obrońcy mogli zareagować, nawet jeśli nie ma ich w grze. Inny exploit polega na szybkiej zmianie przynależności gangowej w celu przejmowania stref dla wielu grup. Wprowadź cooldown na zmianę gangu wynoszący co najmniej 24 rzeczywiste godziny i natychmiast odbieraj wszelkie uprawnienia terytorialne po opuszczeniu gangu. Ograniczaj częstotliwość prób przejęcia na gang (rate limit), aby zapobiec spamowaniu rozpoczęciem przejmowania jako taktyce griefingu. Od strony technicznej weryfikuj wszystkie interakcje z terytorium server-side, nigdy nie ufaj klientowi w kwestii zgłaszania, czy gracz znajduje się w granicach strefy, i używaj server-side kontroli pozycji z GetEntityCoords(GetPlayerPed(src)) aby weryfikować pozycje graczy podczas ticków przejmowania. Rejestruj każdą próbę przejęcia, sukces i porażkę ze znacznikami czasu oraz identyfikatorami graczy, aby badać podejrzane schematy i podejmować działania przeciwko exploiterom na podstawie jednoznacznych dowodów.
Integracja z innymi systemami
System terytoriów osiąga pełny potencjał, gdy łączy się z innymi systemami rozgrywki na twoim serwerze. Połącz terytoria z systemem sprzedaży narkotyków, aby kontrolowanie strefy narkotykowej zwiększało ceny sprzedaży lub zmniejszało ryzyko ingerencji NPC. Połącz go z systemem housing, aby terytoria kontrolowane przez gangi oferowały niższe podatki od nieruchomości lub ekskluzywne meliny (safe houses). Zintegruj go z systemem policji, sprawiając, by terytoria wpływały na priorytet dispatch, gdzie przestępstwa na terenach gangów mogą generować opóźnione lub zredukowane alerty policyjne, symulując rzeczywiste trudności w patrolowaniu kontrolowanych przez gangi dzielnic. Przekazuj dane o terytoriach do telefonu lub systemu powiadomień, aby liderzy gangów mogli sprawdzać status terytorium, przeglądać historię przejęć i koordynować obronę z dowolnego miejsca na mapie. Jeśli twój serwer posiada system progresji lub reputacji, powiąż kontrolę terytorium ze wzrostem reputacji gangu, co odblokowuje aktywności i ekwipunek wyższego poziomu. Im więcej systemów odwołuje się do własności terytoriów, tym bardziej wpływowa i angażująca staje się mechanika, przekształcając się z samodzielnej minigry w główny filar przestępczego ekosystemu roleplay na twoim serwerze.