LifePlay-Revival/Source/LifePlay/LPModInfoSubsystem.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

78 lines
3.7 KiB
C++

// 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/<id>/<id>.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<FString>& 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<FString, TMap<FString, FString>> Metadata;
FString GameVersion;
TSet<FString> Warned;
TSharedPtr<SWidget> 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<FString, FString> RefusedTips;
FTSTicker::FDelegateHandle ManagerTickHandle;
/** Liste du gestionnaire vue en dernier (une instance par ouverture) et ligne de journal deja ecrite pour elle. */
TWeakObjectPtr<UScrollBox> ManagerList;
bool bManagerListLogged = false;
bool bWarnedNoUniqueId = false;
};