Retour aux projets
Outdated

Police vs Voleur (GTA 5 FiveM)

Mode de jeu FiveM dédié à Alexlxl68 pour remplacer les sessions GTA Online par des parties maîtrisées (règles, spawns, timer, scoreboard).

juin 2018YouTube
FiveMLuaGTA V NativesJavaScriptHTML/CSS

Contexte & Problème

En 2018, le youtuber Alexlxl68 avait une série de vidéos populaire appelée "Police vs Voleur". Un joueur incarnant un voleur devait fuir tandis que tous les autres joueurs, en policiers, devaient l'arrêter.

Initialement, ces vidéos étaient tournées sur GTA Online (le multijoueur officiel de Rockstar), mais il n'existait aucun cadre pour piloter proprement ces sessions :

Les participants devaient passer par le magasin de vêtements pour se changer, choisir manuellement les véhicules, ce mettre d'accord sur les rêgles, coordonner les départs... Cela créait beaucoup de friction lors de la mise en place et pendant le gameplay.

La solution

Développer un gamemode FiveM complet qui encadre entièrement l'expérience, de A à Z.

Comment ça marche

Le gamemode fonctionne avec un principe simple :

/pv start
    ↓
Sélection d'un voleur (aléatoire ou manuel)
    ↓
Attribution des rôles (voleur/policiers)
    ↓
Spawn automatique (skins, positions, véhicules, armes)
    ↓
Timer compte à rebours
    ↓
Le voleur essaie de fuir, les policiers essaient de l'attraper
    ↓
Fin de partie

Commande début de partieCommande début de partie

Les particularités qui rendent le mode intéressant :

  • 🎯 Localisation progressive : le voleur n'est pas visible dès le départ sur la carte
  • Équilibre asymétrique : 1 voleur rapide vs plusieurs policiers
  • 🎮 Évolutions possibles : scénarios, ultis (compétences spéciales), modes variantes

Exemples vidéo

Police vs Voleur

Samu vs Infecté (Variante)


Infrastructure serveur

Le projet ne s'arrêtait pas au gamemode. J'ai conçu un serveur FiveM complet avec une sélection précise de ressources :

Stack du serveur :

  • 🚗 Modèles de voiture personnalisés
  • 👤 Modèles de personnage personnalisés
  • 🎫 Loading screen thématisé "Police vs Voleur"
  • 🧱 Scripts utilitaires (notifications, outils dev)
  • 🎯 Performances optimisées (retrait des scripts par défaut inutiles)

Mods gameplay ajoutés :

  • Rappel depuis les hélicoptères
  • Pause des herses (véhicule antigangster)
  • Chien policier
  • Modèles d'armes thématisés

Cette cohérence globale (connexion → gameplay → fin de partie) crée une expérience immersive dédiée à Police vs Voleur.

Image d'archive - Selection des modèlesImage d'archive - Selection des modèles

Image d'archive - Descente en rappelImage d'archive - Descente en rappel

Image d'archive - Chien d'attaque K9Image d'archive - Chien d'attaque K9

Image d'archive - Selection des vehiculesImage d'archive - Selection des vehicules


Les 3 versions du projet

Le projet a évolué en 3 phases pour ajouter progressivement des fonctionnalités. Chaque version apportait des améliorations.

Version 1.0 : Les Fondations

L'objectif : Remplacer GTA Online par une expérience contrôlée et automatisée.

Fonctionnalités

  • 🎮 Boucle de partie : commandes /pv start et /pv stop
  • 👥 Sélection voleur : aléatoire ou manuelle
  • 📍 Spawns fixes par zones : 4 régions de spawn prédéfinies (north, middle, south, prison)
  • 🚗 Spawn véhicules : selon la région
  • 🎯 Blips dynamiques : localisation progressive et dynamique du voleur
  • 🐕 K9 optionnel : probabilité de spawn avec un chien d'attaque
  • 🎨 HUD simple : affichage du rôle, alertes, notifications

Zones et spawns

Les positions de spawn n'étaient pas générées aléatoirement. Chaque position était manuellement choisie et prédéfinie pour créer des situations intéressantes :

  • Zones stratégiques : commissariats, points d'intérêt, zones de poursuite spectaculaires
  • Équilibrage gameplay : distance entre voleur et policiers, couverture disponible, routes de fuite
  • Qualité vidéo : endroits visuellement marquants, arrière-plans reconnaissables

