// Portage UE 5.5 - lot H3d (metadonnees des modules, Docs/Migration/16_H3_Mods_Paquets.md ยง8). // // Lit les metadonnees de chaque module (Content/Modules//.lpmod, lignes "CLE: valeur"). Le jeu (GI) ne lit que // les trois premieres lignes, par position (MODULE_UNIQUEID, MODULE_NAME, MODULE_AUTHOR) ; le gestionnaire de mods // affiche le fichier entier. Cles ajoutees (facultatives, apres la ligne 3) : // MODULE_VERSION, MODULE_CREATED, MODULE_PACKAGED (dates AAAA-MM-JJ), MODULE_LICENSE, MODULE_AUTHOR_LINK, // MODULE_PRICE, MODULE_GAME_VERSION (version du jeu contre laquelle les assets du mod ont ete cuits, ecrite par // LifePlay-Sandbox/Tools/BuildMod.ps1, atelier de mods de l'addon), MODULE_DEFAULT_ENABLED (lu par LPHairstyleSubsystem). // // Garde des mods d'assets (lot U7, U7-T7) : controles et demontage au demarrage du module (FLPModGuard, LPModGuard.h). // Ce sous-systeme en est la partie visible : // - une fenetre (Slate, independante des Blueprints, aussi sur l'ecran titre) liste chaque mod refuse et la raison, coche // ou non dans le gestionnaire de mods (le moteur monte un mod meme decoche), une fois par mod et par session, avec le // moyen de lever le controle ; // - trois cases dans Settings > Misc (une par controle : moteur, version min, version max), lignes ajoutees en C++ a // MainMenu.SettingsScrollBox (noms LPModCheck*, classees dans Misc par LPSettingsSubsystem), enregistrees dans // GameUserSettings.ini, effet au prochain lancement ; // - gestionnaire de mods (U7-T9, aucun Blueprint modifie) : tant que la liste UI/ModManager.ModScrollBox est a l'ecran, // chaque ligne ModuleTick_C d'un mod refuse (variable UniqueID) recoit le suffixe " (not loaded)", une teinte rouge // attenuee, l'infobulle des raisons de la fenetre et une case ModEnabledBox desactivee ; GI.ModEnableds (le choix du // joueur) n'est pas touche. #pragma once #include "CoreMinimal.h" #include "Containers/Ticker.h" #include "Subsystems/GameInstanceSubsystem.h" #include "LPModInfoSubsystem.generated.h" class SWidget; class UScrollBox; UCLASS() class LIFEPLAY_API ULPModInfoSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() public: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; /** Valeur d'une cle du .lpmod d'un module (vide si absente). */ UFUNCTION(BlueprintCallable, Category = "LifePlay|Mods") FString GetModuleMetadata(const FString& Module, const FString& Key) const; /** Cases de Settings > Misc (lot U7) : enregistrees, effet au prochain lancement. */ UFUNCTION() void OnCheckEngineChanged(bool bIsChecked); UFUNCTION() void OnCheckMinVersionChanged(bool bIsChecked); UFUNCTION() void OnCheckMaxVersionChanged(bool bIsChecked); private: bool Tick(float DeltaTime); /** Ajoute les trois cases a MainMenu.SettingsScrollBox si elles n'y sont pas. */ void EnsureSettingsRows(); void ShowWarning(const TArray& Lines); void CloseWarning(); /** Chaque image, seulement si un mod est refuse : marque ses lignes dans le gestionnaire de mods ouvert. */ bool TickModManager(float DeltaTime); /** Module -> (cle en majuscules -> valeur). */ TMap> Metadata; FString GameVersion; TSet Warned; TSharedPtr Popup; FTSTicker::FDelegateHandle TickHandle; double NextCheck = 0.0; /** Mod refuse : MODULE_UNIQUEID et nom du plugin (FString : sans casse) -> infobulle (raisons anglaises de la fenetre). */ TMap RefusedTips; FTSTicker::FDelegateHandle ManagerTickHandle; /** Liste du gestionnaire vue en dernier (une instance par ouverture) et ligne de journal deja ecrite pour elle. */ TWeakObjectPtr ManagerList; bool bManagerListLogged = false; bool bWarnedNoUniqueId = false; };