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()
{
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};
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())
{
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());
}

View File

@ -7,10 +7,10 @@ namespace big
{
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 (plyr->block_outgoing_clone_create) [[unlikely]]
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)
{
return;
}
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/battleye/battleye_service.hpp"
#include "util/chat.hpp"
#include "util/entity.hpp"
#include "util/session.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);
}
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);
}

View File

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

View File

@ -60,7 +60,7 @@ namespace big::entity
{
if (ptr->m_net_object)
{
force_remove_network_entity(ptr, true);
force_remove_network_entity(ptr);
return;
}
}
@ -379,15 +379,15 @@ namespace big::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)
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]{};
rage::datBitBuffer remove_buf(buf, sizeof(buf));
@ -417,6 +417,12 @@ namespace big::entity
pack.write<int>(remove_buf.GetPosition(), 13);
pack.m_buffer.WriteArray(&buf, remove_buf.GetPosition());
if (for_player)
{
pack.send(for_player->get_net_game_player()->m_msg_id);
}
else
{
for (auto& player : g_player_service->players())
{
if (player.second->get_net_game_player())
@ -427,32 +433,10 @@ namespace big::entity
}
}
}
}
if (delete_locally)
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);
}
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);
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);
void force_remove_network_entity(rage::CDynamicEntity* entity, 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(rage::CDynamicEntity* entity, player_ptr for_player);
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, player_ptr for_player = nullptr, bool delete_locally = true);
}