Les 4 régions disponibles :

  • Nord : Zones côtières, zones sauvages (de Sandy Shore à Paleto Bay)
  • Centre: Cœur de la ma (de Vinewood Hills à Sandy Shore)
  • Sud : Toutes la ville de Los Santos
  • Prison : Spawn spécial à la prison

Exemple concret : spawn "sud1" (Banque de Pacific Standard)

-- Spawn du voleur à la banque
pvConfig.spawnVoleur = {
    {spawn = "sud1", heading = 0.50, x = 263.09, y = 214.67, z = 101.68}
}

-- Spawns des 7 policiers (au commissariat Davis à proximité)
pvConfig.spawnPolice = {
    sud1 = {
        {heading = 5.77, x = 441.20, y = -978.70, z = 30.68}, 
        {heading = -0.48, x = 441.10, y = -981.13, z = 30.68}, 
        {heading = 3.46, x = 447.98, y = -973.37, z = 30.68}, 
        {heading = -2.82, x = 447.54, y = -976.41, z = 30.68}, 
        {heading = 0.71, x = 447.20, y = -986.81, z = 30.68}, 
        {heading = -1.19, x = 459.24, y = -992.82, z = 30.68}, 
        {heading = 0.92, x = 444.58, y = -994.57, z = 30.68}
    }
}

-- Caméra d'intro cinématique
pvConfig.spawnCamera = {
    sud1 = {x = 253.47, y = 229.27, z = 103.68, rotx = -20.0, rotz = -160.0, fov = 70.0}
}

-- Véhicule du voleur (devant la banque)
pvConfig.spawnCarVoleurCoord = {
    sud1 = {heading = 204.76, x = 226.73, y = 212.99, z = 105.22}
}

-- Véhicules des policiers (parking du commissariat)
pvConfig.spawnCarPoliceCoord = {	
    sud = {
        {heading = 50.15, x = 408.20, y = -979.77, z = 28.74},
        {heading = 50.15, x = 408.23, y = -984.80, z = 28.74}, 
        {heading = 50.15, x = 408.24, y = -989.14, z = 28.74}, 
        {heading = 50.15, x = 408.23, y = -993.53, z = 28.74}, 
        {heading = 50.15, x = 408.17, y = -998.30, z = 28.74}, 
        {heading = 2.32, x = 415.16, y = -1029.45, z = 28.71}, 
        {heading = 2.32, x = 419.66, y = -1029.11, z = 28.59}
    }
}

Résultat : 1 voleur à la banque vs 7 policiers au commissariat Davis avec une poursuite qui démarre naturellement dans le centre-ville.

Système de localisation du voleur

Début de partie : blip CACHÉ
    ↓
Après 20 secondes : blip RÉVÉLÉ
    ↓
Si voleur sort du véhicule : blip MASQUÉ pendant 15 secondes (par défaut)
    ↓
Si voleur rentre dans le véhicule : blip RÉAPPARAÎT

Le blip correspond à l'icone visible sur le radar (minimap) des joueurs.

Cette mécanique crée de la tension stratégique : le voleur peut se cacher à pied, mais au prix d'une mobilité réduite.

Flux complet

┌─────────────────────────────────────────────┐
│  SERVEUR : Commande /pv start               │
│  • Récupère tous les joueurs connectés      │
│  • Sélectionne un voleur (random ou manuel) │
│  • Assigne les autres en policiers          │
│  • Choisit un spawn de région aléatoire     │
└────────────────┬────────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────────────────┐
│  CLIENT : Réception du rôle                         │
│  • Change le skin du joueur                         │
│  • TP vers le spawn assigné                         │
│  • Spawn du véhicule correspondant                  │
│  • Affiche l'interface de démarrage                 │
└────────────────┬────────────────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────────────────┐
│  SERVEUR : Boucle de partie                         │
│  • Gère les révélations de blips                    │
│  • Surveille la mort des joueurs                    │
│  • Déclenche la fin si le voleur meurt              │
│  • Déclenche la fin si aucun policiers vivants      │
└────────────────┬────────────────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────────────────┐
│  CLIENT : Affichage en temps réel                   │
│  • Alertes de rôle                                  │
│  • Blips des joueurs                                │
│  • Notifications d'événements                       │
│  • Effets visuels et sonores                        │
└────────────────┬────────────────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────────────────┐
│  FIN DE PARTIE                                      │
│  • Victoire voleur (tous les policiers éliminés)    │
│  • OU Victoire police (voleur éliminé)              │
│  • Affichage écran de victoire                      │
│  • Reset de tous les états                          │
└─────────────────────────────────────────────────────┘

