// Portage UE 5.5 - voir LPDumpCDOCommandlet.h #include "LPDumpCDOCommandlet.h" #include "Misc/FileHelper.h" #include "UObject/UnrealType.h" DEFINE_LOG_CATEGORY_STATIC(LogLPDumpCDO, Log, All); ULPDumpCDOCommandlet::ULPDumpCDOCommandlet() { IsClient = false; IsServer = false; IsEditor = true; LogToConsole = true; } int32 ULPDumpCDOCommandlet::Main(const FString& Params) { TArray Tokens, Switches; TMap ParamsMap; ParseCommandLine(*Params, Tokens, Switches, ParamsMap); const FString ClassPath = ParamsMap.FindRef(TEXT("Class")); const FString Out = ParamsMap.FindRef(TEXT("Out")); TArray Wanted; ParamsMap.FindRef(TEXT("Props")).ParseIntoArray(Wanted, TEXT(","), true); if (ClassPath.IsEmpty() || Out.IsEmpty() || Wanted.Num() == 0) { UE_LOG(LogLPDumpCDO, Error, TEXT("Usage : -Class=/Game/X.X_C -Out= -Props=Nom1,Nom2")); return 1; } UClass* Class = LoadObject(nullptr, *ClassPath); if (!Class) { UE_LOG(LogLPDumpCDO, Error, TEXT("Classe introuvable : %s"), *ClassPath); return 1; } const UObject* CDO = Class->GetDefaultObject(); TArray Lines; Lines.Add(FString::Printf(TEXT("##### %s"), *ClassPath)); for (const FString& Name : Wanted) { const FProperty* Prop = Class->FindPropertyByName(FName(*Name)); if (!Prop) { Lines.Add(FString::Printf(TEXT("%s : introuvable"), *Name)); continue; } const void* Value = Prop->ContainerPtrToValuePtr(CDO); if (const FMapProperty* MapProp = CastField(Prop)) { FScriptMapHelper Helper(MapProp, Value); Lines.Add(FString::Printf(TEXT("%s [map] : %d entree(s)"), *Name, Helper.Num())); for (FScriptMapHelper::FIterator It(Helper); It; ++It) { FString Key, Val; MapProp->KeyProp->ExportTextItem_Direct(Key, Helper.GetKeyPtr(It), nullptr, nullptr, PPF_None); MapProp->ValueProp->ExportTextItem_Direct(Val, Helper.GetValuePtr(It), nullptr, nullptr, PPF_None); Lines.Add(FString::Printf(TEXT(" %s = %s"), *Key, *Val)); } } else if (const FArrayProperty* ArrayProp = CastField(Prop)) { FScriptArrayHelper Helper(ArrayProp, Value); Lines.Add(FString::Printf(TEXT("%s [tableau] : %d element(s)"), *Name, Helper.Num())); for (int32 i = 0; i < Helper.Num(); ++i) { FString Text; ArrayProp->Inner->ExportTextItem_Direct(Text, Helper.GetRawPtr(i), nullptr, nullptr, PPF_None); Lines.Add(FString::Printf(TEXT(" [%d] = %s"), i, *Text)); } } else { FString Text; Prop->ExportTextItem_Direct(Text, Value, nullptr, nullptr, PPF_None); Lines.Add(FString::Printf(TEXT("%s = %s"), *Name, *Text)); } } if (!FFileHelper::SaveStringArrayToFile(Lines, *Out, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM)) { UE_LOG(LogLPDumpCDO, Error, TEXT("Ecriture impossible : %s"), *Out); return 1; } UE_LOG(LogLPDumpCDO, Warning, TEXT("=== %s : %d ligne(s) -> %s ==="), *ClassPath, Lines.Num(), *Out); return 0; }