Objectif
Implémenter la chaîne singleplayer complète et synchronisée :
crime observé → signalement → wanted autoritaire → déploiement policier → poursuite → arrestation/combat/perte de cible → désengagement
Le serveur reste l’unique autorité sur les crimes, suspects, niveaux de recherche, affectations policières et résultats d’arrestation. Un seul client exécute l’IA GTA native d’une unité policière ; les autres clients observent le résultat via la synchronisation MTA existante.
État actuel
Neon possède déjà :
- une population de policiers régionaux, limitée à une patrouille « safe » ;
- ownership persistant, epochs et handoff pour les peds ;
- cohortes atomiques peds/véhicules dans
native-task-runtime ;
- primitives natives de déplacement, conduite et combat ;
- bridges authentifiés pour dégâts et bike-jack ;
- synchronisation du wanted visuel avec
setPlayerWantedLevel.
Le harness interdit actuellement les comportements policiers réels dans test-resources/native-ped-traffic/client.lua :
TASK_SIMPLE_ARREST_PED ;
TASK_COMPLEX_ARREST_PED ;
TASK_SIMPLE_BE_ARRESTED ;
TASK_COMPLEX_POLICE_PURSUIT ;
TASK_COMPLEX_BE_COP ;
TASK_COMPLEX_KILL_CRIMINAL ;
TASK_COMPLEX_COP_IN_CAR.
VEHICLE_HIT_AND_RUN est également exclu du checkpoint collision dans test-resources/native-ped-traffic/README.md.
MTA désactive globalement les systèmes vanilla correspondants dans Client/multiplayer_sa/CMultiplayerSA.cpp, notamment les roadblocks, CCrime::ReportCrime et les mises à jour de CWanted.
Contrainte d’architecture critique
Ces patches ne doivent pas être simplement retirés. Le wanted GTA est un singleton local et ne peut pas représenter plusieurs suspects réseau indépendants.
De plus :
CTaskComplexPolicePursuit choisit lui-même un joueur, consulte FindPlayerWanted() et suppose un véritable CCopPed ;
CTaskComplexArrestPed dépend également de FindPlayerWanted(), IsClosestCop() et ped->AsCop() ;
- les peds scriptés MTA sont des wrappers
CPlayerPed, pas des CCopPed.
Références :
gta-reversed-dryxio/source/game_sa/Tasks/TaskTypes/TaskComplexPolicePursuit.cpp ;
gta-reversed-dryxio/source/game_sa/Tasks/TaskTypes/TaskComplexArrestPed.cpp ;
Client/game_sa/TaskGoToSA.cpp, où le scanner de WanderCop est déjà neutralisé pour cette raison.
La solution doit composer des tâches target-scoped compatibles script-peds, sans accès au singleton wanted local et sans cast CCopPed.
Architecture cible
Registre serveur autoritaire
Créer un resource/module isolé native-wanted-police possédant quatre registres bornés :
- Crime : identifiant immuable, type, offender, génération, victime/véhicule, monde, position, source de preuve, sévérité, état et témoins.
- Suspect/wanted : chaos, niveau, floor/maximum, dernier crime, dernière position vue, état de visibilité, unités affectées, roadblocks et response tier.
- Witness : crime, acteur, traffic id, owner/epoch, résultat de visibilité, confiance et statut de signalement.
- Police unit : suspect explicite, membres, véhicules, rôle, phase, owner, epoch, nonce, snapshot et état de handoff.
Deux suspects proches doivent toujours conserver des états, budgets, unités et targets séparés.
Pipeline de crimes
Sources MVP :
- visée avec arme et tir ;
- dégâts et meurtre d’un civil ou policier ;
- attaque au couteau ;
- vol/carjack ;
- dégâts/destruction de véhicule ;
- ped renversé ou tué par véhicule ;
VEHICLE_HIT_AND_RUN ;
- explosion et incendie.
Les infractions routières avancées restent optionnelles tant que leur validation serveur n’est pas fiable.
Ordre de confiance :
- événement serveur issu du pipeline MTA ;
- événement natif observé par l’owner autoritaire de la victime/du véhicule ;
- proposition du client auteur concordant avec l’état serveur ;
- aucun wanted sur une proposition invérifiable.
Chaque proposition doit valider owner, epoch, nonce, génération d’élément, syncer, monde, distance/vitesse, arme/véhicule/siège/victime, cadence et timestamp serveur. Les anciens epochs et doublons sont refusés.
Témoins et signalement
Utiliser les distances retail comme profil initial : 14 m ordinaire, 30 m pour destruction de véhicule, 60 m pour explosion ou destruction aérienne (gta-reversed-dryxio/source/game_sa/Crime.cpp).
Un policier autoritaire à portée signale immédiatement. Sinon, le serveur sélectionne des témoins résidents et demande uniquement à leur owner une observation native bornée. Les crimes non vus expirent ; un crime confirmé est signalé exactement une fois.
La file retail de 16 crimes, le délai de 500 ms et l’expiration de 10 s dans Wanted.cpp servent de référence, mais les files Neon doivent être bornées par suspect, pas globalement.
Calcul wanted
Reproduire en Lua pur testé les poids de CWanted::ReportCrimeNow et les seuils de Wanted.cpp.
| Étoiles |
Chaos |
Cops max |
Véhicules police max |
Chance roadblock |
| 0 |
<= 50 |
0 |
0 |
0 |
| 1 |
> 50 |
1 |
1 |
0 |
| 2 |
> 180 |
3 |
2 |
0 |
| 3 |
> 550 |
4 |
2 |
12 |
| 4 |
> 1200 |
6 |
2 |
18 |
| 5 |
> 2400 |
6 |
2 |
24 |
| 6 |
> 4600 |
10 |
3 |
30 |
Le decay est serveur et dépend de la visibilité réelle, des contacts récents, de la police proche et des nouveaux crimes. Le RPC wanted existant sert au HUD et à la compatibilité Lua, jamais à la décision IA.
Runtime policier target-scoped
Ajouter une primitive resource-scoped de haut niveau, par exemple :
token = acquirePedNativePoliceUnit(cops, vehicles, suspect, descriptor)
ok = updatePedNativePoliceUnit(token, snapshot)
state = getPedNativePoliceUnitDiagnostic(token)
ok = releasePedNativePoliceUnit(token)
Le C++ doit composer uniquement des primitives script-ped-safe :
- seek/follow avec cible explicite ;
- kill-on-foot avec cible explicite ;
- entrée/sortie de véhicule ;
- car drive mission avec cible explicite ;
- follow/block/ram selon le niveau ;
- stand/aim/arrest presentation ;
- aucun choix implicite du joueur le plus proche ;
- aucun accès à
CWanted local ;
- aucun cast
CCopPed.
Les leases sont resource-scoped et libérés lors de la destruction des éléments ou de l’arrêt de la ressource.
Poursuite à pied
Machine d’état :
dispatch → approach → confront → pursue → arrest_attempt | combat | target_lost → search → disengage/reacquire
Le serveur choisit toujours le suspect. Un policier ambient peut être réquisitionné puis rendu à sa population. Mort, quit, changement de monde et wanted zéro terminent proprement la mission.
Arrestation et résistance
L’arrestation traverse deux autorités : owner de l’unité policière pour l’approche, client du suspect pour l’état physique BE_ARRESTED.
Handshake requis :
- proposition
arrest-ready avec epoch/nonce ;
- revalidation serveur de la distance, vitesse, santé, wanted, monde et état de combat ;
- ordre authentifié au client victime ;
- primitive locale
addLocalPlayerNativeBeArrested(...) ;
- ACK des deux côtés ;
- résultat final décidé par le serveur.
Tirer, infliger un dégât, accélérer hors enveloppe, remonter dans un véhicule ou entrer dans une réponse physique prioritaire produit une résistance et reprend atomiquement la poursuite.
Prison, téléport, pénalité et perte d’armes restent configurables pour ne pas casser les gamemodes.
Police en véhicule
Une voiture de police est une cohorte mono-owner : véhicule, conducteur, partenaire éventuel et suspect comme dépendance read-only.
Transitions minimales :
- suspect à pied → approche puis sortie ;
- suspect en véhicule → follow/block/ram ;
- véhicule suspect arrêté → sortie et arrestation ;
- voiture police détruite/retournée/en feu → poursuite à pied ;
- conducteur mort → promotion atomique du partenaire ou dissolution ;
- changement de véhicule du suspect → retarget serveur.
Renforts et niveaux de réponse
Budgets par suspect :
- 1 étoile : agent proche, arrestation prioritaire ;
- 2 étoiles : plusieurs agents et voitures ;
- 3 étoiles : conduite agressive et premiers roadblocks ;
- 4 étoiles : SWAT ;
- 5 étoiles : FBI ;
- 6 étoiles : armée.
Modèles, armes et véhicules viennent d’un catalogue serveur versionné. Les hélicoptères/bateaux sont une dépendance explicite au chantier véhicules spéciaux tant qu’ils ne sont pas supportés.
Roadblocks
Ne pas réactiver directement CRoadBlocks::GenerateRoadBlocks.
Le serveur sélectionne la route probable, demande à un client un candidat natif hors caméra, collecte les veto visibilité/collision, crée des éléments MTA, place toute l’équipe dans une cohorte unique et possède TTL/cleanup. Référence géométrique : gta-reversed-dryxio/source/game_sa/RoadBlocks.cpp.
Handoff atomique
Réutiliser les invariants de native-task-runtime : handle stable, epoch monotone, nonce, release-before-acquire et ACK du current owner.
Snapshot minimal : suspect, phase, wanted, dernière position connue, rôle/health/armor/weapon/ammo/siège/task sémantique des membres, état des véhicules, arrest handshake et roadblock role.
Tous les policiers, partenaires et véhicules changent d’owner ensemble. Le handoff d’un client connecté mais figé dépend du heartbeat/reassignment P0 et bloque la qualification production.
API serveur proposée
reportNativeCrime(offender, crimeType, victim, context)
getNativeWantedState(player)
setNativeWantedEnabled(player, enabled)
clearNativeWanted(player, reason)
setNativeWantedMaximum(player, level)
getNativePoliceUnits(player)
requestNativePoliceBackoff(player, reason)
Événements :
onNativeCrimeValidated
onNativeCrimeReported
onNativeWantedLevelChange
onNativePoliceUnitStateChange
onNativePlayerArrestAttempt
onNativePlayerArrested
onNativeSuspectEscaped
Les APIs sont ACL/resource-scoped.
Checkpoints ordonnés
C0 — Contrats et oracles
Documenter états/invariants, extraire les tables crime/chaos/wanted retail, écrire les tests Lua purs et fixer la coexistence avec les gamemodes utilisant setPlayerWantedLevel.
Sortie : mapping déterministe de tous les crimes, seuils et caps.
C1 — Ledger crime/wanted serveur
Registres, déduplication, file/expiration/decay, publication HUD et diagnostics, sans policier actif.
Sortie : deux joueurs accumulent/perdent leur wanted indépendamment sans divergence.
C2 — Témoins et sources de crimes
Tirs, visée, dégâts, morts, vols, observation native et VEHICLE_HIT_AND_RUN.
Sortie : crime non vu non signalé, crime vu signalé une fois, anciens epochs refusés.
C3 — Primitive C++ policier script-safe
Lease resource-scoped, cible explicite, aucune dépendance à FindPlayerWanted/CCopPed, diagnostics et cleanup.
Sortie : harness deux clients prouvant qu’un cop poursuit uniquement le suspect assigné.
C4 — Poursuite à pied et perte de cible
Réquisition ambient, approche, poursuite, combat, recherche, reacquisition et désengagement.
Sortie : cycle complet sans tâche orpheline ni changement implicite de cible.
C5 — Arrestation/résistance
Handshake policier/victime, BE_ARRESTED local, résistance et résultat configurable.
Sortie : arrestation et résistance convergent avec deux owners différents.
C6 — Unités en véhicule
Conducteur, partenaire, voiture, transition véhicule/pied et reprise après destruction.
Sortie : cohorte toujours mono-owner, sans siège ou tâche dupliqué après handoff.
C7 — Renforts niveaux 1–6
Budgets par suspect, loadouts, SWAT/FBI/armée et allocation équitable.
Sortie : caps respectés et cleanup complet au retour à zéro.
C8 — Roadblocks
Candidat natif, veto caméra/collision, équipe atomique, TTL et cleanup.
Sortie : aucun pop visible, élément abandonné ou mauvais suspect.
C9 — Handoff, heartbeat et soak
Handoff à pied/en voiture/pendant arrestation, owner quit/freeze, 10–20 joueurs et plusieurs suspects.
Sortie : zéro split ownership, double IA, ancien paquet accepté ou croissance non bornée.
Critères d’acceptation transversaux
- poids et seuils attendus pour chaque crime ;
- une double observation ne double pas le chaos ;
- hit-and-run attribué au bon conducteur ;
- deux suspects proches gardent des unités séparées ;
- perte de vue → recherche → decay ; nouveau crime interrompt le decay ;
- arrestation et résistance convergent ;
- mort, quit et resource stop nettoient tous les handles ;
- forged offender/victim/weapon/vehicle/wanted, non-owner, ancien epoch, mauvais monde et proposition hors enveloppe sont refusés ;
- release ACK avant acquisition ; tous les membres/véhicules changent ensemble ;
- aucune résurrection de health/armor/ammo au handoff ;
- files, historiques et télémétrie bornés ;
- aucun nouveau flux réseau permanent haute fréquence ;
- soak avec reconnexion, mort, respawn et resource restart.
Risques principaux
- crash/UB si une tâche retail caste un script-ped en
CCopPed ;
- mauvais suspect si une primitive consulte
FindPlayerPed ou le wanted local ;
- HUD wanted pris à tort pour autorité ;
- double application de dégâts lors d’un replay comportemental ;
- arrestation appliquée au remote wrapper plutôt qu’au client victime ;
- split ownership conducteur/partenaire/voiture ;
- roadblock créé à l’écran ;
- starvation de la population civile ;
- conflit avec les gamemodes possédant déjà le wanted ;
- absence de reprise fiable d’un owner figé sans heartbeat.
Dépendances
Bloquantes avant production :
- heartbeat/reassignment des owners ;
- primitive C++ policier target-scoped et script-ped-safe ;
- réservation partagée du budget peds/véhicules ;
- admission/réquisition d’un cop ambient sans casser son lifecycle ;
- politique explicite de propriété du wanted pour les gamemodes.
Briques réutilisables :
native-task-runtime pour epochs/cohortes ;
native-ped-traffic pour population, ownership, événements et télémétrie ;
native-vehicle-traffic pour candidats routiers et continuité véhicule ;
setPlayerWantedLevel pour HUD/RPC ;
- bridges damage/bike-jack comme modèles d’authentification.
Definition of Done
- crimes et wanted entièrement autoritaires serveur ;
- chaque policier poursuit un suspect explicite ;
- poursuite à pied/en véhicule, arrestation, résistance, mort et perte de cible convergent ;
- renforts et roadblocks respectent les caps par suspect ;
- toute unité est handoffée atomiquement ;
- aucun code Neon ne dépend du singleton wanted local pour décider ;
- aucune tâche nécessitant un vrai
CCopPed n’est installée sur un script-ped ;
- harness deux clients, owner quit/freeze et soak multijoueur passent ;
- resources, leases, syncers, tâches, modèles et éléments sont entièrement nettoyés ;
- documentation et télémétrie décrivent les limites restantes.
Discipline de livraison
Chaque commit doit préciser le prompt/but, la motivation, le modèle d’autorité, les invariants de handoff, les oracles GTA audités, ainsi que les builds et scénarios runtime réellement testés.
Passage prioritaire et sirène
La police autoritaire doit aussi publier un contexte sémantique emergency-passage lorsqu’une unité active sa sirène : unité et suspect ciblé, epoch/nonce, position, direction, vitesse, rayon et TTL. Ce contexte est fenced côté serveur et ne transfère pas l’autorité du véhicule civil à l’unité de police.
Intégration avec l’IA trafic (#92) : le propriétaire de chaque véhicule civil admissible valide ce contexte puis exécute localement une réaction temporaire de type attente/freinage/écart latéral, inspirée de CCarAI::MakeWayForCarWithSiren, tandis que MTA réplique le mouvement résultant. Dédupliquer les passages répétés et ignorer les véhicules d’urgence, unités engagées, véhicules non pilotés ou branches incompatibles.
Critère d’acceptation : une unité en poursuite avec sirène traverse un trafic multi-owner sans collision systématique, sans retargeting du suspect, sans double réaction après replay/handoff et sans commande directe sur un véhicule possédé par un autre client.
Objectif
Implémenter la chaîne singleplayer complète et synchronisée :
crime observé → signalement → wanted autoritaire → déploiement policier → poursuite → arrestation/combat/perte de cible → désengagementLe serveur reste l’unique autorité sur les crimes, suspects, niveaux de recherche, affectations policières et résultats d’arrestation. Un seul client exécute l’IA GTA native d’une unité policière ; les autres clients observent le résultat via la synchronisation MTA existante.
État actuel
Neon possède déjà :
native-task-runtime;setPlayerWantedLevel.Le harness interdit actuellement les comportements policiers réels dans
test-resources/native-ped-traffic/client.lua:TASK_SIMPLE_ARREST_PED;TASK_COMPLEX_ARREST_PED;TASK_SIMPLE_BE_ARRESTED;TASK_COMPLEX_POLICE_PURSUIT;TASK_COMPLEX_BE_COP;TASK_COMPLEX_KILL_CRIMINAL;TASK_COMPLEX_COP_IN_CAR.VEHICLE_HIT_AND_RUNest également exclu du checkpoint collision danstest-resources/native-ped-traffic/README.md.MTA désactive globalement les systèmes vanilla correspondants dans
Client/multiplayer_sa/CMultiplayerSA.cpp, notamment les roadblocks,CCrime::ReportCrimeet les mises à jour deCWanted.Contrainte d’architecture critique
Ces patches ne doivent pas être simplement retirés. Le wanted GTA est un singleton local et ne peut pas représenter plusieurs suspects réseau indépendants.
De plus :
CTaskComplexPolicePursuitchoisit lui-même un joueur, consulteFindPlayerWanted()et suppose un véritableCCopPed;CTaskComplexArrestPeddépend également deFindPlayerWanted(),IsClosestCop()etped->AsCop();CPlayerPed, pas desCCopPed.Références :
gta-reversed-dryxio/source/game_sa/Tasks/TaskTypes/TaskComplexPolicePursuit.cpp;gta-reversed-dryxio/source/game_sa/Tasks/TaskTypes/TaskComplexArrestPed.cpp;Client/game_sa/TaskGoToSA.cpp, où le scanner deWanderCopest déjà neutralisé pour cette raison.La solution doit composer des tâches target-scoped compatibles script-peds, sans accès au singleton wanted local et sans cast
CCopPed.Architecture cible
Registre serveur autoritaire
Créer un resource/module isolé
native-wanted-policepossédant quatre registres bornés :Deux suspects proches doivent toujours conserver des états, budgets, unités et targets séparés.
Pipeline de crimes
Sources MVP :
VEHICLE_HIT_AND_RUN;Les infractions routières avancées restent optionnelles tant que leur validation serveur n’est pas fiable.
Ordre de confiance :
Chaque proposition doit valider owner, epoch, nonce, génération d’élément, syncer, monde, distance/vitesse, arme/véhicule/siège/victime, cadence et timestamp serveur. Les anciens epochs et doublons sont refusés.
Témoins et signalement
Utiliser les distances retail comme profil initial : 14 m ordinaire, 30 m pour destruction de véhicule, 60 m pour explosion ou destruction aérienne (
gta-reversed-dryxio/source/game_sa/Crime.cpp).Un policier autoritaire à portée signale immédiatement. Sinon, le serveur sélectionne des témoins résidents et demande uniquement à leur owner une observation native bornée. Les crimes non vus expirent ; un crime confirmé est signalé exactement une fois.
La file retail de 16 crimes, le délai de 500 ms et l’expiration de 10 s dans
Wanted.cppservent de référence, mais les files Neon doivent être bornées par suspect, pas globalement.Calcul wanted
Reproduire en Lua pur testé les poids de
CWanted::ReportCrimeNowet les seuils deWanted.cpp.<= 50> 50> 180> 550> 1200> 2400> 4600Le decay est serveur et dépend de la visibilité réelle, des contacts récents, de la police proche et des nouveaux crimes. Le RPC wanted existant sert au HUD et à la compatibilité Lua, jamais à la décision IA.
Runtime policier target-scoped
Ajouter une primitive resource-scoped de haut niveau, par exemple :
Le C++ doit composer uniquement des primitives script-ped-safe :
CWantedlocal ;CCopPed.Les leases sont resource-scoped et libérés lors de la destruction des éléments ou de l’arrêt de la ressource.
Poursuite à pied
Machine d’état :
dispatch → approach → confront → pursue → arrest_attempt | combat | target_lost → search → disengage/reacquireLe serveur choisit toujours le suspect. Un policier ambient peut être réquisitionné puis rendu à sa population. Mort, quit, changement de monde et wanted zéro terminent proprement la mission.
Arrestation et résistance
L’arrestation traverse deux autorités : owner de l’unité policière pour l’approche, client du suspect pour l’état physique
BE_ARRESTED.Handshake requis :
arrest-readyavec epoch/nonce ;addLocalPlayerNativeBeArrested(...);Tirer, infliger un dégât, accélérer hors enveloppe, remonter dans un véhicule ou entrer dans une réponse physique prioritaire produit une résistance et reprend atomiquement la poursuite.
Prison, téléport, pénalité et perte d’armes restent configurables pour ne pas casser les gamemodes.
Police en véhicule
Une voiture de police est une cohorte mono-owner : véhicule, conducteur, partenaire éventuel et suspect comme dépendance read-only.
Transitions minimales :
Renforts et niveaux de réponse
Budgets par suspect :
Modèles, armes et véhicules viennent d’un catalogue serveur versionné. Les hélicoptères/bateaux sont une dépendance explicite au chantier véhicules spéciaux tant qu’ils ne sont pas supportés.
Roadblocks
Ne pas réactiver directement
CRoadBlocks::GenerateRoadBlocks.Le serveur sélectionne la route probable, demande à un client un candidat natif hors caméra, collecte les veto visibilité/collision, crée des éléments MTA, place toute l’équipe dans une cohorte unique et possède TTL/cleanup. Référence géométrique :
gta-reversed-dryxio/source/game_sa/RoadBlocks.cpp.Handoff atomique
Réutiliser les invariants de
native-task-runtime: handle stable, epoch monotone, nonce, release-before-acquire et ACK du current owner.Snapshot minimal : suspect, phase, wanted, dernière position connue, rôle/health/armor/weapon/ammo/siège/task sémantique des membres, état des véhicules, arrest handshake et roadblock role.
Tous les policiers, partenaires et véhicules changent d’owner ensemble. Le handoff d’un client connecté mais figé dépend du heartbeat/reassignment P0 et bloque la qualification production.
API serveur proposée
Événements :
Les APIs sont ACL/resource-scoped.
Checkpoints ordonnés
C0 — Contrats et oracles
Documenter états/invariants, extraire les tables crime/chaos/wanted retail, écrire les tests Lua purs et fixer la coexistence avec les gamemodes utilisant
setPlayerWantedLevel.Sortie : mapping déterministe de tous les crimes, seuils et caps.
C1 — Ledger crime/wanted serveur
Registres, déduplication, file/expiration/decay, publication HUD et diagnostics, sans policier actif.
Sortie : deux joueurs accumulent/perdent leur wanted indépendamment sans divergence.
C2 — Témoins et sources de crimes
Tirs, visée, dégâts, morts, vols, observation native et
VEHICLE_HIT_AND_RUN.Sortie : crime non vu non signalé, crime vu signalé une fois, anciens epochs refusés.
C3 — Primitive C++ policier script-safe
Lease resource-scoped, cible explicite, aucune dépendance à
FindPlayerWanted/CCopPed, diagnostics et cleanup.Sortie : harness deux clients prouvant qu’un cop poursuit uniquement le suspect assigné.
C4 — Poursuite à pied et perte de cible
Réquisition ambient, approche, poursuite, combat, recherche, reacquisition et désengagement.
Sortie : cycle complet sans tâche orpheline ni changement implicite de cible.
C5 — Arrestation/résistance
Handshake policier/victime,
BE_ARRESTEDlocal, résistance et résultat configurable.Sortie : arrestation et résistance convergent avec deux owners différents.
C6 — Unités en véhicule
Conducteur, partenaire, voiture, transition véhicule/pied et reprise après destruction.
Sortie : cohorte toujours mono-owner, sans siège ou tâche dupliqué après handoff.
C7 — Renforts niveaux 1–6
Budgets par suspect, loadouts, SWAT/FBI/armée et allocation équitable.
Sortie : caps respectés et cleanup complet au retour à zéro.
C8 — Roadblocks
Candidat natif, veto caméra/collision, équipe atomique, TTL et cleanup.
Sortie : aucun pop visible, élément abandonné ou mauvais suspect.
C9 — Handoff, heartbeat et soak
Handoff à pied/en voiture/pendant arrestation, owner quit/freeze, 10–20 joueurs et plusieurs suspects.
Sortie : zéro split ownership, double IA, ancien paquet accepté ou croissance non bornée.
Critères d’acceptation transversaux
Risques principaux
CCopPed;FindPlayerPedou le wanted local ;Dépendances
Bloquantes avant production :
Briques réutilisables :
native-task-runtimepour epochs/cohortes ;native-ped-trafficpour population, ownership, événements et télémétrie ;native-vehicle-trafficpour candidats routiers et continuité véhicule ;setPlayerWantedLevelpour HUD/RPC ;Definition of Done
CCopPedn’est installée sur un script-ped ;Discipline de livraison
Chaque commit doit préciser le prompt/but, la motivation, le modèle d’autorité, les invariants de handoff, les oracles GTA audités, ainsi que les builds et scénarios runtime réellement testés.
Passage prioritaire et sirène
La police autoritaire doit aussi publier un contexte sémantique
emergency-passagelorsqu’une unité active sa sirène : unité et suspect ciblé, epoch/nonce, position, direction, vitesse, rayon et TTL. Ce contexte est fenced côté serveur et ne transfère pas l’autorité du véhicule civil à l’unité de police.Intégration avec l’IA trafic (#92) : le propriétaire de chaque véhicule civil admissible valide ce contexte puis exécute localement une réaction temporaire de type attente/freinage/écart latéral, inspirée de
CCarAI::MakeWayForCarWithSiren, tandis que MTA réplique le mouvement résultant. Dédupliquer les passages répétés et ignorer les véhicules d’urgence, unités engagées, véhicules non pilotés ou branches incompatibles.Critère d’acceptation : une unité en poursuite avec sirène traverse un trafic multi-owner sans collision systématique, sans retargeting du suspect, sans double réaction après replay/handoff et sans commande directe sur un véhicule possédé par un autre client.