From e6dde46579ff16f55e3585b31007687611bdc4cb Mon Sep 17 00:00:00 2001 From: Fischsalat <64608145+Fischsalat@users.noreply.github.com> Date: Tue, 11 Jul 2023 16:53:25 +0200 Subject: [PATCH] Revert "Multithreading part 1 + const correctness" This reverts commit ae5e5f5072bf86d95942f0658bf0ebc97d7c6266. --- Dumper/Generator.cpp | 225 +++++++++++------------- Dumper/Generator.h | 13 +- Dumper/ObjectArray.cpp | 14 +- Dumper/Package.cpp | 22 +-- Dumper/Package.h | 9 +- Dumper/UnrealObjects.cpp | 357 +++++++++++++++------------------------ Dumper/UnrealObjects.h | 220 +++++++++++------------- 7 files changed, 353 insertions(+), 507 deletions(-) diff --git a/Dumper/Generator.cpp b/Dumper/Generator.cpp index 601516f..1867b28 100644 --- a/Dumper/Generator.cpp +++ b/Dumper/Generator.cpp @@ -1,14 +1,8 @@ #include "Generator.h" -#include - Generator::FunctionsMap Generator::PredefinedFunctions; Generator::MemberMap Generator::PredefinedMembers; -std::mutex Generator::PackageMutex; -std::vector> Generator::Futures; - - void Generator::Init() { /* manual overwrite */ @@ -270,79 +264,6 @@ void Generator::GenerateMappings() MappingsStream.CopyFromOtherBuffer(Buffer); } -void Generator::HandlePackageGeneration(fs::path* SDKFolder, int32 PackageIndex, std::vector* MemberIndices) -{ - UEObject Object = ObjectArray::GetByIndex(PackageIndex); - - if (!Object) - return; - - Package Pack(Object); - - PackageMutex.lock(); - Package::AddPackage(PackageIndex); - Pack.GatherDependencies(*MemberIndices); - PackageMutex.unlock(); - - Pack.Process(*MemberIndices); - - if (!Pack.IsEmpty()) - { - std::string PackageName = Object.GetName(); - std::string FileName = Settings::FilePrefix ? Settings::FilePrefix + PackageName : PackageName; - - if (fs::exists(*SDKFolder / (FileName + "_classes.hpp"))) - { - FileName += "_1"; - } - - FileWriter ClassFile(*SDKFolder, FileName, FileWriter::FileType::Class); - FileWriter StructsFile(*SDKFolder, FileName, FileWriter::FileType::Struct); - FileWriter FunctionFile(*SDKFolder, FileName, FileWriter::FileType::Function); - FileWriter ParameterFile(*SDKFolder, FileName, FileWriter::FileType::Parameter); - - ClassFile.WriteClasses(Pack.AllClasses); - StructsFile.WriteEnums(Pack.AllEnums); - StructsFile.WriteStructs(Pack.AllStructs); - - if (PackageName == "CoreUObject") - { - FunctionFile.Write("\t//Initialize GObjects using InitGObjects()\n\tTUObjectArray* UObject::GObjects = nullptr;\n\n"); - } - - for (auto& Function : Pack.AllFunctions) - { - for (auto& [ClassName, PackageFunctionsPairs] : Generator::PredefinedFunctions) - { - if (PackageFunctionsPairs.first != PackageName) - continue; - - for (auto& PredefFunc : PackageFunctionsPairs.second) - { - if (!PredefFunc.DeclarationCPP.empty()) - { - FunctionFile.Write(PredefFunc.DeclarationCPP); - FunctionFile.Write(PredefFunc.Body); - FunctionFile.Write("\n"); - } - } - } - - FunctionFile.WriteFunction(Function); - ParameterFile.WriteParamStruct(Function.GetParamStruct()); - } - } - else - { - PackageMutex.lock(); - Package::PackageSorterClasses.RemoveDependant(PackageIndex); - Package::PackageSorterStructs.RemoveDependant(PackageIndex); - PackageMutex.unlock(); - - //std::cout << "Removed package: " << Pack.DebugGetObject().GetName() << "\n"; - } -} - void Generator::GenerateSDK() { std::unordered_map> ObjectPackages; @@ -387,59 +308,95 @@ void Generator::GenerateSDK() Package::InitAssertionStream(GenFolder); + for (auto& Pair : ObjectPackages) + { + UEObject Object = ObjectArray::GetByIndex(Pair.first); - // Determine main-package of the game - int32 IndexOfBiggestPackage = 0; - int32 SizeOfBiggestPackage = 0; + if (!Object) + continue; - for (const auto& [PackageIdx, DependencyVector] : ObjectPackages) - { - if (DependencyVector.size() > SizeOfBiggestPackage) + Package Pack(Object); + Pack.Process(Pair.second); + + if (!Pack.IsEmpty()) { - SizeOfBiggestPackage = DependencyVector.size(); - IndexOfBiggestPackage = PackageIdx; - } - } - std::ofstream Out(GenFolder / "Packages.txt"); - for (auto& [PackageIndex, MemberIndices] : ObjectPackages) - { - Out << "SomePackage: " << ObjectArray::GetByIndex(PackageIndex).GetFullName() << std::endl; - } - //void Generator::HandlePackageGeneration(fs::path* SDKFolder, int32 PackageIndex, std::vector* MemberIndices) - //for (auto& [PackageIndex, MemberIndices] : ObjectPackages) - //{ - // Out << "SomePackage: " << ObjectArray::GetByIndex(PackageIndex).GetFullName() << std::endl; - // Futures.push_back(std::async(std::launch::async, HandlePackageGeneration, &SDKFolder, PackageIndex, &MemberIndices)); - //} + std::string PackageName = Object.GetName(); + std::string FileName = Settings::FilePrefix ? Settings::FilePrefix + PackageName : PackageName; + + if (fs::exists(SDKFolder / (FileName + "_classes.hpp"))) + { + FileName += "_1"; + } - //auto Iter = ObjectPackages.begin(); - //std::advance(Iter, 40ull); - // - //for (auto It = ObjectPackages.begin(); It != Iter; ++It) - //{ - // auto& [PackageIndex, MemberIndices] = *It; - // Futures.push_back(std::async(std::launch::async, HandlePackageGeneration, &SDKFolder, PackageIndex, &MemberIndices)); - //} + FileWriter ClassFile(SDKFolder, FileName, FileWriter::FileType::Class); + FileWriter StructsFile(SDKFolder, FileName, FileWriter::FileType::Struct); + FileWriter FunctionFile(SDKFolder, FileName, FileWriter::FileType::Function); + FileWriter ParameterFile(SDKFolder, FileName, FileWriter::FileType::Parameter); - for (auto& Future : Futures) - { - Future.wait(); - } + ClassFile.WriteClasses(Pack.AllClasses); + StructsFile.WriteEnums(Pack.AllEnums); + StructsFile.WriteStructs(Pack.AllStructs); - Futures.clear(); // destroys everything, waits for execution of futures to finish + if (PackageName == "CoreUObject") + { + FunctionFile.Write("\t//Initialize GObjects using InitGObjects()\n\tTUObjectArray* UObject::GObjects = nullptr;\n\n"); + } + + for (auto& Function : Pack.AllFunctions) + { + for (auto& [ClassName, PackageFunctionsPairs] : Generator::PredefinedFunctions) + { + if (PackageFunctionsPairs.first != PackageName) + continue; + + for (auto& PredefFunc : PackageFunctionsPairs.second) + { + if (!PredefFunc.DeclarationCPP.empty()) + { + FunctionFile.Write(PredefFunc.DeclarationCPP); + FunctionFile.Write(PredefFunc.Body); + FunctionFile.Write("\n"); + } + } + } + + FunctionFile.WriteFunction(Function); + ParameterFile.WriteParamStruct(Function.GetParamStruct()); + } + } + else + { + ObjectPackages.erase(Pair.first); + Package::PackageSorterClasses.RemoveDependant(Pair.first); + Package::PackageSorterStructs.RemoveDependant(Pair.first); + + std::cout << "Removed package: " << Pack.DebugGetObject().GetName() << "\n"; + } + } Package::CloseAssertionStream(); - GenerateSDKHeader(GenFolder, IndexOfBiggestPackage); + GenerateSDKHeader(GenFolder, ObjectPackages); GenerateFixupFile(GenFolder); GenerateBasicFile(SDKFolder); std::cout << "\n\n[=] Done [=]\n\n"; } -void Generator::GenerateSDKHeader(const fs::path& SdkPath, int32 BiggestPackageIdx) +void Generator::GenerateSDKHeader(fs::path& SdkPath, std::unordered_map>& Packages) { + // Determine main-package of the game + int32 IndexOfBiggestPackage = 0; + int32 SizeOfBiggestPackage = 0; + for (const auto& [PackageIdx, DependencyVector] : Packages) + { + if (DependencyVector.size() > SizeOfBiggestPackage) + { + SizeOfBiggestPackage = DependencyVector.size(); + IndexOfBiggestPackage = PackageIdx; + } + } std::ofstream HeaderStream(SdkPath / "SDK.hpp"); @@ -448,14 +405,13 @@ void Generator::GenerateSDKHeader(const fs::path& SdkPath, int32 BiggestPackageI HeaderStream << std::format("// {}\n", Settings::GameName); HeaderStream << std::format("// {}\n\n", Settings::GameVersion); - HeaderStream << std::format("// Main-package: {}\n\n", ObjectArray::GetByIndex(BiggestPackageIdx).GetValidName()); + HeaderStream << std::format("// Main-package: {}\n\n", ObjectArray::GetByIndex(IndexOfBiggestPackage).GetValidName()); HeaderStream << "#define WINDOWS_IGNORE_PACKING_MISMATCH\n\n"; HeaderStream << "#include \n"; HeaderStream << "#include \n"; - HeaderStream << "#include \n"; - HeaderStream << "#include \n\n"; + HeaderStream << "#include \n\n"; HeaderStream << "typedef __int8 int8;\n"; HeaderStream << "typedef __int16 int16;\n"; @@ -487,17 +443,17 @@ namespace Offsets { std::string IncludesString; - Package::PackageSorterStructs.GetIncludesForPackage(BiggestPackageIdx, EIncludeFileType::Struct, IncludesString, false); + Package::PackageSorterStructs.GetIncludesForPackage(IndexOfBiggestPackage, EIncludeFileType::Struct, IncludesString, false); HeaderStream << IncludesString; IncludesString.clear(); - Package::PackageSorterClasses.GetIncludesForPackage(BiggestPackageIdx, EIncludeFileType::Class, IncludesString, false, &Package::PackageSorterStructs, EIncludeFileType::Struct); + Package::PackageSorterClasses.GetIncludesForPackage(IndexOfBiggestPackage, EIncludeFileType::Class, IncludesString, false, &Package::PackageSorterStructs, EIncludeFileType::Struct); HeaderStream << IncludesString; IncludesString.clear(); - Package::PackageSorterParams.GetIncludesForPackage(BiggestPackageIdx, EIncludeFileType::Params, IncludesString, false); + Package::PackageSorterParams.GetIncludesForPackage(IndexOfBiggestPackage, EIncludeFileType::Params, IncludesString, false); HeaderStream << IncludesString; } @@ -528,7 +484,7 @@ namespace Offsets HeaderStream.close(); } -void Generator::GenerateFixupFile(const fs::path& SdkPath) +void Generator::GenerateFixupFile(fs::path& SdkPath) { std::ofstream FixupStream(SdkPath / "PropertyFixup.hpp"); @@ -670,7 +626,7 @@ void Generator::InitPredefinedMembers() PredefinedMembers["FFieldVariant"] = { - { "union { class FField* Field; class UObject* Object; }", "Container", 0x0, 0x8 }, + { "union { FField* Field; UObject* Object }", "Container", 0x0, 0x8 }, { UObjectIdentifierType, UObjectIdentifierName, 0x0, !Settings::Internal::bUseMaskForFieldOwner } }; @@ -681,7 +637,7 @@ void Generator::InitPredefinedMembers() { "FFieldVariant", "Owner", Off::FField::Owner, FFieldVariantSize }, { "FField*", "Next", Off::FField::Next, 0x8 }, { "FName", "Name", Off::FField::Name, FNameSize }, - { "int32", "Flags", Off::FField::Flags, 0x4 } + { "EObjectFlags", "Flags", Off::FField::Flags, 0x4 } }; } @@ -860,7 +816,7 @@ R"( }; } -void Generator::GenerateBasicFile(const fs::path& SdkPath) +void Generator::GenerateBasicFile(fs::path& SdkPath) { FileWriter BasicHeader(SdkPath, Settings::FilePrefix ? Settings::FilePrefix + std::string("Basic") : "Basic", FileWriter::FileType::Header); FileWriter BasicSource(SdkPath, Settings::FilePrefix ? Settings::FilePrefix + std::string("Basic") : "Basic", FileWriter::FileType::Source); @@ -1493,15 +1449,28 @@ enum class EClassCastFlags : uint64_t BasicHeader.Write( R"( inline constexpr EClassCastFlags operator|(EClassCastFlags Left, EClassCastFlags Right) -{ +{ + return (EClassCastFlags)((std::underlying_type::type)(Left) | (std::underlying_type::type)(Right)); +} + +inline bool operator&(EClassCastFlags Left, EClassCastFlags Right) +{ + return (((std::underlying_type::type)(Left) & (std::underlying_type::type)(Right)) == (std::underlying_type::type)(Right)); +} +)"); + + BasicHeader.Write( + R"( +inline constexpr EClassCastFlags operator|(EClassCastFlags Left, EClassFlags Right) +{ using CastFlagsType = std::underlying_type::type; - return static_cast(static_cast(Left) | (static_cast(Right)); + return static_cast(static_cast(Left) | static_cast(Right)); } inline bool operator&(EClassCastFlags Left, EClassCastFlags Right) { using CastFlagsType = std::underlying_type::type; - return (static_cast(Left) & static_cast(Right)) == static_cast(Right); + return ((static_cast(Left) & static_cast(Right)) == static_cast(Right)); } )"); diff --git a/Dumper/Generator.h b/Dumper/Generator.h index e284825..415a3c3 100644 --- a/Dumper/Generator.h +++ b/Dumper/Generator.h @@ -3,7 +3,6 @@ #include #include #include -#include #include "FileWriter.h" #include "Settings.h" #include "Package.h" @@ -43,9 +42,6 @@ class Generator static FunctionsMap PredefinedFunctions; // Types.cpp static MemberMap PredefinedMembers; // Package.cpp - static std::mutex PackageMutex; - static std::vector> Futures; - public: static void Init(); @@ -53,15 +49,12 @@ class Generator static void InitPredefinedMembers(); static void InitPredefinedFunctions(); -private: - static void HandlePackageGeneration(fs::path* SDKFolder, int32 PackageIndex, std::vector* MemberIndices); - public: static void GenerateMappings(); static void GenerateSDK(); private: - static void GenerateSDKHeader(const fs::path& SdkPath, int32 BiggestPackageIdx); - static void GenerateFixupFile(const fs::path& SdkPath); - static void GenerateBasicFile(const fs::path& SdkPath); + static void GenerateSDKHeader(fs::path& SdkPath, std::unordered_map>& Packages); + static void GenerateFixupFile(fs::path& SdkPath); + static void GenerateBasicFile(fs::path& SdkPath); }; diff --git a/Dumper/ObjectArray.cpp b/Dumper/ObjectArray.cpp index 3442421..abe32f3 100644 --- a/Dumper/ObjectArray.cpp +++ b/Dumper/ObjectArray.cpp @@ -268,8 +268,8 @@ void ObjectArray::DumpObjects() { fs::path Path(Settings::SDKGenerationPath); - if (!Settings::GameVersion.empty() && !Settings::GameName.empty()) - Path /= (Settings::GameVersion + '-' + Settings::GameName); + if (!Settings::GameVersion.empty()) + Path /= Settings::GameVersion; std::ofstream DumpStream(Path / "GObjects-Dump.txt"); @@ -303,21 +303,19 @@ void ObjectArray::GetAllPackages(std::unordered_map().GetOffset() < LowestOffset) { LowestOffset = Property.Cast().GetOffset(); } } - if (!Super || Object.IsA(EClassCastFlags::Function)) - continue; - if (LowestOffset != 0xFFFFFF) { for (UEStruct S = Super; S; S = S.GetSuper()) diff --git a/Dumper/Package.cpp b/Dumper/Package.cpp index 3564402..5929621 100644 --- a/Dumper/Package.cpp +++ b/Dumper/Package.cpp @@ -125,7 +125,7 @@ void PackageDependencyManager::GetFunctionDependency(UEFunction Func, std::unord } } -void Package::InitAssertionStream(const fs::path& GenPath) +void Package::InitAssertionStream(fs::path& GenPath) { if (Settings::Debug::bGenerateAssertionFile) { @@ -188,7 +188,7 @@ Types::Member Package::GenerateBitPadding(const int32 Offset, const int32 PadSiz return Types::Member("uint8", std::format("BitPad_{:X} : {:X}", BitPadNum++, PadSize), std::move(Reason)); } -void Package::GatherDependencies(const std::vector& PackageMembers) +void Package::GatherDependencies(std::vector& PackageMembers) { for (int32_t Index : PackageMembers) { @@ -238,8 +238,7 @@ void Package::GatherDependencies(const std::vector& PackageMembers) { Package::PackageSorterStructs.AddDependency(PackageObject.GetIndex(), Outermost.GetIndex()); } - //Needs lock, error here! - //static_assert(false, "LOCK REQUIRED!!!"); + Package::PackageSorterParams.AddDependency(PackageObject.GetIndex(), Outermost.GetIndex()); continue; @@ -258,17 +257,12 @@ void Package::GatherDependencies(const std::vector& PackageMembers) } } -void Package::AddPackage(int32 Idx) -{ - Package::PackageSorterClasses.AddPackage(Idx); - Package::PackageSorterStructs.AddPackage(Idx); -} - -void Package::Process(const std::vector& PackageMembers) +void Package::Process(std::vector& PackageMembers) { - //AddPackage(PackageObject.GetIndex()); + Package::PackageSorterClasses.AddPackage(PackageObject.GetIndex()); + Package::PackageSorterStructs.AddPackage(PackageObject.GetIndex()); - //GatherDependencies(PackageMembers); + GatherDependencies(PackageMembers); for (int32_t Index : PackageMembers) { @@ -292,7 +286,7 @@ void Package::Process(const std::vector& PackageMembers) } } -void Package::GenerateMembers(const std::vector& MemberVector, UEStruct& Super, Types::Struct& Struct, int32 StructSize, int32 SuperSize) +void Package::GenerateMembers(std::vector& MemberVector, UEStruct& Super, Types::Struct& Struct, int32 StructSize, int32 SuperSize) { const bool bIsSuperFunction = Super.IsA(EClassCastFlags::Function); diff --git a/Dumper/Package.h b/Dumper/Package.h index b0abdae..4168e09 100644 --- a/Dumper/Package.h +++ b/Dumper/Package.h @@ -98,19 +98,18 @@ class Package { } - static void AddPackage(int32 Idx); - static void InitAssertionStream(const fs::path& GenPath); + static void InitAssertionStream(fs::path& GenPath); static void CloseAssertionStream(); static int32 GeneratePredefinedMembers(const std::string& ClassName, Types::Struct& Struct, int32 StructSize, int32 SuperSize); static Types::Member GenerateBytePadding(int32 Offset, int32 PadSize, std::string&& Reason); static Types::Member GenerateBitPadding(int32 Offset, int32 PadSize, std::string&& Reason); - void GatherDependencies(const std::vector& PackageMembers); + void GatherDependencies(std::vector& PackageMembers); - void Process(const std::vector& PackageMembers); + void Process(std::vector& PackageMembers); - void GenerateMembers(const std::vector& MemberVector, UEStruct& Super, Types::Struct& Struct, int32 StructSize, int32 SuperSize); + void GenerateMembers(std::vector& MemberVector, UEStruct& Super, Types::Struct& Struct, int32 StructSize, int32 SuperSize); Types::Function GenerateFunction(UEFunction& Function, UEStruct& Super); Types::Struct GenerateStruct(UEStruct Struct, bool bIsFunction = false); Types::Class GenerateClass(UEClass Class); diff --git a/Dumper/UnrealObjects.cpp b/Dumper/UnrealObjects.cpp index 3defba8..11aae6d 100644 --- a/Dumper/UnrealObjects.cpp +++ b/Dumper/UnrealObjects.cpp @@ -13,42 +13,42 @@ void* UEFFieldClass::GetAddress() return Class; } -EFieldClassID UEFFieldClass::GetId() const +EFieldClassID UEFFieldClass::GetId() { return *reinterpret_cast(Class + Off::FFieldClass::Id); } -EClassCastFlags UEFFieldClass::GetCastFlags() const +EClassCastFlags UEFFieldClass::GetCastFlags() { return *reinterpret_cast(Class + Off::FFieldClass::CastFlags); } -EClassFlags UEFFieldClass::GetClassFlags() const +EClassFlags UEFFieldClass::GetClassFlags() { return *reinterpret_cast(Class + Off::FFieldClass::ClassFlags); } -UEFFieldClass UEFFieldClass::GetSuper() const +UEFFieldClass UEFFieldClass::GetSuper() { return UEFFieldClass(*reinterpret_cast(Class + Off::FFieldClass::SuperClass)); } -FName UEFFieldClass::GetFName() const +FName UEFFieldClass::GetFName() { return FName(Class + Off::FFieldClass::Name); //Not the real FName, but a wrapper which holds the address of a FName } -bool UEFFieldClass::IsType(EClassCastFlags Flags) const +bool UEFFieldClass::IsType(EClassCastFlags Flags) { return (Flags != EClassCastFlags::None ? (GetCastFlags() & Flags) : true); } -std::string UEFFieldClass::GetName() const +std::string UEFFieldClass::GetName() { return Class ? GetFName().ToString() : "None"; } -std::string UEFFieldClass::GetValidName() const +std::string UEFFieldClass::GetValidName() { std::string Name = GetName(); @@ -82,7 +82,7 @@ std::string UEFFieldClass::GetValidName() const return Name; } -std::string UEFFieldClass::GetCppName() const +std::string UEFFieldClass::GetCppName() { // This is evile dark magic code which shouldn't exist return "F" + GetValidName(); @@ -93,12 +93,12 @@ void* UEFField::GetAddress() return Field; } -EObjectFlags UEFField::GetFlags() const +EObjectFlags UEFField::GetFlags() { return *reinterpret_cast(Field + Off::FField::Flags); } -class UEObject UEFField::GetOwnerAsUObject() const +class UEObject UEFField::GetOwnerAsUObject() { if (IsOwnerUObject()) { @@ -111,7 +111,7 @@ class UEObject UEFField::GetOwnerAsUObject() const return nullptr; } -class UEFField UEFField::GetOwnerAsFField() const +class UEFField UEFField::GetOwnerAsFField() { if (!IsOwnerUObject()) return *reinterpret_cast(Field + Off::FField::Owner); @@ -119,7 +119,7 @@ class UEFField UEFField::GetOwnerAsFField() const return nullptr; } -class UEObject UEFField::GetOwnerUObject() const +class UEObject UEFField::GetOwnerUObject() { UEFField Field = *this; @@ -131,23 +131,23 @@ class UEObject UEFField::GetOwnerUObject() const return Field.GetOwnerAsUObject(); } -class UEObject UEFField::GetOutermost() const +class UEObject UEFField::GetOutermost() { UEObject OwnerUObject = GetOwnerUObject(); return OwnerUObject.GetOutermost(); } -UEFFieldClass UEFField::GetClass() const +UEFFieldClass UEFField::GetClass() { return UEFFieldClass(*reinterpret_cast(Field + Off::FField::Class)); } -FName UEFField::GetFName() const +FName UEFField::GetFName() { return FName(Field + Off::FField::Name); //Not the real FName, but a wrapper which holds the address of a FName } -UEFField UEFField::GetNext() const +UEFField UEFField::GetNext() { return UEFField(*reinterpret_cast(Field + Off::FField::Next)); } @@ -158,7 +158,7 @@ UEType UEFField::Cast() const return UEType(Field); } -bool UEFField::IsOwnerUObject() const +bool UEFField::IsOwnerUObject() { if (Settings::Internal::bUseMaskForFieldOwner) { @@ -168,17 +168,17 @@ bool UEFField::IsOwnerUObject() const return *reinterpret_cast(Field + Off::FField::Owner + 0x8); } -bool UEFField::IsA(EClassCastFlags Flags) const +bool UEFField::IsA(EClassCastFlags Flags) { return (Flags != EClassCastFlags::None ? GetClass().IsType(Flags) : true); } -std::string UEFField::GetName() const +std::string UEFField::GetName() { return Field ? GetFName().ToString() : "None"; } -std::string UEFField::GetValidName() const +std::string UEFField::GetValidName() { std::string Name = GetName(); @@ -212,7 +212,7 @@ std::string UEFField::GetValidName() const return Name; } -std::string UEFField::GetCppName() const +std::string UEFField::GetCppName() { static UEClass ActorClass = ObjectArray::FindClassFast("Actor"); static UEClass InterfaceClass = ObjectArray::FindClassFast("Interface"); @@ -236,7 +236,7 @@ std::string UEFField::GetCppName() const return 'F' + Temp; } -UEFField::operator bool() const +UEFField::operator bool() { return Field != nullptr && reinterpret_cast(Field + Off::FField::Class) != nullptr; } @@ -258,54 +258,48 @@ void* UEObject::GetAddress() return Object; } -EObjectFlags UEObject::GetFlags() const +EObjectFlags UEObject::GetFlags() { return *reinterpret_cast(Object + Off::UObject::Flags); } -int32 UEObject::GetIndex() const +int32 UEObject::GetIndex() { return *reinterpret_cast(Object + Off::UObject::Index); } -UEClass UEObject::GetClass() const +UEClass UEObject::GetClass() { return UEClass(*reinterpret_cast(Object + Off::UObject::Class)); } -FName UEObject::GetFName() const +FName UEObject::GetFName() { return FName(Object + Off::UObject::Name); //Not the real FName, but a wrapper which holds the address of a FName } -UEObject UEObject::GetOuter() const +UEObject UEObject::GetOuter() { return UEObject(*reinterpret_cast(Object + Off::UObject::Outer)); } -bool UEObject::HasAnyFlags(EObjectFlags Flags) const +bool UEObject::HasAnyFlags(EObjectFlags Flags) { return GetFlags() & Flags; } template -UEType UEObject::Cast() +UEType UEObject::Cast() const { return UEType(Object); } -template -const UEType UEObject::Cast() const -{ - return UEType(Object); -} - -bool UEObject::IsA(EClassCastFlags TypeFlags) const +bool UEObject::IsA(EClassCastFlags TypeFlags) { return (TypeFlags != EClassCastFlags::None ? GetClass().IsType(TypeFlags) : true); } -UEObject UEObject::GetOutermost() const +UEObject UEObject::GetOutermost() { UEObject Outermost; @@ -316,12 +310,12 @@ UEObject UEObject::GetOutermost() const return Outermost; } -std::string UEObject::GetName() const +std::string UEObject::GetName() { return Object ? GetFName().ToString() : "None"; } -std::string UEObject::GetValidName() const +std::string UEObject::GetValidName() { std::string Name = GetName(); @@ -355,7 +349,7 @@ std::string UEObject::GetValidName() const return Name; } -std::string UEObject::GetCppName() const +std::string UEObject::GetCppName() { static UEClass ActorClass = ObjectArray::FindClassFast("Actor"); static UEClass InterfaceClass = ObjectArray::FindClassFast("Interface"); @@ -379,7 +373,7 @@ std::string UEObject::GetCppName() const return 'F' + Temp; } -std::string UEObject::GetFullName() const +std::string UEObject::GetFullName() { if (*this) { @@ -401,7 +395,7 @@ std::string UEObject::GetFullName() const return "None"; } -UEObject::operator bool() const +UEObject::operator bool() { // if an object is 0x10000F000 it passes the nullptr check return Object != nullptr && reinterpret_cast(Object + Off::UObject::Class) != nullptr; @@ -431,17 +425,17 @@ void UEObject::ProcessEvent(UEFunction Func, void* Params) Prd(Object, Func.GetAddress(), Params); } -UEField UEField::GetNext() const +UEField UEField::GetNext() { return UEField(*reinterpret_cast(Object + Off::UField::Next)); } -bool UEField::IsNextValid() const +bool UEField::IsNextValid() { return (bool)GetNext(); } -std::vector> UEEnum::GetNameValuePairs() const +std::vector> UEEnum::GetNameValuePairs() { struct Name08Byte { uint8 Pad[0x08]; }; struct Name16Byte { uint8 Pad[0x10]; }; @@ -496,40 +490,62 @@ std::vector> UEEnum::GetNameValuePairs() const return Ret; } -std::string UEEnum::GetSingleName(int32 Index) const +std::string UEEnum::GetSingleName(int32 Index) { return GetNameValuePairs()[Index].First.ToString(); } -std::string UEEnum::GetEnumTypeAsStr() const +std::string UEEnum::GetEnumTypeAsStr() { std::string Temp = GetName(); return "enum class " + (Temp[0] == 'E' ? Temp : 'E' + Temp); } +std::string UEEnum::UNSAFEGetCPPType() +{ + return (*reinterpret_cast(Object + Off::UEnum::Names - 0x10)).ToString(); +} + +std::string UEEnum::UNSAFEGetDeclarationType() +{ + int f = *reinterpret_cast(Object + Off::UEnum::Names + 0x10); + + if (f == 0) + { + return "Regular"; + } + else if (f == 1) + { + return "Namespaced"; + } + else if (f == 2) + { + return "EnumClass"; + } +} -UEStruct UEStruct::GetSuper() const +UEStruct UEStruct::GetSuper() { return UEStruct(*reinterpret_cast(Object + Off::UStruct::SuperStruct)); } -UEField UEStruct::GetChild() const +UEField UEStruct::GetChild() { return UEField(*reinterpret_cast(Object + Off::UStruct::Children)); } -UEFField UEStruct::GetChildProperties() const +UEFField UEStruct::GetChildProperties() { return UEFField(*reinterpret_cast(Object + Off::UStruct::ChildProperties)); } -int32 UEStruct::GetStructSize() const +int32 UEStruct::GetStructSize() { return *reinterpret_cast(Object + Off::UStruct::Size); } -std::vector UEStruct::GetProperties() const +std::vector UEStruct::GetProperties() { std::vector Properties; @@ -557,7 +573,7 @@ std::vector UEStruct::GetProperties() const return Properties; } -bool UEStruct::HasMembers() const +bool UEStruct::HasMembers() { if (!Object) return false; @@ -586,17 +602,17 @@ bool UEStruct::HasMembers() const return false; } -EClassCastFlags UEClass::GetCastFlags() const +EClassCastFlags UEClass::GetCastFlags() { return *reinterpret_cast(Object + Off::UClass::CastFlags); } -bool UEClass::IsType(EClassCastFlags TypeFlag) const +bool UEClass::IsType(EClassCastFlags TypeFlag) { return (TypeFlag != EClassCastFlags::None ? (GetCastFlags() & TypeFlag) : true); } -bool UEClass::HasType(UEClass TypeClass) const +bool UEClass::HasType(UEClass TypeClass) { if (TypeClass == nullptr) return false; @@ -610,12 +626,12 @@ bool UEClass::HasType(UEClass TypeClass) const return false; } -UEObject UEClass::GetDefaultObject() const +UEObject UEClass::GetDefaultObject() { return UEObject(*reinterpret_cast(Object + Off::UClass::ClassDefaultObject)); } -UEFunction UEClass::GetFunction(const std::string& ClassName, const std::string& FuncName) const +UEFunction UEClass::GetFunction(const std::string& ClassName, const std::string& FuncName) { for (UEStruct Struct = *this; Struct; Struct = Struct.GetSuper()) { @@ -634,22 +650,22 @@ UEFunction UEClass::GetFunction(const std::string& ClassName, const std::string& return nullptr; } -EFunctionFlags UEFunction::GetFunctionFlags() const +EFunctionFlags UEFunction::GetFunctionFlags() { return *reinterpret_cast(Object + Off::UFunction::FunctionFlags); } -bool UEFunction::HasFlags(EFunctionFlags FuncFlags) const +bool UEFunction::HasFlags(EFunctionFlags FuncFlags) { return GetFunctionFlags() & FuncFlags; } -std::string UEFunction::StringifyFlags() const +std::string UEFunction::StringifyFlags() { return StringifyFunctionFlags(GetFunctionFlags()); } -std::string UEFunction::GetParamStructName() const +std::string UEFunction::GetParamStructName() { return GetOuter().GetCppName() + "_" + GetValidName() + "_Params"; } @@ -659,7 +675,7 @@ void* UEProperty::GetAddress() return Base; } -std::pair UEProperty::GetClass() const +std::pair UEProperty::GetClass() { if (Settings::Internal::bUseFProperty) { @@ -668,20 +684,14 @@ std::pair UEProperty::GetClass() const return { UEObject(Base).GetClass(), UEFFieldClass(0) }; } - -template -UEType UEProperty::Cast() -{ - return UEType(Base); -} - + template -const UEType UEProperty::Cast() const +inline UEType UEProperty::Cast() { return UEType(Base); } -bool UEProperty::IsA(EClassCastFlags TypeFlags) const +bool UEProperty::IsA(EClassCastFlags TypeFlags) { if (GetClass().first) return GetClass().first.IsType(TypeFlags); @@ -689,14 +699,7 @@ bool UEProperty::IsA(EClassCastFlags TypeFlags) const return GetClass().second.IsType(TypeFlags); } -bool UEProperty::IsTypeSupported() const -{ - EClassCastFlags PropTypeFlags = (GetClass().first ? GetClass().first.GetCastFlags() : GetClass().second.GetCastFlags()); - - return static_cast>(PropTypeFlags) & static_cast>(GetSupportedProperties()); -} - -FName UEProperty::GetFName() const +FName UEProperty::GetFName() { if (Settings::Internal::bUseFProperty) { @@ -706,49 +709,49 @@ FName UEProperty::GetFName() const return FName(Base + Off::UObject::Name); //Not the real FName, but a wrapper which holds the address of a FName } -int32 UEProperty::GetArrayDim() const +int32 UEProperty::GetArrayDim() { return *reinterpret_cast(Base + Off::UProperty::ArrayDim); } -int32 UEProperty::GetSize() const +int32 UEProperty::GetSize() { return *reinterpret_cast(Base + Off::UProperty::ElementSize); } -int32 UEProperty::GetOffset() const +int32 UEProperty::GetOffset() { return *reinterpret_cast(Base + Off::UProperty::Offset_Internal); } -EPropertyFlags UEProperty::GetPropertyFlags() const +EPropertyFlags UEProperty::GetPropertyFlags() { return *reinterpret_cast(Base + Off::UProperty::PropertyFlags); } -EMappingsTypeFlags UEProperty::GetMappingType() const +EMappingsTypeFlags UEProperty::GetMappingType() { EClassCastFlags Flags = GetClass().first ? GetClass().first.GetCastFlags() : GetClass().second.GetCastFlags(); return EPropertyFlagsToMappingFlags(Flags); } -bool UEProperty::HasPropertyFlags(EPropertyFlags PropertyFlag) const +bool UEProperty::HasPropertyFlags(EPropertyFlags PropertyFlag) { return GetPropertyFlags() & PropertyFlag; } -UEObject UEProperty::GetOutermost() const +UEObject UEProperty::GetOutermost() { return Settings::Internal::bUseFProperty ? UEFField(Base).GetOutermost() : UEObject(Base).GetOutermost(); } -std::string UEProperty::GetName() const +std::string UEProperty::GetName() { return Base ? GetFName().ToString() : "None"; } -std::string UEProperty::GetValidName() const +std::string UEProperty::GetValidName() { std::string Name = GetName(); @@ -782,7 +785,7 @@ std::string UEProperty::GetValidName() const return Name; } -std::string UEProperty::GetCppType() const +std::string UEProperty::GetCppType() { EClassCastFlags TypeFlags = (GetClass().first ? GetClass().first.GetCastFlags() : GetClass().second.GetCastFlags()); @@ -886,27 +889,30 @@ std::string UEProperty::GetCppType() const { return Cast().GetCppType(); } - else if (TypeFlags & EClassCastFlags::InterfaceProperty) - { + else if (TypeFlags & EClassCastFlags::InterfaceProperty) { return Cast().GetCppType(); } else { - return (GetClass().first ? GetClass().first.GetCppName() : GetClass().second.GetCppName()) + "_";; + std::string CppName = (GetClass().first ? GetClass().first.GetCppName() : GetClass().second.GetCppName()) + "_"; + + UnknownProperties.insert({ CppName, GetSize() }); + + return CppName; } } -std::string UEProperty::StringifyFlags() const +std::string UEProperty::StringifyFlags() { return StringifyPropertyFlags(GetPropertyFlags()); } -UEEnum UEByteProperty::GetEnum() const +UEEnum UEByteProperty::GetEnum() { return UEEnum(*reinterpret_cast(Base + Off::UByteProperty::Enum)); } -std::string UEByteProperty::GetCppType() const +std::string UEByteProperty::GetCppType() { if (UEEnum Enum = GetEnum()) { @@ -916,12 +922,12 @@ std::string UEByteProperty::GetCppType() const return "uint8"; } -uint8 UEBoolProperty::GetFieldMask() const +uint8 UEBoolProperty::GetFieldMask() { return reinterpret_cast(Base + Off::UBoolProperty::Base)->FieldMask; } -uint8 UEBoolProperty::GetBitIndex() const +uint8 UEBoolProperty::GetBitIndex() { uint8 FieldMask = GetFieldMask(); @@ -940,117 +946,117 @@ uint8 UEBoolProperty::GetBitIndex() const return 0xFF; } -bool UEBoolProperty::IsNativeBool() const +bool UEBoolProperty::IsNativeBool() { return reinterpret_cast(Base + Off::UBoolProperty::Base)->FieldMask == 0xFF; } -std::string UEBoolProperty::GetCppType() const +std::string UEBoolProperty::GetCppType() { return IsNativeBool() ? "bool" : "uint8"; } -UEClass UEObjectProperty::GetPropertyClass() const +UEClass UEObjectProperty::GetPropertyClass() { return UEClass(*reinterpret_cast(Base + Off::UObjectProperty::PropertyClass)); } -std::string UEObjectProperty::GetCppType() const +std::string UEObjectProperty::GetCppType() { return std::format("class {}*", GetPropertyClass() ? GetPropertyClass().GetCppName() : "UObject"); } -UEClass UEClassProperty::GetMetaClass() const +UEClass UEClassProperty::GetMetaClass() { return UEClass(*reinterpret_cast(Base + Off::UClassProperty::MetaClass)); } -std::string UEClassProperty::GetCppType() const +std::string UEClassProperty::GetCppType() { return HasPropertyFlags(EPropertyFlags::UObjectWrapper) ? std::format("TSubclassOf", GetMetaClass().GetCppName()) : "class UClass*"; } -std::string UEWeakObjectProperty::GetCppType() const +std::string UEWeakObjectProperty::GetCppType() { return std::format("TWeakObjectPtr", GetPropertyClass().GetCppName()); } -std::string UELazyObjectProperty::GetCppType() const +std::string UELazyObjectProperty::GetCppType() { return std::format("TLazyObjectPtr", GetPropertyClass().GetCppName()); } -std::string UESoftObjectProperty::GetCppType() const +std::string UESoftObjectProperty::GetCppType() { return std::format("TSoftObjectPtr", GetPropertyClass().GetCppName()); } -std::string UESoftClassProperty::GetCppType() const +std::string UESoftClassProperty::GetCppType() { return std::format("TSoftClassPtr", GetMetaClass() ? GetMetaClass().GetCppName() : GetPropertyClass().GetCppName()); } -std::string UEInterfaceProperty::GetCppType() const +std::string UEInterfaceProperty::GetCppType() { return std::format("TScriptInterface", GetPropertyClass().GetCppName()); } -UEStruct UEStructProperty::GetUnderlayingStruct() const +UEStruct UEStructProperty::GetUnderlayingStruct() { return UEStruct(*reinterpret_cast(Base + Off::UStructProperty::Struct)); } -std::string UEStructProperty::GetCppType() const +std::string UEStructProperty::GetCppType() { return std::format("struct {}", GetUnderlayingStruct().GetCppName()); } -UEProperty UEArrayProperty::GetInnerProperty() const +UEProperty UEArrayProperty::GetInnerProperty() { return UEProperty(*reinterpret_cast(Base + Off::UArrayProperty::Inner)); } -std::string UEArrayProperty::GetCppType() const +std::string UEArrayProperty::GetCppType() { return std::format("TArray<{}>", GetInnerProperty().GetCppType()); } -UEProperty UEMapProperty::GetKeyProperty() const +UEProperty UEMapProperty::GetKeyProperty() { return UEProperty(reinterpret_cast(Base + Off::UMapProperty::Base)->KeyProperty); } -UEProperty UEMapProperty::GetValueProperty() const +UEProperty UEMapProperty::GetValueProperty() { return UEProperty(reinterpret_cast(Base + Off::UMapProperty::Base)->ValueProperty); } -std::string UEMapProperty::GetCppType() const +std::string UEMapProperty::GetCppType() { return std::format("TMap<{}, {}>", GetKeyProperty().GetCppType(), GetValueProperty().GetCppType()); } -UEProperty UESetProperty::GetElementProperty() const +UEProperty UESetProperty::GetElementProperty() { return UEProperty(*reinterpret_cast(Base + Off::USetProperty::ElementProp)); } -std::string UESetProperty::GetCppType() const +std::string UESetProperty::GetCppType() { return std::format("TSet<{}>", GetElementProperty().GetCppType()); } -UEProperty UEEnumProperty::GetUnderlayingProperty() const +UEProperty UEEnumProperty::GetUnderlayingProperty() { return UEProperty(reinterpret_cast(Base + Off::UEnumProperty::Base)->UnderlayingProperty); } -UEEnum UEEnumProperty::GetEnum() const +UEEnum UEEnumProperty::GetEnum() { return UEEnum(reinterpret_cast(Base + Off::UEnumProperty::Base)->Enum); } -std::string UEEnumProperty::GetCppType() const +std::string UEEnumProperty::GetCppType() { return GetEnum().GetEnumTypeAsStr(); } @@ -1067,9 +1073,12 @@ void TemplateTypeCreationForUnrealObjects(void) UEFField FDummy(nullptr); UEProperty PDummy(nullptr); - const UEObject CDummy(nullptr); - const UEFField CFDummy(nullptr); - const UEProperty CPDummy(nullptr); + PDummy.Cast(); + PDummy.Cast(); + PDummy.Cast(); + + PDummy.Cast(); + PDummy.Cast(); FDummy.Cast(); FDummy.Cast(); @@ -1097,32 +1106,6 @@ void TemplateTypeCreationForUnrealObjects(void) FDummy.Cast(); FDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - PDummy.Cast(); - Dummy.Cast(); Dummy.Cast(); @@ -1160,76 +1143,4 @@ void TemplateTypeCreationForUnrealObjects(void) Dummy.Cast(); Dummy.Cast(); Dummy.Cast(); - - - CPDummy.Cast(); - CPDummy.Cast(); - CPDummy.Cast(); - - CPDummy.Cast(); - CPDummy.Cast(); - - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - CFDummy.Cast(); - - CDummy.Cast(); - - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); - CDummy.Cast(); } diff --git a/Dumper/UnrealObjects.h b/Dumper/UnrealObjects.h index 36c988a..ee500af 100644 --- a/Dumper/UnrealObjects.h +++ b/Dumper/UnrealObjects.h @@ -31,18 +31,18 @@ class UEFFieldClass void* GetAddress(); - EFieldClassID GetId() const; + EFieldClassID GetId(); - EClassCastFlags GetCastFlags() const; - EClassFlags GetClassFlags() const; - UEFFieldClass GetSuper() const; - FName GetFName() const; + EClassCastFlags GetCastFlags(); + EClassFlags GetClassFlags(); + UEFFieldClass GetSuper(); + FName GetFName(); - bool IsType(EClassCastFlags Flags) const; + bool IsType(EClassCastFlags Flags); - std::string GetName() const; - std::string GetValidName() const; - std::string GetCppName() const; + std::string GetName(); + std::string GetValidName(); + std::string GetCppName(); }; class UEFField @@ -66,26 +66,26 @@ class UEFField void* GetAddress(); - EObjectFlags GetFlags() const; - class UEObject GetOwnerAsUObject() const; - class UEFField GetOwnerAsFField() const; - class UEObject GetOwnerUObject() const; - class UEObject GetOutermost() const; - UEFFieldClass GetClass() const; - FName GetFName() const; - UEFField GetNext() const; + EObjectFlags GetFlags(); + class UEObject GetOwnerAsUObject(); + class UEFField GetOwnerAsFField(); + class UEObject GetOwnerUObject(); + class UEObject GetOutermost(); + UEFFieldClass GetClass(); + FName GetFName(); + UEFField GetNext(); template UEType Cast() const; - bool IsOwnerUObject() const; - bool IsA(EClassCastFlags Flags) const; + bool IsOwnerUObject(); + bool IsA(EClassCastFlags Flags); - std::string GetName() const; - std::string GetValidName() const; - std::string GetCppName() const; + std::string GetName(); + std::string GetValidName(); + std::string GetCppName(); - explicit operator bool() const; + explicit operator bool(); bool operator==(const UEFField& Other) const; bool operator!=(const UEFField& Other) const; }; @@ -114,30 +114,27 @@ class UEObject void* GetAddress(); - EObjectFlags GetFlags() const; - int32 GetIndex() const; - UEClass GetClass() const; - FName GetFName() const; - UEObject GetOuter() const; + EObjectFlags GetFlags(); + int32 GetIndex(); + UEClass GetClass(); + FName GetFName(); + UEObject GetOuter(); - bool HasAnyFlags(EObjectFlags Flags) const; + bool HasAnyFlags(EObjectFlags Flags); template - UEType Cast(); - - template - const UEType Cast() const; + UEType Cast() const; - bool IsA(EClassCastFlags TypeFlags) const; + bool IsA(EClassCastFlags TypeFlags); - UEObject GetOutermost() const; + UEObject GetOutermost(); - std::string GetName() const; - std::string GetValidName() const; - std::string GetCppName() const; - std::string GetFullName() const; + std::string GetName(); + std::string GetValidName(); + std::string GetCppName(); + std::string GetFullName(); - explicit operator bool() const; + explicit operator bool(); explicit operator uint8*(); bool operator==(const UEObject& Other) const; bool operator!=(const UEObject& Other) const; @@ -150,8 +147,8 @@ class UEField : public UEObject using UEObject::UEObject; public: - UEField GetNext() const; - bool IsNextValid() const; + UEField GetNext(); + bool IsNextValid(); }; class UEEnum : public UEField @@ -161,9 +158,12 @@ class UEEnum : public UEField public: static std::unordered_map BigEnums; //ObjectArray::GetAllPackages() - std::vector> GetNameValuePairs() const; - std::string GetSingleName(int32 Index) const; - std::string GetEnumTypeAsStr() const; + std::vector> GetNameValuePairs(); + std::string GetSingleName(int32 Index); + std::string GetEnumTypeAsStr(); + + std::string UNSAFEGetCPPType(); + std::string UNSAFEGetDeclarationType(); }; class UEStruct : public UEField @@ -174,14 +174,14 @@ class UEStruct : public UEField static std::unordered_map StructSizes; public: - UEStruct GetSuper() const; - UEField GetChild() const; - UEFField GetChildProperties() const; - int32 GetStructSize() const; + UEStruct GetSuper(); + UEField GetChild(); + UEFField GetChildProperties(); + int32 GetStructSize(); - std::vector GetProperties() const; + std::vector GetProperties(); - bool HasMembers() const; + bool HasMembers(); }; class UEFunction : public UEStruct @@ -189,11 +189,11 @@ class UEFunction : public UEStruct using UEStruct::UEStruct; public: - EFunctionFlags GetFunctionFlags() const; - bool HasFlags(EFunctionFlags Flags) const; + EFunctionFlags GetFunctionFlags(); + bool HasFlags(EFunctionFlags Flags); - std::string StringifyFlags() const; - std::string GetParamStructName() const; + std::string StringifyFlags(); + std::string GetParamStructName(); }; class UEClass : public UEStruct @@ -201,12 +201,12 @@ class UEClass : public UEStruct using UEStruct::UEStruct; public: - EClassCastFlags GetCastFlags() const; - bool IsType(EClassCastFlags TypeFlag) const; - bool HasType(UEClass TypeClass) const; - UEObject GetDefaultObject() const; + EClassCastFlags GetCastFlags(); + bool IsType(EClassCastFlags TypeFlag); + bool HasType(UEClass TypeClass); + UEObject GetDefaultObject(); - UEFunction GetFunction(const std::string& ClassName, const std::string& FuncName) const; + UEFunction GetFunction(const std::string& ClassName, const std::string& FuncName); }; class UEProperty @@ -229,49 +229,31 @@ class UEProperty { } -public: void* GetAddress(); - std::pair GetClass() const; + std::pair GetClass(); template UEType Cast(); - template - const UEType Cast() const; + bool IsA(EClassCastFlags TypeFlags); - bool IsA(EClassCastFlags TypeFlags) const; + FName GetFName(); + int32 GetArrayDim(); + int32 GetSize(); + int32 GetOffset(); + EPropertyFlags GetPropertyFlags(); + EMappingsTypeFlags GetMappingType(); + bool HasPropertyFlags(EPropertyFlags PropertyFlag); - bool IsTypeSupported() const; + UEObject GetOutermost(); - FName GetFName() const; - int32 GetArrayDim() const; - int32 GetSize() const; - int32 GetOffset() const; - EPropertyFlags GetPropertyFlags() const; - EMappingsTypeFlags GetMappingType() const; - bool HasPropertyFlags(EPropertyFlags PropertyFlag) const; + std::string GetName(); + std::string GetValidName(); - UEObject GetOutermost() const; + std::string GetCppType(); - std::string GetName() const; - std::string GetValidName() const; - - std::string GetCppType() const; - - std::string StringifyFlags() const; - -public: - static consteval EClassCastFlags GetSupportedProperties() - { - return EClassCastFlags::ByteProperty | EClassCastFlags::UInt16Property | EClassCastFlags::UInt32Property | EClassCastFlags::UInt64Property - | EClassCastFlags::Int8Property | EClassCastFlags::Int16Property | EClassCastFlags::IntProperty | EClassCastFlags::Int64Property - | EClassCastFlags::FloatProperty | EClassCastFlags::DoubleProperty | EClassCastFlags::ClassProperty | EClassCastFlags::NameProperty - | EClassCastFlags::StrProperty | EClassCastFlags::TextProperty | EClassCastFlags::BoolProperty | EClassCastFlags::StructProperty - | EClassCastFlags::ArrayProperty | EClassCastFlags::WeakObjectProperty | EClassCastFlags::LazyObjectProperty | EClassCastFlags::SoftClassProperty - | EClassCastFlags::SoftObjectProperty | EClassCastFlags::ObjectProperty | EClassCastFlags::MapProperty | EClassCastFlags::SetProperty - | EClassCastFlags::EnumProperty | EClassCastFlags::InterfaceProperty; - } + std::string StringifyFlags(); }; class UEByteProperty : public UEProperty @@ -279,9 +261,9 @@ class UEByteProperty : public UEProperty using UEProperty::UEProperty; public: - UEEnum GetEnum() const; + UEEnum GetEnum(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEBoolProperty : public UEProperty @@ -289,11 +271,11 @@ class UEBoolProperty : public UEProperty using UEProperty::UEProperty; public: - uint8 GetFieldMask() const; - uint8 GetBitIndex() const; - bool IsNativeBool() const; + uint8 GetFieldMask(); + uint8 GetBitIndex(); + bool IsNativeBool(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEObjectProperty : public UEProperty @@ -301,9 +283,9 @@ class UEObjectProperty : public UEProperty using UEProperty::UEProperty; public: - UEClass GetPropertyClass() const; + UEClass GetPropertyClass(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEClassProperty : public UEObjectProperty @@ -311,9 +293,9 @@ class UEClassProperty : public UEObjectProperty using UEObjectProperty::UEObjectProperty; public: - UEClass GetMetaClass() const; + UEClass GetMetaClass(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEWeakObjectProperty : public UEObjectProperty @@ -321,7 +303,7 @@ class UEWeakObjectProperty : public UEObjectProperty using UEObjectProperty::UEObjectProperty; public: - std::string GetCppType() const; + std::string GetCppType(); }; class UELazyObjectProperty : public UEObjectProperty @@ -329,7 +311,7 @@ class UELazyObjectProperty : public UEObjectProperty using UEObjectProperty::UEObjectProperty; public: - std::string GetCppType() const; + std::string GetCppType(); }; class UESoftObjectProperty : public UEObjectProperty @@ -337,7 +319,7 @@ class UESoftObjectProperty : public UEObjectProperty using UEObjectProperty::UEObjectProperty; public: - std::string GetCppType() const; + std::string GetCppType(); }; class UESoftClassProperty : public UEClassProperty @@ -345,7 +327,7 @@ class UESoftClassProperty : public UEClassProperty using UEClassProperty::UEClassProperty; public: - std::string GetCppType() const; + std::string GetCppType(); }; class UEInterfaceProperty : public UEObjectProperty @@ -353,7 +335,7 @@ class UEInterfaceProperty : public UEObjectProperty using UEObjectProperty::UEObjectProperty; public: - std::string GetCppType() const; + std::string GetCppType(); }; class UEStructProperty : public UEProperty @@ -361,9 +343,9 @@ class UEStructProperty : public UEProperty using UEProperty::UEProperty; public: - UEStruct GetUnderlayingStruct() const; + UEStruct GetUnderlayingStruct(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEArrayProperty : public UEProperty @@ -371,9 +353,9 @@ class UEArrayProperty : public UEProperty using UEProperty::UEProperty; public: - UEProperty GetInnerProperty() const; + UEProperty GetInnerProperty(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEMapProperty : public UEProperty @@ -381,10 +363,10 @@ class UEMapProperty : public UEProperty using UEProperty::UEProperty; public: - UEProperty GetKeyProperty() const; - UEProperty GetValueProperty() const; + UEProperty GetKeyProperty(); + UEProperty GetValueProperty(); - std::string GetCppType() const; + std::string GetCppType(); }; class UESetProperty : public UEProperty @@ -392,9 +374,9 @@ class UESetProperty : public UEProperty using UEProperty::UEProperty; public: - UEProperty GetElementProperty() const; + UEProperty GetElementProperty(); - std::string GetCppType() const; + std::string GetCppType(); }; class UEEnumProperty : public UEProperty @@ -402,8 +384,8 @@ class UEEnumProperty : public UEProperty using UEProperty::UEProperty; public: - UEProperty GetUnderlayingProperty() const; - UEEnum GetEnum() const; + UEProperty GetUnderlayingProperty(); + UEEnum GetEnum(); - std::string GetCppType() const; + std::string GetCppType(); };