From e20ba575efc7eb10735e7a46703180e102b19281 Mon Sep 17 00:00:00 2001 From: praydog Date: Wed, 26 Jun 2024 03:00:53 -0700 Subject: [PATCH] Lua: Add StructObject.new(UStruct*) --- .../lib/include/datatypes/StructObject.hpp | 7 ++++ lua-api/lib/src/datatypes/StructObject.cpp | 42 ++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lua-api/lib/include/datatypes/StructObject.hpp b/lua-api/lib/include/datatypes/StructObject.hpp index 1e6f3f2..e499e9e 100644 --- a/lua-api/lib/include/datatypes/StructObject.hpp +++ b/lua-api/lib/include/datatypes/StructObject.hpp @@ -6,9 +6,16 @@ namespace lua::datatypes { struct StructObject { StructObject(void* obj, uevr::API::UStruct* def) : object{ obj }, desc{ def } {} + StructObject(uevr::API::UStruct* def); // Allocates a new structure given a definition + StructObject(uevr::API::UObject* obj); + ~StructObject(); + + void construct(uevr::API::UStruct* def); void* object{ nullptr }; uevr::API::UStruct* desc{ nullptr }; + + std::vector created_object{}; // Only used when the object is created by second constructor }; void bind_struct_object(sol::state_view& lua); diff --git a/lua-api/lib/src/datatypes/StructObject.cpp b/lua-api/lib/src/datatypes/StructObject.cpp index 8bb7fb2..b2903c4 100644 --- a/lua-api/lib/src/datatypes/StructObject.cpp +++ b/lua-api/lib/src/datatypes/StructObject.cpp @@ -4,6 +4,45 @@ #include namespace lua::datatypes { + void StructObject::construct(uevr::API::UStruct* def) { + // TODO: Call constructor? Not important for now + if (def->is_a(uevr::API::UScriptStruct::static_class())) { + auto script_struct = static_cast(def); + + created_object.resize(script_struct->get_struct_size()); + memset(created_object.data(), 0, created_object.size()); + } else { + created_object.resize(def->get_properties_size()); + } + + object = created_object.data(); + desc = def; + } + + StructObject::StructObject(uevr::API::UStruct* def) { + if (def == nullptr) { + throw sol::error("Cannot create a StructObject from a nullptr UStruct"); + } + + construct(def); + } + + StructObject::StructObject(uevr::API::UObject* obj) { + if (obj == nullptr) { + throw sol::error("Cannot create a StructObject from a nullptr UObject"); + } + + if (!obj->is_a(uevr::API::UStruct::static_class())) { + throw sol::error("Cannot create a StructObject from a UObject that is not a UStruct"); + } + + construct(static_cast(obj)); + } + + StructObject::~StructObject() { + + } + void bind_struct_object(sol::state_view& lua) { lua.new_usertype("StructObject", "get_address", [](StructObject& self) { return (uintptr_t)self.object; }, @@ -30,7 +69,8 @@ namespace lua::datatypes { const auto name = ::utility::widen(index_obj.as()); lua::utility::set_property(s, self->object, self->desc, name, value); - } + }, + sol::meta_function::construct, sol::constructors() ); } } \ No newline at end of file