LifePlay-Revival/Docs/Migration/etat/PROP/PROP-BUG.md

120 lines
5.8 KiB
Markdown
Raw Permalink Normal View History

# ERR-043 — Seul le verre reste apparent
**ID registre :** ERR-043
**Lot :** PROP
**Date signalement :** 2026-10-08
**Gravité :** moyenne (visuel)
**Statut :** corrigé en code (CHG-244) — **à valider en PIE**
**Fiches liées :** [PROP-CART](PROP-CART.md) (dumps / graphes), CHG-243 (ERR-008 MapMarkers, corrélé), ERR-011 (bruit `No SkeletalMesh`)
---
## 1. Symptôme
Dans un lieu intérieur (ex. pub `pub___vin01`), un PNJ en animation quotidienne avec accessoire (`drinkglass`, parfois suivi d’une autre pose) laisse **le verre (prop StaticMesh) visible** alors que :
1. le **corps** du personnage a disparu (mesh skeletal vide / dummy recyclé), ou
2. le personnage est encore là mais un **verre flotte** à hauteur de torse / tête, détaché de la main (souvent pendant qu’il tient déjà un autre prop, ex. carnet `write`).
Phrase utilisateur : *« seul le verre reste apparent »*.
| Capture | Contenu |
|---|---|
| Verre orphelin + barmaid | Verre à pied opaque blanc flottant devant le buste ; PNJ visible avec bloc-notes |
| Cliente qui boit | État nominal : corps + verre à la bouche (référence du comportement attendu) |
Chemins Cursor (session) :
`…/assets/…image-d4b12d9d-651a-4448-b327-8c6923b9a1e0.png`,
`…/assets/…image-c2441b41-47f4-4c3a-9cad-0120376c2833.png`.
---
## 2. Reproduction
1. Lancer PIE (carte `CentralLondon`), entrer dans un **pub**.
2. Laisser les PNJ play daily (`drinkglass` / occupations meubles).
3. S’approcher d’un PNJ **ou** changer de lieu (déclenche `DestroyDummies`).
4. Observer : spam log `GetSocketInfoByName(…): No SkeletalMesh for Component(CharacterMesh0)` sur `Person_C_*`, messages `test0204 DestroyDummies` / `test0304 DESTROY…`, et éventuellement verre flottant.
**Preuve session :** `Saved/Logs/LifePlay.log` (PIE 2026-10-07→08) — premier warning mesh vide ~l.5331 (`22.39.21`), **~21 083** occurrences dans la session, acteurs `Person_C_0`…`Person_C_5`.
---
## 3. Cause racine
### 3.1 Cycle de vie des props
| Étape | Blueprint | Comportement |
|---|---|---|
| Apparition | `Person::spawnProp` | `AddComponent` (`NODE_AddStaticMeshComponent-0`) → `AttachToComponent(Mesh, Socket)` → `SetStaticMesh` → ajout au tableau **`Props`** |
| Nettoyage prévu | `Person::clearProps` | détruit les SMC de `Props` + enfants SMC de `Mesh`, vide le tableau |
| Recycle dummy | `GI::destroyDummy` | `SetActorHiddenInGame(true)` → `ResetVars` → transform origine → `unOccupyFnt` — **n’appelle pas `clearProps`** |
Le verre n’est **pas** un acteur séparé : c’est un composant du `Person`. Quand `CharacterMesh0` n’a plus de `SkeletalMesh`, le corps disparaît ; les SMC de props peuvent rester le seul rendu.
### 3.2 Chaîne observée
```
DestroyDummies
→ destroyDummy(Person) // sans clearProps
→ CharacterMesh0.SkeletalMesh = None
→ warnings GetSocketInfoByName(head|pelvis|…)
→ verre (Props / SMC attaché) encore visible
```
Dumps : `etat/PROP/PROP_LPDumpFunction_20261008-010449` (`spawnProp`), `-010554` (`clearProps`), `-010647` (`destroyDummy`). Détail dans PROP-CART §3.
### 3.3 Variante « PNJ encore visible + verre flottant »
Après un glitch mesh / changement d’anim (`drinkglass` → `write`) sans clear : le prop peut rester parenté au `Mesh` avec **socket None ou invalide** → position relative à l’origine du mesh (torse), d’où l’aspect « flottant ».
---
## 4. Non-causes (à ne pas re-investiguer pour ce symptôme)
| Piste | Verdict |
|---|---|
| ERR-008 `MapMarkers.WidgetComponents[0]` | **Corrélée** à l’approche (`updateAllPersonButtons` → `SpawnMapMarkers`), **pas** la cause du verre. Atténuée CHG-243. |
| `Person::updateButtonSize` | Masque seulement **`ButtonSM`** (bouton de nom), pas le corps ni les props. |
| Réglages VQ / `LPSettingsSubsystem` | Aucune lecture de `Props` / `spawnProp` / mesh Person. |
| ERR-011 `No SkeletalMesh` « normal » | Bruit accepté en 4.27/5.5 ; ici le **pic** au DESTROY + props non clear = bug distinct. |
| Verres blancs opaques sur les étagères | Matériau / translucency — hors ERR-043. |
---
## 5. Correctif
| Élément | Détail |
|---|---|
| CHG | **CHG-244** |
| Code | `Source/LifePlay/LPPersonPropGuardSubsystem.h/.cpp` |
| Mécanisme | Sous-système d’instance de jeu, tick ~0,2 s |
| Si Person caché **ou** Mesh sans asset skeletal | `ProcessEvent(clearProps)` + purge C++ du tableau `Props` + destruction des enfants SMC nommés `NODE_AddStaticMeshComponent*` (pas les vêtements `*SM`) |
| Si Person visible | Retrait des entrées `Props` orphelines (mauvais parent, socket None / inexistant) |
| BP modifiés | Aucun |
| Compile | `LifePlayEditor` Win64 Development **PASS** (2026-10-08) |
Alternative BP (non retenue pour ce lot) : appeler `clearProps` au début de `GI::destroyDummy` (et idéalement avant chaque nouveau `spawnProp` d’anim).
---
## 6. Critères d’acceptation
- [ ] Relancer l’éditeur avec la DLL CHG-244.
- [ ] Pub : PNJ qui boivent / changent d’occupation ; changer de lieu (DestroyDummies).
- [ ] Aucun verre flottant orphelin après DESTROY / disparition temporaire du corps.
- [ ] Log : au moins une ligne `PersonPropGuard : clearProps` ou `props orphelines` lors d’un recycle.
- [ ] Pas de régression vêtements (les SMC `*SM` ne doivent pas être détruits à tort).
---
## 7. Assets / références
| Objet | Chemin |
|---|---|
| Prop verre | `Content/Heavy/New3/Anims/Daily/Props/drinkglass_prop.uasset` |
| Anims | `…/Anims/Daily/drinkglass_F.uasset`, `drinkglass_M.uasset` |
| BP | `Content/BPs/Person.uasset` (`spawnProp`, `clearProps`), `Content/BPs/GI.uasset` (`destroyDummy`) |
| Registre | `Docs/Migration/Registre_Erreurs.md` → ERR-043 |
| Journal | `Docs/Migration/Journal_Modifications.md` → CHG-244 |