Projetando um Sistema Territorial
Os sistemas territoriais de gangues são uma das mecânicas mais envolventes que você pode adicionar a um servidor de RPG FiveM porque dão às organizações criminosas uma razão tangível para competir, cooperar e investir no crescimento de sua facção. Na sua essência, um sistema territorial divide o mapa em zonas que as gangues podem reivindicar e controlar, concedendo à gangue proprietária benefícios específicos dentro desses limites. As decisões de design que você toma aqui moldam toda a experiência de RPG criminal em seu servidor. Você precisa considerar quantas zonas criar, qual o tamanho de cada zona, quais benefícios o controle de uma zona oferece, com que frequência as zonas podem ser contestadas e o que acontece quando uma gangue perde todo o seu território. Poucas zonas significam que apenas as maiores gangues podem participar, enquanto muitas zonas espalham o conflito e fazem com que os territórios individuais pareçam sem sentido. Uma abordagem equilibrada consiste em criar 15 a 25 zonas em áreas que já tenham significado de representação criminal, como locais de venda de drogas, distritos de armazéns e áreas habitacionais de baixos rendimentos.
Estrutura de dados do território
A camada de dados precisa rastrear a propriedade da zona, capturar o estado e as vantagens associadas a cada território. Armazene definições de território em um arquivo de configuração e dados de propriedade no banco de dados para que os layouts das zonas possam ser ajustados sem alterar os dados persistentes. Cada zona precisa de um identificador exclusivo, coordenadas de limite que definam sua área, o proprietário atual e um carimbo de data/hora de quando foi capturada pela última vez. O uso de limites baseados em polígonos oferece controle preciso sobre formatos de zonas que seguem ruas e pontos de referência naturalmente, embora zonas simples baseadas em raios sejam mais fáceis de implementar e tenham melhor desempenho:
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
);
]]Considere adicionar uma coluna capture_count que rastreia quantas vezes uma zona mudou de mãos, que você pode usar para análises e para identificar zonas que são muito disputadas, indicando que pode ser necessário ajustar o tempo de espera ou a dificuldade de captura para essas áreas específicas.
Mecânica de Captura
A mecânica de captura é o ciclo de jogo que orienta todo o sistema territorial. Quando uma gangue rival entra em um território e inicia uma tentativa de captura, é iniciado um cronômetro informando que os atacantes devem sobreviver até a conclusão, enquanto a gangue defensora recebe alertas e pode responder. Os sistemas de captura mais envolventes exigem que a gangue atacante mantenha um número mínimo de membros dentro da zona durante toda a duração da captura, criando pontos de confronto naturais. Se a contagem de invasores cair abaixo do limite, o progresso da captura será interrompido ou começará a diminuir. Aqui está uma implementação do lado do servidor da lógica de captura principal:
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)Execute um thread do lado do servidor que funciona a cada poucos segundos para atualizar o progresso da captura, verificando se a contagem mínima de invasores é mantida e se nenhuma violação de resfriamento ocorreu. Quando a captura for concluída, atualize o banco de dados, notifique todos os jogadores relevantes e aplique a nova propriedade em todo o servidor. Transmita a mudança de território para todos os clientes conectados para que eles possam atualizar seus mapas em tempo real.
Blips de mapa e feedback visual
As manchas de território no minimapa e no mapa do menu de pausa são essenciais para mostrar aos jogadores quais áreas são controladas por quais gangues. Cada território deve exibir uma marca colorida que corresponda à cor da gangue proprietária, com os territórios sem dono exibidos em cinza neutro ou branco. Quando uma captura está em andamento, o ícone deve piscar ou mudar para uma cor contestada para chamar a atenção dos jogadores no servidor. Use AddBlipForRadius para zonas territoriais porque cria uma sobreposição de área circular no mapa que comunica claramente os limites da zona:
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 }
endAlém dos ícones do mapa, considere adicionar indicadores visuais no mundo, como fumaça colorida, adereços de graffiti ou bandeiras de gangue que aparecem em pontos-chave dentro de um território quando ele é capturado. Essas dicas ambientais mergulham os jogadores na narrativa da guerra de gangues e fazem com que os limites do território pareçam tangíveis mesmo quando o minimapa não está visível. Você pode usar o CreateObject nativo para gerar acessórios específicos de gangues em locais predefinidos dentro de cada zona.
Vantagens e recompensas de gangue
As vantagens territoriais são o que motiva as gangues a lutar e defender seu território. Sem recompensas significativas, o controle do território se torna uma novidade com a qual os jogadores se envolvem uma vez e depois ignoram. As melhores vantagens proporcionam vantagens econômicas e estratégicas que aumentam à medida que uma gangue controla mais território. As vantagens económicas podem incluir um aumento percentual nos lucros da venda de drogas na zona, acesso a vendedores exclusivos no mercado negro, preços reduzidos em lojas afiliadas a gangues ou geração de renda passiva que deposita dinheiro na conta bancária compartilhada da gangue em intervalos regulares. As vantagens estratégicas podem incluir tempos de reaparecimento mais rápidos dentro do território, redução da geração de alertas policiais para crimes cometidos na zona, acesso a esconderijos para armazenamento de armas e drogas ou a capacidade de colocar armadilhas e defesas específicas de gangues. Implemente vantagens como verificações no servidor que são ativadas quando um jogador com a afiliação de gangue certa realiza uma ação dentro de um território de propriedade de sua gangue. Mantenha o sistema de benefícios modular para que você possa adicionar facilmente novos benefícios ou ajustar os existentes com base no feedback do jogador, sem reestruturar toda a base de código.
Eventos e programação de guerra territorial
Eventos estruturados de guerra territorial adicionam um elemento competitivo programado ao sistema territorial, evitando conflitos constantes de baixo nível que podem se tornar exaustivos para os jogadores. Em vez de permitir capturas a qualquer momento, você pode restringir as batalhas territoriais a intervalos de tempo específicos, como sextas e sábados à noite, criando eventos antecipados para os quais os jogadores planejam e para os quais trazem seu elenco completo. Como alternativa, implemente um sistema de declaração de guerra em que uma gangue deva declarar formalmente guerra contra outra gangue por meio de uma mecânica do jogo, desencadeando um período de preparação de 30 minutos antes que os territórios se tornem contestáveis. Isto dá à gangue defensora tempo para reunir seus membros e preparar as defesas, resultando em batalhas maiores e mais dramáticas. Acompanhe estatísticas de guerra, como mortes, territórios ganhos e perdidos e danos causados, e anuncie os resultados em todo o servidor quando o período de guerra terminar. Uma tabela de classificação ou sistema de histórico de guerra que os jogadores podem revisar adiciona um elemento de classificação competitiva que mantém as gangues engajadas entre os períodos de guerra ativos e cria histórias que se tornam parte da história do servidor.
Medidas Antiexploração
Os sistemas territoriais são alvos principais de exploração porque impactam diretamente a economia do jogo e a dinâmica de poder. A exploração mais comum é a captura de zumbis, em que um membro de uma gangue faz login durante horários de baixa população para tomar territórios silenciosamente e sem oposição. Evite isso exigindo uma população mínima de servidores antes que as capturas possam ser iniciadas e enviando notificações de webhook do Discord sempre que uma captura for iniciada, para que os defensores possam responder mesmo que não estejam online no momento. Outra exploração envolve a troca rápida de afiliações de gangues para capturar territórios para vários grupos. Imponha um tempo de espera para mudança de gangue de pelo menos 24 horas no mundo real e retire quaisquer permissões relacionadas ao território imediatamente após sair de uma gangue. Tentativas de captura com limite de taxa por gangue para evitar capturas que iniciam spam como uma tática de luto. Do lado técnico, valide todas as interações territoriais no lado do servidor, nunca confie no cliente para relatar se um jogador está dentro de um limite de zona e use verificações de posição no lado do servidor com GetEntityCoords(GetPlayerPed(src)) para verificar a localização dos jogadores durante os ticks de captura. Registre todas as tentativas, sucessos e falhas de captura com carimbos de data e hora e identificadores de jogadores para que você possa investigar padrões suspeitos e tomar medidas contra exploradores com evidências claras.
Integração com outros sistemas
Um sistema territorial atinge todo o seu potencial quando se conecta a outros sistemas de jogo em seu servidor. Vincule territórios ao seu sistema de venda de drogas para que o controle de uma zona de drogas aumente os preços de venda ou reduza o risco de interferência de NPCs. Conecte-o ao seu sistema habitacional para que os territórios de propriedade de gangues ofereçam impostos sobre a propriedade reduzidos ou casas seguras exclusivas. Integre-se ao seu sistema policial fazendo com que os territórios influenciem a prioridade de despacho, onde crimes em territórios controlados por gangues podem gerar alertas policiais atrasados ou reduzidos, simulando o desafio do mundo real de policiar bairros controlados por gangues. Insira dados do território em seu telefone ou sistema de notificação para que os líderes de gangues possam verificar o status do território, visualizar o histórico de capturas e coordenar esforços de defesa de qualquer lugar no mapa. Se o seu servidor tiver um sistema de progressão ou reputação, vincule o controle do território aos ganhos de reputação da gangue que desbloqueiam atividades e equipamentos de nível superior. Quanto mais sistemas fizerem referência à propriedade do território, mais impactante e envolvente a mecânica se tornará, transformando-a de um minijogo independente em um pilar central do ecossistema de RPG criminoso do seu servidor.

