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