From 60ddf96493bbb2b9a43c6342e2bd0de851790beb Mon Sep 17 00:00:00 2001 From: edujiro5972 <336072401+edujiro5972@users.noreply.github.com> Date: Fri, 2 Oct 2026 09:34:29 +0200 Subject: [PATCH] O2b : ModdingExtra liste les paquets depuis le registre d'assets en contenu compresse (villes de CityMenu) Co-Authored-By: Claude Opus 5.5 --- Docs/Migration/Journal_Modifications.md | 1 + .../Source/ModdingExtra/ModdingExtra.Build.cs | 1 + .../Private/ModdingExtraBPLibrary.cpp | 42 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index 95ffb63..0580174 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -911,3 +911,4 @@ Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (sol | CHG-064 | 2026-10-02 | O2 | `Config/DefaultGame.ini` : `UsePakFile=True`, `bUseIoStore=True`, `bCompressed=True` (réglages par défaut du moteur : Oodle Kraken) ; `Modules` reste en fichiers nus | build Development 3 367 → 2 002 Mo (−40 %), 23 928 → 2 104 fichiers ; build `LifePlay_Build_5.5_O2` ; validé en jeu le 2026-10-02 (7 contrôles) | `Tools\Restore.ps1 -Lot O2` ou `git checkout O2-avant -- Config` | | CHG-065 | 2026-10-02 | O4 | nouveau `Tools/FixTextureMips.py` ; 29 textures (`Clothes4` 27, route, trottoir) : `MipGenSettings` = groupe de texture, `NeverStream` = faux (diff : ces 2 propriétés + `LightingGuid` régénéré) | textures de couleur 3D sans mipmaps : scintillement à distance, pleine résolution toujours en mémoire ; exclus : cheveux et masques de transparence (29), interface et textures sans matériau (44), dimensions non puissance de 2 (733) ; build `LifePlay_Build_5.5_O4` | `Tools\Restore.ps1 -Lot O4` | | CHG-066 | 2026-10-02 | O | build Shipping de distribution `LifePlay_Build_5.5_Shipping_V1.2` (O1, O2, O4, O9, O9b) | 3 246 → 1 494 Mo (−54 %), 24 249 → 2 084 fichiers ; validation en jeu en attente | — (build seulement) | +| CHG-067 | 2026-10-02 | O2b | `Plugins/ModdingExtra` : `GetAllFilesFromFolder` reconstruit la liste des `.uasset`/`.umap` depuis le registre d'assets quand le disque n'en renvoie aucun (contenu compressé IoStore) ; dépendance `AssetRegistry` | régression d'O2 constatée sur le build Shipping : aucune ville proposée (`UI/CityMenu` liste les fichiers `Heavy/StreetMap/*.uasset` du disque, `UI/City` vérifie chaque ville par suffixe `/.uasset`) ; seul appel concerné, les autres lisent des fichiers texte de `Modules` ; build `LifePlay_Build_5.5_Shipping_V1.2` reconstruit | `git checkout O2b-avant -- Plugins/ModdingExtra` | diff --git a/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs b/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs index 37ef520..5625f53 100644 --- a/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs +++ b/Plugins/ModdingExtra/Source/ModdingExtra/ModdingExtra.Build.cs @@ -33,6 +33,7 @@ public class ModdingExtra : ModuleRules new string[] { "CoreUObject", + "AssetRegistry", // portage 5.5, lot O2b : enumeration des assets en conteneurs IoStore "Engine", "Slate", "SlateCore", diff --git a/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp b/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp index 47ad334..02bdd33 100644 --- a/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp +++ b/Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp @@ -2,7 +2,10 @@ #include "ModdingExtraBPLibrary.h" #include "ModdingExtra.h" +#include "AssetRegistry/AssetRegistryModule.h" #include "HAL/FileManager.h" +#include "Engine/World.h" +#include "Modules/ModuleManager.h" #include "Misc/FileHelper.h" #include "Misc/Paths.h" @@ -55,6 +58,45 @@ float UModdingExtraBPLibrary::ModdingExtraSampleFunction(float Param) //FileManager.FindFiles(Files, *FinalPath, true, false); FileManager.FindFilesRecursive(Files, *FinalPathWithoutExt, *Ext, true, false, false); + // Portage 5.5, lot O2b : dans un build au contenu compresse (IoStore), les paquets .uasset/.umap ne sont plus + // des fichiers du disque et la recherche ci-dessus ne renvoie rien (UI/CityMenu liste ainsi les villes de + // Heavy/StreetMap). On reconstruit alors la meme liste, chemins compris, depuis le registre d'assets. + // Avec des fichiers nus (editeur, build sans conteneurs), la liste du disque n'est pas vide : rien ne change. + const bool bPackageExt = Ext.Equals(TEXT("*.uasset"), ESearchCase::IgnoreCase) || Ext.Equals(TEXT("*.umap"), ESearchCase::IgnoreCase); + if (Files.Num() == 0 && bPackageExt) + { + FString Folder = RootFolderFullPath; + Folder.ReplaceInline(TEXT("\\"), TEXT("/")); + Folder.RemoveFromStart(TEXT("/")); + Folder.RemoveFromEnd(TEXT("/")); + const FString PackageRoot = TEXT("/Game/") + Folder; + + const IAssetRegistry& Registry = FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")).Get(); + TArray Assets; + Registry.GetAssetsByPath(FName(*PackageRoot), Assets, /*bRecursive=*/true); + const bool bWantMaps = Ext.Equals(TEXT("*.umap"), ESearchCase::IgnoreCase); + TSet Seen; + for (const FAssetData& Asset : Assets) + { + bool bAlreadySeen = false; + Seen.Add(Asset.PackageName, &bAlreadySeen); + if (bAlreadySeen) + { + continue; + } + const bool bIsMap = Asset.AssetClassPath == UWorld::StaticClass()->GetClassPathName(); + if (bIsMap != bWantMaps) + { + continue; + } + FString Relative = Asset.PackageName.ToString(); + Relative.RemoveFromStart(TEXT("/Game/")); + Files.Add(FullPath + TEXT("/") + Relative + Ext.RightChop(1)); + } + UE_LOG(LogModdingExtra, Log, TEXT("GetAllFilesFromFolder | '%s' : %d paquet(s) trouve(s) dans le registre d'assets (contenu compresse)"), + *RootFolderFullPath, Files.Num()); + } + UE_LOG(LogModdingExtra, Verbose, TEXT("GetAllFilesFromFolder | '%s' ext='%s' -> %d fichier(s)"), *RootFolderFullPath, *Ext, Files.Num());