This commit is contained in:
Mr-X-GTA 2024-09-27 21:01:04 +02:00
parent c1bc789db5
commit 8c06e326c4
7 changed files with 28 additions and 54 deletions

View File

@ -21,20 +21,6 @@ namespace big
{ {
void bypass_battleye() void bypass_battleye()
{ {
for (const auto& plyr : g_player_service->players() | std::ranges::views::values)
{
if (!plyr->is_host() || plyr->block_outgoing_clone_create)
continue;
if (auto ped = g_player_service->get_self()->get_ped())
{
entity::force_remove_network_entity(ped, plyr);
}
plyr->block_outgoing_clone_create = true;
break;
}
constexpr std::array<std::uint32_t, 16> valid_hashes = {1410389794, 967, 1523678325, 472, 0, 0, 1323039495, 0, 0, 1731098795, 2256610353, 17956, 414639110, 307143837, 3443181821, 0}; constexpr std::array<std::uint32_t, 16> valid_hashes = {1410389794, 967, 1523678325, 472, 0, 0, 1323039495, 0, 0, 1731098795, 2256610353, 17956, 414639110, 307143837, 3443181821, 0};
if (auto hashes = *g_pointers->m_gta.m_game_data_hash) if (auto hashes = *g_pointers->m_gta.m_game_data_hash)

View File

@ -61,7 +61,7 @@ namespace big
if (g.protections.kick_rejoin && !NETWORK::NETWORK_IS_ACTIVITY_SESSION() && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH("maintransition"_J) == 0 && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS()) if (g.protections.kick_rejoin && !NETWORK::NETWORK_IS_ACTIVITY_SESSION() && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH("maintransition"_J) == 0 && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS())
{ {
g_fiber_pool->queue_job([] { g_fiber_pool->queue_job([] {
session::join_session(gta_util::get_network()->m_last_joined_session.m_session_info); session::join_session(*(rage::rlSessionInfo*)((uint64_t)gta_util::get_network() + 0x1E448)); // TODO gta_util::get_network()->m_last_joined_session.m_session_info
}); });
g_notification_service.push_warning("KICKED"_T.data(), "USER_DESYNC_KICKED_REJOIN"_T.data()); g_notification_service.push_warning("KICKED"_T.data(), "USER_DESYNC_KICKED_REJOIN"_T.data());
} }

View File

@ -7,10 +7,10 @@ namespace big
{ {
void hooks::send_clone_create(CNetworkObjectMgr* _this, rage::netObject* object, CNetGamePlayer* player, rage::datBitBuffer* buffer) void hooks::send_clone_create(CNetworkObjectMgr* _this, rage::netObject* object, CNetGamePlayer* player, rage::datBitBuffer* buffer)
{ {
auto plyr = g_player_service->get_by_id(player->m_player_id); if (auto plyr = g_player_service->get_by_id(player->m_player_id); plyr && plyr->bad_host && (eNetObjType)object->m_object_type == eNetObjType::NET_OBJ_TYPE_PLAYER)
{
if (plyr->block_outgoing_clone_create) [[unlikely]]
return; return;
}
g_hooking->get_original<hooks::send_clone_create>()(_this, object, player, buffer); g_hooking->get_original<hooks::send_clone_create>()(_this, object, player, buffer);
} }

View File

@ -10,6 +10,7 @@
#include "services/players/player_service.hpp" #include "services/players/player_service.hpp"
#include "services/battleye/battleye_service.hpp" #include "services/battleye/battleye_service.hpp"
#include "util/chat.hpp" #include "util/chat.hpp"
#include "util/entity.hpp"
#include "util/session.hpp" #include "util/session.hpp"
#include "gta/net_object_mgr.hpp" #include "gta/net_object_mgr.hpp"
@ -753,8 +754,12 @@ namespace big
{ {
g_battleye_service.receive_message(player->get_net_game_player()->get_host_token(), &data, size); g_battleye_service.receive_message(player->get_net_game_player()->get_host_token(), &data, size);
} }
else if (player) else if (player && !player->bad_host)
{ {
player->bad_host = true;
g_fiber_pool->queue_job([player] {
entity::force_remove_network_entity(g_local_player, player, false);
});
g_battleye_service.send_message_to_server(player->get_net_game_player()->get_host_token(), &data, size); g_battleye_service.send_message_to_server(player->get_net_game_player()->get_host_token(), &data, size);
} }

View File

@ -96,7 +96,7 @@ namespace big
bool log_clones = false; bool log_clones = false;
bool log_network_events = false; bool log_network_events = false;
bool block_outgoing_clone_create = false; bool bad_host = false;
bool trigger_desync_kick = false; bool trigger_desync_kick = false;
bool trigger_end_session_kick = false; bool trigger_end_session_kick = false;

View File

@ -60,7 +60,7 @@ namespace big::entity
{ {
if (ptr->m_net_object) if (ptr->m_net_object)
{ {
force_remove_network_entity(ptr, true); force_remove_network_entity(ptr);
return; return;
} }
} }
@ -379,15 +379,15 @@ namespace big::entity
return closest_entity; return closest_entity;
} }
void force_remove_network_entity(rage::CDynamicEntity* entity, bool delete_locally) void force_remove_network_entity(rage::CDynamicEntity* entity, player_ptr for_player, bool delete_locally)
{ {
if (!entity->m_net_object) if (!entity->m_net_object)
return; return;
force_remove_network_entity(entity->m_net_object->m_object_id, entity->m_net_object->m_ownership_token, delete_locally); force_remove_network_entity(entity->m_net_object->m_object_id, entity->m_net_object->m_ownership_token, for_player, delete_locally);
} }
void force_remove_network_entity(std::uint16_t net_id, int ownership_token, bool delete_locally) void force_remove_network_entity(std::uint16_t net_id, int ownership_token, player_ptr for_player, bool delete_locally)
{ {
char buf[0x200]{}; char buf[0x200]{};
rage::datBitBuffer remove_buf(buf, sizeof(buf)); rage::datBitBuffer remove_buf(buf, sizeof(buf));
@ -417,13 +417,20 @@ namespace big::entity
pack.write<int>(remove_buf.GetPosition(), 13); pack.write<int>(remove_buf.GetPosition(), 13);
pack.m_buffer.WriteArray(&buf, remove_buf.GetPosition()); pack.m_buffer.WriteArray(&buf, remove_buf.GetPosition());
for (auto& player : g_player_service->players()) if (for_player)
{ {
if (player.second->get_net_game_player()) pack.send(for_player->get_net_game_player()->m_msg_id);
}
else
{
for (auto& player : g_player_service->players())
{ {
if (!player.second->get_ped() || player.second->get_ped()->m_net_object->m_object_id != net_id) // would crash the player otherwise if (player.second->get_net_game_player())
{ {
pack.send(player.second->get_net_game_player()->m_msg_id); if (!player.second->get_ped() || player.second->get_ped()->m_net_object->m_object_id != net_id) // would crash the player otherwise
{
pack.send(player.second->get_net_game_player()->m_msg_id);
}
} }
} }
} }
@ -432,27 +439,4 @@ namespace big::entity
if (auto object = (*g_pointers->m_gta.m_network_object_mgr)->find_object_by_id(net_id, true)) if (auto object = (*g_pointers->m_gta.m_network_object_mgr)->find_object_by_id(net_id, true))
(*g_pointers->m_gta.m_network_object_mgr)->UnregisterNetworkObject(object, 8, true, true); (*g_pointers->m_gta.m_network_object_mgr)->UnregisterNetworkObject(object, 8, true, true);
} }
void force_remove_network_entity(rage::CDynamicEntity* entity, player_ptr for_player)
{
auto net_obj = entity->m_net_object;
if (!net_obj)
return;
char buf[0x200]{};
rage::datBitBuffer remove_buf(buf, sizeof(buf));
remove_buf.Write<std::uint16_t>(net_obj->m_object_id, 13);
remove_buf.Write<uint32_t>(get_next_token_value(net_obj->m_ownership_token), 5);
packet pack;
pack.write_message(rage::eNetMessage::MsgPackedReliables);
pack.write<int>(4, 4); // remove
pack.write<int>(1, 5); // msgs_written
pack.write<int>(remove_buf.GetPosition(), 13);
pack.m_buffer.WriteArray(&buf, remove_buf.GetPosition());
pack.send(for_player->get_net_game_player()->m_msg_id);
}
} }

View File

@ -22,7 +22,6 @@ namespace big::entity
bool request_model(rage::joaat_t hash); bool request_model(rage::joaat_t hash);
double distance_to_middle_of_screen(const rage::fvector2& screen_pos); double distance_to_middle_of_screen(const rage::fvector2& screen_pos);
Entity get_entity_closest_to_middle_of_screen(rage::fwEntity** pointer = nullptr, std::vector<Entity> ignore_entities = {}, bool include_veh = true, bool include_ped = true, bool include_prop = true, bool include_players = true); Entity get_entity_closest_to_middle_of_screen(rage::fwEntity** pointer = nullptr, std::vector<Entity> ignore_entities = {}, bool include_veh = true, bool include_ped = true, bool include_prop = true, bool include_players = true);
void force_remove_network_entity(rage::CDynamicEntity* entity, bool delete_locally = true); void force_remove_network_entity(rage::CDynamicEntity* entity, player_ptr for_player = nullptr, bool delete_locally = true);
void force_remove_network_entity(std::uint16_t net_id, int ownership_token = -1, bool delete_locally = true); void force_remove_network_entity(std::uint16_t net_id, int ownership_token = -1, player_ptr for_player = nullptr, bool delete_locally = true);
void force_remove_network_entity(rage::CDynamicEntity* entity, player_ptr for_player);
} }