From d75a7a30074febf72dd6bd26952b8508f3e528fb Mon Sep 17 00:00:00 2001 From: praydog Date: Thu, 12 Dec 2024 12:36:18 -0800 Subject: [PATCH] Lua: Add read/write functions to StructObject --- lua-api/lib/include/ScriptUtility.hpp | 26 ++++++++++----- lua-api/lib/src/datatypes/StructObject.cpp | 38 +++++++++++++--------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/lua-api/lib/include/ScriptUtility.hpp b/lua-api/lib/include/ScriptUtility.hpp index 8dcaf8ba..601d1e82 100644 --- a/lua-api/lib/include/ScriptUtility.hpp +++ b/lua-api/lib/include/ScriptUtility.hpp @@ -18,10 +18,10 @@ namespace lua::utility { sol::object call_function(sol::this_state s, uevr::API::UObject* self, uevr::API::UFunction* fn, sol::variadic_args args); sol::object call_function(sol::this_state s, uevr::API::UObject* self, const std::wstring& name, sol::variadic_args args); - template - void write_t(uevr::API::UObject* self, size_t offset, T value) { + template + inline T read_t_struct(void* self, uevr::API::UStruct* c, size_t offset) { size_t size = 0; - const auto c = self->get_class(); + if (c->is_a(uevr::API::UScriptStruct::static_class())) { auto script_struct = reinterpret_cast(c); @@ -34,14 +34,12 @@ namespace lua::utility { throw sol::error("Offset out of bounds"); } - *(T*)((uintptr_t)self + offset) = value; + return *(T*)((uintptr_t)self + offset); } - template - T read_t(uevr::API::UObject* self, size_t offset) { + template + inline void write_t_struct(void* self, uevr::API::UStruct* c, size_t offset, T value) { size_t size = 0; - const auto c = self->get_class(); - if (c->is_a(uevr::API::UScriptStruct::static_class())) { auto script_struct = reinterpret_cast(c); @@ -54,6 +52,16 @@ namespace lua::utility { throw sol::error("Offset out of bounds"); } - return *(T*)((uintptr_t)self + offset); + *(T*)((uintptr_t)self + offset) = value; + } + + template + void write_t(uevr::API::UObject* self, size_t offset, T value) { + write_t_struct(self, self->get_class(), offset, value); + } + + template + T read_t(uevr::API::UObject* self, size_t offset) { + return read_t_struct(self, self->get_class(), offset); } } \ No newline at end of file diff --git a/lua-api/lib/src/datatypes/StructObject.cpp b/lua-api/lib/src/datatypes/StructObject.cpp index 47c629cd..28ee9ebd 100644 --- a/lua-api/lib/src/datatypes/StructObject.cpp +++ b/lua-api/lib/src/datatypes/StructObject.cpp @@ -4,6 +4,16 @@ #include namespace lua::datatypes { + template + T read_t_structobject(StructObject& self, size_t offset) { + return utility::read_t_struct(self.object, self.desc, offset); + } + + template + void write_t_structobject(StructObject& self, size_t offset, T value) { + utility::write_t_struct(self.object, self.desc, offset, value); + } + void StructObject::construct(uevr::API::UStruct* def) { // TODO: Call constructor? Not important for now if (def->is_a(uevr::API::UScriptStruct::static_class())) { @@ -53,22 +63,18 @@ namespace lua::datatypes { "set_property", [](sol::this_state s, StructObject* self, const std::wstring& name, sol::object value) { lua::utility::set_property(s, self->object, self->desc, name, value); }, - "write_qword", [](StructObject& self, size_t offset, uint64_t value) { - size_t size = 0; - if (self.desc->is_a(uevr::API::UScriptStruct::static_class())) { - auto script_struct = static_cast(self.desc); - - size = script_struct->get_struct_size(); - } else { - size = self.desc->get_properties_size(); - } - - if (offset + sizeof(uint64_t) > size) { - throw sol::error("Offset out of bounds"); - } - - *(uint64_t*)((uintptr_t)self.object + offset) = value; - }, + "write_qword", &write_t_structobject, + "write_dword", &write_t_structobject, + "write_word", &write_t_structobject, + "write_byte", &write_t_structobject, + "write_float", &write_t_structobject, + "write_double", &write_t_structobject, + "read_qword", &read_t_structobject, + "read_dword", &read_t_structobject, + "read_word", &read_t_structobject, + "read_byte", &read_t_structobject, + "read_float", &read_t_structobject, + "read_double", &read_t_structobject, sol::meta_function::index, [](sol::this_state s, StructObject* self, sol::object index_obj) -> sol::object { if (!index_obj.is()) { return sol::make_object(s, sol::lua_nil);