LifePlay-Revival/Docs/Migration/correctifs/P01_Source_LifePlay.patch
edujiro5972 9b7e971ed7 L1 : base saine - contenu de gameplay remis a l'identique de 4.27
Decisions D-01/D-02 : correctifs anterieurs non suivis retires.
Content/{BPs,UI,Structs,Scenes,Render,Characters} = 4.27 (385 fichiers,
MD5 verifies). Correctifs isoles : Docs/Migration/05_Correctifs_Isoles.md,
patchs de code 4.27->5.5 dans Docs/Migration/correctifs/.
Releve de base 5.5 : CompileAllBlueprints 6 erreurs (StatMenu, CharGen),
0 echec de chargement ; LPCheckMeshAssignment 5 broches AssetRegistry
orphelines dans GI (GetAssetsByClass). Tools/RunCommandlet.ps1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 01:12:38 +02:00

355 lines
16 KiB
Diff

diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.cpp
index 9553b8f..b8ab09f 100644
--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.cpp
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.cpp
@@ -1,4 +1,4 @@
-// Portage UE 4.27 (2026.9 beta) - voir LPAssetRegistryHelpers.h
+// Portage UE 5.5 (2026.9 beta) - voir LPAssetRegistryHelpers.h
#include "LPAssetRegistryHelpers.h"
@@ -11,5 +11,48 @@ FAssetData ULPAssetRegistryHelpers::GetAssetByObjectPath(const FName ObjectPath,
const FAssetRegistryModule& AssetRegistryModule =
FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
- return AssetRegistryModule.Get().GetAssetByObjectPath(ObjectPath, bIncludeOnlyOnDiskAssets);
+ // 5.1+ : la surcharge prenant un FName est depreciee. La broche Blueprint reste un
+ // FName (les noeuds rebranches par la commandlet en dependent), seule la conversion
+ // vers FSoftObjectPath est faite ici.
+ const FSoftObjectPath Path(ObjectPath.ToString());
+ const FAssetData Result = AssetRegistryModule.Get().GetAssetByObjectPath(Path, bIncludeOnlyOnDiskAssets);
+
+ // Diagnostic du 2026-09-08 : cette fonction a ete instrumentee pour verifier qu'elle
+ // n'etait pas en cause dans l'absence de maillage des personnages. Elle ne l'etait pas
+ // (2720 resolutions reussies sur 2776). Le defaut venait de GetAssetsByClass, ci-dessous.
+ return Result;
+}
+
+bool ULPAssetRegistryHelpers::GetAssetsByClassName(FName ClassName, TArray<FAssetData>& OutAssetData, bool bSearchSubClasses)
+{
+ OutAssetData.Reset();
+
+ if (ClassName.IsNone())
+ {
+ return false;
+ }
+
+ // TryFindTypeSlow resout un nom court ("SkeletalMesh") vers la classe reelle, quel que
+ // soit son module : /Script/Engine.SkeletalMesh comme /Script/StreetMapRuntime.StreetMap.
+ const UClass* ResolvedClass = UClass::TryFindTypeSlow<UClass>(ClassName.ToString());
+ if (!ResolvedClass)
+ {
+ UE_LOG(LogTemp, Warning, TEXT("LPAssetRegistryHelpers : classe '%s' introuvable."), *ClassName.ToString());
+ return false;
+ }
+
+ const FAssetRegistryModule& AssetRegistryModule =
+ FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
+
+ return AssetRegistryModule.Get().GetAssetsByClass(
+ FTopLevelAssetPath(ResolvedClass), OutAssetData, bSearchSubClasses);
+}
+
+FName ULPAssetRegistryHelpers::GetAssetObjectPath(const FAssetData& AssetData)
+{
+ if (!AssetData.IsValid())
+ {
+ return NAME_None;
+ }
+ return FName(*AssetData.GetSoftObjectPath().ToString());
}
diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.h
index d59109a..85fe6fa 100644
--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.h
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.h
@@ -1,8 +1,8 @@
-// Portage UE 4.27 (2026.9 beta)
+// Portage UE 5.5 (2026.9 beta) - rustine introduite lors du portage 4.27, toujours necessaire.
//
// Epic a rendu IAssetRegistry::GetAssetByObjectPath impur (BlueprintPure=false) apres la
// version d'Unreal utilisee pour ecrire les Blueprints du jeu. Les graphes existants
-// l'employaient comme noeud PUR : au chargement en 4.27 le noeud gagne une broche Exec non
+// l'employaient comme noeud PUR : au chargement le noeud gagne une broche Exec non
// connectee, il est donc elague, et le noeud "Get Asset" qui consommait sa sortie se retrouve
// sans entree -> "'In Asset Data' ... must have an input wired into it".
//
@@ -31,4 +31,30 @@ public:
*/
UFUNCTION(BlueprintPure, Category = "AssetRegistry")
static FAssetData GetAssetByObjectPath(const FName ObjectPath, bool bIncludeOnlyOnDiskAssets = false);
+
+ /**
+ * Version FName de IAssetRegistry::GetAssetsByClass.
+ *
+ * 5.1 a remplace le parametre FName ClassName par un FTopLevelAssetPath ClassPathName.
+ * La montee de version a supprime l'ancienne broche des noeuds existants SANS reporter
+ * sa valeur sur la nouvelle : les trois appels de GI (SkeletalMesh, StaticMesh,
+ * StreetMap) interrogeaient donc l'AssetRegistry avec un chemin de classe VIDE et ne
+ * renvoyaient plus rien. Le jeu ne pouvait plus enumerer ni corps, ni vetements, ni
+ * coiffures : generatePerson() sans argument n'avait plus rien a tirer au sort.
+ *
+ * Rien dans le graphe ne le signalait : la compilation restait a zero erreur.
+ *
+ * Les noms de broches reproduisent ceux du noeud d'origine pour que le reaiguillage se
+ * limite a un changement de reference de fonction.
+ */
+ UFUNCTION(BlueprintCallable, Category = "AssetRegistry")
+ static bool GetAssetsByClassName(FName ClassName, TArray<FAssetData>& OutAssetData, bool bSearchSubClasses = false);
+
+ /**
+ * Equivalent de l'ancien FAssetData::ObjectPath (supprime en 5.1 au profit de
+ * FSoftObjectPath). Rend le chemin sous la forme "/Game/Dossier/Asset.Asset" attendue
+ * par les consommateurs existants.
+ */
+ UFUNCTION(BlueprintPure, Category = "AssetRegistry")
+ static FName GetAssetObjectPath(const FAssetData& AssetData);
};
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp
new file mode 100644
index 0000000..33bba33
--- /dev/null
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp
@@ -0,0 +1,18 @@
+// Portage UE 5.5 - voir LPNavigationHelpers.h
+
+#include "LPNavigationHelpers.h"
+
+#include "NavigationSystem.h"
+
+bool ULPNavigationHelpers::GetRandomLocationInNavigableRadius(
+ UObject* WorldContextObject,
+ const FVector& Origin,
+ FVector& RandomLocation,
+ float Radius,
+ ANavigationData* NavData,
+ TSubclassOf<UNavigationQueryFilter> FilterClass)
+{
+ // Simple reacheminement : toute la logique reste cote moteur.
+ return UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius(
+ WorldContextObject, Origin, RandomLocation, Radius, NavData, FilterClass);
+}
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h
new file mode 100644
index 0000000..81e9922
--- /dev/null
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h
@@ -0,0 +1,48 @@
+// Portage UE 5.5 (2026.9 beta) - remediation R-04.
+//
+// UNavigationSystemV1::K2_GetRandomPointInNavigableRadius est deprecie depuis 5.1 au profit
+// de K2_GetRandomLocationInNavigableRadius. Les deux ont EXACTEMENT la meme liste de
+// parametres et le meme retour, mais l'ancien est BlueprintPure et le nouveau est
+// BlueprintCallable : echanger la reference de fonction sur les noeuds existants leur
+// ajouterait des broches Exec non connectees, ils seraient elagues a la compilation.
+// C'est le meme piege que celui traite par ULPAssetRegistryHelpers lors du portage 4.27.
+//
+// Cette classe re-expose donc la version NON depreciee en BlueprintPure, avec des noms de
+// broches identiques a ceux du noeud d'origine, pour que la commandlet
+// LPFixDeprecatedNodes puisse se contenter de reaiguiller la reference de fonction.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Kismet/BlueprintFunctionLibrary.h"
+#include "Templates/SubclassOf.h"
+#include "LPNavigationHelpers.generated.h"
+
+class ANavigationData;
+class UNavigationQueryFilter;
+
+UCLASS()
+class LIFEPLAY_API ULPNavigationHelpers : public UBlueprintFunctionLibrary
+{
+ GENERATED_BODY()
+
+public:
+
+ /**
+ * Version PURE de UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius.
+ *
+ * Les noms de parametres reproduisent ceux de K2_GetRandomPointInNavigableRadius : ce sont
+ * eux qui portent les liaisons dans les Blueprints existants (Room, Person, AI).
+ */
+ UFUNCTION(BlueprintPure, Category = "AI|Navigation",
+ meta = (WorldContext = "WorldContextObject",
+ DisplayName = "Get Random Location in Navigable Radius (Pure)",
+ Keywords = "random point navigable radius"))
+ static bool GetRandomLocationInNavigableRadius(
+ UObject* WorldContextObject,
+ const FVector& Origin,
+ FVector& RandomLocation,
+ float Radius,
+ ANavigationData* NavData = nullptr,
+ TSubclassOf<UNavigationQueryFilter> FilterClass = nullptr);
+};
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp
new file mode 100644
index 0000000..ee3092b
--- /dev/null
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp
@@ -0,0 +1,80 @@
+// Portage UE 5.5 - voir LPVictoryCompat.h
+
+#include "LPVictoryCompat.h"
+
+#include "Engine/Texture2D.h"
+#include "HAL/PlatformApplicationMisc.h"
+#include "IImageWrapper.h"
+#include "IImageWrapperModule.h"
+#include "Misc/FileHelper.h"
+#include "Modules/ModuleManager.h"
+
+namespace
+{
+ EImageFormat GetJoyImageFormat(EJoyImageFormats JoyFormat)
+ {
+ switch (JoyFormat)
+ {
+ case EJoyImageFormats::JPG: return EImageFormat::JPEG;
+ case EJoyImageFormats::PNG: return EImageFormat::PNG;
+ case EJoyImageFormats::BMP: return EImageFormat::BMP;
+ case EJoyImageFormats::ICO: return EImageFormat::ICO;
+ case EJoyImageFormats::EXR: return EImageFormat::EXR;
+ case EJoyImageFormats::ICNS: return EImageFormat::ICNS;
+ }
+ return EImageFormat::JPEG;
+ }
+}
+
+UTexture2D* ULPVictoryCompat::Victory_LoadTexture2D_FromFile(const FString& FullFilePath, EJoyImageFormats ImageFormat, bool& IsValid, int32& Width, int32& Height)
+{
+ IsValid = false;
+ UTexture2D* LoadedT2D = nullptr;
+
+ IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
+ TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(GetJoyImageFormat(ImageFormat));
+
+ // Load From File
+ TArray<uint8> RawFileData;
+ if (!FFileHelper::LoadFileToArray(RawFileData, *FullFilePath)) return nullptr;
+
+ // Create T2D!
+ if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
+ {
+ TArray<uint8> UncompressedBGRA;
+ if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))
+ {
+ LoadedT2D = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);
+
+ // Valid?
+ if (!LoadedT2D) return nullptr;
+
+ // Out!
+ Width = ImageWrapper->GetWidth();
+ Height = ImageWrapper->GetHeight();
+
+ // Copy!
+ // 5.1+ : UTexture2D::PlatformData est prive, on passe par GetPlatformData()
+ void* TextureData = LoadedT2D->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
+ FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num());
+ LoadedT2D->GetPlatformData()->Mips[0].BulkData.Unlock();
+
+ // Update!
+ LoadedT2D->UpdateResource();
+ }
+ }
+
+ // Success!
+ // NOTE : comportement repris tel quel du plugin d'origine. IsValid ne distingue que
+ // le fichier introuvable (false, sortie anticipee ci-dessus) du reste (true), y compris
+ // quand l'image est illisible et que le retour est nul. Volontairement non corrige :
+ // les Blueprints existants branchent sur ce flag, changer sa semantique changerait
+ // leur comportement. Voir Docs/Architecture/VictoryPlugin_Architecture.md (R-14).
+ IsValid = true;
+ return LoadedT2D;
+}
+
+void ULPVictoryCompat::Victory_SaveStringToOSClipboard(const FString& ToClipboard)
+{
+ FPlatformApplicationMisc::ClipboardCopy(*ToClipboard);
+}
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h
new file mode 100644
index 0000000..0a71bf5
--- /dev/null
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h
@@ -0,0 +1,51 @@
+// Portage UE 5.5 - remplacement des 2 seuls noeuds du Victory Plugin utilises par LifePlay.
+//
+// Le plugin d'origine (VictoryBPLibrary, 9327 lignes sur 17 fichiers) dependait de PhysX,
+// APEX et ApexDestruction, supprimes d'UE5. Un releve exhaustif sur les 8562 .uasset du
+// projet n'a trouve que deux fonctions appelees, depuis 5 assets seulement, plus
+// l'enumeration EJoyImageFormats.
+//
+// Detail complet : Docs/Architecture/VictoryPlugin_Architecture.md
+//
+// Les noms et signatures sont reproduits a l'identique pour que les noeuds Blueprint
+// existants se rebranchent seuls ; le raccordement se fait par les CoreRedirects
+// declares dans Config/DefaultEngine.ini.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Kismet/BlueprintFunctionLibrary.h"
+#include "LPVictoryCompat.generated.h"
+
+class UTexture2D;
+
+/**
+ * Formats d'image acceptes par Victory_LoadTexture2D_FromFile.
+ * L'ordre des membres est celui du plugin d'origine : il est serialise en octet dans les
+ * valeurs par defaut des broches Blueprint, toute permutation les corromprait.
+ */
+UENUM(BlueprintType)
+enum class EJoyImageFormats : uint8
+{
+ JPG UMETA(DisplayName="JPG "),
+ PNG UMETA(DisplayName="PNG "),
+ BMP UMETA(DisplayName="BMP "),
+ ICO UMETA(DisplayName="ICO "),
+ EXR UMETA(DisplayName="EXR "),
+ ICNS UMETA(DisplayName="ICNS ")
+};
+
+UCLASS()
+class LIFEPLAY_API ULPVictoryCompat : public UBlueprintFunctionLibrary
+{
+ GENERATED_BODY()
+
+public:
+
+ /** Load a Texture2D from a JPG,PNG,BMP,ICO,EXR,ICNS file! IsValid tells you if file path was valid or not. Enjoy! -Rama */
+ UFUNCTION(BlueprintPure, Category = "Victory BP Library|Load Texture From File", meta=(Keywords="image png jpg jpeg bmp bitmap ico icon exr icns"))
+ static UTexture2D* Victory_LoadTexture2D_FromFile(const FString& FullFilePath, EJoyImageFormats ImageFormat, bool& IsValid, int32& Width, int32& Height);
+
+ UFUNCTION(BlueprintCallable, Category = "Victory BP Library|String")
+ static void Victory_SaveStringToOSClipboard(const FString& ToClipboard);
+};
diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LifePlay.Build.cs b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LifePlay.Build.cs
index bcdaa8f..4252313 100644
--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LifePlay.Build.cs
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LifePlay.Build.cs
@@ -7,9 +7,23 @@ public class LifePlay : ModuleRules
public LifePlay(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
+
+ // Portage 5.5 : le module a une structure plate (pas de sous-dossier Public/).
+ // BuildSettingsVersion.V5 desactive les chemins d'include legacy, il faut donc
+ // exposer explicitement le dossier du module aux modules qui en dependent
+ // (LifePlayEditorTools inclut LPAssetRegistryHelpers.h).
+ PublicIncludePaths.Add(ModuleDirectory);
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AssetRegistry" });
+ // Portage 5.5 : necessaires a LPVictoryCompat (remplacement du Victory Plugin)
+ PrivateDependencyModuleNames.AddRange(new string[] { "ImageWrapper", "ApplicationCore" });
+
+ // Portage 5.5 (R-04) : ULPNavigationHelpers re-expose K2_GetRandomLocationInNavigableRadius
+ // en BlueprintPure. Dependance PUBLIQUE : le .h expose ANavigationData et
+ // UNavigationQueryFilter dans sa signature, et LifePlayEditorTools l'inclut.
+ PublicDependencyModuleNames.Add("NavigationSystem");
+
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI