diff --git a/src/hooks/protections/received_event.cpp b/src/hooks/protections/received_event.cpp index ee135c56..9f3f87bb 100644 --- a/src/hooks/protections/received_event.cpp +++ b/src/hooks/protections/received_event.cpp @@ -6,6 +6,7 @@ #include "util/math.hpp" #include "util/notify.hpp" #include "util/toxic.hpp" +#include "util/mobile.hpp" #include #include @@ -498,13 +499,20 @@ namespace big } case eNetworkEvents::REQUEST_CONTROL_EVENT: { - int net_id = buffer->Read(13); + auto net_id = buffer->Read(13); if (g_local_player && g_local_player->m_vehicle && g_local_player->m_vehicle->m_net_object - && g_local_player->m_vehicle->m_net_object->m_object_id == net_id && g_local_player->m_vehicle->m_driver == g_local_player && !NETWORK::NETWORK_IS_ACTIVITY_SESSION()) + && g_local_player->m_vehicle->m_net_object->m_object_id == net_id) //The request is for a vehicle we are currently in. { - g_pointers->m_gta.m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); - g.reactions.request_control_event.process(plyr); - return; + Vehicle personal_vehicle = mobile::mechanic::get_personal_vehicle(); + Vehicle veh = g_pointers->m_gta.m_ptr_to_handle(g_local_player->m_vehicle); + if (!NETWORK::NETWORK_IS_ACTIVITY_SESSION() //If we're in Freemode. + || personal_vehicle == veh //Or we're in our personal vehicle. + || DECORATOR::DECOR_GET_INT(veh, "RandomId") == g_local_player->m_net_object->m_object_id) // Or it's a vehicle we spawned. + { + g_pointers->m_gta.m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); // Tell them to get bent. + g.reactions.request_control_event.process(plyr); + return; + } } buffer->Seek(0); break; diff --git a/src/util/teleport.hpp b/src/util/teleport.hpp index 4e400f64..3d6280ab 100644 --- a/src/util/teleport.hpp +++ b/src/util/teleport.hpp @@ -54,15 +54,16 @@ namespace big::teleport } else { - auto hnd = vehicle::spawn(RAGE_JOAAT("ninef"), *player->get_ped()->get_position(), 0.0f, true); + auto hnd = vehicle::spawn(VEHICLE_RCBANDITO, *player->get_ped()->get_position(), 0.0f, true); ENTITY::SET_ENTITY_VISIBLE(hnd, false, false); ENTITY::SET_ENTITY_COLLISION(hnd, false, false); ENTITY::FREEZE_ENTITY_POSITION(hnd, true); auto obj_id = player->get_ped()->m_net_object->m_object_id; + auto veh_id = g_pointers->m_gta.m_handle_to_ptr(hnd)->m_net_object->m_object_id; remote_player_teleport remote_tp = {obj_id, {coords.x, coords.y, coords.z}}; - g.m_remote_player_teleports.emplace(g_pointers->m_gta.m_handle_to_ptr(hnd)->m_net_object->m_object_id, remote_tp); + g.m_remote_player_teleports.emplace(veh_id, remote_tp); if (is_local_player) { @@ -90,8 +91,8 @@ namespace big::teleport entity::delete_entity(hnd); - std::erase_if(g.m_remote_player_teleports, [obj_id](auto& obj) { - return obj.first == obj_id; + std::erase_if(g.m_remote_player_teleports, [veh_id](auto& obj) { + return obj.first == veh_id; }); return true; diff --git a/src/util/vehicle.hpp b/src/util/vehicle.hpp index 962994be..503c2201 100644 --- a/src/util/vehicle.hpp +++ b/src/util/vehicle.hpp @@ -62,6 +62,7 @@ namespace big::vehicle inline void set_mp_bitset(Vehicle veh) { DECORATOR::DECOR_SET_INT(veh, "MPBitset", 0); + DECORATOR::DECOR_SET_INT(veh, "RandomId", g_local_player->m_net_object->m_object_id); auto networkId = NETWORK::VEH_TO_NET(veh); if (NETWORK::NETWORK_GET_ENTITY_IS_NETWORKED(veh)) NETWORK::SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES(networkId, true); diff --git a/src/views/players/view_players.cpp b/src/views/players/view_players.cpp index 7b4de9ce..92ed74b9 100644 --- a/src/views/players/view_players.cpp +++ b/src/views/players/view_players.cpp @@ -16,6 +16,9 @@ namespace big bool has_scrollbar = false; static void player_button(const player_ptr& plyr) { + if (plyr == nullptr) + return; + bool selected_player = plyr == g_player_service->get_selected(); // generate icons string