Résultat

  • ✅ Un gamemode solide et jouable qui remplaçait GTA Online
  • ✅ Automatisation complète de la mise en place
  • ✅ Expérience cohérente et répétable

Limitation : chaque partie ressemblait aux précédentes (spawns prévisibles, stratégie toujours identique)


Version 2.0 : Système de Scénarios

Pourquoi une V2.0 ? : Après avoir testé V1.0 en production, le problème devint évident : chaque partie ressemblait à la précédente. Les spawns étaient prévisibles, la stratégie souvent identique. Pour garder l'audience et les joueurs engagée, il fallait une variété contextuelle.

Fonctionnalités

Au lieu de simplement changer de région, chaque partie aurait un contexte narratif complet : scénario de braquage, scénario de fuite, ambiance thématisée, etc.

  • 🧩 Système de scénarios modulaires : chaque scénario = 1 fichier Lua avec toutes les données
  • 📍 Spawns contextuels : positions complètement différentes selon le scénario
  • 🎭 Thématisation complète : skins, véhicules, ambiance adaptés au scénario
  • 👁️ Mode spectateur : ressource séparée pour que les joueurs éliminés regardent
  • ⏱️ Timer synchronisé : manche avec durée définie (ex: 2 minutes)
  • 📊 Versioning : tracking de version, watermark en jeu
  • 🔁 Synchronisation : évite les désync pendant chaque étape du jeu

Structure d'un scénario

Chaque scénario est un module indépendant qui définit tous les paramètres et me permet ainsi de maitriser le flux complet, du spawn des vehicules; jusqu'aux animations (cut-scene custom):

local banque = {}
banque.name = "banque"

-- Positions de spawn des joueurs
banque.spawn = {
    voleur = {
        heading = 157.41528320312, 
        x = 262.6858215332, 
        y = 212.88841247558, 
        z = 101.68349456788
    },
    police = {
        {heading = 281.76208496094, x = 218.11204528808, ...},
        {heading = 318.65139770508, x = 221.57264709472, ...},
        -- ... plusieurs positions pour répartir les policiers
    }
}

-- Positions de spawn des véhicules
banque.spawn.car = {
    voleur = {
        heading = 71.797721862792, 
        x = 260.87121582032, 
        y = 188.11964416504, 
        z = 104.10507202148	
    },
    police = {
        {heading = 187.15296936036, x = 220.09686279296, ...},
        -- ... positions pour chaque policier
    }
}

-- Position de la caméra d'intro
banque.spawn.cam = {
    x = 248.46881103516,
    y = 218.0495147705,
    z = 102.39113616944,
    rotx = 0.0,
    rotz = 0.0,
    fov = 70.0
}

-- Modèles de véhicules
banque.car.model = {
    voleur = {"alpha"},  -- Voiture rapide
    police = {"police"}  -- Voiture de police
}

-- Skins des personnages
banque.skins = {
    voleur = {"mp_m_freemode_01"},
    police = {"s_m_y_cop_01"}
}

-- Etc

Flux complet

/pv start
    ↓
Sélection aléatoire d'un voleur
    ↓
Sélection aléatoire d'un scénario (banque, magasin, rue, etc.)
    ↓
Le serveur récupère tous les paramètres du scénario :
  • Positions spawn voleur/policiers
  • Véhicules thématisés
  • Skins appropriés
  • Camera d'intro
  • Cinématique/Scenariot
    ↓
Attribution et spawn automatique
    ↓
Timer synchronisé
    ↓
Gameplay
    ↓
Fin quand timer écoulé OU victoire

Avantages

  • Facile d'ajouter des scénarios : copier/coller une structure Lua + modifier les coordonnées
  • Cohérence thématique : skins et véhicules adaptés au contexte
  • Rejouabilité : les joueurs découvrent de nouveaux scénarios à chaque session

Résultat

  • ✅ Le gamemode devient rejouable avec une vraie progression
  • ✅ Chaque partie a une ambiance et stratégie différente

Le cœur du gameplay reste cependant similaire.


Version 2.1 : Couche Arcade avec un système de pouvoirs

Après là v2.0, le cœur du gamemode remplissait ça mission. Mais pour diversifier le gameplay et apporter du nouveau contenu YouTube, j'ai eu l'idée d'ajouter des éléments qui changeraient la dynamique des poursuites.

Concept

