79 lines
4.2 KiB
C++
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);
|
|
};
|