Concevoir un système de territoire
Les systèmes de territoires de gangs sont l'un des mécanismes les plus attrayants que tu puissies ajouter à un serveur de jeu de rôle FiveM, car ils donnent aux organisations criminelles une raison tangible de rivaliser, de coopérer et d'investir dans la croissance de leur faction. À la base, un système de territoire divise la carte en zones que les gangs peuvent revendiquer et contrôler, accordant au gang propriétaire des avantages spécifiques à l'intérieur de ces limites. Les décisions de conception que tu prenes ici façonnent toute l’expérience de jeu de rôle criminel sur ton serveur. Tu dois considérer le nombre de zones à créer, la taille de chaque zone, les avantages que le contrôle d'une zone offre, la fréquence à laquelle les zones peuvent être contestées et ce qui se passe lorsqu'un gang perd tout son territoire. Trop peu de zones signifie que seuls les gangs les plus importants peuvent participer, tandis qu'un trop grand nombre de zones disperse le conflit et donne l'impression que les territoires individuels n'ont aucun sens. Une approche équilibrée consiste à créer 15 à 25 zones dans des zones qui ont déjà une importance pour les jeux de rôle criminels, comme les lieux de vente de drogue, les quartiers d'entrepôts et les zones d'habitation à faible revenu.
Structure des données du territoire
La couche de données doit suivre la propriété des zones, capturer l'état et les avantages associés à chaque territoire. Stockez les définitions de territoire dans un fichier de configuration et les données de propriété dans la base de données afin que la disposition des zones puisse être ajustée sans toucher aux données persistantes. Chaque zone a besoin d'un identifiant unique, de coordonnées de limite qui définissent sa zone, du propriétaire actuel et d'un horodatage de la dernière capture. L'utilisation de limites basées sur des polygones tu donne un contrôle précis sur les formes de zones qui suivent naturellement les rues et les points de repère, bien que de simples zones basées sur un rayon soient plus faciles à mettre en œuvre et fonctionnent mieux :
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
);
]]
Pensez à ajouter un capture_count colonne qui indique le nombre de fois qu'une zone a changé de mains, que tu peux utiliser à des fins d'analyse et pour identifier les zones trop disputées, indiquant que tu devres peut-être ajuster le temps de recharge ou capturer la difficulté pour ces zones spécifiques.
Mécanismes de capture
Le mécanisme de capture est la boucle de jeu qui anime l’ensemble du système de territoire. Lorsqu'un gang rival entre sur un territoire et lance une tentative de capture, un chronomètre démarre : les attaquants doivent survivre jusqu'à la fin tandis que le gang en défense reçoit des alertes et peut répondre. Les systèmes de capture les plus engageants exigent que le gang attaquant maintienne un nombre minimum de membres à l'intérieur de la zone pendant toute la durée de la capture, créant ainsi des points de confrontation naturels. Si le nombre d’attaquants tombe en dessous du seuil, la progression de la capture s’interrompt ou commence à décliner. Voici une implémentation côté serveur de la logique de capture principale :
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)
Exécutez un thread côté serveur qui s'active toutes les quelques secondes pour mettre à jour la progression de la capture, en vérifiant que le nombre minimum d'attaquants est maintenu et qu'aucune violation du temps de recharge n'a eu lieu. Une fois la capture terminée, mettez à jour la base de données, informez tous les joueurs concernés et appliquez la nouvelle propriété sur le serveur. Diffusez le changement de territoire à tous les clients connectés afin qu'ils puissent mettre à jour leurs spots cartographiques en temps réel.
Blips de carte et commentaires visuels
Les indicateurs de territoire sur la mini-carte et la carte du menu pause sont essentiels pour montrer aux joueurs quelles zones sont contrôlées par quels gangs. Chaque territoire doit afficher un spot coloré qui correspond à la couleur du gang propriétaire, les territoires sans propriétaire apparaissant en gris ou en blanc neutre. Lorsqu'une capture est en cours, le flash doit clignoter ou prendre une couleur contestée pour attirer l'attention des joueurs du serveur. Utiliser AddBlipForRadius pour les zones de territoire, car cela crée une superposition de zone circulaire sur la carte qui communique clairement les limites de la zone :
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
Au-delà des points de carte, pensez à ajouter des indicateurs visuels dans le monde comme de la fumée colorée, des accessoires de graffiti ou des drapeaux de gangs qui apparaissent à des points clés d'un territoire lorsqu'il est capturé. Ces indices environnementaux plongent les joueurs dans le récit de la guerre des gangs et rendent les limites du territoire tangibles même lorsque la mini-carte n'est pas visible. Tu peux utiliser le CreateObject natif pour générer des accessoires spécifiques aux gangs à des emplacements prédéfinis dans chaque zone.
Avantages et récompenses des gangs
Les avantages du territoire sont ce qui motive les gangs à se battre et à défendre leur territoire. Sans récompenses significatives, le contrôle du territoire devient une nouveauté dans laquelle les joueurs s'engagent une fois puis ignorent. Les meilleurs avantages offrent des avantages économiques et stratégiques qui s’aggravent à mesure qu’un gang contrôle plus de territoire. Les avantages économiques peuvent inclure une augmentation en pourcentage des bénéfices de la vente de drogue dans la zone, l'accès à des vendeurs exclusifs du marché noir, des prix réduits dans les magasins affiliés au gang ou une génération de revenus passifs qui dépose de l'argent sur le compte bancaire commun du gang à intervalles réguliers. Les avantages stratégiques pourraient inclure des temps de réapparition plus rapides sur le territoire, une génération réduite d'alertes de police pour les crimes commis dans la zone, l'accès à des cachettes cachées pour stocker des armes et de la drogue, ou la possibilité de placer des pièges et des défenses spécifiques aux gangs. Implémentez des avantages sous forme de contrôles côté serveur qui s'activent lorsqu'un joueur ayant la bonne affiliation à un gang effectue une action sur un territoire appartenant à son gang. Gardez le système d'avantages modulaire afin que tu puissies facilement ajouter de nouveaux avantages ou ajuster ceux existants en fonction des commentaires des joueurs sans restructurer l'ensemble de la base de code.
Événements et planification de la guerre de territoire
Les événements de guerre de territoire structurés ajoutent un élément compétitif programmé au système de territoire, empêchant les escarmouches constantes de bas niveau qui peuvent devenir épuisantes pour les joueurs. Au lieu d'autoriser les captures à tout moment, tu peux limiter les batailles de territoire à des plages horaires spécifiques comme le vendredi et le samedi soir, créant ainsi des événements anticipés que les joueurs planifient et auxquels ils apportent leur effectif complet. Tu peux également mettre en œuvre un système de déclaration de guerre dans lequel un gang doit officiellement déclarer la guerre à un autre gang via un mécanisme de jeu, déclenchant une période de préparation de 30 minutes avant que les territoires ne deviennent contestables. Cela donne au gang en défense le temps de rallier ses membres et de préparer ses défenses, ce qui donne lieu à des batailles plus vastes et plus dramatiques. Suivez les statistiques de guerre telles que les victimes, les morts, les territoires gagnés et perdus et les dégâts infligés, puis annoncez les résultats sur l'ensemble du serveur à la fin de la période de guerre. Un système de classement ou d'histoire de guerre que les joueurs peuvent consulter ajoute un élément de classement compétitif qui maintient les gangs engagés entre les périodes de guerre actives et crée des histoires qui font partie de l'histoire du serveur.
Mesures anti-exploit
Les systèmes de territoire sont des cibles privilégiées pour l’exploitation car ils ont un impact direct sur l’économie du jeu et la dynamique du pouvoir. L'exploit le plus courant est la capture de zombies, où un membre d'un gang se connecte pendant les heures où la population est faible pour s'emparer silencieusement de territoires sans opposition. Évitez cela en exigeant une population de serveurs minimale avant que les captures puissent être lancées et en envoyant des notifications de webhook Discord chaque fois qu'une capture démarre afin que les défenseurs puissent répondre même s'ils ne sont pas actuellement en ligne. Un autre exploit consiste à changer rapidement d’affiliation à un gang pour capturer des territoires pour plusieurs groupes. Appliquez un temps de recharge de changement de gang d'au moins 24 heures dans le monde réel et supprimez toutes les autorisations liées au territoire immédiatement après avoir quitté un gang. Tentatives de capture à taux limité par gang pour empêcher les captures déclenchant du spam en tant que tactique de dérangement. Sur le plan technique, validez toutes les interactions du territoire côté serveur, ne faites jamais confiance au client pour signaler si un joueur se trouve à l'intérieur d'une limite de zone et utilisez des contrôles de position côté serveur avec GetEntityCoords(GetPlayerPed(src)) pour vérifier l'emplacement des joueurs pendant les ticks de capture. Enregistrez chaque tentative de capture, succès et échec avec des horodatages et des identifiants de joueur afin que tu puissies enquêter sur les modèles suspects et prendre des mesures contre les exploiteurs avec des preuves claires.
Intégration avec d'autres systèmes
Un système de territoire atteint son plein potentiel lorsqu'il se connecte à d'autres systèmes de jeu sur ton serveur. Reliez les territoires à ton système de vente de drogue afin que le contrôle d’une zone de drogue augmente les prix de vente ou réduise le risque d’interférence des PNJ. Connectez-le à ton système de logement afin que les territoires appartenant à des gangs offrent des taxes foncières réduites ou des refuges exclusifs. Intégrez ton système de police en permettant aux territoires d'influencer la priorité de répartition, où les crimes dans les territoires contrôlés par les gangs peuvent générer des alertes de police retardées ou réduites, simulant ainsi le défi réel du maintien de l'ordre dans les quartiers contrôlés par les gangs. Introduisez les données du territoire dans ton téléphone ou ton système de notification afin que les chefs de gang puissent vérifier l'état du territoire, afficher l'historique des captures et coordonner les efforts de défense depuis n'importe où sur la carte. Si ton serveur dispose d'un système de progression ou de réputation, associez le contrôle du territoire aux gains de réputation des gangs qui débloquent des activités et des équipements de niveau supérieur. Plus il y a de systèmes faisant référence à la propriété du territoire, plus la mécanique devient percutante et engageante, le transformant d'un mini-jeu autonome en un pilier central de l'écosystème de jeu de rôle criminel de ton serveur.

