FString::Find("" , IgnoreCase, FromStart) renvoie 0 en UE5 et INDEX_NONE en 4.27 : Contains(x, "") devenu vrai.
Test 3120 cas (transcription 4.27) : 0 ecart ; diff independant 385/385 ; compilation et cuisson 0 avertissement.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
91 lines
2.9 KiB
C++
91 lines
2.9 KiB
C++
// 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;
|
|
}
|