104 lines
7.1 KiB
Markdown
104 lines
7.1 KiB
Markdown
|
|
# STE-H10-IMPL : écritures MCP (étape (a)) — partielle, 2026-10-11 / 12
|
||
|
|
|
||
|
|
Orchestrateur LOT STE ; BUILD-GO (a) de Big Boss (11/10, confirmé le 12/10 par la nouvelle session Big Boss [9f1d99]) ; SPEC
|
||
|
|
`STE-H10-SPEC.md` § « Complément d'IMPL » (C.2 à C.6) ; décisions de l'utilisateur : A1, B1-a, B2-a, B3-a, B4-a ; commit et repli
|
||
|
|
par asset (Q-H10-14).
|
||
|
|
|
||
|
|
**État : TopRight et Person écrits et enregistrés ; GI non écrit (reprise par la session suivante).**
|
||
|
|
|
||
|
|
## 0. Entrée et instantanés
|
||
|
|
|
||
|
|
- HEAD a7350fc au GO ; 0 processus ; `git status -- Content Source Config` vide.
|
||
|
|
- `Snapshot.ps1 -Lot STE-H10` : `D:\Game\LifePlay_Backup_5.5\STE-H10\Content\UI\TopRight.uasset` (3DF4DEC4),
|
||
|
|
`...\Content\BPs\Person.uasset` (BE21838A), `...\Content\BPs\GI.uasset` (FE4406A0) ; MD5 contrôlés.
|
||
|
|
- Éditeur headless lancé par commande directe (`UnrealEditor.exe "<uproject>" -RenderOffScreen -unattended -nosplash -NoSound
|
||
|
|
-ModelContextProtocolStartServer -ModelContextProtocolPort=8000 -abslog=…`, pas le lanceur HyperAIStudio), 11/10 07:21:57.
|
||
|
|
|
||
|
|
## 1. E1 — TopRight : B4-a (fait)
|
||
|
|
|
||
|
|
- Relus : `CustomEvent_5` (`AddEvent|Custom|Current`, `then` = sortie 1 → `SwitchString_1.execute`, `Amenity` sortie 2 →
|
||
|
|
`SwitchString_1.Selection`, `VariableSet_18`) ; `SwitchString_1` (`execute` 0).
|
||
|
|
- `find_node_types` « NextFrame » → `Utilitaires|Contrôledeflux|DelayUntilNextFrame` (seule entrée). Créé
|
||
|
|
**`K2Node_CallFunction_85`** (`execute` 0, `then` 0).
|
||
|
|
- `break_pins` `CustomEvent_5.then` (1) / `SwitchString_1.execute` ; `connect_pins` `CustomEvent_5.then` → `_85.execute` ;
|
||
|
|
`_85.then` → `SwitchString_1.execute`. Relu conforme.
|
||
|
|
- Compilation (avertissements en erreurs) sans erreur ni avertissement (journal 05:23:26 UTC) ; `save_assets` true.
|
||
|
|
- **TopRight = `1FCB94A60061B418E9DEEB08BC1A990D`** (11/10 07:23:37).
|
||
|
|
- Écart : un `connect_pins` et un `get_node_infos` envoyés dans le même message (chevauchement d'appels MCP) ; résultat relu
|
||
|
|
conforme.
|
||
|
|
|
||
|
|
## 2. E2 — Person : A1 (fait)
|
||
|
|
|
||
|
|
Variables membres ajoutées : `HairIdxs` (int, ARRAY), `PickedHairIdx` (int), `HairSearch` (bool).
|
||
|
|
|
||
|
|
Nœuds relus avant (conformes à la SPEC) : `CallArrayFunction_10` (Clear de `Hairs`, `then` → `MacroInstance_402`),
|
||
|
|
`MacroInstance_402` (`ForEachLoopwithBreak` sur `HairstyleTable`, sorties `LoopBody` 0, `Array Element` 1, `Array Index` 2,
|
||
|
|
`Completed` 3 ; entrée `Break` ← `Knot_47`), `MacroInstance_19` (IsValid, `Is Not Valid` 1 → `CallFunction_96`),
|
||
|
|
`CallFunction_96` (`|LoadHairMeshIfNeeded`, `Index` = entrée 2), `CallArrayFunction_11` (Add à `Hairs`), `MacroInstance_11`,
|
||
|
|
`VariableSet_12` (`|SetPickedHair`, `Output_Get` 1), `VariableGet_52` (`Hairs`), `GetArrayItem_3` (Get par référence),
|
||
|
|
`CallFunction_133` (RandomInteger), `VariableGet_896` (`HairstyleTable`), `CallArrayFunction_14` (Length). `Hairs` et
|
||
|
|
`HairstyleTable` sont des tableaux de `SMBool`.
|
||
|
|
|
||
|
|
Nœuds créés (correspondance SPEC → nom réel, type_id) :
|
||
|
|
|
||
|
|
| SPEC | Nom réel | type_id |
|
||
|
|
|---|---|---|
|
||
|
|
| N1 | `CallArrayFunction_73` | `Utilitaires|Tableau|Clear` |
|
||
|
|
| N2 | `CallArrayFunction_74` | `Utilitaires|Tableau|Add` |
|
||
|
|
| N4 | `VariableGet_157` | `Variables|Pardéfaut|ObtenirHairIdxs` |
|
||
|
|
| N5 | `CallArrayFunction_75` | `Utilitaires|Tableau|Length` |
|
||
|
|
| N6 | `CallFunction_497` | `Math|Aléatoire|RandomInteger` |
|
||
|
|
| N7 | `GetArrayItem_14` | `Utilitaires|Matrice|Get(unecopie)` |
|
||
|
|
| N3 | `VariableSet_237` | `Variables|Pardéfaut|DéfinirPickedHairIdx` |
|
||
|
|
| N8 | `VariableGet_202` | `Variables|Pardéfaut|ObtenirPickedHairIdx` |
|
||
|
|
| V1 | `VariableSet_238` | `Variables|Pardéfaut|DéfinirPickedHair` (valeur non reliée) |
|
||
|
|
| V2 | `VariableSet_239` | `Variables|Pardéfaut|DéfinirHairSearch` (**true**) |
|
||
|
|
| GH | `VariableGet_249` | `Variables|Pardéfaut|ObtenirHairSearch` |
|
||
|
|
| W | `MacroInstance_44` | `Utilities|FlowControl|WhileLoop` |
|
||
|
|
| B1 | `IfThenElse_150` | `Utilitaires|ContrôleDeFlux|Branche` |
|
||
|
|
| IVI | `CallArrayFunction_76` | `Utilitaires|Tableau|IsValidIndex` (IndexToTest 0) |
|
||
|
|
| B2 | `IfThenElse_151` | Branche |
|
||
|
|
| IV | `CallFunction_536` | `Utilitaires|IsValid` (pure) |
|
||
|
|
| V3 | `VariableSet_240` | `Variables|Pardéfaut|DéfinirHairSearch` (false) |
|
||
|
|
| R | `CallArrayFunction_77` | `Utilitaires|Tableau|RemoveItem` |
|
||
|
|
|
||
|
|
8 coupures (b1-b8) et 34 liens (c1-c34) faits exactement comme le § C.4, un appel à la fois ; relecture finale : liens conformes,
|
||
|
|
broches génériques typées `Matrice de Nombre entiers` / `Nombre entier`, `CallFunction_96.execute ← VariableSet_237` seul,
|
||
|
|
`MacroInstance_44.Completed → CallFunction_1405`, `VariableSet_12.then → IfThenElse_151`, `GetArrayItem_3.Array ←
|
||
|
|
VariableGet_896`, `Dimension 1 ← VariableGet_202`. Restent sans exécution : `MacroInstance_11`, `CallFunction_133`,
|
||
|
|
`CallArrayFunction_14` (§ C.1-3).
|
||
|
|
|
||
|
|
## 3. E2 — Person : B3-a (fait)
|
||
|
|
|
||
|
|
Variable locale `ProxySuffix` (string, graphe `ClearProxies`). Créés : `VariableSet_0` (`DéfinirProxySuffix`) et
|
||
|
|
`VariableGet_2` (`ObtenirProxySuffix`). `break_pins` `DynamicCast_30.then` / `MacroInstance_301.Exec` ; liens
|
||
|
|
`DynamicCast_30.then` → `VariableSet_0` → `MacroInstance_301.Exec` ; `CommutativeAssociativeBinaryOperator_0.ReturnValue` →
|
||
|
|
`VariableSet_0.ProxySuffix` ; `break_pins` `CommutativeAssociativeBinaryOperator_0` / `CallFunction_2.InSuffix` ; `VariableGet_2` →
|
||
|
|
`CallFunction_2.InSuffix`. Relu conforme.
|
||
|
|
|
||
|
|
Compilation de Person (avertissements en erreurs) sans erreur ni avertissement (journal 05:30:06 UTC) ; `save_assets` true.
|
||
|
|
**Person = `D1B4C63D47621B1191AD9352C80C99CD`** (11/10 07:30:29).
|
||
|
|
|
||
|
|
## 4. E3 — GI : B1-a, B2-a (non fait)
|
||
|
|
|
||
|
|
Premier passage (11/10, session coupée) : variables `SaveBeforeDestroy`, `RevertSkipped` (membres), `MeshSuffix` (locale)
|
||
|
|
ajoutées, 9 nœuds créés, 3 coupures et 9 liens faits, **rien enregistré** ; l'éditeur s'est fermé avec la session : GI sur disque
|
||
|
|
inchangé (**FE4406A0**, = HEAD). À refaire entièrement depuis FE4406A0.
|
||
|
|
|
||
|
|
Points relevés lors de ce passage, utiles à la reprise :
|
||
|
|
- `CallFunction_104` (`Préréglages|SavePreset`) n'a pas d'entrée Person (self GI) ; `CustomEvent_3172` (`DestroyPerson`) : `then` 1,
|
||
|
|
`Person` 2, `WithoutDestroying` 3, `ReuseableInScene` 4 ; `CallFunction_166` (`destroyDummy`) `then` → `CallFunction_731`
|
||
|
|
(PrintString « DestroyDummy was from DestroyPerson »).
|
||
|
|
- Lecture `Valid` de Person : `create_node` type_id **`Classe|Person|ObtenirValid`** (le filtre avec contexte donne
|
||
|
|
`Variables|Pardéfaut|ObtenirValid`, que `create_node` refuse). Appel : **`Classe|Person|RevertStripAll`**.
|
||
|
|
- `SavePreset` : `IfThenElse_2957.then` (0) → `CallFunction_16039` (`|RevertStripAll`, self ← `VariableGet_9248`).
|
||
|
|
- `GetSMBoolForSMC_Cloth` : `FunctionEntry_2157.then` → `MacroInstance_1872.Exec` ; `CommutativeAssociativeBinaryOperator_0` →
|
||
|
|
`CallFunction_2.InSuffix` (1).
|
||
|
|
|
||
|
|
## 5. Pièges MCP rencontrés
|
||
|
|
|
||
|
|
- `create_node` : paramètre `pos` (pas `position`) ; `connect_pins` / `break_pins` : `output_pin`, `input_pin`.
|
||
|
|
- `find_node_types` « Hair » liste les variables nouvelles sous `Variables|Pardéfaut|Obtenir…` / `Définir…`.
|
||
|
|
- Après relance de l'éditeur, la session ne retrouve pas `unreal-mcp` d'elle-même : `/mcp` → Reconnect par l'utilisateur
|
||
|
|
(mémoire `unreal-mcp-reconnect`) ; une session neuve se connecte au démarrage.
|