From 4d0d36e145c61742324a67bceb0fce8f5b043e1b Mon Sep 17 00:00:00 2001 From: praydog Date: Fri, 18 Oct 2024 23:44:36 -0700 Subject: [PATCH 1/3] Future proof game object name stuff --- CMakeLists.txt | 24 ++++++++++++++++++++++++ src/mods/Graphics.cpp | 3 ++- src/mods/VR.cpp | 3 ++- src/mods/tools/ChainViewer.cpp | 3 ++- src/mods/tools/GameObjectsDisplay.cpp | 3 ++- src/mods/tools/ObjectExplorer.cpp | 11 +++++++---- 6 files changed, 39 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f21cc321..1cc3041c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -556,6 +556,7 @@ if(REF_BUILD_RE2_SDK OR REF_BUILD_FRAMEWORK) # build-re2-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -585,6 +586,7 @@ if(REF_BUILD_RE2_SDK OR REF_BUILD_FRAMEWORK) # build-re2-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -1385,6 +1387,7 @@ if(REF_BUILD_RE2_TDB66SDK OR REF_BUILD_FRAMEWORK) # build-re2tdb66-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -1414,6 +1417,7 @@ if(REF_BUILD_RE2_TDB66SDK OR REF_BUILD_FRAMEWORK) # build-re2tdb66-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -2629,6 +2633,7 @@ if(REF_BUILD_RE3_SDK OR REF_BUILD_FRAMEWORK) # build-re3-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -2658,6 +2663,7 @@ if(REF_BUILD_RE3_SDK OR REF_BUILD_FRAMEWORK) # build-re3-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -3458,6 +3464,7 @@ if(REF_BUILD_RE3_TDB67SDK OR REF_BUILD_FRAMEWORK) # build-re3tdb67-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -3487,6 +3494,7 @@ if(REF_BUILD_RE3_TDB67SDK OR REF_BUILD_FRAMEWORK) # build-re3tdb67-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -4909,6 +4917,7 @@ if(REF_BUILD_RE4_SDK OR REF_BUILD_FRAMEWORK) # build-re4-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -4938,6 +4947,7 @@ if(REF_BUILD_RE4_SDK OR REF_BUILD_FRAMEWORK) # build-re4-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -5740,6 +5750,7 @@ if(REF_BUILD_RE7_SDK OR REF_BUILD_FRAMEWORK) # build-re7-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -5769,6 +5780,7 @@ if(REF_BUILD_RE7_SDK OR REF_BUILD_FRAMEWORK) # build-re7-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -6569,6 +6581,7 @@ if(REF_BUILD_RE7_TDB49SDK OR REF_BUILD_FRAMEWORK) # build-re7tdb49-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -6598,6 +6611,7 @@ if(REF_BUILD_RE7_TDB49SDK OR REF_BUILD_FRAMEWORK) # build-re7tdb49-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -7813,6 +7827,7 @@ if(REF_BUILD_RE8_SDK OR REF_BUILD_FRAMEWORK) # build-re8-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -7842,6 +7857,7 @@ if(REF_BUILD_RE8_SDK OR REF_BUILD_FRAMEWORK) # build-re8-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -8851,6 +8867,7 @@ if(REF_BUILD_DMC5_SDK OR REF_BUILD_FRAMEWORK) # build-dmc5-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -8880,6 +8897,7 @@ if(REF_BUILD_DMC5_SDK OR REF_BUILD_FRAMEWORK) # build-dmc5-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -9887,6 +9905,7 @@ if(REF_BUILD_MHRISE_SDK OR REF_BUILD_FRAMEWORK) # build-mhrise-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -9916,6 +9935,7 @@ if(REF_BUILD_MHRISE_SDK OR REF_BUILD_FRAMEWORK) # build-mhrise-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -10925,6 +10945,7 @@ if(REF_BUILD_SF6_SDK OR REF_BUILD_FRAMEWORK) # build-sf6-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -10954,6 +10975,7 @@ if(REF_BUILD_SF6_SDK OR REF_BUILD_FRAMEWORK) # build-sf6-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" @@ -11963,6 +11985,7 @@ if(REF_BUILD_DD2_SDK OR REF_BUILD_FRAMEWORK) # build-dd2-sdk "shared/sdk/MurmurHash.cpp" "shared/sdk/REArray.cpp" "shared/sdk/REContext.cpp" + "shared/sdk/REGameObject.cpp" "shared/sdk/REGlobals.cpp" "shared/sdk/REManagedObject.cpp" "shared/sdk/RETransform.cpp" @@ -11992,6 +12015,7 @@ if(REF_BUILD_DD2_SDK OR REF_BUILD_FRAMEWORK) # build-dd2-sdk "shared/sdk/REArray.hpp" "shared/sdk/REComponent.hpp" "shared/sdk/REContext.hpp" + "shared/sdk/REGameObject.hpp" "shared/sdk/REGlobals.hpp" "shared/sdk/REManagedObject.hpp" "shared/sdk/REMath.hpp" diff --git a/src/mods/Graphics.cpp b/src/mods/Graphics.cpp index 3245b1804..64a773b24 100644 --- a/src/mods/Graphics.cpp +++ b/src/mods/Graphics.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "VR.hpp" #include "Graphics.hpp" @@ -483,7 +484,7 @@ bool Graphics::on_pre_gui_draw_element(REComponent* gui_element, void* primitive } } - const auto name = utility::re_string::get_string(game_object->name); + const auto name = utility::re_game_object::get_name(game_object); const auto name_hash = utility::hash(name); switch(name_hash) { diff --git a/src/mods/VR.cpp b/src/mods/VR.cpp index 1e5e13745..ca7d4774c 100644 --- a/src/mods/VR.cpp +++ b/src/mods/VR.cpp @@ -43,6 +43,7 @@ #include "sdk/Application.hpp" #include "sdk/Renderer.hpp" #include "sdk/REMath.hpp" +#include "sdk/REGameObject.hpp" #include "utility/Scan.hpp" #include "utility/FunctionHook.hpp" @@ -2363,7 +2364,7 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte if (game_object != nullptr && game_object->transform != nullptr) { auto context = sdk::get_thread_context(); - const auto name = utility::re_string::get_string(game_object->name); + const auto name = utility::re_game_object::get_name(game_object); const auto name_hash = utility::hash(name); switch (name_hash) { diff --git a/src/mods/tools/ChainViewer.cpp b/src/mods/tools/ChainViewer.cpp index 6483f1218..03ffedb37 100644 --- a/src/mods/tools/ChainViewer.cpp +++ b/src/mods/tools/ChainViewer.cpp @@ -10,6 +10,7 @@ #include "sdk/RETypeDB.hpp" #include "sdk/REManagedObject.hpp" #include "sdk/Renderer.hpp" +#include "sdk/REGameObject.hpp" #if TDB_VER < 69 #include "sdk/regenny/re3/via/motion/Chain.hpp" @@ -182,7 +183,7 @@ void ChainViewer::on_frame() { return; } - auto owner_name = utility::re_string::get_string(owner->name); + auto owner_name = utility::re_game_object::get_name(owner); if (owner_name.empty()) { owner_name = ""; diff --git a/src/mods/tools/GameObjectsDisplay.cpp b/src/mods/tools/GameObjectsDisplay.cpp index 478e8898e..5ea4f5589 100644 --- a/src/mods/tools/GameObjectsDisplay.cpp +++ b/src/mods/tools/GameObjectsDisplay.cpp @@ -2,6 +2,7 @@ #include "sdk/SceneManager.hpp" #include "sdk/RETypeDB.hpp" #include "sdk/REManagedObject.hpp" +#include "sdk/REGameObject.hpp" #include "GameObjectsDisplay.hpp" @@ -130,7 +131,7 @@ void GameObjectsDisplay::on_frame() { continue; } - auto owner_name = utility::re_string::get_string(owner->name); + auto owner_name = utility::re_game_object::get_name(owner); if (owner_name.empty()) { continue; diff --git a/src/mods/tools/ObjectExplorer.cpp b/src/mods/tools/ObjectExplorer.cpp index f8ff5c162..a1202217e 100644 --- a/src/mods/tools/ObjectExplorer.cpp +++ b/src/mods/tools/ObjectExplorer.cpp @@ -23,6 +23,7 @@ #include "Genny.hpp" #include "GennyIda.hpp" +#include #include "REFramework.hpp" #include "ObjectExplorer.hpp" @@ -2290,7 +2291,7 @@ void ObjectExplorer::handle_address(Address address, int32_t offset, Address par context_menu(real_address); if (is_game_object) { - additional_text = utility::re_string::get_string(address.as()->name); + additional_text = utility::re_game_object::get_name(address.as()); } else { // Change name based on VMType @@ -2508,7 +2509,9 @@ void ObjectExplorer::handle_game_object(REGameObject* game_object) { m_add_component_name.reserve(256); } - ImGui::Text("Name: %s", utility::re_string::get_string(game_object->name).c_str()); + auto game_object_name = utility::re_game_object::get_name(game_object); + + ImGui::Text("Name: %s", game_object_name.c_str()); make_tree_offset(game_object, offsetof(REGameObject, transform), "Transform"); make_tree_offset(game_object, offsetof(REGameObject, folder), "Folder"); @@ -2519,7 +2522,7 @@ void ObjectExplorer::handle_component(REComponent* component) { auto display_component_preview = [&](REComponent* comp) { if (comp != nullptr && comp->ownerGameObject != nullptr) { auto prev_name = utility::re_managed_object::get_type_name(comp); - auto prev_gameobject_name = utility::re_string::get_string(comp->ownerGameObject->name); + auto prev_gameobject_name = utility::re_game_object::get_name(comp->ownerGameObject); auto tree_hovered = ImGui::IsItemHovered(); @@ -4052,7 +4055,7 @@ void ObjectExplorer::context_menu(void* address, std::optional name } else { auto owner = obj->ownerGameObject; - spdlog::info("[{:s}] {:s} ({:x})", utility::re_string::get_string(owner->name), t->name, (uintptr_t)obj); + spdlog::info("[{:s}] {:s} ({:x})", utility::re_game_object::get_name(owner), t->name, (uintptr_t)obj); } } From d474aa0a9b568a377f4d1e8749ad9a74cf75ba69 Mon Sep 17 00:00:00 2001 From: praydog Date: Sat, 19 Oct 2024 11:31:28 -0700 Subject: [PATCH 2/3] Forgot to commit files from last commit --- shared/sdk/REGameObject.cpp | 30 ++++++++++++++++++++++++++++++ shared/sdk/REGameObject.hpp | 9 +++++++++ 2 files changed, 39 insertions(+) create mode 100644 shared/sdk/REGameObject.cpp create mode 100644 shared/sdk/REGameObject.hpp diff --git a/shared/sdk/REGameObject.cpp b/shared/sdk/REGameObject.cpp new file mode 100644 index 000000000..cbbdfb18f --- /dev/null +++ b/shared/sdk/REGameObject.cpp @@ -0,0 +1,30 @@ +#include "RETypeDB.hpp" + +#include "REGameObject.hpp" + +namespace utility::re_game_object { +std::string get_name(REGameObject* obj) { + if (obj == nullptr) { + return {}; + } + + // Only doing this on newer versions where we know it works + // Haven't tested it on older versions so just to be safe. +#if TDB_VER >= 71 + static const auto game_object_t = sdk::find_type_definition("via.GameObject"); + static const auto get_name_fn = game_object_t != nullptr ? game_object_t->get_method("get_Name") : nullptr; + + if (get_name_fn != nullptr) { + auto str = get_name_fn->call<::SystemString*>(sdk::get_thread_context(), obj); + + if (str != nullptr) { + return utility::re_string::get_string(str); + } + } +#endif + + // We rely on the reflected function first because + // this offset might change between versions. + return utility::re_string::get_string(obj->name); +} +} \ No newline at end of file diff --git a/shared/sdk/REGameObject.hpp b/shared/sdk/REGameObject.hpp new file mode 100644 index 000000000..ffc5dba7b --- /dev/null +++ b/shared/sdk/REGameObject.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "REManagedObject.hpp" + +namespace utility { +namespace re_game_object { +std::string get_name(::REGameObject* obj); +} +} \ No newline at end of file From 470fe85d2946c2e1ebf0c4b653e244cf6675ec79 Mon Sep 17 00:00:00 2001 From: praydog Date: Fri, 25 Oct 2024 13:03:26 -0700 Subject: [PATCH 3/3] (#1135) Lua: Fix sdk.set_native_field not functioning at all --- src/mods/bindings/Sdk.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mods/bindings/Sdk.cpp b/src/mods/bindings/Sdk.cpp index 75cfc1038..4b9b63861 100644 --- a/src/mods/bindings/Sdk.cpp +++ b/src/mods/bindings/Sdk.cpp @@ -330,7 +330,7 @@ sol::object parse_data(lua_State* l, void* data, ::sdk::RETypeDefinition* data_t sol::object get_native_field(sol::object obj, ::sdk::RETypeDefinition* ty, const char* name); sol::object get_native_field_from_field(sol::object obj, ::sdk::RETypeDefinition* ty, ::sdk::REField* field); sol::object get_field_or_method(sol::object obj, const char* name); -void set_native_field(lua_State* l, sol::object obj, ::sdk::RETypeDefinition* ty, const char* name, sol::object value); +void set_native_field(sol::this_state s, sol::object obj, ::sdk::RETypeDefinition* ty, const char* name, sol::object value); struct ValueType { std::vector data{}; @@ -1055,9 +1055,10 @@ void set_native_field_from_field(sol::object obj, ::sdk::RETypeDefinition* ty, : set_data(data, field_type, value); } -void set_native_field(lua_State* l, sol::object obj, ::sdk::RETypeDefinition* ty, const char* name, sol::object value) { +void set_native_field(sol::this_state s, sol::object obj, ::sdk::RETypeDefinition* ty, const char* name, sol::object value) { const auto field = ty->get_field(name); if (field == nullptr) { + auto l = s.lua_state(); //throw sol::error("Attempted to set invalid REManagedObject field:" + std::string(name)); luaL_traceback(l, l, ("Attempted to set invalid REManagedObject field:" + std::string(name)).c_str(), 1); std::string traceback_err = lua_tostring(l, -1); @@ -1686,7 +1687,7 @@ void bindings::open_sdk(ScriptState* s) { return; } - return api::sdk::set_native_field(s->lua(), sol::make_object(s->lua(), obj), utility::re_managed_object::get_type_definition(obj), name, value); + return api::sdk::set_native_field(sol::this_state{s->lua()}, sol::make_object(s->lua(), obj), utility::re_managed_object::get_type_definition(obj), name, value); }, "call", [s](REManagedObject* obj, const char* name, sol::variadic_args args) { if (obj == nullptr) {