LifePlay-Revival/Source/LifePlayEditorTools/LPDumpCDOCommandlet.cpp

92 lines
2.9 KiB
C++
Raw Permalink Normal View History

// 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<FString> Tokens, Switches;
TMap<FString, FString> ParamsMap;
ParseCommandLine(*Params, Tokens, Switches, ParamsMap);
const FString ClassPath = ParamsMap.FindRef(TEXT("Class"));
const FString Out = ParamsMap.FindRef(TEXT("Out"));
TArray<FString> 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=<fichier.txt> -Props=Nom1,Nom2"));
return 1;
}
UClass* Class = LoadObject<UClass>(nullptr, *ClassPath);
if (!Class)
{
UE_LOG(LogLPDumpCDO, Error, TEXT("Classe introuvable : %s"), *ClassPath);
return 1;
}
const UObject* CDO = Class->GetDefaultObject();
TArray<FString> 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<void>(CDO);
if (const FMapProperty* MapProp = CastField<FMapProperty>(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<FArrayProperty>(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;
}