Skip to content

Commit

Permalink
Plugins/Lua: Add UField, Add UStruct::get_children
Browse files Browse the repository at this point in the history
  • Loading branch information
praydog committed Jul 17, 2024
1 parent b1a1724 commit fb387e1
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 7 deletions.
9 changes: 8 additions & 1 deletion include/uevr/API.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ SOFTWARE.
#define UEVR_OUT

#define UEVR_PLUGIN_VERSION_MAJOR 2
#define UEVR_PLUGIN_VERSION_MINOR 28
#define UEVR_PLUGIN_VERSION_MINOR 29
#define UEVR_PLUGIN_VERSION_PATCH 0

#define UEVR_RENDERER_D3D11 0
Expand All @@ -62,6 +62,7 @@ DECLARE_UEVR_HANDLE(UEVR_FCanvasHandle);
DECLARE_UEVR_HANDLE(UEVR_UObjectArrayHandle);
DECLARE_UEVR_HANDLE(UEVR_UObjectHandle);
DECLARE_UEVR_HANDLE(UEVR_FFieldHandle);
DECLARE_UEVR_HANDLE(UEVR_UFieldHandle);
DECLARE_UEVR_HANDLE(UEVR_FPropertyHandle);
DECLARE_UEVR_HANDLE(UEVR_UStructHandle);
DECLARE_UEVR_HANDLE(UEVR_UClassHandle);
Expand Down Expand Up @@ -291,6 +292,10 @@ typedef struct {
UEVR_FNameHandle (*get_fname)(UEVR_FFieldHandle field);
} UEVR_FFieldFunctions;

typedef struct {
UEVR_UFieldHandle (*get_next)(UEVR_UFieldHandle field);
} UEVR_UFieldFunctions;

