From 7433b0a69fee868ba277e06146f8990eb37bcc3c Mon Sep 17 00:00:00 2001 From: Aure7138 <100095051+Aure7138@users.noreply.github.com> Date: Mon, 16 Jan 2023 06:14:41 +0800 Subject: [PATCH] fix: Instant Respawn Crash (#867) Fixes #861 --- .../write_player_game_state_data_node.cpp | 20 +++++++++++++++---- src/util/globals.hpp | 5 +++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/hooks/spoofing/write_player_game_state_data_node.cpp b/src/hooks/spoofing/write_player_game_state_data_node.cpp index 8d60d185..73734e25 100644 --- a/src/hooks/spoofing/write_player_game_state_data_node.cpp +++ b/src/hooks/spoofing/write_player_game_state_data_node.cpp @@ -1,18 +1,30 @@ #include "hooking.hpp" #include -#include "natives.hpp" +#include "services/players/player_service.hpp" +#include "util/globals.hpp" namespace big { - bool is_player_in_cutscene(Player player) { return NETWORK::NETWORK_IS_PLAYER_IN_MP_CUTSCENE(player); } + static bool is_in_cutscene() + { + if (g_local_player && g_local_player->m_player_info) + return g_local_player->m_player_info->m_game_state == eGameState::InMPCutscene; + return false; + } - bool is_player_in_interior(Ped player) { return (INTERIOR::GET_INTERIOR_FROM_ENTITY(player) != 0); } + static bool is_in_interior() + { + int id = 0; + if (auto self_ptr = g_player_service->get_self(); self_ptr->is_valid()) + id = self_ptr->id(); + return globals::get_interior_from_player(id) != 0; + } bool hooks::write_player_game_state_data_node(rage::netObject* player, CPlayerGameStateDataNode* node) { auto ret = g_hooking->get_original()(player, node); - if (g.spoofing.spoof_hide_god && !is_player_in_cutscene(self::id) && !is_player_in_interior(self::ped)) + if (g.spoofing.spoof_hide_god && !is_in_cutscene() && !is_in_interior()) { node->m_is_invincible = false; node->m_bullet_proof = false; diff --git a/src/util/globals.hpp b/src/util/globals.hpp index 0d300029..150c5712 100644 --- a/src/util/globals.hpp +++ b/src/util/globals.hpp @@ -33,4 +33,9 @@ namespace big::globals g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target); } + + inline Interior get_interior_from_player(Player player) + { + return *scr_globals::globalplayer_bd.at(player, scr_globals::size::globalplayer_bd).at(245).as(); + } }