L7a (CX-B10) : 56 noeuds Get SkeletalMesh deprecies remplaces par LPMeshCompat::GetSkeletalMesh (R-03, ERR-012)
Semantique exacte du getter moteur (Cast<USkeletalMesh>(GetSkinnedAsset())) pour tout USkinnedMeshComponent, contrairement a CX-B05. Diff avant/apres : 56/56 liaisons identiques, 0 autre objet modifie. Compilation 190 -> 6 avertissements, cuisson 95 -> 3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
665e1633e9
commit
5d1f9a142f
13 changed files with 167 additions and 42 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -141,7 +141,7 @@ Ordre indicatif, à réviser selon le registre :
|
|||
|
||||
| Lot | Famille | Périmètre |
|
||||
|---|---|---|
|
||||
| L7a | R-03 refait correctement | `GetSkinnedAsset()` pour les proxies ; 56 nœuds, 10 Blueprints |
|
||||
| L7a | R-03 refait correctement | ✅ outil et réimport faits (CX-B10, 56 nœuds, 8 Blueprints) ; validation en jeu en attente |
|
||||
| L7b | Erreurs d'exécution fréquentes | `ParseIntoArray`, `getBeautyValue`, `standIdle`, `ContactMenu` |
|
||||
| L7c | Configuration | clés de nativisation, rendu 5.5 explicite (GI, ombres, RHI) |
|
||||
| L7d | Visuel | AtmosphericFog → SkyAtmosphere ; reconstruction de l'éclairage |
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ exporté dans `Docs/Migration/correctifs/` pour relecture.
|
|||
| CX-B06 | `LPFixDeprecatedNodes` (R-04) | 6 nœuds, `AI`, `Person`, `Room` | `LPNavigationHelpers` | avertissements de dépréciation seulement | 5 | reporté (L7) |
|
||||
| CX-B08 | `LPFixParseIntoArray` (nouveau) | 114 nœuds `ParseIntoArray`, 17 Blueprints | rebranchés sur `LPStringCompat::ParseIntoArray` (algorithme UE 4.27) | UE5 renvoie `[""]` pour une chaîne vide : cause d'ERR-027 (personnages de quête invisibles/dévêtus) | 1 | **réimporté** (CHG-029), validé en jeu |
|
||||
| CX-B09 | `LPFixButtonPadding` (nouveau) | 430 `UButton`, 46 Widget Blueprints | marges des boutons remises au défaut UE 4.27 (Normal 2,2,2,2 ; Pressed 2,3,2,1), composante par composante | le style par défaut de `UButton` est passé à 12 px horizontaux en UE5 (`FUMGCoreStyle`) ; les assets 4.27 ne stockent pas la marge par défaut : cause d'ERR-034 (barre de temps décalée) | 1 | **réimporté** (CHG-033), validé en jeu |
|
||||
| CX-B10 | `LPFixSkeletalMeshGet` (nouveau) | 56 nœuds `Get SkeletalMesh`, 8 Blueprints (`Person` 28, `GI` 17, `CharGen` 3, `Inventory` 3, `Hairstyle` 2, `CharGenSlider`, `Cursor`, `Inventory_Cloth` 1) | remplacés par `LPMeshCompat::GetSkeletalMesh(Component)` = `Cast<USkeletalMesh>(GetSkinnedAsset())`, la sémantique exacte du getter déprécié, valable pour tout `USkinnedMeshComponent` | R-03 refait (L7a) ; remplace CX-B05 rejeté | 1 | **réimporté** (CHG-036) ; validation en jeu en attente |
|
||||
| CX-B07 | `LPResavePackages` (nouveau) | 239 paquets UE4 restants (`UI` 147, `Structs` 57, `BPs` 22, `Render` 11, `Characters` 1, `Scenes` 1) | format UE5, contenu inchangé | EX-03 ; T-STAT-01 | 6 | **réimporté** (CHG-035), diff avant/après neutre ; validation en jeu en attente |
|
||||
|
||||
## 3. Protocole de réimport sous contrôle renforcé
|
||||
|
|
|
|||
|
|
@ -502,3 +502,31 @@ Rattachement du dépôt local à l'historique publié (2026-09-30) : `.git` sauv
|
|||
propre du dépôt publié. Exclus : `Saved` (comme l'auteur), `Intermediate`, `McpAutomationBridge`, `.mcp.json`, `.claude`,
|
||||
captures d'écran, `.git` local. Test d'intégrité 7-Zip réussi. Script : `D:\Game\LifePlay_Publication\make_archive.cmd`.
|
||||
`README.md` réécrit en anglais avec le lien de l'archive.
|
||||
|
||||
---
|
||||
|
||||
## Lot L7a — R-03 refait : nœuds `Get SkeletalMesh` dépréciés (2026-09-30)
|
||||
|
||||
Analyse (source UE 5.5) : la lecture de `USkinnedMeshComponent::SkeletalMesh` passe par `GetSkeletalMesh_DEPRECATED()`,
|
||||
qui renvoie `Cast<USkeletalMesh>(GetSkinnedAsset())`. CX-B05 avait pris `USkeletalMeshComponent::GetSkeletalMeshAsset()`,
|
||||
qui n'existe pas sur les proxies (`USkinnedMeshComponent`) : d'où ERR-002 aggravé. Remplacement exact retenu :
|
||||
`ULPMeshCompat::GetSkeletalMesh(Component)`, même calcul, pour tout `USkinnedMeshComponent`. Inventaire structurel
|
||||
(instantané CX-B07) : 56 nœuds sources (les appels `GetSkeletalMesh_DEPRECATED` relevés ne sont que les copies compilées ;
|
||||
la variable `SkeletalMesh` de `GenitalSlider` est une variable Blueprint, non concernée).
|
||||
|
||||
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|
||||
|---|---|---|---|---|---|
|
||||
| CHG-036 | 2026-09-30 | L7a (CX-B10) | `Source/LifePlay/LPMeshCompat.h/.cpp`, `Source/LifePlayEditorTools/LPFixSkeletalMeshGetCommandlet.h/.cpp` (nouveaux), `Tools/DiffRemplacementNoeuds.py` ; 8 Blueprints (`etat/L7a_assets.txt`) | ERR-012 / R-03 : 56 nœuds dépréciés | `Tools\Restore.ps1 -Lot L7a` ; `git checkout L7a-avant -- Source Tools` |
|
||||
|
||||
| Contrôle | Résultat | Preuve |
|
||||
|---|---|---|
|
||||
| Simulation | 56 nœuds, 0 cas non pris en charge (cible `self`, nœud impur) | `etat/L7a_dryrun.txt` |
|
||||
| Application (contrôle intégré des liaisons) | 56/56 remplacés, 8 Blueprints sauvegardés, 0 écart | `etat/L7a_application.txt` |
|
||||
| Diff indépendant `LPDumpAssets` avant/après (`Tools/DiffRemplacementNoeuds.py`) | 56 paires (même graphe, même position) ; liaisons `self`→`Component` et `SkeletalMesh`→`ReturnValue` identiques pour 56/56 ; **0 autre objet modifié** (hors copies compilées, graphes anonymes régénérés, GUID, positions des graphes-souches, messages de compilation) | `Saved/Logs/portage/L7a_assets_{avant,apres}.txt` |
|
||||
| Chargement des 8 Blueprints | avertissements 112 → 6 | journaux `L7a_LPDumpAssets_*` |
|
||||
|
||||
Effet de mesure : le nœud d'origine émettait `Accessed None … SkeletalMesh` sur un composant None ; la nouvelle fonction
|
||||
renvoie None sans message (trace `LogLifePlay` en `Verbose`). Les compteurs `AccessedNoneMaillage` de `LogStats.ps1`
|
||||
baissent donc mécaniquement : comparer les sessions sur les autres signatures.
|
||||
| `CompileAllBlueprints` | 0 erreur, **6 avertissements** (190 avant) : restent seulement les 6 nœuds R-04 `GetRandomPointInNavigableRadius` (`AI`, `Person`, `Room`) | `etat/L7a_CompileAllBlueprints_*.txt` |
|
||||
| Build empaquetée `LifePlay_Build_5.5_L7a` | cuisson 0 erreur, **3 avertissements** (95 avant) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7a_BuildCookRun.log` |
|
||||
|
|
|
|||
|
|
@ -1,41 +1,41 @@
|
|||
# Registre des erreurs — migration 5.5
|
||||
|
||||
> Une ligne par signature d'erreur. Fréquence mesurée avec `Tools\LogStats.ps1` ; source indiquée.
|
||||
> Priorité = fréquence × gravité. Statut : ouvert · en cours · corrigé (CHG) · accepté (V1).
|
||||
|
||||
| ID | Signature | Source | Fréquence | Gravité | Lot cible | Statut |
|
||||
|---|---|---|---:|---|---|---|
|
||||
| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | clos (CHG-007) : remplacé par la base saine 4.27 complète ; format UE5 → ERR-022 |
|
||||
| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | corrigé statiquement (CHG-018) ; A/B d'exécution en attente |
|
||||
| ERR-021 | broche `Font` d'`EditableTextBoxStyle` : échec de compilation `UI/StatMenu`, `UI/CharGen` | `CompileAllBlueprints` L1 | 6 erreurs | **bloquante** (cuisson) | L4-CX-B02 | corrigé (CHG-022) |
|
||||
| ERR-022 | 293 packages de gameplay au format UE4 (base 4.27) | `Tools\AssetHeaders.ps1` | 293 | faible (converti au chargement) | L4-CX-B07 | **corrigé (CHG-035, CX-B07)** : 239 paquets réenregistrés (le nombre avait baissé de 293 à 239 grâce aux lots CX-B01 à B09) ; 8563/8563 paquets au format UE5 |
|
||||
| ERR-023 | `AndroidFileServer` réécrit sa section et son `SecurityToken` dans `DefaultEngine.ini` à chaque lancement | L1 | chaque lancement | faible (bruit git) | L2 | clos (CHG-011, CHG-012) |
|
||||
| ERR-024 | `McpAutomationBridge` (outil de développement) impose des plugins d'exécution (`GameplayAbilities`, `SmartObjects`, `Niagara`, `PythonScriptPlugin`…) et dépend de `StructUtils`, déprécié en 5.5 | UBT L2 | — | faible (livraison) | L7g | ouvert |
|
||||
| ERR-002 | `generatePerson()` sans argument : personnages identiques (« Tyrone »), nus, invisibles ; en PIE 5.5 chaque `index SPAWN` pointe vers `Person_C_0` | rapport 2026-09-28, journal PIE 09-28 | 16,6 `Accessed None` maillage/perso (4.27 : 0,3) | bloquante | L5 | **clos** : volet aléatoire corrigé par CX-B01, volet preset par CX-B08 (ERR-027) ; validé en jeu le 2026-09-30 |
|
||||
| ERR-027 | Personnages de quête (`generatePerson(preset)`) invisibles pendant le dialogue, dévêtus dans le mini-jeu. Pile : `ReadSceneLine → CallFunction → GeneratePerson → LoadPreset → GenerateAndApplyStrings / GenerateAndApplyBools` lit un maillage vide dans les champs de structure `Mesh_2_99B58993…` et `SkeletalMesh_2_93573D99…` ; en aval `GetSkeletalMesh_DEPRECATED` renvoie None (`Person` EventGraph, `GI::PlayAnimationMorph`) | partie utilisateur L4b (`LifePlay_Build_5.5_L4b/.../Saved/Logs/LifePlay.log`) | `Accessed None` maillage : **26,5 par personnage** (1 219 / 46) contre **0,27** en 4.27 (4 / 15) ; les deux signatures de champ : 0 occurrence en 4.27 | **bloquante** | L5 | **corrigé (CHG-029, CX-B08)**, validé en jeu le 2026-09-30 : 0 lecture de corps vide, 0,38 `Accessed None`/perso (43,7 avant) |
|
||||
| ERR-028 | `clearVariable` : index 0 sur tableau `Person` vide de `Variable` (via `GeneratePerson`, `getRelative`, `GetSpecific`) | partie utilisateur L4b | 211 | **bruit** : présent à l'identique en 4.27 — piste écartée | — | accepté |
|
||||
| ERR-003 | `Attempted to access index 0 from array Float_… of length 0` dans `GI::ReturnStatIfNeeded` (variable DSL `Float` vide) | build 5.5 Development | 2 (4.27 : 0) | haute | L5 | ouvert |
|
||||
| ERR-004 | `index N from CallFunc_ParseIntoArray_ReturnValue of length N` (`GI` EventGraph) | PIE 09-28 | 6 510 | moyenne | L7b | ouvert — origine localisée (L3) : `GI.populateClothes4` appelée par `Person.ReceiveBeginPlay` |
|
||||
| ERR-005 | `getBeautyValue` : `Floats_*` index hors bornes | PIE 09-28 | 1 297 | moyenne | L7b | ouvert |
|
||||
| ERR-006 | `Accès à None` `NearVec` dans `Person::standIdle` | PIE 09-28 | 273 | moyenne | L7b | ouvert |
|
||||
| ERR-007 | `Accès à None` `ContactMenu` dans `UpdateDailyPose` | PIE 09-28 | 257 | moyenne | L7b | ouvert |
|
||||
| ERR-008 | `CallFunc_Array_Get_Item` à None dans `GI` | PIE 09-28 | 229 | moyenne | L5 | ouvert |
|
||||
| ERR-009 | `SpawnActor failed because no class was specified` | PIE 09-28 | 11 | moyenne | L6 | ouvert |
|
||||
| ERR-010 | `LogLPModdingTrace` : instrumentation de portage à chaque `LoadTxt` | tous journaux | ≈ 1 300 à 5 400 / session | faible (bruit) | L3 | clos (CHG-016) : `LogModdingExtra` en Verbose |
|
||||
| ERR-011 | `GetSocketInfoByName … No SkeletalMesh for CharacterMesh` | tous journaux | 80/perso en 4.27, 76 en 5.5 | bruit (existe en 4.27) | — | accepté |
|
||||
| ERR-012 | Nœud `SkeletalMesh` déprécié (`GI` 52, `Person` 24) | `LogBlueprint` | 153 | faible (dette) | L7a | ouvert |
|
||||
| ERR-013 | `Daz/Michael/hairs/other/Pubes05-06` introuvable (assets dans `Daz/Bridget/Hairs/Pubic/`) | journaux 4.27 et 5.5 | 56 / session | faible (existe en 4.27) | L7b | ouvert |
|
||||
| ERR-014 | `Modules/ModLauncher.config` absent : `LoadTxt ECHEC` | journaux 4.27 et 5.5 | 2 / session | faible (existe en 4.27) | L3 | accepté : signalé une seule fois (CHG-016) ; absence = tous les modules actifs |
|
||||
| ERR-015 | `InputMode:UIOnly … Non-Focusable widget` | PIE 09-28 | 25 | faible | L7b | ouvert |
|
||||
| ERR-016 | Matériau `FntMat` sans `bUsedWithStaticLighting` → matériau par défaut | rapport 09-28 | — | faible (visuel) | L7d | ouvert |
|
||||
| ERR-017 | `LogStreaming Failed to read file` (icônes moteur VisionOS, Interchange, Slate) | PIE 09-28 | 37 | cosmétique | — | accepté |
|
||||
| ERR-018 | Assets StreetMap fortement réduits (`CentralLondon` 202 → 13,6 Mo, `00BathCC`) | comparaison des tailles | 4 fichiers | à qualifier | L4 | ouvert |
|
||||
| ERR-019 | Plantages du resave de masse : `BulkData IsUnlocked`, `Array.h:783` (`fnt_new100/111`) | `Saved/Crashes` 09-07 | 2 | à surveiller | L4 | ouvert |
|
||||
| ERR-025 | `LPFixEditableTextBoxFont` : un `Make EditableTextBoxStyle` peut perdre sa police sans rebranchement selon l'ordre de parcours (`CharGen::Make_64`) | relecture du diff L4-CX-B02 | 1 nœud | haute (silencieuse) | L4-CX-B02 | corrigé dans la commandlet (CHG-020) ; présent probablement dans le contenu du 2026-09-07 |
|
||||
| ERR-026 | Build Development incomplète : 3 257 packages cuits au lieu de 8 561 ; la plupart des maillages, vêtements, coiffures et textures manquent (chargés par chemin à l'exécution, invisibles pour le cuiseur) | retour utilisateur sur `LifePlay_Build_5.5_L4` | 5 304 packages | **bloquante** | L4 | corrigé (CHG-025) : `+DirectoriesToAlwaysCook=(Path="/Game")` ; test T-PKG-01 ajouté |
|
||||
| ERR-029 | Cuisson L5d : 95 avertissements (L5c : 0) | `L5d_BuildCookRun.log` | 95 | faible | L7a | **accepté** : ≈ 90 dépréciations `Get SkeletalMesh` (R-03) + 3 `GetRandomPointInNavigableRadius` (R-04) + 1 Unreal Trace Server ; visibles car la cuisson itérative a recompilé les 17 Blueprints modifiés par CX-B08 (L5c n'en recompilait aucun). Pas de régression |
|
||||
| ERR-030 | `Accessed None … Person` dans `GI::Dress` (appelée par `Room`) : habillage des PNJ de pièce | partie V1 du 2026-09-30 (42 min, 271 personnages) | 20 189 (74,5/perso ; 4.27 : 0) | faible (situationnel, pas d'effet visible) | L6b | ouvert — 0 occurrence sur la partie L6a (65 personnages) : dépend du lieu ou de la scène. Lié à ERR-003 : variables de scène `Person` vides 15 à 20/perso en 5.5 contre 3,3 en 4.27 ; `ReturnStatIfNeeded` lit la variable `Player` au tableau `Person` vide (capteur L6a). Le capteur doit pouvoir filtrer par fonction ; partie V1rc (2 h, 339 persos) : `Dress` 283,6/perso en rafales sur 25 minutes (jusqu'à 23 096/min), autres fonctions stables par personnage (`getActorVar` 4,0, `ReturnStatIfNeeded` 3,8) → situationnel, sans effet visible signalé ; lot L7i |
|
||||
| ERR-031 | Le contact n'apparaît pas dans l'encadré lors d'un appel téléphonique | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6c | **préexistant en 4.27** (constaté par l'utilisateur le 2026-09-30, même encadré vide) : hors périmètre de la migration, non corrigé. Analyse : `UI/Scene::FaceRender` affiche `Render/SecondScreenMat` ← caméra `SecondScreen` de `CentralLondon` (liste « ShowOnly » : `Wall` + `PlayerCharacter`, scène à -3,1e6 / -1,5e7) ; dans la carte 4.27 d'origine, cette caméra a `RootComponent = None` et une position nulle, elle ne vise donc que le ciel |
|
||||
| ERR-032 | Scintillement à l'approche d'un personnage | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6a | **corrigé (CHG-031)**, validé en jeu le 2026-09-30 : on peut s'approcher des PNJ sans scintillement |
|
||||
| ERR-033 | Certaines actions demandent deux clics pour démarrer | retour utilisateur 2026-09-30 | — | moyenne (ergonomie) | L6d | **non reproduit** depuis le build L6e (constat utilisateur 2026-09-30) ; aucune modification ciblée — coïncide avec CX-B09 (marges des boutons), sans lien démontré ; sous surveillance, à rouvrir s'il réapparaît |
|
||||
| ERR-034 | La barre de temps est décalée vers la droite | retour utilisateur 2026-09-30 | — | faible (visuel) | L6e | **corrigé (CHG-033, CX-B09)** — cause : marge par défaut des `UButton` passée de 2 px (UE4 `FCoreStyle`) à 12 px horizontaux (UE5 `FUMGCoreStyle`) ; 5 boutons × 20 px = 100 px de débordement ; **validé en jeu le 2026-09-30** (build L6e, confirmé par l'utilisateur) |
|
||||
# Registre des erreurs — migration 5.5
|
||||
|
||||
> Une ligne par signature d'erreur. Fréquence mesurée avec `Tools\LogStats.ps1` ; source indiquée.
|
||||
> Priorité = fréquence × gravité. Statut : ouvert · en cours · corrigé (CHG) · accepté (V1).
|
||||
|
||||
| ID | Signature | Source | Fréquence | Gravité | Lot cible | Statut |
|
||||
|---|---|---|---:|---|---|---|
|
||||
| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | clos (CHG-007) : remplacé par la base saine 4.27 complète ; format UE5 → ERR-022 |
|
||||
| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | corrigé statiquement (CHG-018) ; A/B d'exécution en attente |
|
||||
| ERR-021 | broche `Font` d'`EditableTextBoxStyle` : échec de compilation `UI/StatMenu`, `UI/CharGen` | `CompileAllBlueprints` L1 | 6 erreurs | **bloquante** (cuisson) | L4-CX-B02 | corrigé (CHG-022) |
|
||||
| ERR-022 | 293 packages de gameplay au format UE4 (base 4.27) | `Tools\AssetHeaders.ps1` | 293 | faible (converti au chargement) | L4-CX-B07 | **corrigé (CHG-035, CX-B07)** : 239 paquets réenregistrés (le nombre avait baissé de 293 à 239 grâce aux lots CX-B01 à B09) ; 8563/8563 paquets au format UE5 |
|
||||
| ERR-023 | `AndroidFileServer` réécrit sa section et son `SecurityToken` dans `DefaultEngine.ini` à chaque lancement | L1 | chaque lancement | faible (bruit git) | L2 | clos (CHG-011, CHG-012) |
|
||||
| ERR-024 | `McpAutomationBridge` (outil de développement) impose des plugins d'exécution (`GameplayAbilities`, `SmartObjects`, `Niagara`, `PythonScriptPlugin`…) et dépend de `StructUtils`, déprécié en 5.5 | UBT L2 | — | faible (livraison) | L7g | ouvert |
|
||||
| ERR-002 | `generatePerson()` sans argument : personnages identiques (« Tyrone »), nus, invisibles ; en PIE 5.5 chaque `index SPAWN` pointe vers `Person_C_0` | rapport 2026-09-28, journal PIE 09-28 | 16,6 `Accessed None` maillage/perso (4.27 : 0,3) | bloquante | L5 | **clos** : volet aléatoire corrigé par CX-B01, volet preset par CX-B08 (ERR-027) ; validé en jeu le 2026-09-30 |
|
||||
| ERR-027 | Personnages de quête (`generatePerson(preset)`) invisibles pendant le dialogue, dévêtus dans le mini-jeu. Pile : `ReadSceneLine → CallFunction → GeneratePerson → LoadPreset → GenerateAndApplyStrings / GenerateAndApplyBools` lit un maillage vide dans les champs de structure `Mesh_2_99B58993…` et `SkeletalMesh_2_93573D99…` ; en aval `GetSkeletalMesh_DEPRECATED` renvoie None (`Person` EventGraph, `GI::PlayAnimationMorph`) | partie utilisateur L4b (`LifePlay_Build_5.5_L4b/.../Saved/Logs/LifePlay.log`) | `Accessed None` maillage : **26,5 par personnage** (1 219 / 46) contre **0,27** en 4.27 (4 / 15) ; les deux signatures de champ : 0 occurrence en 4.27 | **bloquante** | L5 | **corrigé (CHG-029, CX-B08)**, validé en jeu le 2026-09-30 : 0 lecture de corps vide, 0,38 `Accessed None`/perso (43,7 avant) |
|
||||
| ERR-028 | `clearVariable` : index 0 sur tableau `Person` vide de `Variable` (via `GeneratePerson`, `getRelative`, `GetSpecific`) | partie utilisateur L4b | 211 | **bruit** : présent à l'identique en 4.27 — piste écartée | — | accepté |
|
||||
| ERR-003 | `Attempted to access index 0 from array Float_… of length 0` dans `GI::ReturnStatIfNeeded` (variable DSL `Float` vide) | build 5.5 Development | 2 (4.27 : 0) | haute | L5 | ouvert |
|
||||
| ERR-004 | `index N from CallFunc_ParseIntoArray_ReturnValue of length N` (`GI` EventGraph) | PIE 09-28 | 6 510 | moyenne | L7b | ouvert — origine localisée (L3) : `GI.populateClothes4` appelée par `Person.ReceiveBeginPlay` |
|
||||
| ERR-005 | `getBeautyValue` : `Floats_*` index hors bornes | PIE 09-28 | 1 297 | moyenne | L7b | ouvert |
|
||||
| ERR-006 | `Accès à None` `NearVec` dans `Person::standIdle` | PIE 09-28 | 273 | moyenne | L7b | ouvert |
|
||||
| ERR-007 | `Accès à None` `ContactMenu` dans `UpdateDailyPose` | PIE 09-28 | 257 | moyenne | L7b | ouvert |
|
||||
| ERR-008 | `CallFunc_Array_Get_Item` à None dans `GI` | PIE 09-28 | 229 | moyenne | L5 | ouvert |
|
||||
| ERR-009 | `SpawnActor failed because no class was specified` | PIE 09-28 | 11 | moyenne | L6 | ouvert |
|
||||
| ERR-010 | `LogLPModdingTrace` : instrumentation de portage à chaque `LoadTxt` | tous journaux | ≈ 1 300 à 5 400 / session | faible (bruit) | L3 | clos (CHG-016) : `LogModdingExtra` en Verbose |
|
||||
| ERR-011 | `GetSocketInfoByName … No SkeletalMesh for CharacterMesh` | tous journaux | 80/perso en 4.27, 76 en 5.5 | bruit (existe en 4.27) | — | accepté |
|
||||
| ERR-012 | Nœud `SkeletalMesh` déprécié (`GI` 52, `Person` 24) | `LogBlueprint` | 153 | faible (dette) | L7a | **corrigé (CHG-036, CX-B10)** : 56 nœuds (8 Blueprints) remplacés par `LPMeshCompat::GetSkeletalMesh` ; compilation 190 → 6 avertissements, cuisson 95 → 3 ; validation en jeu en attente |
|
||||
| ERR-013 | `Daz/Michael/hairs/other/Pubes05-06` introuvable (assets dans `Daz/Bridget/Hairs/Pubic/`) | journaux 4.27 et 5.5 | 56 / session | faible (existe en 4.27) | L7b | ouvert |
|
||||
| ERR-014 | `Modules/ModLauncher.config` absent : `LoadTxt ECHEC` | journaux 4.27 et 5.5 | 2 / session | faible (existe en 4.27) | L3 | accepté : signalé une seule fois (CHG-016) ; absence = tous les modules actifs |
|
||||
| ERR-015 | `InputMode:UIOnly … Non-Focusable widget` | PIE 09-28 | 25 | faible | L7b | ouvert |
|
||||
| ERR-016 | Matériau `FntMat` sans `bUsedWithStaticLighting` → matériau par défaut | rapport 09-28 | — | faible (visuel) | L7d | ouvert |
|
||||
| ERR-017 | `LogStreaming Failed to read file` (icônes moteur VisionOS, Interchange, Slate) | PIE 09-28 | 37 | cosmétique | — | accepté |
|
||||
| ERR-018 | Assets StreetMap fortement réduits (`CentralLondon` 202 → 13,6 Mo, `00BathCC`) | comparaison des tailles | 4 fichiers | à qualifier | L4 | ouvert |
|
||||
| ERR-019 | Plantages du resave de masse : `BulkData IsUnlocked`, `Array.h:783` (`fnt_new100/111`) | `Saved/Crashes` 09-07 | 2 | à surveiller | L4 | ouvert |
|
||||
| ERR-025 | `LPFixEditableTextBoxFont` : un `Make EditableTextBoxStyle` peut perdre sa police sans rebranchement selon l'ordre de parcours (`CharGen::Make_64`) | relecture du diff L4-CX-B02 | 1 nœud | haute (silencieuse) | L4-CX-B02 | corrigé dans la commandlet (CHG-020) ; présent probablement dans le contenu du 2026-09-07 |
|
||||
| ERR-026 | Build Development incomplète : 3 257 packages cuits au lieu de 8 561 ; la plupart des maillages, vêtements, coiffures et textures manquent (chargés par chemin à l'exécution, invisibles pour le cuiseur) | retour utilisateur sur `LifePlay_Build_5.5_L4` | 5 304 packages | **bloquante** | L4 | corrigé (CHG-025) : `+DirectoriesToAlwaysCook=(Path="/Game")` ; test T-PKG-01 ajouté |
|
||||
| ERR-029 | Cuisson L5d : 95 avertissements (L5c : 0) | `L5d_BuildCookRun.log` | 95 | faible | L7a | **accepté** : ≈ 90 dépréciations `Get SkeletalMesh` (R-03) + 3 `GetRandomPointInNavigableRadius` (R-04) + 1 Unreal Trace Server ; visibles car la cuisson itérative a recompilé les 17 Blueprints modifiés par CX-B08 (L5c n'en recompilait aucun). Pas de régression |
|
||||
| ERR-030 | `Accessed None … Person` dans `GI::Dress` (appelée par `Room`) : habillage des PNJ de pièce | partie V1 du 2026-09-30 (42 min, 271 personnages) | 20 189 (74,5/perso ; 4.27 : 0) | faible (situationnel, pas d'effet visible) | L6b | ouvert — 0 occurrence sur la partie L6a (65 personnages) : dépend du lieu ou de la scène. Lié à ERR-003 : variables de scène `Person` vides 15 à 20/perso en 5.5 contre 3,3 en 4.27 ; `ReturnStatIfNeeded` lit la variable `Player` au tableau `Person` vide (capteur L6a). Le capteur doit pouvoir filtrer par fonction ; partie V1rc (2 h, 339 persos) : `Dress` 283,6/perso en rafales sur 25 minutes (jusqu'à 23 096/min), autres fonctions stables par personnage (`getActorVar` 4,0, `ReturnStatIfNeeded` 3,8) → situationnel, sans effet visible signalé ; lot L7i |
|
||||
| ERR-031 | Le contact n'apparaît pas dans l'encadré lors d'un appel téléphonique | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6c | **préexistant en 4.27** (constaté par l'utilisateur le 2026-09-30, même encadré vide) : hors périmètre de la migration, non corrigé. Analyse : `UI/Scene::FaceRender` affiche `Render/SecondScreenMat` ← caméra `SecondScreen` de `CentralLondon` (liste « ShowOnly » : `Wall` + `PlayerCharacter`, scène à -3,1e6 / -1,5e7) ; dans la carte 4.27 d'origine, cette caméra a `RootComponent = None` et une position nulle, elle ne vise donc que le ciel |
|
||||
| ERR-032 | Scintillement à l'approche d'un personnage | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6a | **corrigé (CHG-031)**, validé en jeu le 2026-09-30 : on peut s'approcher des PNJ sans scintillement |
|
||||
| ERR-033 | Certaines actions demandent deux clics pour démarrer | retour utilisateur 2026-09-30 | — | moyenne (ergonomie) | L6d | **non reproduit** depuis le build L6e (constat utilisateur 2026-09-30) ; aucune modification ciblée — coïncide avec CX-B09 (marges des boutons), sans lien démontré ; sous surveillance, à rouvrir s'il réapparaît |
|
||||
| ERR-034 | La barre de temps est décalée vers la droite | retour utilisateur 2026-09-30 | — | faible (visuel) | L6e | **corrigé (CHG-033, CX-B09)** — cause : marge par défaut des `UButton` passée de 2 px (UE4 `FCoreStyle`) à 12 px horizontaux (UE5 `FUMGCoreStyle`) ; 5 boutons × 20 px = 100 px de débordement ; **validé en jeu le 2026-09-30** (build L6e, confirmé par l'utilisateur) |
|
||||
|
|
|
|||
96
Tools/DiffRemplacementNoeuds.py
Normal file
96
Tools/DiffRemplacementNoeuds.py
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
import re,sys,collections
|
||||
def parse(p):
|
||||
objs={}; pkg=None; key=None
|
||||
for line in open(p,encoding='utf-8'):
|
||||
line=line.rstrip('\n')
|
||||
if line.startswith('##### '): pkg=line[6:]; continue
|
||||
m=re.match(r'^ (\S+) \[(\w+)\]$',line)
|
||||
if m: key=(pkg,m.group(1)); objs[key]={'cls':m.group(2),'lines':[]}; continue
|
||||
if key: objs[key]['lines'].append(line)
|
||||
return objs
|
||||
A=parse(sys.argv[1]); B=parse(sys.argv[2])
|
||||
def graph(path): return path.split(':')[-1].split('.')[0] if ':' in path else ''
|
||||
def iscopy(path):
|
||||
g=graph(path); return "ExecuteUbergraph" in g or g.endswith("_MERGED") or re.fullmatch(r"EdGraph_[0-9]+",g) is not None
|
||||
def pos(o):
|
||||
x=y='0'
|
||||
for l in o['lines']:
|
||||
if l.startswith(' NodePosX = '): x=l.split('= ')[1]
|
||||
if l.startswith(' NodePosY = '): y=l.split('= ')[1]
|
||||
return x,y
|
||||
old={k:v for k,v in A.items() if v['cls']=='K2Node_VariableGet' and not iscopy(k[1]) and any('Engine.SkinnedMeshComponent\'",MemberName="SkeletalMesh"' in l for l in v['lines'])}
|
||||
new={k:v for k,v in B.items() if v['cls']=='K2Node_CallFunction' and not iscopy(k[1]) and any('MemberName="GetSkeletalMesh"' in l and 'LPMeshCompat' in l for l in v['lines'])}
|
||||
print('anciens noeuds',len(old),'nouveaux',len(new))
|
||||
idx={(k[0],k[1].rsplit('.',1)[0],pos(v)):k for k,v in new.items()}
|
||||
ren={}; miss=0
|
||||
for k,v in old.items():
|
||||
t=idx.get((k[0],k[1].rsplit('.',1)[0],pos(v)))
|
||||
if not t: miss+=1; continue
|
||||
ren[(k[0],graph(k[1]),k[1].rsplit('.',1)[1])]=t[1].rsplit('.',1)[1]
|
||||
print('apparies',len(ren),'non apparies',miss)
|
||||
skip=re.compile(r'^ (NodeGuid|GraphGuid|ErrorType|ErrorMsg|bHasCompilerMessage|NodePosX|NodePosY) = ')
|
||||
def norm(pkg,g,lines):
|
||||
out=[]
|
||||
for l in lines:
|
||||
if skip.match(l): continue
|
||||
for (p,gg,o),n in ren.items():
|
||||
if p==pkg and gg==g:
|
||||
l=l.replace(o+'.SkeletalMesh',n+'.ReturnValue').replace(o+'.self',n+'.Component')
|
||||
out.append(canon(l,pkg,g))
|
||||
return out
|
||||
def canon(l,pkg=None,g=None):
|
||||
if l.startswith(' pin ') and ' -> ' in l:
|
||||
head,links=l.rsplit(' -> ',1)
|
||||
return head+' -> '+', '.join(sorted(x for x in links.split(', ') if x))
|
||||
if l.startswith(' Nodes = ('):
|
||||
items=[x.strip('"') for x in l[len(' Nodes = ('):-1].split('","')]
|
||||
if pkg is not None:
|
||||
items=[x for x in items if not any(pkg==p2 and ("."+o+"'") in x and (":"+gg+".") in x for (p2,gg,o) in ren)]
|
||||
items+=[ "NOUVEAU:"+pkg+":"+gg+"."+n for (p2,gg,o),n in ren.items() if p2==pkg and gg==g ]
|
||||
else:
|
||||
items=[("NOUVEAU:"+x.split("'/Game/")[0] if False else x) for x in items]
|
||||
return ' Nodes = SET'+str(sorted(items))
|
||||
return l
|
||||
newnames={(k[0],graph(k[1]),k[1].rsplit('.',1)[1]) for k in new}
|
||||
def canonB(k,l):
|
||||
if l.startswith(' Nodes = ('):
|
||||
items=[x.strip('"') for x in l[len(' Nodes = ('):-1].split('","')]
|
||||
keep=[]; add=[]
|
||||
for x in items:
|
||||
nm=x.rsplit('.',1)[1].rstrip("'")
|
||||
if (k[0],k[1].split(':')[-1],nm) in newnames: add.append("NOUVEAU:"+k[0]+":"+k[1].split(':')[-1]+"."+nm)
|
||||
else: keep.append(x)
|
||||
return ' Nodes = SET'+str(sorted(keep+add))
|
||||
return canon(l)
|
||||
diffs=collections.Counter(); ex=[]
|
||||
for k in set(A)|set(B):
|
||||
if iscopy(k[1]) or k in old or k in new: continue
|
||||
if k[1].startswith('PLACEHOLDER'): continue
|
||||
a=norm(k[0],graph(k[1]),A[k]['lines']) if k in A else None; b=[canonB(k,l) for l in B[k]['lines'] if not skip.match(l)] if k in B else None
|
||||
if a!=b:
|
||||
cls=(A.get(k) or B.get(k))['cls']
|
||||
diffs[(k[0],cls,'absent avant' if a is None else 'absent apres' if b is None else 'modifie')]+=1
|
||||
if len(ex)<40: ex.append((k,[x for x in (a or []) if x not in (b or [])][:2],[x for x in (b or []) if x not in (a or [])][:2]))
|
||||
print('objets en ecart hors noeuds remplaces et copies :',sum(diffs.values()))
|
||||
for k,v in sorted(diffs.items()): print(' ',v,*k)
|
||||
for e in ex: print(e[0]); [print(' -',x[:160]) for x in e[1]]; [print(' +',x[:160]) for x in e[2]]
|
||||
def pinlinks(o,name):
|
||||
for l in o['lines']:
|
||||
m=re.match(r'^ pin (\S+) \[.*\] defaut=.* -> (.*)$',l)
|
||||
if m and m.group(1)==name: return sorted(x for x in m.group(2).split(', ') if x)
|
||||
return None
|
||||
ok=bad=0
|
||||
for k,v in old.items():
|
||||
t=idx[(k[0],k[1].rsplit('.',1)[0],pos(v))]; n=B[t]
|
||||
g=graph(k[1])
|
||||
def rn(lst):
|
||||
out=[]
|
||||
for x in lst or []:
|
||||
for (p2,gg,o),nn in ren.items():
|
||||
if p2==k[0] and gg==g: x=x.replace(o+'.',nn+'.') if x.split('.')[0]==o else x
|
||||
out.append(x)
|
||||
return sorted(out)
|
||||
if rn(pinlinks(v,'self'))==pinlinks(n,'Component') and rn(pinlinks(v,'SkeletalMesh'))==pinlinks(n,'ReturnValue'): ok+=1
|
||||
else:
|
||||
bad+=1; print('ECART',k[1],pinlinks(v,'self'),pinlinks(n,'Component'),pinlinks(v,'SkeletalMesh'),pinlinks(n,'ReturnValue'))
|
||||
print('noeuds remplaces : liaisons identiques',ok,'/ ecarts',bad)
|
||||
Loading…
Reference in a new issue