119 lines
5.8 KiB
Markdown
119 lines
5.8 KiB
Markdown
# 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 |
|