typedef struct {
int (*get_offset)(UEVR_FPropertyHandle prop);
unsigned long long (*get_property_flags)(UEVR_FPropertyHandle prop);
Expand All @@ -308,6 +313,7 @@ typedef struct {
UEVR_FPropertyHandle (*find_property)(UEVR_UStructHandle klass, const wchar_t* name);
int (*get_properties_size)(UEVR_UStructHandle klass); /* size in bytes */
int (*get_min_alignment)(UEVR_UStructHandle klass);
UEVR_UFieldHandle (*get_children)(UEVR_UStructHandle klass);
} UEVR_UStructFunctions;

typedef struct {
Expand Down Expand Up @@ -453,6 +459,7 @@ typedef struct {
const UEVR_FBoolPropertyFunctions* fboolproperty;
const UEVR_FStructPropertyFunctions* fstructproperty;
const UEVR_FEnumPropertyFunctions* fenumproperty;
const UEVR_UFieldFunctions* ufield;
} UEVR_SDKData;

DECLARE_UEVR_HANDLE(UEVR_IVRSystem);
Expand Down
33 changes: 32 additions & 1 deletion include/uevr/API.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ class API {
struct UScriptStruct;
struct UStructOps;
struct FField;
struct UField;
struct FProperty;
struct FFieldClass;
struct FUObjectArray;
Expand Down Expand Up @@ -380,7 +381,32 @@ class API {
}
};

struct UStruct : public UObject {
struct UField : public UObject {
inline UEVR_UFieldHandle to_handle() { return (UEVR_UFieldHandle)this; }
inline UEVR_UFieldHandle to_handle() const { return (UEVR_UFieldHandle)this; }

static UClass* static_class() {
static auto result = API::get()->find_uobject<UClass>(L"Class /Script/CoreUObject.Field");
return result;
}

inline UField* get_next() const {
static const auto fn = initialize()->get_next;
return (UField*)fn(to_handle());
}

private:
static inline const UEVR_UFieldFunctions* s_functions{nullptr};
static inline const UEVR_UFieldFunctions* initialize() {
if (s_functions == nullptr) {
s_functions = API::get()->sdk()->ufield;
}

return s_functions;
}
};

struct UStruct : public UField {
inline UEVR_UStructHandle to_handle() { return (UEVR_UStructHandle)this; }
inline UEVR_UStructHandle to_handle() const { return (UEVR_UStructHandle)this; }

Expand Down Expand Up @@ -414,6 +440,11 @@ class API {
return (FField*)fn(to_handle());
}

UField* get_children() const {
static const auto fn = initialize()->get_children;
return (UField*)fn(to_handle());
}

int32_t get_properties_size() const {
static const auto fn = initialize()->get_properties_size;
return fn(to_handle());
Expand Down
14 changes: 10 additions & 4 deletions lua-api/lib/src/ScriptContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -456,20 +456,26 @@ int ScriptContext::setup_bindings() {
}
);

m_lua.new_usertype<uevr::API::UStruct>("UEVR_UStruct",
m_lua.new_usertype<uevr::API::UField>("UEVR_UField",
sol::base_classes, sol::bases<uevr::API::UObject>(),
"get_next", &uevr::API::UField::get_next
);

m_lua.new_usertype<uevr::API::UStruct>("UEVR_UStruct",
sol::base_classes, sol::bases<uevr::API::UField, uevr::API::UObject>(),
"static_class", &uevr::API::UStruct::static_class,
"get_super_struct", &uevr::API::UStruct::get_super_struct,
"get_super", &uevr::API::UStruct::get_super,
"find_function", [](uevr::API::UStruct& self, const std::wstring& name) {
return self.find_function(name);
},
"get_child_properties", &uevr::API::UStruct::get_child_properties,
"get_properties_size", &uevr::API::UStruct::get_properties_size
"get_properties_size", &uevr::API::UStruct::get_properties_size,
"get_children", &uevr::API::UStruct::get_children
);

m_lua.new_usertype<uevr::API::UClass>("UEVR_UClass",
sol::base_classes, sol::bases<uevr::API::UStruct, uevr::API::UObject>(),
sol::base_classes, sol::bases<uevr::API::UStruct, uevr::API::UField, uevr::API::UObject>(),
"static_class", &uevr::API::UClass::static_class,
"get_class_default_object", &uevr::API::UClass::get_class_default_object,
"get_objects_matching", &uevr::API::UClass::get_objects_matching<uevr::API::UObject>,
Expand All @@ -480,7 +486,7 @@ int ScriptContext::setup_bindings() {
sol::meta_function::call, [](sol::this_state s, uevr::API::UFunction* fn, uevr::API::UObject* obj, sol::variadic_args args) -> sol::object {
return lua::utility::call_function(s, obj, fn, args);
},
sol::base_classes, sol::bases<uevr::API::UStruct, uevr::API::UObject>(),
sol::base_classes, sol::bases<uevr::API::UStruct, uevr::API::UField, uevr::API::UObject>(),
"static_class", &uevr::API::UFunction::static_class,
"call", &uevr::API::UFunction::call,
"get_native_function", &uevr::API::UFunction::get_native_function,
Expand Down
12 changes: 11 additions & 1 deletion src/mods/PluginLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,9 @@ UEVR_UStructFunctions g_ustruct_functions {
},
.get_min_alignment = [](UEVR_UStructHandle strct) {
return USTRUCT(strct)->get_min_alignment();
},
.get_children = [](UEVR_UStructHandle strct) {
return (UEVR_UFieldHandle)USTRUCT(strct)->get_children();
}
};

Expand Down Expand Up @@ -1008,6 +1011,12 @@ UEVR_FEnumPropertyFunctions g_fenum_property_functions {
}
};

UEVR_UFieldFunctions g_ufield_functions {
.get_next = [](UEVR_UFieldHandle field) -> UEVR_UFieldHandle {
return (UEVR_UFieldHandle)((sdk::UField*)field)->get_next();
}
};

UEVR_SDKData g_sdk_data {
&g_sdk_functions,
&g_sdk_callbacks,
Expand All @@ -1030,7 +1039,8 @@ UEVR_SDKData g_sdk_data {
&g_farray_property_functions,
&g_fbool_property_functions,
&g_fstruct_property_functions,
&g_fenum_property_functions
&g_fenum_property_functions,
&g_ufield_functions,
};

namespace uevr {
Expand Down

0 comments on commit fb387e1

Please sign in to comment.