LifePlay-Revival/Source/LifePlay/LPModGuard.h
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

79 lines
4.2 KiB
C++

// Lot U7 (U7-T7) : garde de compatibilite des mods d'assets (plugins de type Mod, dossier Mods/<id> 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 /<id>/ est retire (FPackageName::UnRegisterMountPoint) : le registre d'assets oublie tous ses
// assets et aucun chemin /<id>/... 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/<id> 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/<Module>). */
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<FString> Reasons;
/** Raisons du refus, en francais sans accents (journal). */
TArray<FString> 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<FLPModVerdict>& GetVerdicts();
/** Vrai si le plugin de type Mod <Module> 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<FString, FString>& OutKeys);
};