diff --git a/shared/sdk/UEngine.cpp b/shared/sdk/UEngine.cpp index 661760b1..4ebad4af 100644 --- a/shared/sdk/UEngine.cpp +++ b/shared/sdk/UEngine.cpp @@ -68,6 +68,34 @@ UEngine* UEngine::get() { return *engine; } +UWorld* UEngine::get_world() { + const auto& game_instance = get_property(L"GameInstance"); + + if (game_instance == nullptr) { + return nullptr; + } + + const auto& localplayers = game_instance->get_property>(L"LocalPlayers"); + + if (localplayers.count == 0) { + return nullptr; + } + + const auto localplayer = localplayers.data[0]; + + if (localplayer == nullptr) { + return nullptr; + } + + const auto viewport_client = localplayer->get_property(L"ViewportClient"); + + if (viewport_client == nullptr) { + return nullptr; + } + + return viewport_client->get_property(L"World"); +} + std::optional UEngine::get_emulatestereo_string_ref_address() { static const auto addr = []() -> std::optional { SPDLOG_INFO("Searching for correct string reference to \"emulatestereo\"..."); diff --git a/shared/sdk/UEngine.hpp b/shared/sdk/UEngine.hpp index 91267943..e58ec5cf 100644 --- a/shared/sdk/UEngine.hpp +++ b/shared/sdk/UEngine.hpp @@ -1,11 +1,17 @@ #pragma once +#include "UObject.hpp" + namespace sdk { -class UEngine { +class UWorld; + +class UEngine : public sdk::UObject { public: static UEngine** get_lvalue(); static UEngine* get(); + UWorld* get_world(); + public: void initialize_hmd_device(); static std::optional get_initialize_hmd_device_address();