LifePlay-Revival/Docs/Migration/etat/PROP/PROP-BUG.md
2026-10-08 01:40:50 +02:00

119 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 |