>
Guia 2026-03-16

Sistemas de Território de Gang e Guerras de Bairro em FiveM

OntelMonke

OntelMonke

Admin & Developer na Agency Scripts

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 }
end

Alé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.

Partilhar este artigo

Pronto para melhorar o teu servidor?

Explora os nossos scripts FiveM premium na loja Agency Scripts ou junta-te à nossa comunidade no Discord para suporte e atualizações.