diff --git a/CMakeLists.txt b/CMakeLists.txt index bb40c2bf..b368c2ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -314,6 +314,7 @@ set(CMKR_TARGET sdk) set(sdk_SOURCES "") list(APPEND sdk_SOURCES + "shared/sdk/APlayerController.cpp" "shared/sdk/CVar.cpp" "shared/sdk/ConsoleManager.cpp" "shared/sdk/DynamicRHI.cpp" @@ -338,6 +339,7 @@ list(APPEND sdk_SOURCES "shared/sdk/UObjectBase.cpp" "shared/sdk/UProperty.cpp" "shared/sdk/Utility.cpp" + "shared/sdk/APlayerController.hpp" "shared/sdk/CVar.hpp" "shared/sdk/ConsoleManager.hpp" "shared/sdk/DynamicRHI.hpp" @@ -417,6 +419,7 @@ set(CMKR_TARGET sdk-nolog) set(sdk-nolog_SOURCES "") list(APPEND sdk-nolog_SOURCES + "shared/sdk/APlayerController.cpp" "shared/sdk/CVar.cpp" "shared/sdk/ConsoleManager.cpp" "shared/sdk/DynamicRHI.cpp" @@ -441,6 +444,7 @@ list(APPEND sdk-nolog_SOURCES "shared/sdk/UObjectBase.cpp" "shared/sdk/UProperty.cpp" "shared/sdk/Utility.cpp" + "shared/sdk/APlayerController.hpp" "shared/sdk/CVar.hpp" "shared/sdk/ConsoleManager.hpp" "shared/sdk/DynamicRHI.hpp" diff --git a/shared/sdk/APlayerController.cpp b/shared/sdk/APlayerController.cpp new file mode 100644 index 00000000..01944a5c --- /dev/null +++ b/shared/sdk/APlayerController.cpp @@ -0,0 +1,7 @@ +#include "APlayerController.hpp" + +namespace sdk { +APawn* APlayerController::get_acknowledged_pawn() const { + return get_property(L"AcknowledgedPawn"); +} +} \ No newline at end of file diff --git a/shared/sdk/APlayerController.hpp b/shared/sdk/APlayerController.hpp new file mode 100644 index 00000000..2dd4a5fd --- /dev/null +++ b/shared/sdk/APlayerController.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "UObject.hpp" + +namespace sdk { +class APawn; + +class APlayerController : public UObject { +public: + APawn* get_acknowledged_pawn() const; + +protected: +}; +} \ No newline at end of file diff --git a/shared/sdk/UEngine.cpp b/shared/sdk/UEngine.cpp index 4ebad4af..22d62285 100644 --- a/shared/sdk/UEngine.cpp +++ b/shared/sdk/UEngine.cpp @@ -68,20 +68,44 @@ UEngine* UEngine::get() { return *engine; } -UWorld* UEngine::get_world() { +ULocalPlayer* UEngine::get_localplayer(int32_t index) { + if (index < 0) { + return nullptr; + } + const auto& game_instance = get_property(L"GameInstance"); if (game_instance == nullptr) { return nullptr; } - const auto& localplayers = game_instance->get_property>(L"LocalPlayers"); + const auto& localplayers = game_instance->get_property>(L"LocalPlayers"); - if (localplayers.count == 0) { + if (localplayers.count <= index) { return nullptr; } - const auto localplayer = localplayers.data[0]; + return localplayers.data[index]; +} + +APawn* UEngine::get_localpawn(int32_t index) { + const auto player = (UObject*)get_localplayer(index); + + if (player == nullptr) { + return nullptr; + } + + const auto player_controller = (UObject*)player->get_property(L"PlayerController"); + + if (player_controller == nullptr) { + return nullptr; + } + + return player_controller->get_property(L"AcknowledgedPawn"); +} + +UWorld* UEngine::get_world() { + const auto localplayer = (sdk::UObject*)get_localplayer(0); if (localplayer == nullptr) { return nullptr; diff --git a/shared/sdk/UEngine.hpp b/shared/sdk/UEngine.hpp index dc252857..e7818dd0 100644 --- a/shared/sdk/UEngine.hpp +++ b/shared/sdk/UEngine.hpp @@ -5,14 +5,18 @@ namespace sdk { class UWorld; +class ULocalPlayer; +class APawn; +class APlayerController; class UEngine : public sdk::UObject { public: static UEngine** get_lvalue(); static UEngine* get(); + ULocalPlayer* get_localplayer(int32_t index = 0); + APawn* get_localpawn(int32_t index = 0); UWorld* get_world(); - public: void initialize_hmd_device(); static std::optional get_initialize_hmd_device_address();