Ajouter un système de pouvoirs spéciaux (ultis) déclenchable en collectant des orbes distribuées sur la map, générant des retournements de situation et des moments innatendu.

Les ultis

Morph (Voleur) : effet visuel de transformation (particules), puis le voleur devient un petit animal (ex: rat). Cette ulti casse la lecture visuelle des policiers et permet de passer inaperçu dans des zones urbaines. Son impact est très fort lors de ruptures de ligne de vue (angles, recoins, intérieurs).

Charge (Police) : le policier vise un véhicule, puis celui-ci se bloque brièvement (frein à main), avec lumières + alarme. L'objectif est de neutraliser la voiture du voleur pendant ~5s pour permettre l'interception. C'est un excellent outil de catch-up si bien timé (virages, tunnels, ponts).

Clones (Voleur) : plusieurs copies du joueur apparaissent et s'enfuient dans différentes directions. Cette ulti sert à semer la confusion et forcer les policiers à diviser leur attention. Elle est excellente en zone dense.

Image d'archive - Icone d'ulti clonageImage d'archive - Icone d'ulti clonage

Wallhack (Voleur/Police) : un overlay HUD affiche les joueurs à travers les murs. Cela donne une lecture tactique instantanée des positions. L'avantage informationnel est énorme.

Image prototype - WallhackImage prototype - Wallhack

Blackout (Voleur) : extinction globale des lumières, ambiance chaotique et PNJ qui paniquent. Le but est de casser les repères visuels de la police et créer une fenêtre d'évasion. Très cinématique, cette ulti est utile pour provoquer des erreurs de pilotage.

Nightvision (Police) : filtres de vision spéciaux (vision nocturne). Cette compétence permet de conserver la traque dans l'obscurité. Elle améliore nettement le tracking, surtout de nuit.

Rage (Voleur) : propulsion verticale explosive, phase aérienne invisible, puis onde de choc massive à l'atterrissage (rayon 35m). Elle offre un repositionnement spectaculaire et une zone de contrôle qui repousse véhicules et joueurs. C'est une ulti très forte pour retourner une situation désespérée.

Spikes (Police) : pose de herses en ligne sur la route ; les pneus éclatent au passage. Cette ulti crée des barrières de contrôle et punit les trajectoires prévisibles. Elle est excellente en goulot d'étranglement (ponts, tunnels, autoroutes).

Image d'illustration - HersesImage d'illustration - Herses

Ghost (Voleur) : le voleur devient complètement invisible pour les policiers. Cette capacité permet d'échapper à la poursuite visuelle et de se cacher à la vue de tous. Très forte pour créer des ruptures et relancer la fuite.

Heatvision (Police) : filtre de vision thermique affichant les sources de chaleur (joueurs, véhicules). Elle sert à détecter le voleur même caché ou dans l'obscurité. Cette ulti contre efficacement Ghost et améliore le tracking en zones denses.

Images d'archive - Vision ThermiqueImages d'archive - Vision Thermique

Radar (Police) : radar amélioré montrant la position exacte et continue du voleur sur la carte. Son usage principal est de coordonner les policiers et d'anticiper les trajectoires du voleur. Elle permet des encerclements coordonnés et bloque les échappatoires.

Riot (Voleur) : tous les PNJ de la ville deviennent hostiles : ils attaquent la police et lui foncent dessus en voiture. Cette ulti crée un chaos généralisé qui ralentit et distrait les policiers. Elle transforme la ville entière en obstacle pour la police.

Soul (Voleur) : le voleur prend le contrôle d'un PNJ pendant quelques secondes. Cela permet de se fondre dans la masse et de brouiller son identification. Elle est excellente pour les feintes, les misdirections et les disparitions visuelles.

WatchDogs (Voleur) : interface de contrôle qui permet d'interagir avec les éléments urbains (feux tricolores passant au vert, véhicules qui accélèrent, etc.). Cette ulti transforme la ville en alliée du voleur en créant des obstacles et des distractions pour les policiers. Impact dévastateur en zone urbaine dense, elle permet de créer des passages ou de piéger les poursuivants sur la route.

Image prototype - Ulti WatchDogsImage prototype - Ulti WatchDogs

Pipeline des ultis

Début de manche
    ↓
Spawn des orbes sur la map
    ↓
Joueur collecte une orbe (animation + barre de progression)
    ↓
Si succès : orbe consommée, +1 point d'ulti
    ↓
Quand suffisant de points : ulti déverrouillée
    ↓
