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