// Lot U7 (U7-T7) : garde de compatibilite des mods d'assets (plugins de type Mod, dossier Mods/ du jeu). // // Un mod d'une autre version du moteur fait planter le chargeur au premier paquet (essai U7-T4) : le moteur monte ses // conteneurs au PreInit sans aucun controle. Un mod qui echoue a un controle n'est donc pas charge. Au demarrage du module // LifePlay (FLifePlayGameModule::StartupModule, avant le GameInstance dont l'Event Init Blueprint precede les // sous-systemes), dans un jeu cuit : // - son point de montage // est retire (FPackageName::UnRegisterMountPoint) : le registre d'assets oublie tous ses // assets et aucun chemin //... ne se resout plus ; // - ses paks sont demontes (FCoreDelegates::OnUnmountPak -> FPakPlatformFile::Unmount) : pak, entrees du magasin de // paquets et conteneur IoStore retires. // Aucun asset du mod ne peut plus etre charge, ni par le C++, ni par un Blueprint, ni par une sauvegarde. // // Trois controles, chacun levable dans Settings > Misc (GameUserSettings.ini, section /Script/LifePlay.LPModInfoSubsystem, // effet au prochain lancement ; une ligne Warning a chaque demarrage tant qu'un controle est leve) : // - Moteur : version de l'en-tete de conteneur IoStore et de AssetRegistry.bin du mod egales a celles du moteur qui // execute le jeu (EIoContainerHeaderVersion::Latest, FAssetRegistryVersion::LatestVersion) ; si le .uplugin porte // EngineVersion (ecrit par LifePlay-Sandbox/Tools/BuildMod.ps1, forme X.Y.Z), meme major.minor que le moteur. // Fichier illisible : refus. Jeu non cuit (editeur) : controle binaire sans objet. // - Version min : MODULE_GAME_VERSION du .lpmod >= MinGameVersion (comparaison numerique composante par composante). // - Version max : MODULE_GAME_VERSION <= ProjectVersion du jeu (sinon : mettre le jeu a jour). // MODULE_GAME_VERSION absent : controles min et max sans objet (Warning), le controle Moteur s'applique quand meme. // Plugin = module : le nom du plugin est celui du dossier Content/Modules/ qui porte le .lpmod. // Editeur : rien n'est demonte ; LPModDailies et LPHairstyleSubsystem ecartent seulement les mods refuses. // Fenetre d'avertissement et cases de Settings > Misc : ULPModInfoSubsystem. Voir Docs/Migration/etat/U58/U7/U7-T7-IMPL.md. #pragma once #include "CoreMinimal.h" /** Controles de la garde, un par case de Settings > Misc. */ enum class ELPModCheck : uint8 { Engine, MinVersion, MaxVersion, Num }; /** Verdict d'un plugin de type Mod. */ struct FLPModVerdict { /** Nom du plugin (= dossier Content/Modules/). */ FString Module; /** MODULE_NAME du .lpmod, sinon nom du .uplugin. */ FString DisplayName; /** MODULE_GAME_VERSION du .lpmod (vide si absent). */ FString BuiltFor; bool bRefused = false; /** Jeu cuit : point de montage retire et paks demontes (controle relu apres coup). */ bool bUnloaded = false; /** Raisons du refus, en anglais (fenetre). */ TArray Reasons; /** Raisons du refus, en francais sans accents (journal). */ TArray LogReasons; }; class FLPModGuard { public: /** Premiere version du jeu sous UE 5.8 : version minimale d'un mod d'assets. A relever au prochain changement de moteur. */ static const TCHAR* const MinGameVersion; /** Controles et demontage des mods refuses, une seule fois par processus (rien dans un commandlet). */ static void Run(); /** Verdicts des plugins de type Mod (Run() d'abord si besoin). */ static const TArray& GetVerdicts(); /** Vrai si le plugin de type Mod est refuse (sans tenir compte de la casse). */ static bool IsRefused(const FString& Module); /** Etat d'un controle pour cette session (lu au demarrage). */ static bool IsCheckActive(ELPModCheck Check); /** Case enregistree dans GameUserSettings.ini (vraie par defaut). */ static bool GetSavedCheck(ELPModCheck Check); /** Enregistre la case ; le controle change au prochain lancement. */ static void SaveCheck(ELPModCheck Check, bool bEnabled); /** Version du jeu (ProjectVersion de DefaultGame.ini). */ static const FString& GetGameVersion(); /** Lignes "CLE: valeur" d'un .lpmod (cle en majuscules, valeur sans espaces autour, lignes // ignorees). */ static void ParseLpmod(const FString& Text, TMap& OutKeys); };