From 58e36f2eb934ace99f3995c2cf61c170e1f8c549 Mon Sep 17 00:00:00 2001 From: Jadis0x <49281043+jadis0x@users.noreply.github.com> Date: Fri, 31 May 2024 23:24:48 +0300 Subject: [PATCH] added IsNull function IsNull(app::Object_1*): detects whether objects are null, works more efficiently than a nullptr check. --- lib/ClientHelper.cpp | 8 ++++++++ lib/ClientHelper.h | 1 + lib/UnityCore.h | 16 ++++++++------- user/players/players.cpp | 42 ++++++++++++++++++++++++++-------------- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/lib/ClientHelper.cpp b/lib/ClientHelper.cpp index 12418aa..7c69e7b 100644 --- a/lib/ClientHelper.cpp +++ b/lib/ClientHelper.cpp @@ -73,6 +73,14 @@ bool IsInGame() return false; } +bool IsNull(app::Object_1* obj) +{ + if (obj == nullptr) + return true; + + return !app::Object_1_op_Implicit(obj, nullptr); +} + app::GameObject* GetAzazel(app::Survival* survival) { app::GameObject* ai = app::Survival_GetAzazel(survival, nullptr); diff --git a/lib/ClientHelper.h b/lib/ClientHelper.h index 653c061..c417a92 100644 --- a/lib/ClientHelper.h +++ b/lib/ClientHelper.h @@ -8,6 +8,7 @@ bool IsLocalPlayer(app::NolanBehaviour* player); bool IsPlayerCrawling(); bool IsPlayerCrawling(app::GameObject* go); bool IsInGame(); +bool IsNull(app::Object_1* obj); app::GameObject* GetAzazel(app::Survival* survival); diff --git a/lib/UnityCore.h b/lib/UnityCore.h index 69eb5fd..aec0950 100644 --- a/lib/UnityCore.h +++ b/lib/UnityCore.h @@ -3,6 +3,7 @@ #include "Wrapper.h" #include #include +#include "ClientHelper.h" namespace Unity { namespace GameObject { @@ -10,14 +11,14 @@ namespace Unity { app::Component* GetComponentByName(app::GameObject* go, const char* type); } - namespace Math{ + namespace Math { namespace Vector3 { std::string ToString(app::Vector3* v); std::string ToString(app::Vector3 v); } } - namespace Transform{ + namespace Transform { app::Transform* Get(app::GameObject* go); app::Vector3 Position(app::Transform* transform); } @@ -44,11 +45,12 @@ namespace UnityCore { app::Object_1* obj_1 = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); - if (obj_1) { - T* foundObject = reinterpret_cast(obj_1); - if (foundObject) { - return foundObject; - } + if (IsNull(obj_1) || obj_1 == nullptr) return nullptr; + + T* foundObject = reinterpret_cast(obj_1); + + if (foundObject) { + return foundObject; } } diff --git a/user/players/players.cpp b/user/players/players.cpp index 5b8be28..c5d85ef 100644 --- a/user/players/players.cpp +++ b/user/players/players.cpp @@ -3,6 +3,7 @@ #include "players.h" #include +#include "ClientHelper.h" app::GameObject__Array* Players::GetAllPlayers() @@ -22,6 +23,18 @@ app::GameObject__Array* Players::GetAllPlayers() app::GameObject* Player::GetLocalPlayer() { + static app::GameObject* cachedLocalPlayer = nullptr; + + if (cachedLocalPlayer != nullptr) { + // Check if cached player is still valid + if (IsNull((app::Object_1*)cachedLocalPlayer)) { + cachedLocalPlayer = nullptr; + } + else { + return cachedLocalPlayer; + } + } + app::GameObject__Array* playerList = Players::GetAllPlayers(); app::String* NolanBehaviourStr = reinterpret_cast(il2cpp_string_new("NolanBehaviour")); @@ -32,24 +45,23 @@ app::GameObject* Player::GetLocalPlayer() for (int i = 0; i < _size; i++) { app::GameObject* currentPlayer = playerList->vector[i]; - if (app::GameObject_GetComponentByName) { - app::Component* nbComponent = app::GameObject_GetComponentByName(currentPlayer, NolanBehaviourStr, nullptr); + if (IsNull((app::Object_1*)currentPlayer)) { + return nullptr; + } + else { + if (app::GameObject_GetComponentByName) { + app::Component* nbComponent = app::GameObject_GetComponentByName(currentPlayer, NolanBehaviourStr, nullptr); - if (nbComponent) { - app::NolanBehaviour* nb = reinterpret_cast(nbComponent); + if (nbComponent) { + app::NolanBehaviour* nb = reinterpret_cast(nbComponent); - if (nb) { - - if (app::BoltEntity_get_IsOwner != nullptr && currentPlayer != nullptr) { - - app::BoltEntity* entity = nb->fields._._._._._entity; - - if (entity) { - if (app::BoltEntity_get_IsOwner(entity, nullptr)) { - return currentPlayer; - } + if (nb) { + if (IsLocalPlayer(nb)) { + return currentPlayer; + } + else { + return nullptr; } - } } }