Files
ReshadePluginsCore/LittleNightmareIII/SDK/Basic.hpp

1416 lines
44 KiB
C++

#pragma once
/*
* SDK generated by Dumper-7
*
* https://github.com/Encryqed/Dumper-7
*/
// Basic file containing structs required by the SDK
#define VC_EXTRALEAN
#define WIN32_LEAN_AND_MEAN
#include <string>
#include <functional>
#include <type_traits>
#include "../PropertyFixup.hpp"
#include "../UnrealContainers.hpp"
#include "../Assertions.inl"
namespace SDK
{
using namespace UC;
#include "../NameCollisions.inl"
/*
* Disclaimer:
* - The 'GNames' is only a fallback and null by default, FName::AppendString is used
* - THe 'GWorld' offset is not used by the SDK, it's just there for "decoration", use the provided 'UWorld::GetWorld()' function instead
*/
namespace Offsets
{
inline int32 GObjects = 0x06233500;
inline int32 AppendString = 0x00000000;
inline int32 GNames = 0x06436A80;
inline int32 GWorld = 0x06433698;
inline int32 ProcessEvent = 0x01DD3580;
inline int32 ProcessEventIdx = 0x00000044;
}
namespace InSDKUtils
{
uintptr_t GetImageBase();
template<typename FuncType>
inline FuncType GetVirtualFunction(const void* ObjectInstance, int32 Index)
{
void** VTable = *reinterpret_cast<void***>(const_cast<void*>(ObjectInstance));
return reinterpret_cast<FuncType>(VTable[Index]);
}
template<typename FuncType, typename... ParamTypes>
requires std::invocable<FuncType, ParamTypes...>
inline auto CallGameFunction(FuncType Function, ParamTypes&&... Args)
{
return Function(std::forward<ParamTypes>(Args)...);
}
}
// Forward declarations because in-line forward declarations make the compiler think 'GetStaticClass()' is a class template
class UClass;
class UObject;
class UFunction;
class FName;
namespace BasicFilesImpleUtils
{
// Helper functions for GetStaticClass and GetStaticBPGeneratedClass
UClass* FindClassByName(const std::string& Name, bool bByFullName = false);
UClass* FindClassByFullName(const std::string& Name);
std::string GetObjectName(class UClass* Class);
int32 GetObjectIndex(class UClass* Class);
/* FName represented as a uint64. */
uint64 GetObjFNameAsUInt64(class UClass* Class);
UObject* GetObjectByIndex(int32 Index);
UFunction* FindFunctionByFName(const FName* Name);
FName StringToName(const wchar_t* Name);
}
const FName& GetStaticName(const wchar_t* Name, FName& StaticName);
template<bool bIsFullName = false>
class UClass* GetStaticClass(const char* Name, class UClass*& StaticClass)
{
if (StaticClass == nullptr)
{
if constexpr (bIsFullName) {
StaticClass = BasicFilesImpleUtils::FindClassByFullName(Name);
}
else /* default */ {
StaticClass = BasicFilesImpleUtils::FindClassByName(Name);
}
}
return StaticClass;
}
template<bool bIsFullName = false>
class UClass* GetStaticBPGeneratedClass(const char* Name, int32& ClassIdx, uint64& ClassNameIdx)
{
/* Could be external function, not really unique to this StaticClass functon */
static auto SetClassIndex = [](UClass* Class, int32& Index, uint64& ClassName) -> UClass*
{
if (Class)
{
Index = BasicFilesImpleUtils::GetObjectIndex(Class);
ClassName = BasicFilesImpleUtils::GetObjFNameAsUInt64(Class);
}
return Class;
};
/* Use the full name to find an object */
if constexpr (bIsFullName)
{
if (ClassIdx == 0x0) [[unlikely]]
return SetClassIndex(BasicFilesImpleUtils::FindClassByFullName(Name), ClassIdx, ClassNameIdx);
UClass* ClassObj = static_cast<UClass*>(BasicFilesImpleUtils::GetObjectByIndex(ClassIdx));
/* Could use cast flags too to save some string comparisons */
if (!ClassObj || BasicFilesImpleUtils::GetObjFNameAsUInt64(ClassObj) != ClassNameIdx)
return SetClassIndex(BasicFilesImpleUtils::FindClassByFullName(Name), ClassIdx, ClassNameIdx);
return ClassObj;
}
else /* Default, use just the name to find an object*/
{
if (ClassIdx == 0x0) [[unlikely]]
return SetClassIndex(BasicFilesImpleUtils::FindClassByName(Name), ClassIdx, ClassNameIdx);
UClass* ClassObj = static_cast<UClass*>(BasicFilesImpleUtils::GetObjectByIndex(ClassIdx));
/* Could use cast flags too to save some string comparisons */
if (!ClassObj || BasicFilesImpleUtils::GetObjFNameAsUInt64(ClassObj) != ClassNameIdx)
return SetClassIndex(BasicFilesImpleUtils::FindClassByName(Name), ClassIdx, ClassNameIdx);
return ClassObj;
}
}
template<class ClassType>
ClassType* GetDefaultObjImpl()
{
UClass* StaticClass = ClassType::StaticClass();
if (StaticClass)
{
return reinterpret_cast<ClassType*>(StaticClass->DefaultObject);
}
return nullptr;
}
#define STATIC_CLASS_IMPL(NameString) \
{ \
static UClass* Clss = nullptr; \
return GetStaticClass(NameString, Clss); \
}
#define STATIC_CLASS_IMPL_FULLNAME(FullNameString) \
{ \
static UClass* Clss = nullptr; \
return GetStaticClass<true>(FullNameString, Clss); \
}
#define BP_STATIC_CLASS_IMPL(NameString) \
{ \
static int32 ClassIdx = 0; \
static uint64 ClassName = 0; \
return GetStaticBPGeneratedClass(NameString, ClassIdx, ClassName); \
}
#define BP_STATIC_CLASS_IMPL_FULLNAME(FullNameString) \
{ \
static int32 ClassIdx = 0; \
static uint64 ClassName = 0; \
return GetStaticBPGeneratedClass<true>(FullNameString, ClassIdx, ClassName); \
}
#define STATIC_NAME_IMPL(NameString) \
{ \
static FName Name = FName(); \
return GetStaticName(NameString, Name); \
}
// Predefined struct FUObjectItem
// 0x0018 (0x0018 - 0x0000)
struct FUObjectItem final
{
public:
class UObject* Object; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_8[0x10]; // 0x0008(0x0010)(Fixing Struct Size After Last Property [ Dumper-7 ])
};
DUMPER7_ASSERTS_FUObjectItem;
// Predefined struct TUObjectArray
// 0x0020 (0x0020 - 0x0000)
class TUObjectArray final
{
public:
static constexpr auto DecryptPtr = [](void* ObjPtr) -> uint8*
{
return reinterpret_cast<uint8*>(ObjPtr);
};
static constexpr int32 ElementsPerChunk = 0x10000; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
struct FUObjectItem** Objects; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_8[0x8]; // 0x0008(0x0008)(Fixing Size After Last Property [ Dumper-7 ])
int32 MaxElements; // 0x0010(0x0004)(NOT AUTO-GENERATED PROPERTY)
int32 NumElements; // 0x0014(0x0004)(NOT AUTO-GENERATED PROPERTY)
int32 MaxChunks; // 0x0018(0x0004)(NOT AUTO-GENERATED PROPERTY)
int32 NumChunks; // 0x001C(0x0004)(NOT AUTO-GENERATED PROPERTY)
public:
inline int32 Num() const
{
return NumElements;
}
FUObjectItem** GetDecrytedObjPtr() const
{
return reinterpret_cast<FUObjectItem**>(DecryptPtr(Objects));
}
inline class UObject* GetByIndex(const int32 Index) const
{
const int32 ChunkIndex = Index / ElementsPerChunk;
const int32 InChunkIdx = Index % ElementsPerChunk;
if (Index < 0 || ChunkIndex >= NumChunks || Index >= NumElements)
return nullptr;
FUObjectItem* ChunkPtr = GetDecrytedObjPtr()[ChunkIndex];
if (!ChunkPtr) return nullptr;
return ChunkPtr[InChunkIdx].Object;
}
};
DUMPER7_ASSERTS_TUObjectArray;
class TUObjectArrayWrapper
{
private:
friend class UObject;
private:
void* GObjectsAddress = nullptr;
private:
TUObjectArrayWrapper() = default;
public:
TUObjectArrayWrapper(TUObjectArrayWrapper&&) = delete;
TUObjectArrayWrapper(const TUObjectArrayWrapper&) = delete;
TUObjectArrayWrapper& operator=(TUObjectArrayWrapper&&) = delete;
TUObjectArrayWrapper& operator=(const TUObjectArrayWrapper&) = delete;
private:
inline void InitGObjects()
{
GObjectsAddress = reinterpret_cast<void*>(InSDKUtils::GetImageBase() + Offsets::GObjects);
}
public:
inline void InitManually(void* GObjectsAddressParameter)
{
GObjectsAddress = GObjectsAddressParameter;
}
inline class TUObjectArray* operator->()
{
if (!GObjectsAddress) [[unlikely]]
InitGObjects();
return reinterpret_cast<class TUObjectArray*>(GObjectsAddress);
}
inline TUObjectArray& operator*() const
{
return *reinterpret_cast<class TUObjectArray*>(GObjectsAddress);
}
inline operator const void* ()
{
if (!GObjectsAddress) [[unlikely]]
InitGObjects();
return GObjectsAddress;
}
inline class TUObjectArray* GetTypedPtr()
{
if (!GObjectsAddress) [[unlikely]]
InitGObjects();
return reinterpret_cast<class TUObjectArray*>(GObjectsAddress);
}
};
// Predefined struct FNumberedData
// 0x0008 (0x0008 - 0x0000)
struct FNumberedData final
{
public:
uint8 Id[0x4]; // 0x0000(0x0001)(NOT AUTO-GENERATED PROPERTY)
uint8 Number[0x4]; // 0x0004(0x0001)(NOT AUTO-GENERATED PROPERTY)
public:
int32 GetTypedId() const
{
return reinterpret_cast<int32>(Id);
}
uint32 GetNumber() const
{
return reinterpret_cast<uint32>(Number);
}
};
DUMPER7_ASSERTS_FNumberedData;
// Predefined struct FNameEntryHeader
// 0x0002 (0x0002 - 0x0000)
struct FNameEntryHeader final
{
public:
uint16 bIsWide : 1; // 0x0000(0x0002)(BitIndex: 0x00, PropSize: 0x0002 (NOT AUTO-GENERATED PROPERTY))
uint16 BitPad_0_1 : 5; // 0x0000(0x0002)(Fixing Bit-Field Size Between Bits [ Dumper-7 ])
uint16 Len : 10; // 0x0000(0x0002)(BitIndex: 0x06, PropSize: 0x0002 (NOT AUTO-GENERATED PROPERTY))
};
DUMPER7_ASSERTS_FNameEntryHeader;
// Predefined struct FStringData
// 0x0800 (0x0800 - 0x0000)
union FStringData final
{
public:
char AnsiName[0x400]; // 0x0000(0x0001)(NOT AUTO-GENERATED PROPERTY)
wchar_t WideName[0x400]; // 0x0000(0x0002)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FStringData;
// Predefined struct FNameEntry
// 0x0802 (0x0802 - 0x0000)
struct FNameEntry final
{
public:
struct FNameEntryHeader Header; // 0x0000(0x0002)(NOT AUTO-GENERATED PROPERTY)
union FStringData Name; // 0x0002(0x0800)(NOT AUTO-GENERATED PROPERTY)
public:
bool IsWide() const
{
return Header.bIsWide;
}
std::string GetString() const
{
if (IsWide())
{
return UtfN::Utf16StringToUtf8String<std::string>(Name.WideName, Header.Len);
}
return std::string(Name.AnsiName, Header.Len);
}
};
DUMPER7_ASSERTS_FNameEntry;
// Predefined struct FNamePool
// 0x10010 (0x10010 - 0x0000)
class FNamePool final
{
public:
static constexpr uint32 FNameEntryStride = 0x0002; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
static constexpr uint32 FNameBlockOffsetBits = 0x0010; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
static constexpr uint32 FNameBlockOffsets = 1 << FNameBlockOffsetBits; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_0[0x8]; // 0x0000(0x0008)(Fixing Size After Last Property [ Dumper-7 ])
uint32 CurrentBlock; // 0x0008(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint32 CurrentByteCursor; // 0x000C(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint8* Blocks[0x2000]; // 0x0010(0x10000)(NOT AUTO-GENERATED PROPERTY)
public:
bool IsValidIndex(int32 Index, int32 ChunkIdx, int32 InChunkIdx) const
{
return ChunkIdx <= CurrentBlock && !(ChunkIdx == CurrentBlock && InChunkIdx > CurrentByteCursor);
}
FNameEntry* GetEntryByIndex(int32 Index) const
{
const int32 ChunkIdx = Index >> FNameBlockOffsetBits;
const int32 InChunk = (Index & (FNameBlockOffsets - 1));
if (!IsValidIndex(Index, ChunkIdx, InChunk))
return nullptr;
return reinterpret_cast<FNameEntry*>(Blocks[ChunkIdx] + (InChunk * FNameEntryStride));
}
};
DUMPER7_ASSERTS_FNamePool;
// Predefined struct FName
// 0x0008 (0x0008 - 0x0000)
class FName final
{
public:
static inline FNamePool* GNames = nullptr; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
int32 ComparisonIndex; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint32 Number; // 0x0004(0x0004)(NOT AUTO-GENERATED PROPERTY)
public:
constexpr FName(int32 ComparisonIndex = 0, uint32 Number = 0)
: ComparisonIndex(ComparisonIndex), Number(Number)
{
}
static void InitManually(void* Location)
{
GNames = reinterpret_cast<FNamePool*>(Location);
}
constexpr FName(const FName& other)
: ComparisonIndex(other.ComparisonIndex), Number(other.Number)
{
}
static void InitInternal()
{
GNames = reinterpret_cast<FNamePool*>(InSDKUtils::GetImageBase() + Offsets::GNames);
}
bool IsNone() const
{
return !ComparisonIndex&& !Number;
}
int32 GetDisplayIndex() const
{
return ComparisonIndex;
}
std::string GetRawString() const
{
if (!GNames)
InitInternal();
std::string RetStr = FName::GNames->GetEntryByIndex(GetDisplayIndex())->GetString();
if (Number > 0)
RetStr += ("_" + std::to_string(Number - 1));
return RetStr;
}
std::string ToString() const
{
std::string OutputString = GetRawString();
size_t pos = OutputString.rfind('/');
if (pos == std::string::npos)
return OutputString;
return OutputString.substr(pos + 1);
}
FName& operator=(const FName& Other)
{
ComparisonIndex = Other.ComparisonIndex;
Number = Other.Number;
return *this;
}
bool operator==(const FName& Other) const
{
return ComparisonIndex == Other.ComparisonIndex && Number == Other.Number;
}
bool operator!=(const FName& Other) const
{
return ComparisonIndex != Other.ComparisonIndex || Number != Other.Number;
}
};
DUMPER7_ASSERTS_FName;
template<typename ClassType>
class TSubclassOf
{
class UClass* ClassPtr;
public:
TSubclassOf() = default;
inline TSubclassOf(UClass* Class)
: ClassPtr(Class)
{
}
inline UClass* Get()
{
return ClassPtr;
}
inline operator UClass*() const
{
return ClassPtr;
}
template<typename Target, typename = std::enable_if<std::is_base_of_v<Target, ClassType>, bool>::type>
inline operator TSubclassOf<Target>() const
{
return ClassPtr;
}
inline UClass* operator->()
{
return ClassPtr;
}
inline TSubclassOf& operator=(UClass* Class)
{
ClassPtr = Class;
return *this;
}
inline bool operator==(const TSubclassOf& Other) const
{
return ClassPtr == Other.ClassPtr;
}
inline bool operator!=(const TSubclassOf& Other) const
{
return ClassPtr != Other.ClassPtr;
}
inline bool operator==(UClass* Other) const
{
return ClassPtr == Other;
}
inline bool operator!=(UClass* Other) const
{
return ClassPtr != Other;
}
};
namespace FTextImpl
{
// Predefined struct FTextData
// 0x0038 (0x0038 - 0x0000)
class FTextData final
{
public:
uint8 Pad_0[0x28]; // 0x0000(0x0028)(Fixing Size After Last Property [ Dumper-7 ])
class FString TextSource; // 0x0028(0x0010)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FTextData;
}
// Predefined struct FText
// 0x0018 (0x0018 - 0x0000)
class FText final
{
public:
class FTextImpl::FTextData* TextData; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_8[0x10]; // 0x0008(0x0010)(Fixing Struct Size After Last Property [ Dumper-7 ])
public:
const class FString& GetStringRef() const
{
return TextData->TextSource;
}
std::string ToString() const
{
return TextData->TextSource.ToString();
}
};
DUMPER7_ASSERTS_FText;
// Predefined struct FWeakObjectPtr
// 0x0008 (0x0008 - 0x0000)
class FWeakObjectPtr
{
public:
int32 ObjectIndex; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
int32 ObjectSerialNumber; // 0x0004(0x0004)(NOT AUTO-GENERATED PROPERTY)
public:
class UObject* Get() const;
class UObject* operator->() const;
bool operator==(const FWeakObjectPtr& Other) const;
bool operator!=(const FWeakObjectPtr& Other) const;
bool operator==(const class UObject* Other) const;
bool operator!=(const class UObject* Other) const;
};
DUMPER7_ASSERTS_FWeakObjectPtr;
template<typename UEType>
class TWeakObjectPtr : public FWeakObjectPtr
{
public:
UEType* Get() const
{
return static_cast<UEType*>(FWeakObjectPtr::Get());
}
UEType* operator->() const
{
return static_cast<UEType*>(FWeakObjectPtr::Get());
}
};
// Predefined struct FUniqueObjectGuid
// 0x0010 (0x0010 - 0x0000)
class FUniqueObjectGuid final
{
public:
uint32 A; // 0x0000(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint32 B; // 0x0004(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint32 C; // 0x0008(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint32 D; // 0x000C(0x0004)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FUniqueObjectGuid;
// Predefined struct TPersistentObjectPtr
// 0x0000 (0x0000 - 0x0000)
template<typename TObjectID>
class TPersistentObjectPtr
{
public:
FWeakObjectPtr WeakPtr; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
int32 TagAtLastTest; // 0x0008(0x0004)(NOT AUTO-GENERATED PROPERTY)
TObjectID ObjectID; // 0x000C(0x0000)(NOT AUTO-GENERATED PROPERTY)
public:
class UObject* Get() const
{
return WeakPtr.Get();
}
class UObject* operator->() const
{
return WeakPtr.Get();
}
};
template<typename UEType>
class TLazyObjectPtr : public TPersistentObjectPtr<FUniqueObjectGuid>
{
public:
UEType* Get() const
{
return static_cast<UEType*>(TPersistentObjectPtr::Get());
}
UEType* operator->() const
{
return static_cast<UEType*>(TPersistentObjectPtr::Get());
}
};
namespace FakeSoftObjectPtr
{
// ScriptStruct CoreUObject.SoftObjectPath
// 0x0018 (0x0018 - 0x0000)
struct FSoftObjectPath
{
public:
class FName AssetPathName; // 0x0000(0x0008)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
class FString SubPathString; // 0x0008(0x0010)(ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
};
DUMPER7_ASSERTS_FSoftObjectPath;
}
class FSoftObjectPtr : public TPersistentObjectPtr<FakeSoftObjectPtr::FSoftObjectPath>
{
};
template<typename UEType>
class TSoftObjectPtr : public FSoftObjectPtr
{
public:
UEType* Get() const
{
return static_cast<UEType*>(TPersistentObjectPtr::Get());
}
UEType* operator->() const
{
return static_cast<UEType*>(TPersistentObjectPtr::Get());
}
};
template<typename UEType>
class TSoftClassPtr : public FSoftObjectPtr
{
public:
UEType* Get() const
{
return static_cast<UEType*>(TPersistentObjectPtr::Get());
}
UEType* operator->() const
{
return static_cast<UEType*>(TPersistentObjectPtr::Get());
}
};
class FEncryptedObjPtr
{
public:
class UObject* Object;
uint64_t KeyOrSomething;
};
template<typename UEType>
class TEncryptedObjPtr : public FEncryptedObjPtr
{
public:
public:
UEType* Get()
{
return static_cast<UEType*>(Object);
}
const UEType* Get() const
{
return static_cast<const UEType*>(Object);
}
UEType* operator->()
{
return Get();
}
const UEType* operator->() const
{
return Get();
}
inline operator UEType* ()
{
return Get();
}
inline operator UEType* () const
{
return Get();
}
public:
inline bool operator==(const FEncryptedObjPtr& Other) const
{
return Object == Other.Object;
}
inline bool operator!=(const FEncryptedObjPtr& Other) const
{
return Object != Other.Object;
}
inline explicit operator bool() const
{
return Object != nullptr;
}
};
// Predefined struct FScriptInterface
// 0x0010 (0x0010 - 0x0000)
class FScriptInterface
{
public:
UObject* ObjectPointer; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
void* InterfacePointer; // 0x0008(0x0008)(NOT AUTO-GENERATED PROPERTY)
public:
class UObject* GetObjectRef() const
{
return ObjectPointer;
}
void* GetInterfaceRef() const
{
return InterfacePointer;
}
};
DUMPER7_ASSERTS_FScriptInterface;
// Predefined struct TScriptInterface
// 0x0000 (0x0010 - 0x0010)
template<class InterfaceType>
class TScriptInterface final : public FScriptInterface
{
};
// Predefined struct FFieldPath
// 0x0020 (0x0020 - 0x0000)
class FFieldPath
{
public:
class FField* ResolvedField; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
TWeakObjectPtr<class UStruct> ResolvedOwner; // 0x0008(0x0008)(NOT AUTO-GENERATED PROPERTY)
TArray<FName> Path; // 0x0010(0x0010)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FFieldPath;
// Predefined struct TFieldPath
// 0x0000 (0x0020 - 0x0020)
template<class PropertyType>
class TFieldPath final : public FFieldPath
{
};
template<typename OptionalType, bool bIsIntrusiveUnsetCheck = false>
class TOptional
{
private:
template<int32 TypeSize>
struct OptionalWithBool
{
static_assert(TypeSize > 0x0, "TOptional can not store an empty type!");
uint8 Value[TypeSize];
bool bIsSet;
};
private:
using ValueType = std::conditional_t<bIsIntrusiveUnsetCheck, uint8[sizeof(OptionalType)], OptionalWithBool<sizeof(OptionalType)>>;
private:
alignas(OptionalType) ValueType StoredValue;
private:
inline uint8* GetValueBytes()
{
if constexpr (!bIsIntrusiveUnsetCheck)
return StoredValue.Value;
return StoredValue;
}
inline const uint8* GetValueBytes() const
{
if constexpr (!bIsIntrusiveUnsetCheck)
return StoredValue.Value;
return StoredValue;
}
public:
inline OptionalType& GetValueRef()
{
return *reinterpret_cast<OptionalType*>(GetValueBytes());
}
inline const OptionalType& GetValueRef() const
{
return *reinterpret_cast<const OptionalType*>(GetValueBytes());
}
inline bool IsSet() const
{
if constexpr (!bIsIntrusiveUnsetCheck)
return StoredValue.bIsSet;
constexpr char ZeroBytes[sizeof(OptionalType)];
return memcmp(GetValueBytes(), &ZeroBytes, sizeof(OptionalType)) == 0;
}
inline explicit operator bool() const
{
return IsSet();
}
};
// Predefined struct FScriptDelegate
// 0x0010 (0x0010 - 0x0000)
struct FScriptDelegate
{
public:
FWeakObjectPtr Object; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
FName FunctionName; // 0x0008(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FScriptDelegate;
// Predefined struct TDelegate
// 0x0010 (0x0010 - 0x0000)
template<typename FunctionSignature>
class TDelegate
{
public:
struct InvalidUseOfTDelegate TemplateParamIsNotAFunctionSignature; // 0x0000(0x0000)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_0[0x10]; // 0x0000(0x0010)(Fixing Struct Size After Last Property [ Dumper-7 ])
};
// Predefined struct TDelegate<Ret(Args...)>
// 0x0010 (0x0010 - 0x0000)
template<typename Ret, typename... Args>
class TDelegate<Ret(Args...)>
{
public:
FScriptDelegate BoundFunction; // 0x0000(0x0010)(NOT AUTO-GENERATED PROPERTY)
};
// Predefined struct TMulticastInlineDelegate
// 0x0010 (0x0010 - 0x0000)
template<typename FunctionSignature>
class TMulticastInlineDelegate
{
public:
struct InvalidUseOfTMulticastInlineDelegate TemplateParamIsNotAFunctionSignature; // 0x0000(0x0010)(NOT AUTO-GENERATED PROPERTY)
};
// Predefined struct TMulticastInlineDelegate<Ret(Args...)>
// 0x0000 (0x0000 - 0x0000)
template<typename Ret, typename... Args>
class TMulticastInlineDelegate<Ret(Args...)>
{
public:
TArray<FScriptDelegate> InvocationList; // 0x0000(0x0010)(NOT AUTO-GENERATED PROPERTY)
};
#define UE_ENUM_OPERATORS(EEnumClass) \
\
inline constexpr EEnumClass operator|(EEnumClass Left, EEnumClass Right) \
{ \
return (EEnumClass)((std::underlying_type<EEnumClass>::type)(Left) | (std::underlying_type<EEnumClass>::type)(Right)); \
} \
\
inline constexpr EEnumClass& operator|=(EEnumClass& Left, EEnumClass Right) \
{ \
return (EEnumClass&)((std::underlying_type<EEnumClass>::type&)(Left) |= (std::underlying_type<EEnumClass>::type)(Right)); \
} \
\
inline bool operator&(EEnumClass Left, EEnumClass Right) \
{ \
return (((std::underlying_type<EEnumClass>::type)(Left) & (std::underlying_type<EEnumClass>::type)(Right)) == (std::underlying_type<EEnumClass>::type)(Right)); \
}
enum class EObjectFlags : int32
{
NoFlags = 0x00000000,
Public = 0x00000001,
Standalone = 0x00000002,
MarkAsNative = 0x00000004,
Transactional = 0x00000008,
ClassDefaultObject = 0x00000010,
ArchetypeObject = 0x00000020,
Transient = 0x00000040,
MarkAsRootSet = 0x00000080,
TagGarbageTemp = 0x00000100,
NeedInitialization = 0x00000200,
NeedLoad = 0x00000400,
KeepForCooker = 0x00000800,
NeedPostLoad = 0x00001000,
NeedPostLoadSubobjects = 0x00002000,
NewerVersionExists = 0x00004000,
BeginDestroyed = 0x00008000,
FinishDestroyed = 0x00010000,
BeingRegenerated = 0x00020000,
DefaultSubObject = 0x00040000,
WasLoaded = 0x00080000,
TextExportTransient = 0x00100000,
LoadCompleted = 0x00200000,
InheritableComponentTemplate = 0x00400000,
DuplicateTransient = 0x00800000,
StrongRefOnFrame = 0x01000000,
NonPIEDuplicateTransient = 0x02000000,
Dynamic = 0x04000000,
WillBeLoaded = 0x08000000,
HasExternalPackage = 0x10000000,
MirroredGarbage = 0x40000000,
AllocatedInSharedPage = 0x80000000,
};
enum class EFunctionFlags : uint32
{
None = 0x00000000,
Final = 0x00000001,
RequiredAPI = 0x00000002,
BlueprintAuthorityOnly = 0x00000004,
BlueprintCosmetic = 0x00000008,
Net = 0x00000040,
NetReliable = 0x00000080,
NetRequest = 0x00000100,
Exec = 0x00000200,
Native = 0x00000400,
Event = 0x00000800,
NetResponse = 0x00001000,
Static = 0x00002000,
NetMulticast = 0x00004000,
UbergraphFunction = 0x00008000,
MulticastDelegate = 0x00010000,
Public = 0x00020000,
Private = 0x00040000,
Protected = 0x00080000,
Delegate = 0x00100000,
NetServer = 0x00200000,
HasOutParms = 0x00400000,
HasDefaults = 0x00800000,
NetClient = 0x01000000,
DLLImport = 0x02000000,
BlueprintCallable = 0x04000000,
BlueprintEvent = 0x08000000,
BlueprintPure = 0x10000000,
EditorOnly = 0x20000000,
Const = 0x40000000,
NetValidate = 0x80000000,
AllFlags = 0xFFFFFFFF,
};
enum class EClassFlags : uint32
{
CLASS_None = 0x00000000u,
Abstract = 0x00000001u,
DefaultConfig = 0x00000002u,
Config = 0x00000004u,
Transient = 0x00000008u,
Parsed = 0x00000010u,
MatchedSerializers = 0x00000020u,
ProjectUserConfig = 0x00000040u,
Native = 0x00000080u,
NoExport = 0x00000100u,
NotPlaceable = 0x00000200u,
PerObjectConfig = 0x00000400u,
ReplicationDataIsSetUp = 0x00000800u,
EditInlineNew = 0x00001000u,
CollapseCategories = 0x00002000u,
Interface = 0x00004000u,
CustomConstructor = 0x00008000u,
Const = 0x00010000u,
LayoutChanging = 0x00020000u,
CompiledFromBlueprint = 0x00040000u,
MinimalAPI = 0x00080000u,
RequiredAPI = 0x00100000u,
DefaultToInstanced = 0x00200000u,
TokenStreamAssembled = 0x00400000u,
HasInstancedReference = 0x00800000u,
Hidden = 0x01000000u,
Deprecated = 0x02000000u,
HideDropDown = 0x04000000u,
GlobalUserConfig = 0x08000000u,
Intrinsic = 0x10000000u,
Constructed = 0x20000000u,
ConfigDoNotCheckDefaults = 0x40000000u,
NewerVersionExists = 0x80000000u,
};
enum class EClassCastFlags : uint64
{
None = 0x0000000000000000,
Field = 0x0000000000000001,
Int8Property = 0x0000000000000002,
Enum = 0x0000000000000004,
Struct = 0x0000000000000008,
ScriptStruct = 0x0000000000000010,
Class = 0x0000000000000020,
ByteProperty = 0x0000000000000040,
IntProperty = 0x0000000000000080,
FloatProperty = 0x0000000000000100,
UInt64Property = 0x0000000000000200,
ClassProperty = 0x0000000000000400,
UInt32Property = 0x0000000000000800,
InterfaceProperty = 0x0000000000001000,
NameProperty = 0x0000000000002000,
StrProperty = 0x0000000000004000,
Property = 0x0000000000008000,
ObjectProperty = 0x0000000000010000,
BoolProperty = 0x0000000000020000,
UInt16Property = 0x0000000000040000,
Function = 0x0000000000080000,
StructProperty = 0x0000000000100000,
ArrayProperty = 0x0000000000200000,
Int64Property = 0x0000000000400000,
DelegateProperty = 0x0000000000800000,
NumericProperty = 0x0000000001000000,
MulticastDelegateProperty = 0x0000000002000000,
ObjectPropertyBase = 0x0000000004000000,
WeakObjectProperty = 0x0000000008000000,
LazyObjectProperty = 0x0000000010000000,
SoftObjectProperty = 0x0000000020000000,
TextProperty = 0x0000000040000000,
Int16Property = 0x0000000080000000,
DoubleProperty = 0x0000000100000000,
SoftClassProperty = 0x0000000200000000,
Package = 0x0000000400000000,
Level = 0x0000000800000000,
Actor = 0x0000001000000000,
PlayerController = 0x0000002000000000,
Pawn = 0x0000004000000000,
SceneComponent = 0x0000008000000000,
PrimitiveComponent = 0x0000010000000000,
SkinnedMeshComponent = 0x0000020000000000,
SkeletalMeshComponent = 0x0000040000000000,
Blueprint = 0x0000080000000000,
DelegateFunction = 0x0000100000000000,
StaticMeshComponent = 0x0000200000000000,
MapProperty = 0x0000400000000000,
SetProperty = 0x0000800000000000,
EnumProperty = 0x0001000000000000,
USparseDelegateFunction = 0x0002000000000000,
MulticastInlineDelegateProperty = 0x0004000000000000,
MulticastSparseDelegateProperty = 0x0008000000000000,
FieldPathProperty = 0x0010000000000000,
LargeWorldCoordinatesRealProperty = 0x0080000000000000,
OptionalProperty = 0x0100000000000000,
VValueProperty = 0x0200000000000000,
VerseVMClass = 0x0400000000000000,
VRestValueProperty = 0x0800000000000000,
Utf8StrProperty = 0x1000000000000000,
AnsiStrProperty = 0x2000000000000000,
VCellProperty = 0x4000000000000000,
};
enum class EPropertyFlags : uint64
{
None = 0x0000000000000000,
Edit = 0x0000000000000001,
ConstParm = 0x0000000000000002,
BlueprintVisible = 0x0000000000000004,
ExportObject = 0x0000000000000008,
BlueprintReadOnly = 0x0000000000000010,
Net = 0x0000000000000020,
EditFixedSize = 0x0000000000000040,
Parm = 0x0000000000000080,
OutParm = 0x0000000000000100,
ZeroConstructor = 0x0000000000000200,
ReturnParm = 0x0000000000000400,
DisableEditOnTemplate = 0x0000000000000800,
Transient = 0x0000000000002000,
Config = 0x0000000000004000,
DisableEditOnInstance = 0x0000000000010000,
EditConst = 0x0000000000020000,
GlobalConfig = 0x0000000000040000,
InstancedReference = 0x0000000000080000,
DuplicateTransient = 0x0000000000200000,
SubobjectReference = 0x0000000000400000,
SaveGame = 0x0000000001000000,
NoClear = 0x0000000002000000,
ReferenceParm = 0x0000000008000000,
BlueprintAssignable = 0x0000000010000000,
Deprecated = 0x0000000020000000,
IsPlainOldData = 0x0000000040000000,
RepSkip = 0x0000000080000000,
RepNotify = 0x0000000100000000,
Interp = 0x0000000200000000,
NonTransactional = 0x0000000400000000,
EditorOnly = 0x0000000800000000,
NoDestructor = 0x0000001000000000,
AutoWeak = 0x0000004000000000,
ContainsInstancedReference = 0x0000008000000000,
AssetRegistrySearchable = 0x0000010000000000,
SimpleDisplay = 0x0000020000000000,
AdvancedDisplay = 0x0000040000000000,
Protected = 0x0000080000000000,
BlueprintCallable = 0x0000100000000000,
BlueprintAuthorityOnly = 0x0000200000000000,
TextExportTransient = 0x0000400000000000,
NonPIEDuplicateTransient = 0x0000800000000000,
ExposeOnSpawn = 0x0001000000000000,
PersistentInstance = 0x0002000000000000,
UObjectWrapper = 0x0004000000000000,
HasGetValueTypeHash = 0x0008000000000000,
NativeAccessSpecifierPublic = 0x0010000000000000,
NativeAccessSpecifierProtected = 0x0020000000000000,
NativeAccessSpecifierPrivate = 0x0040000000000000,
SkipSerialization = 0x0080000000000000,
};
UE_ENUM_OPERATORS(EObjectFlags);
UE_ENUM_OPERATORS(EFunctionFlags);
UE_ENUM_OPERATORS(EClassFlags);
UE_ENUM_OPERATORS(EClassCastFlags);
UE_ENUM_OPERATORS(EPropertyFlags);
// Predefined struct FFieldClass
// 0x0028 (0x0028 - 0x0000)
class FFieldClass
{
public:
FName Name; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
uint64 Id; // 0x0008(0x0008)(NOT AUTO-GENERATED PROPERTY)
uint64 CastFlags; // 0x0010(0x0008)(NOT AUTO-GENERATED PROPERTY)
EClassFlags ClassFlags; // 0x0018(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_1C[0x4]; // 0x001C(0x0004)(Fixing Size After Last Property [ Dumper-7 ])
class FFieldClass* SuperClass; // 0x0020(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FFieldClass;
// Predefined struct FFieldVariant
// 0x0010 (0x0010 - 0x0000)
class FFieldVariant
{
public:
using ContainerType = union { class FField* Field; class UObject* Object; };
ContainerType Container; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
bool bIsUObject; // 0x0008(0x0001)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FFieldVariant;
// Predefined struct FField
// 0x0038 (0x0038 - 0x0000)
class FField
{
public:
void* VTable; // 0x0000(0x0008)(NOT AUTO-GENERATED PROPERTY)
class FFieldClass* ClassPrivate; // 0x0008(0x0008)(NOT AUTO-GENERATED PROPERTY)
FFieldVariant Owner; // 0x0010(0x0010)(NOT AUTO-GENERATED PROPERTY)
class FField* Next; // 0x0020(0x0008)(NOT AUTO-GENERATED PROPERTY)
FName Name; // 0x0028(0x0008)(NOT AUTO-GENERATED PROPERTY)
int32 ObjFlags; // 0x0030(0x0004)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FField;
// Predefined struct FProperty
// 0x0040 (0x0078 - 0x0038)
class FProperty : public FField
{
public:
int32 ArrayDim; // 0x0038(0x0004)(NOT AUTO-GENERATED PROPERTY)
int32 ElementSize; // 0x003C(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint64 PropertyFlags; // 0x0040(0x0008)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_48[0x4]; // 0x0048(0x0004)(Fixing Size After Last Property [ Dumper-7 ])
int32 Offset; // 0x004C(0x0004)(NOT AUTO-GENERATED PROPERTY)
uint8 Pad_50[0x28]; // 0x0050(0x0028)(Fixing Struct Size After Last Property [ Dumper-7 ])
};
DUMPER7_ASSERTS_FProperty;
// Predefined struct FByteProperty
// 0x0008 (0x0080 - 0x0078)
class FByteProperty final : public FProperty
{
public:
class UEnum* Enum; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FByteProperty;
// Predefined struct FBoolProperty
// 0x0008 (0x0080 - 0x0078)
class FBoolProperty final : public FProperty
{
public:
uint8 FieldSize; // 0x0078(0x0001)(NOT AUTO-GENERATED PROPERTY)
uint8 ByteOffset; // 0x0079(0x0001)(NOT AUTO-GENERATED PROPERTY)
uint8 ByteMask; // 0x007A(0x0001)(NOT AUTO-GENERATED PROPERTY)
uint8 FieldMask; // 0x007B(0x0001)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FBoolProperty;
// Predefined struct FObjectPropertyBase
// 0x0008 (0x0080 - 0x0078)
class FObjectPropertyBase : public FProperty
{
public:
class UClass* PropertyClass; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FObjectPropertyBase;
// Predefined struct FClassProperty
// 0x0008 (0x0088 - 0x0080)
class FClassProperty final : public FObjectPropertyBase
{
public:
class UClass* MetaClass; // 0x0080(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FClassProperty;
// Predefined struct FStructProperty
// 0x0008 (0x0080 - 0x0078)
class FStructProperty final : public FProperty
{
public:
class UStruct* Struct; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FStructProperty;
// Predefined struct FArrayProperty
// 0x0008 (0x0080 - 0x0078)
class FArrayProperty final : public FProperty
{
public:
class FProperty* InnerProperty; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FArrayProperty;
// Predefined struct FDelegateProperty
// 0x0008 (0x0080 - 0x0078)
class FDelegateProperty final : public FProperty
{
public:
class UFunction* SignatureFunction; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FDelegateProperty;
// Predefined struct FMapProperty
// 0x0010 (0x0088 - 0x0078)
class FMapProperty final : public FProperty
{
public:
class FProperty* KeyProperty; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
class FProperty* ValueProperty; // 0x0080(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FMapProperty;
// Predefined struct FSetProperty
// 0x0008 (0x0080 - 0x0078)
class FSetProperty final : public FProperty
{
public:
class FProperty* ElementProperty; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FSetProperty;
// Predefined struct FEnumProperty
// 0x0010 (0x0088 - 0x0078)
class FEnumProperty final : public FProperty
{
public:
class FProperty* UnderlayingProperty; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
class UEnum* Enum; // 0x0080(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FEnumProperty;
// Predefined struct FFieldPathProperty
// 0x0008 (0x0080 - 0x0078)
class FFieldPathProperty final : public FProperty
{
public:
class FFieldClass* FieldClass; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FFieldPathProperty;
// Predefined struct FOptionalProperty
// 0x0008 (0x0080 - 0x0078)
class FOptionalProperty final : public FProperty
{
public:
class FProperty* ValueProperty; // 0x0078(0x0008)(NOT AUTO-GENERATED PROPERTY)
};
DUMPER7_ASSERTS_FOptionalProperty;
namespace CyclicDependencyFixupImpl
{
/*
* A wrapper for a Byte-Array of padding, that allows for casting to the actual underlaiyng type. Used for undefined structs in cylic headers.
*/
template<typename UnderlayingStructType, int32 Size, int32 Align>
struct alignas(Align) TCylicStructFixup
{
private:
uint8 Pad[Size];
public:
UnderlayingStructType& GetTyped() { return reinterpret_cast< UnderlayingStructType&>(*this); }
const UnderlayingStructType& GetTyped() const { return reinterpret_cast<const UnderlayingStructType&>(*this); }
};
/*
* A wrapper for a Byte-Array of padding, that inherited from UObject allows for casting to the actual underlaiyng type and access to basic UObject functionality. For cyclic classes.
*/
template<typename UnderlayingClassType, int32 Size, int32 Align = sizeof(void*), class BaseClassType = class UObject>
struct alignas(Align) TCyclicClassFixup : public BaseClassType
{
private:
uint8 Pad[Size];
public:
UnderlayingClassType* GetTyped() { return reinterpret_cast< UnderlayingClassType*>(this); }
const UnderlayingClassType* GetTyped() const { return reinterpret_cast<const UnderlayingClassType*>(this); }
};
}
template<typename UnderlayingStructType, int32 Size, int32 Align>
using TStructCycleFixup = CyclicDependencyFixupImpl::TCylicStructFixup<UnderlayingStructType, Size, Align>;
template<typename UnderlayingClassType, int32 Size, int32 Align = 0x8>
using TObjectBasedCycleFixup = CyclicDependencyFixupImpl::TCyclicClassFixup<UnderlayingClassType, Size, Align, class UObject>;
template<typename UnderlayingClassType, int32 Size, int32 Align = 0x8>
using TActorBasedCycleFixup = CyclicDependencyFixupImpl::TCyclicClassFixup<UnderlayingClassType, Size, Align, class AActor>;
}