This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
Files
YimMenu/src/backend/looped/session/force_script_host.cpp
maybegreat48 4589b87553 Menu revamp (#3274)
* Complete player and network UI redesign, meant to show all features instead of stuffing them into tiny boxes
* Added option to delete player vehicles
* Better clone player (now clones head blend too)
* Better host token spoofing, with an option to enter your own
* Better host token spoofing detection
* Better desync kick prot detections
* A script blocker for the entire session (per-player options will be added later)
* Added option to spoof data/DLC hashes
* Logging framework that allows developers to easily debug false positives
* Major protection improvements
2024-06-27 10:32:17 +02:00

64 lines
1.8 KiB
C++

#include "backend/looped/looped.hpp"
#include "backend/player_command.hpp"
#include "natives.hpp"
#include "pointers.hpp"
#include "gta_util.hpp"
#include "gta/script_handler.hpp"
#include "gta/net_array.hpp"
#include "packet.hpp"
namespace big
{
void looped::session_force_script_host()
{
if (!g.session.force_script_host)
return;
static bool loaded_into_session = false;
if (!*g_pointers->m_gta.m_is_session_started)
{
loaded_into_session = false;
return;
}
if (!loaded_into_session)
{
if (SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH("maintransition"_J) == 0) [[unlikely]]
{
if (auto freemode = gta_util::find_script_thread("freemode"_J); freemode && freemode->m_net_component)
{
auto net_component = reinterpret_cast<CGameScriptHandlerNetComponent*>(freemode->m_net_component);
int num_synced_arrays = 0;
for (int i = 0; i < net_component->m_host_array_count; i++)
{
if ((g_pointers->m_gta.m_get_host_array_handler_by_index(net_component, i)->m_flags & 1) != 0)
num_synced_arrays++;
}
if (num_synced_arrays == net_component->m_host_array_count)
{
net_component->do_host_migration(g_player_service->get_self()->get_net_game_player(), 0xFFFF, true);
packet pack;
pack.write_message(rage::eNetMessage::MsgScriptVerifyHostAck);
net_component->m_script_handler->get_id()->serialize(&pack.m_buffer);
pack.write<bool>(true, 1);
pack.write<bool>(true, 1);
pack.write<std::uint16_t>(0xFFFF, 16);
for (auto& player : g_player_service->players())
{
if (player.second->get_net_game_player())
pack.send(player.second->get_net_game_player()->m_msg_id);
}
loaded_into_session = true;
}
}
}
}
}
}