Redesigned delete_vehicle protections.

This commit is contained in:
gir489returns 2024-08-13 18:34:04 -04:00
parent a00533c274
commit e834524ab4
6 changed files with 388 additions and 363 deletions

View File

@ -2,8 +2,8 @@ include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
gtav_classes gtav_classes
GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git GIT_REPOSITORY https://github.com/gir489returns/GTAV-Classes.git
GIT_TAG b9b832ab00c95a731f8472f696c5d026a29fd767 GIT_TAG d700a082cbca28e2ca8a0251e3663c582a24b276
GIT_PROGRESS TRUE GIT_PROGRESS TRUE
CONFIGURE_COMMAND "" CONFIGURE_COMMAND ""
BUILD_COMMAND "" BUILD_COMMAND ""

View File

@ -91,26 +91,17 @@ namespace big
} }
} }
CVehicle* get_personal_vehicle()
{
Vehicle personal_vehicle = mobile::mechanic::get_personal_vehicle();
if (ENTITY::DOES_ENTITY_EXIST(personal_vehicle))
{
return reinterpret_cast<CVehicle*>(g_pointers->m_gta.m_handle_to_ptr(personal_vehicle));
}
return nullptr;
}
virtual void on_tick() override virtual void on_tick() override
{ {
if (g_local_player) if (g_local_player)
{ {
const auto personal_vehicle = get_personal_vehicle(); if (const auto personal_vehicle = mobile::mechanic::get_personal_cvehicle())
{
apply_godmode_to_vehicle(personal_vehicle, true); apply_godmode_to_vehicle(personal_vehicle, true);
apply_godmode_to_vehicle(g_local_player->m_vehicle, personal_vehicle == g_local_player->m_vehicle); apply_godmode_to_vehicle(g_local_player->m_vehicle, personal_vehicle == g_local_player->m_vehicle);
} }
} }
}
virtual void on_disable() override virtual void on_disable() override
{ {
@ -119,8 +110,7 @@ namespace big
if (g_local_player->m_vehicle) if (g_local_player->m_vehicle)
restore_original_vehicle_data(g_local_player->m_vehicle); restore_original_vehicle_data(g_local_player->m_vehicle);
const auto personal_vehicle = get_personal_vehicle(); if (const auto personal_vehicle = mobile::mechanic::get_personal_cvehicle())
if (personal_vehicle)
{ {
restore_original_vehicle_data(personal_vehicle); restore_original_vehicle_data(personal_vehicle);
} }

View File

@ -42,7 +42,7 @@ namespace big
struct remote_player_teleport struct remote_player_teleport
{ {
std::int16_t m_player_net_id; std::int32_t m_player_net_id;
rage::fvector3 m_position; rage::fvector3 m_position;
}; };
@ -76,7 +76,7 @@ namespace big
int m_remote_controller_vehicle = -1; int m_remote_controller_vehicle = -1;
int m_remote_controlled_vehicle = -1; int m_remote_controlled_vehicle = -1;
std::unordered_map<uint16_t, remote_player_teleport> m_remote_player_teleports; std::unordered_map<int32_t, remote_player_teleport> m_remote_player_teleports;
rage::scrThread* m_hunt_the_beast_thread = nullptr; rage::scrThread* m_hunt_the_beast_thread = nullptr;

View File

@ -1,4 +1,5 @@
#include "hooking/hooking.hpp" #include "hooking/hooking.hpp"
#include "util/mobile.hpp"
#include "util/notify.hpp" #include "util/notify.hpp"
namespace big namespace big
@ -12,12 +13,15 @@ namespace big
return; return;
} }
if (g_local_player && g_local_player->m_vehicle && g_local_player->m_vehicle->m_net_object if (const auto personal_vehicle = mobile::mechanic::get_personal_cvehicle())
&& object_id == g_local_player->m_vehicle->m_net_object->m_object_id
&& !g_local_player->m_vehicle->m_net_object->m_next_owner_id) [[unlikely]]
{ {
if (!NETWORK::NETWORK_IS_ACTIVITY_SESSION()) //If we're in Freemode. if (auto net_obj = personal_vehicle->m_net_object)
{ {
if (object_id == net_obj->m_object_id && entity::network_has_control_of_entity(net_obj))
{
LOG(VERBOSE) << "DELETION ORDER FOR PERSONAL VEHICLE: " << net_obj->m_object_id << " m_is_remote: " << net_obj->m_is_remote
<< " m_bubble: " << net_obj->m_bubble << " m_owner_id: " << net_obj->m_owner_id
<< " m_wants_to_be_owner: " << net_obj->m_wants_to_be_owner;
if (auto plyr = g_player_service->get_by_id(src->m_player_id)) if (auto plyr = g_player_service->get_by_id(src->m_player_id))
{ {
g.reactions.delete_vehicle.process(plyr); g.reactions.delete_vehicle.process(plyr);
@ -25,6 +29,26 @@ namespace big
return; return;
} }
} }
}
if (self::veh != 0)
{
if (const auto current_vehicle = reinterpret_cast<CVehicle*>(g_pointers->m_gta.m_handle_to_ptr(self::veh)))
{
auto net_obj = current_vehicle->m_net_object;
if (object_id == net_obj->m_object_id && entity::network_has_control_of_entity(net_obj))
{
LOG(VERBOSE) << "DELETION ORDER FOR CURRENT VEHICLE: " << net_obj->m_object_id
<< " m_is_remote: " << net_obj->m_is_remote << " m_bubble: " << net_obj->m_bubble
<< " m_owner_id: " << net_obj->m_owner_id << " m_wants_to_be_owner: " << net_obj->m_wants_to_be_owner;
if (auto plyr = g_player_service->get_by_id(src->m_player_id))
{
g.reactions.delete_vehicle.process(plyr);
}
return;
}
}
}
if (auto object = g_pointers->m_gta.m_get_net_object(*g_pointers->m_gta.m_network_object_mgr, object_id, true)) [[likely]] if (auto object = g_pointers->m_gta.m_get_net_object(*g_pointers->m_gta.m_network_object_mgr, object_id, true)) [[likely]]
{ {

View File

@ -159,7 +159,7 @@ namespace big::entity
bool network_has_control_of_entity(rage::netObject* net_object) bool network_has_control_of_entity(rage::netObject* net_object)
{ {
return !net_object || !net_object->m_next_owner_id && (net_object->m_control_id == -1); return !net_object || !net_object->m_is_remote && (net_object->m_wants_to_be_owner == -1);
} }
bool take_control_of(Entity ent, int timeout) bool take_control_of(Entity ent, int timeout)

View File

@ -139,6 +139,17 @@ namespace big::mobile
return *scr_globals::freemode_global.at(301).as<Vehicle*>(); return *scr_globals::freemode_global.at(301).as<Vehicle*>();
} }
inline CVehicle* get_personal_cvehicle()
{
Vehicle personal_vehicle = get_personal_vehicle();
if (personal_vehicle != -1 && ENTITY::DOES_ENTITY_EXIST(personal_vehicle))
{
return reinterpret_cast<CVehicle*>(g_pointers->m_gta.m_handle_to_ptr(personal_vehicle));
}
return nullptr;
}
inline void summon_vehicle_by_index(int veh_idx) inline void summon_vehicle_by_index(int veh_idx)
{ {
if (*scr_globals::freemode_global.at(1000).as<int*>() != -1) if (*scr_globals::freemode_global.at(1000).as<int*>() != -1)