Система территорий банд FiveM: скриптинг войн за контроль
Создайте рабочую систему территорий банд для FiveM. Зоны, захваты, награды, связи с контролем наркотиков и лучшие скрипты банд для глубоких ролевых войн.
Agency Scripts
Основатель и ведущий разработчик Agency Scripts
Проектирование системы территорий
Системы территорий банд , одни из самых увлекательных механик, которые вы можете добавить на FiveM ролевой сервер, так как они дают криминальным организациям реальную причину конкурировать, сотрудничать и инвестировать в рост своей фракции. В основе система территорий делит карту на зоны, которые банды могут захватывать и контролировать, предоставляя владеющей банде определённые преимущества в этих границах. Принятые вами решения формируют весь криминальный ролевой опыт на вашем сервере. Нужно продумать, сколько зон создавать, какого размера должна быть каждая зона, какие преимущества дает контроль над зоной, как часто зоны могут оспариваться и что происходит, когда банда теряет всю свою территорию. Слишком мало зон означает, что участвовать могут только самые крупные банды, а слишком много зон размывает конфликт и делает отдельные территории бессмысленными. Оптимальный подход , создать 15-25 зон в местах, уже имеющих криминальное ролевое значение, таких как места продажи наркотиков, складские районы и районы с низким доходом.
Структура данных территории
Слой данных должен отслеживать владение зонами, состояние захвата и бонусы, связанные с каждой территорией. Храните определения территорий в конфигурационном файле, а данные о владении , в базе данных, чтобы можно было корректировать расположение зон без изменения постоянных данных. Каждая зона должна иметь уникальный идентификатор, координаты границ, определяющие её площадь, текущего владельца и отметку времени последнего захвата. Использование многоугольных границ даёт точный контроль над формой зон, которые естественно следуют улицам и ориентирам, хотя простые зоны на основе радиуса проще реализовать и они работают быстрее:
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
);
]]
Рассмотрите возможность добавления capture_count столбец, который отслеживает, сколько раз зона переходила из рук в руки, что можно использовать для аналитики и выявления зон с чрезмерной конкуренцией, указывая на необходимость корректировки таймера перезарядки или сложности захвата для этих конкретных областей.
Механика захвата
Механика захвата , игровой цикл, управляющий всей системой территорий. Когда враждующая банда входит на территорию и начинает попытку захвата, запускается таймер, который атакующие должны выдержать до конца, в то время как защищающаяся банда получает оповещения и может реагировать. Самые захватывающие системы захвата требуют, чтобы атакующая банда поддерживала минимальное количество членов в зоне на протяжении всего времени захвата, создавая естественные точки конфронтации. Если количество атакующих падает ниже порога, прогресс захвата приостанавливается или начинает уменьшаться. Вот серверная реализация основной логики захвата:
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)
Запускайте серверный поток, который срабатывает каждые несколько секунд для обновления прогресса захвата, проверяя, что минимальное количество атакующих поддерживается и что не было нарушений перерывов. Когда захват завершается, обновляйте базу данных, уведомляйте всех соответствующих игроков и применяйте новое владение по всему серверу. Транслируйте изменение территории всем подключённым клиентам, чтобы они могли обновить свои маркеры на карте в реальном времени.
Метки на карте и визуальная обратная связь
Отметки территорий на миникарте и карте в меню паузы необходимы для отображения игрокам, какие зоны контролируются какими бандами. Каждая территория должна показывать цветную отметку, соответствующую цвету владеющей банды, а незанятые территории , нейтральным серым или белым цветом. Во время захвата отметка должна мигать или менять цвет на спорный, чтобы привлечь внимание игроков по всему серверу. Используйте AddBlipForRadius для территориальных зон, потому что он создает круговой оверлей на карте, который четко показывает границы зоны:
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
Помимо маркеров на карте, рассмотрите возможность добавления визуальных индикаторов в мире, таких как цветной дым, граффити или флаги банд, которые появляются в ключевых точках территории при её захвате. Эти элементы окружения погружают игроков в сюжет бандитских войн и делают границы территорий ощутимыми даже при отключённой миникарте. Вы можете использовать CreateObject native для спавна пропов, специфичных для банд, в заранее определённых локациях каждой зоны.
Преимущества и награды банды
Преимущества территории мотивируют банды бороться за и защищать свои зоны. Без значимых наград контроль территории становится новинкой, с которой игроки взаимодействуют один раз, а затем игнорируют. Лучшие преимущества дают экономические и стратегические бонусы, которые накапливаются по мере контроля банды над территорией. Экономические преимущества могут включать процентный бонус к прибыли от продажи наркотиков в зоне, доступ к эксклюзивным черным рынкам, сниженные цены в магазинах, связанных с бандой, или пассивный доход, который регулярно зачисляется на общий банковский счет банды. Стратегические преимущества могут включать более быстрое возрождение в территории, снижение уровня тревоги полиции при преступлениях в зоне, доступ к скрытым тайникам для хранения оружия и наркотиков или возможность размещать специфические для банды ловушки и оборону. Реализуйте преимущества как серверные проверки, которые активируются, когда игрок с соответствующей принадлежностью к банде выполняет действие внутри территории, принадлежащей его банде. Сделайте систему преимуществ модульной, чтобы легко добавлять новые или корректировать существующие на основе отзывов игроков без перестройки всего кода.
События Turf War и планирование
Структурированные события turf war добавляют запланированный соревновательный элемент в систему территорий, предотвращая постоянные мелкие стычки, которые утомляют игроков. Вместо захватов в любое время вы можете ограничить территориальные бои определёнными временными окнами, например, вечерами пятницы и субботы, создавая ожидаемые события, к которым игроки готовятся и собирают полный состав. Альтернативно, реализуйте систему объявления войны, где банда должна официально объявить войну другой банде через игровой механизм, что запускает 30-минутный период подготовки перед тем, как территории станут оспариваемыми. Это даёт защищающейся банде время собрать участников и подготовить оборону, что приводит к более масштабным и драматичным боям. Отслеживайте статистику войны: убийства, смерти, захваченные и потерянные территории, нанесённый урон, затем объявляйте результаты на сервере по окончании периода войны. Таблица лидеров или система истории войн, которую игроки могут просматривать, добавляет соревновательный элемент ранжирования, поддерживает интерес банд между активными войнами и создаёт истории, становящиеся частью истории сервера.
Меры против эксплойтов
Системы территорий являются основными целями для эксплойтов, так как они напрямую влияют на внутриигровую экономику и баланс сил. Самый распространенный эксплойт , «зомби-захват», когда член банды заходит в игру в часы низкой активности, чтобы тихо захватить территории без сопротивления. Предотвратите это, требуя минимальное количество игроков на сервере для начала захвата, а также отправляя уведомления в Discord через webhook при начале захвата, чтобы защитники могли отреагировать, даже если они оффлайн. Другой эксплойт , частая смена принадлежности к бандами для захвата территорий для нескольких групп. Введите кулдаун на смену банды не менее 24 часов реального времени и сразу лишайте всех прав, связанных с территорией, при выходе из банды. Ограничьте количество попыток захвата на банду, чтобы предотвратить спам-запуски захватов как тактику грифа. С технической стороны, проверяйте все взаимодействия с территорией на сервере, не доверяйте клиенту в определении нахождения игрока внутри зоны и используйте серверные проверки позиции с GetEntityCoords(GetPlayerPed(src)) для проверки местоположения игроков во время захватов. Логируйте каждую попытку захвата, успех и неудачу с отметками времени и идентификаторами игроков, чтобы вы могли расследовать подозрительные паттерны и принимать меры против эксплойтеров с чёткими доказательствами.
Интеграция с другими системами
Система территорий раскрывает весь потенциал, когда интегрируется с другими игровыми системами сервера. Свяжите территории с системой продажи наркотиков, чтобы контроль над зоной увеличивал цены или снижал риск вмешательства NPC. Подключите к системе жилья, чтобы территории, контролируемые бандами, предлагали сниженные налоги или эксклюзивные безопасные дома. Интегрируйте с полицейской системой, чтобы территории влияли на приоритет вызовов, где преступления в зонах банд могли вызывать задержки или снижение уровня оповещений, имитируя реальные сложности патрулирования бандитских районов. Передавайте данные территорий в телефон или систему уведомлений, чтобы лидеры банд могли проверять статус, историю захватов и координировать оборону из любой точки карты. Если на сервере есть система прогрессии или репутации, привяжите контроль территорий к росту репутации банд, открывающей более высокоуровневые активности и экипировку. Чем больше систем ссылается на владение территориями, тем значимее и интереснее становится механика, превращая её из отдельной миниигры в центральный столп криминального RP вашего сервера.