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(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& 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(ClassName.ToString()); + if (!ResolvedClass) + { + UE_LOG(LogTemp, Warning, TEXT("LPAssetRegistryHelpers : classe '%s' introuvable."), *ClassName.ToString()); + return false; + } + + const FAssetRegistryModule& AssetRegistryModule = + FModuleManager::LoadModuleChecked(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& 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 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 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(FName("ImageWrapper")); + TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(GetJoyImageFormat(ImageFormat)); + + // Load From File + TArray RawFileData; + if (!FFileHelper::LoadFileToArray(RawFileData, *FullFilePath)) return nullptr; + + // Create T2D! + if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num())) + { + TArray 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