81 lines
8.8 KiB
Markdown
81 lines
8.8 KiB
Markdown
# CAM-B0-IMPL : sonde MCP des capacités de la phase 2 (2026-10-13)
|
||
|
||
Lot CAM, sous-lot B0 (`CAM-SPEC.md` § (a) CAM-B0, Q16). BUILD-GO de Big Boss le 2026-10-13. Exécuté par la session CAM
|
||
(`local_cb58847a`), appels MCP un à un depuis la session, sans sous-agent `lp-mcp-bp`. **Aucun fichier suivi écrit.**
|
||
Mode de permission : auto ; **0 refus** du mode auto sur ≈ 75 appels MCP (création, écriture, compilation, enregistrement).
|
||
|
||
## 1. Déroulé
|
||
- Avant : 0 processus UE, port 8000 libre, `Content\Dev` absent ; `git status -- Content Source Config` = GI, Person,
|
||
TopRight en `M` (STE-H10).
|
||
- Éditeur headless (`lp-mcp` § 2) : PID 26368, journal `Saved\Logs\CAM-B0_editeur_20261013-074758.log` (hors git) ;
|
||
`Wait-HyperAIStudioMCP.ps1 -TimeoutSeconds 540` code 0 ; `unreal-mcp` visible dans la session sans reconnexion
|
||
(`get_current_level` = `/Game/Scenes/CentralLondon`).
|
||
- Création de `/Game/Dev/CAM_Probe` (Actor) et `/Game/Dev/CAM_Probe2` (Actor) ; essais ; `compile_blueprint`
|
||
(`warnings_as_errors` vrai) ; `save_assets` des 2 sondes seules ; `Stop-Process` (accepté) ; `UeState.ps1` = 0 ;
|
||
déplacement vers `D:\Game\LifePlay_Backup_5.5\CAM\B0\` ; `Content\Dev` vide retiré (`rmdir`).
|
||
- Écart : 2 appels `add_variable` envoyés en parallèle (contre « un appel à la fois ») ; tous deux réussis, sans effet.
|
||
- Journal brut des appels : `CAM-B0-journal.txt` (début de séance).
|
||
|
||
## 2. Résultats par capacité (R1 / R2 de la SPEC)
|
||
|
||
| # | Capacité | Résultat | Détail (type_id exact, éditeur en français) |
|
||
|---|---|---|---|
|
||
| 1 | `BlueprintTools.create` d'un Actor | fait | `asset_type` = `/Script/Engine.Actor` |
|
||
| 2 | `add_variable` bool, Vector | fait | `ProbeBool`, `ProbeVec` |
|
||
| 3 | `add_object_variable` CameraActor | fait | `CamRoom` (`/Script/Engine.CameraActor`) |
|
||
| 4 | `add_struct_variable` TimerHandle | fait | `ProbeTimer` (`/Script/Engine.TimerHandle`) — nécessaire au point 8 |
|
||
| 5 | `add_event` personnalisé | fait | `ProbeEvent` → `K2Node_CustomEvent_0` (broches `OutputDelegate` 0, `then` 1) |
|
||
| 6 | surcharge `ReceiveEndPlay` / `ReceiveBeginPlay` | fait | `add_event` rend un `K2Node_Event` (« Ajouterunévénement\|ÉvénementEndPlay ») ; BeginPlay rend le nœud fantôme existant |
|
||
| 7 | `SpawnActorFromClass` + `Class` = CameraActor | fait | `Jeu\|Faireapparaîtreunacteuràpartird'uneclasse` ; après `set_pin_value`, `ReturnValue` typé « Acteur De Caméra », broche `Instigator` ajoutée (index 6) |
|
||
| 8 | minuterie par événement `K2_SetTimerDelegate` | fait | `Utilitaires\|Temps\|SetTimerbyEvent` ; `OutputDelegate` → `Delegate` (1) ; `Time` (2) = 0,016, `bLooping` (3) vrai, `bMaxOncePerFrame` (4) vrai ; sortie `ReturnValue` (1) = TimerHandle |
|
||
| 9 | **`K2_ClearTimerDelegate`** | **ÉCHEC** | absent de `find_node_types` (« ClearTimer » → seul `ClearTimerbyFunctionName`) ; `create_node` « Utilitaires\|Temps\|ClearTimerbyEvent » → « The node could not be created / Utilitaires\|Temps\|ClearTimerbyEvent does not exist » |
|
||
| 9b | remplacement : arrêt par handle | fait | `SetTimerbyEvent.ReturnValue` → `Définir ProbeTimer` ; `Obtenir ProbeTimer` → `Utilitaires\|Temps\|ClearandInvalidateTimerbyHandle.Handle` (1) ; EndPlay → Clear |
|
||
| 10 | `SphereTraceSingle`, canal Camera | fait | `Collision\|SphereTraceByChannel` ; `TraceChannel` (4) = `TraceTypeQuery2` (relu par `get_pin_value`), `Radius` (3) = 12 ; sorties `OutHit` (1), `ReturnValue` (2) |
|
||
| 11 | `BreakHitResult` | fait | `Collision\|BreakHitResult`, entrée 0 ← `OutHit` |
|
||
| 12 | `VInterpTo`, `RInterpTo` | fait | `Math\|Interpolation\|VInterpTo` / `RInterpTo` ; entrées Current 0, Target 1, DeltaTime 2 (float), InterpSpeed 3 (= 8) |
|
||
| 13 | `GetWorldDeltaSeconds` | fait | `Utilitaires\|Temps\|GetWorldDeltaSeconds`, sortie double reliée à DeltaTime float (conversion acceptée) |
|
||
| 14 | `FindLookAtRotation` | fait | `Math\|Rotateur\|FindLookatRotation` → `RInterpTo.Target` |
|
||
| 15 | `GetComponentBounds`, `GetActorBounds` | fait | `Collision\|GetComponentBounds`, `Collision\|GetActorBounds` (créés, non câblés) |
|
||
| 16 | `GetSocketLocation` | fait | `Transformation\|GetSocketLocation` (créé, non câblé) |
|
||
| 17 | `GetScaledCapsuleHalfHeight` | fait | `Composants\|Capsule\|GetScaledCapsuleHalfHeight` |
|
||
| 18 | `Less_DoubleDouble` | fait | opérateur générique `Utilitaires\|Opérateurs\|Inférieurà(<)` (`K2Node_PromotableOperator`) ; devient `float<float` (double) dès qu'une entrée float est reliée ; `B` = 0,05 |
|
||
| 19 | `EqualEqual_ObjectObject` | fait | `Utilitaires\|Opérateurs\|Égalà(==)` ; devient `Equal(Object)` quand `CamRoom` est relié |
|
||
| 20 | addition, soustraction, multiplication de vecteurs | fait | `Utilitaires\|Opérateurs\|Ajouter` / `Soustraire` / `Multiplier` → `vector+vector`, `vector-vector` ; `Multiplier` accepte B double (vecteur × scalaire) ; chaîne reliée à `Définir ProbeVec` (exécutée) |
|
||
| 21 | affectation de `PostProcessSettings` d'un CameraComponent | fait | `Classe\|CameraComponent\|DéfinirPostProcessSettings` (`K2Node_VariableSet`, `self` 2, valeur 1) ← `Classe\|CameraComponent\|ObtenirPostProcessSettings` |
|
||
| 22 | `CamRoom.CameraComponent` | fait, par la catégorie `Classe` | `Variables\|Acteurdelacaméra\|ObtenirCameraComponent` (listé seulement avec `context_pins`) → « does not exist », même avec `declaring_class` ; **`Classe\|Acteurdecaméra\|ObtenirCameraComponent`** crée le getter (autre voie : `Acteur\|GetComponentbyClass` + `ComponentClass` = CameraComponent, sortie typée) |
|
||
| 23 | 2e BP : `VariableGet` d'une variable du 1er | fait, par la catégorie `Classe` | `Variables\|Pardéfaut\|ObtenirProbeBool` (rendu par `find_node_types(context_pins)`) → « does not exist », même avec `declaring_class` ; **`Classe\|CAMProbe\|ObtenirProbeBool`** crée le getter (`self` 0 ← variable `Probe`) |
|
||
| 24 | 2e BP : appel de `ProbeEvent` | fait | `Classe\|CAMProbe\|ProbeEvent` (`self` 1) ; BeginPlay → Branche(`ProbeBool`) vrai → appel |
|
||
| 25 | `compile_blueprint` | fait | CAM_Probe ×3, CAM_Probe2 ×1, `warnings_as_errors` vrai : aucune exception ; journal : « Compiling Blueprint » sans erreur ni avertissement Blueprint |
|
||
| 26 | `save_assets` (2 sondes seules) | fait | `true` |
|
||
|
||
Réserve : les nœuds purs non reliés à une exécution (bornes, socket, capsule, `<`, `==`, `FindLookAtRotation`,
|
||
`VInterpTo`, `RInterpTo`, `BreakHitResult`) sont créés avec leurs broches typées, mais un nœud pur non relié est écarté
|
||
par le compilateur : leur compilation n'est donc pas prouvée par B0 (seule la chaîne
|
||
`ProbeEvent` → PostProcess → SphereTrace → `ProbeVec` := ((v + v) − v) × DeltaSeconds l'est).
|
||
|
||
## 3. Conséquences pour la SPEC (à reporter avant B1)
|
||
1. **B1-13, B2-6** : remplacer `K2_ClearTimerDelegate(UpdateRoomCam)` par un handle : variable `RoomCamTimer`
|
||
(TimerHandle) affectée par la sortie de `K2Node_CallFunction_329` (minuterie existante de Room), puis
|
||
`ClearandInvalidateTimerbyHandle(RoomCamTimer)`. À vérifier en B1 : la sortie `ReturnValue` du nœud 329 existant.
|
||
2. **Accès aux membres d'un autre BP** (`GI.SexOn`, `GI.Room`, `GI.PlayerCharacter`, `GI.PC`, `GI.Wall`, `GI.BuilderOn`,
|
||
`GI.SpaceOn`, `CamRoom.CameraComponent`, appels `Room_C::ApplyRoomCamera` depuis PC / GI) : utiliser les type_id
|
||
`Classe|<Classe affichée>|Obtenir<Var>` / `Définir<Var>` / `<Fonction>` (sans contexte), pas ceux rendus par
|
||
`find_node_types(context_pins)`. Le nom affiché de la classe est localisé et sans tiret bas (`CAMProbe`, `Acteurdecaméra`) :
|
||
le relire par `find_node_types` avec le filtre `<Nom>|` avant chaque sous-lot.
|
||
3. Comparateurs et opérations vectorielles : opérateurs génériques `Utilitaires|Opérateurs|…`, typés par la 1re liaison ;
|
||
relier l'entrée avant `set_pin_value`.
|
||
4. Le mode auto n'a refusé aucun appel MCP d'écriture fait **par la session elle-même** (les 4 refus de STE visaient
|
||
`lp-mcp-bp` en sous-agent ou un relais entre sessions) : même voie recommandée pour B1-B5.
|
||
|
||
## 4. Contrôles de fin (BUILD-FIN)
|
||
| Contrôle | Résultat |
|
||
|---|---|
|
||
| MD5 GI / Person / TopRight / Room / PC | `71034A04…` / `D1B4C63D…` / `1FCB94A6…` / `E8F58B2A…` / `09F54974…` : inchangés |
|
||
| Sondes, avant → après déplacement | `CAM_Probe.uasset` `CAAF5D9E48616DBC3281BB703DDA1DB0` → identique ; `CAM_Probe2.uasset` `A5F598B2C3F76DECE8623A5783D9B382` → identique ; sous `D:\Game\LifePlay_Backup_5.5\CAM\B0\` |
|
||
| `Content\Dev` | absent (2 fichiers déplacés, dossier vide retiré) |
|
||
| `git status --short -- Content Source Config` | GI, Person, TopRight en `M` (STE-H10) : identique à l'avant |
|
||
| Processus | `UeState.ps1` : processus=0 éditeur=0 compilation=0 shaders=0 jeu=0 |
|
||
| Autosaves | `Saved\Autosaves\Game\BPs` = Room_Auto2, TestStatic_Auto1 (anciens), aucun de la sonde |
|
||
|
||
Fichiers écrits : `etat\CAM\CAM-B0-IMPL.md`, `etat\CAM\CAM-B0-journal.txt`, `etat\CAM\CAM-TACHES.md` (ligne B0).
|
||
Hors git : journal de l'éditeur sous `Saved\Logs\`, sondes sous `Backup_5.5\CAM\B0\`.
|