Le serveur attribue un ulti aléatoire :
  • Voleur : Morph, Clones, Wallhack, etc.
  • Police : Charge, Spikes, Nightvision, etc.
    ↓
Le joueur peut déclencher l'ulti

Résultat

✅ Gamemode devient fun et imprévisible ✅ Chaque partie a des retournements de situation uniques


Mode spectateur

Quand un joueur meurt, il passe en mode spectateur (option activable).

L'interface affiche le nom du joueur spectate et permet de naviguer entre tous les joueurs vivants.

┌───────────────────────────────────────────────┐
│  JOUEUR ÉLIMINÉ                               │
│  • TriggerEvent('pv:startSpec', "true")       │
└────────────────┬──────────────────────────────┘
                 │
                 ▼
┌───────────────────────────────────────────────┐
│  RÉCUPÉRATION DES JOUEURS VIVANTS             │
│  • Le serveur envoie la liste                 │
│  • players[1], players[2], ...                │
└────────────────┬──────────────────────────────┘
                 │
                 ▼
┌───────────────────────────────────────────────┐
│  ACTIVATION DU MODE SPECTATEUR                │
└────────────────┬──────────────────────────────┘
                 │
                 ▼
┌───────────────────────────────────────────────┐
│  CONTRÔLES                                    │
│  • Flèche GAUCHE : Joueur précédent           │
│  • Flèche DROITE : Joueur suivant             │
└───────────────────────────────────────────────┘

Interface NUI (HUD)

L'interface utilisateur est créée avec NUI (HTML/CSS/JS embarqué dans FiveM) :

Effets visuels :

  • Animations CSS avec animate.css
  • Sons immersifs (sirènes, musiques de victoire)

Synchronisation Client/Serveur

FiveM utilise un modèle événementiel asynchrone :

-- SERVEUR → CLIENT (broadcast à tous)
TriggerClientEvent("pv:startGame", -1, role, spawn, vehicle)

-- SERVEUR → CLIENT (ciblé)
TriggerClientEvent("pv:notification", source, "Message")

-- CLIENT → SERVEUR
TriggerServerEvent("pv:takeOrb", orb_id)

-- CLIENT → CLIENT (via serveur)
RegisterNetEvent("pv:win")
AddEventHandler("pv:win", function(winner)
    -- Afficher écran de victoire
end)

Défis de synchronisation rencontrés :

  • Spawn simultané : Callbacks pour s'assurer que tout le monde est prêt
  • Blips désynchronisés : Refresh périodique côté serveur
  • États joueurs : Table centralisée serveur avec updates réguliers
  • Orbes multiples : Système de lock pour éviter la double collecte

Limitations et défis

Limitations techniques

Limite de joueurs simultanés : FiveM étant un mod multijoueur communautaire, les performances dépendent de la machine hôte. Pour des sessions YouTube fluides, le nombre optimal était de 6-12 joueurs.

Dépendance aux Natives GTA V : Certaines fonctionnalités utilisent des natives non documentées ou instables, nécessitant des workarounds et tests intensifs.

Synchronisation réseau : FiveM repose sur le P2P de GTA V qui n'a pas été conçu pour du gameplay compétitif. Des délais de sync pouvaient apparaître (blips, positions véhicules, teleportation).

Défis de développement

Documentation limitée : En 2018, FiveM était encore très mal documenté. Beaucoup de fonctionnalités ont été découvertes par reverse engineering et tests.

Équilibrage gameplay : Trouver le bon équilibre entre les policiers et le voleur (vitesse véhicules, timer, ultis) a nécessité de nombreuses itérations.

Production vidéo : Le gamemode devait être interessant visuellement tout en restant stable et lisible pour les spectateurs et les joueurs.


Résultats & Impact

Résultats quantitatifs

Le gamemode a été utilisé pour plusieurs vidéos sur la chaîne d'Alexlxl68, totalisant des millions de vues.

Au-delà de la création d'un gamemode fonctionnel, ce projet a été une école technique intensive :

Gestion de projet complexe :

  • Architecture multi-ressources
  • Dépendances entre modules
  • Versioning et déploiement

Programmation temps réel :

  • Synchronisation client/serveur
  • Gestion d'états distribués
  • Optimisation de performance

Game design :

  • Équilibrage de mécaniques
  • Feedback joueur
  • Itération

Ce projet est l'une de mes plus grosse expériences en développement de jeu multijoueur, avec un impact direct sur les joueurs et une audience réelle.