2022-05-20 18:17:41 -04:00
|
|
|
#include "hooking.hpp"
|
2022-06-30 00:11:54 +02:00
|
|
|
#include "services/players/player_service.hpp"
|
2022-07-05 16:54:45 -04:00
|
|
|
#include <natives.hpp>
|
2022-09-12 18:44:47 +00:00
|
|
|
#include "gta_util.hpp"
|
2022-05-20 18:17:41 -04:00
|
|
|
|
|
|
|
namespace big
|
|
|
|
{
|
2022-07-05 16:54:45 -04:00
|
|
|
bool get_msg_type(rage::eNetMessage& msgType, rage::datBitBuffer& buffer)
|
2022-05-20 18:17:41 -04:00
|
|
|
{
|
|
|
|
uint32_t pos;
|
|
|
|
uint32_t magic;
|
|
|
|
uint32_t length;
|
|
|
|
uint32_t extended{};
|
|
|
|
if ((buffer.m_flagBits & 2) != 0 || (buffer.m_flagBits & 1) == 0 ? (pos = buffer.m_curBit) : (pos = buffer.m_maxBit),
|
2022-07-05 16:54:45 -04:00
|
|
|
buffer.m_bitsRead + 15 > pos || !buffer.ReadDword(&magic, 14) || magic != 0x3246 || !buffer.ReadDword(&extended, 1)) {
|
|
|
|
msgType = rage::eNetMessage::CMsgInvalid;
|
2022-05-20 18:17:41 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
length = extended ? 16 : 8;
|
2022-07-05 16:54:45 -04:00
|
|
|
if ((buffer.m_flagBits & 1) == 0 ? (pos = buffer.m_curBit) : (pos = buffer.m_maxBit), length + buffer.m_bitsRead <= pos && buffer.ReadDword((uint32_t*)&msgType, length))
|
2022-05-20 18:17:41 -04:00
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
2022-08-29 10:26:18 +00:00
|
|
|
|
2022-05-20 18:17:41 -04:00
|
|
|
bool hooks::receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame)
|
|
|
|
{
|
2022-09-12 18:44:47 +00:00
|
|
|
if (frame->get_event_type() == rage::netConnection::InFrame::EventType::FrameReceived)
|
2022-05-20 18:17:41 -04:00
|
|
|
{
|
|
|
|
rage::datBitBuffer buffer((uint8_t*)frame->m_data, frame->m_length);
|
|
|
|
buffer.m_flagBits = 1;
|
2022-07-05 16:54:45 -04:00
|
|
|
rage::eNetMessage msgType;
|
2022-09-12 18:44:47 +00:00
|
|
|
player_ptr player;
|
|
|
|
for (std::uint32_t i = 0; i < gta_util::get_network()->m_game_session_ptr->m_player_count; i++)
|
|
|
|
{
|
|
|
|
if (gta_util::get_network()->m_game_session_ptr->m_players[i]->m_player_data.m_peer_id_2 == frame->m_peer_id)
|
|
|
|
{
|
|
|
|
player = g_player_service->get_by_host_token(gta_util::get_network()->m_game_session_ptr->m_players[i]->m_player_data.m_host_token);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2022-07-05 16:54:45 -04:00
|
|
|
if (player && get_msg_type(msgType, buffer))
|
2022-05-20 18:17:41 -04:00
|
|
|
{
|
2022-07-05 16:54:45 -04:00
|
|
|
switch (msgType)
|
2022-05-20 18:17:41 -04:00
|
|
|
{
|
2022-11-12 03:17:22 +10:30
|
|
|
case rage::eNetMessage::CMsgTextMessage:
|
|
|
|
{
|
|
|
|
if (g->session.log_chat_messages)
|
|
|
|
{
|
|
|
|
char message[256];
|
|
|
|
uint64_t unk;
|
|
|
|
bool is_team;
|
|
|
|
buffer.ReadString(message, 256);
|
|
|
|
buffer.ReadQWord(&unk, 64);
|
|
|
|
buffer.ReadBool(&is_team);
|
|
|
|
LOG(INFO) << "[CHAT] from " << player->get_name() << ": " << message << (is_team) ? " [TEAM]" : " [ALL]";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case rage::eNetMessage::CMsgTextMessage2:
|
|
|
|
{
|
|
|
|
if (g->session.log_text_messages)
|
|
|
|
{
|
|
|
|
char message[256];
|
|
|
|
uint64_t unk;
|
|
|
|
buffer.ReadString(message, 256);
|
|
|
|
buffer.ReadQWord(&unk, 64);
|
|
|
|
LOG(INFO) << "[TEXT] from " << player->get_name() << ": " << message;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2022-08-29 10:26:18 +00:00
|
|
|
case rage::eNetMessage::CMsgScriptMigrateHost:
|
|
|
|
{
|
|
|
|
if (std::chrono::system_clock::now() - player->m_last_transition_msg_sent < 200ms)
|
2022-05-20 18:17:41 -04:00
|
|
|
{
|
2022-08-29 10:26:18 +00:00
|
|
|
if (player->m_num_failed_transition_attempts++ == 20)
|
|
|
|
{
|
2022-10-24 14:08:37 +02:00
|
|
|
g_notification_service->push_error("Protections", std::format("{} tried to OOM kick you!", player->get_name()));
|
2022-08-29 10:26:18 +00:00
|
|
|
}
|
|
|
|
return true;
|
2022-05-20 18:17:41 -04:00
|
|
|
}
|
2022-08-29 10:26:18 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
player->m_last_transition_msg_sent = std::chrono::system_clock::now();
|
|
|
|
player->m_num_failed_transition_attempts = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2022-09-12 18:44:47 +00:00
|
|
|
case rage::eNetMessage::CMsgRemoveGamersFromSessionCmd:
|
|
|
|
{
|
|
|
|
player_ptr pl;
|
|
|
|
uint64_t session_id;
|
|
|
|
buffer.ReadQWord(&session_id, 64);
|
|
|
|
uint32_t count;
|
|
|
|
buffer.ReadDword(&count, 6);
|
|
|
|
for (std::uint32_t i = 0; i < count; i++)
|
|
|
|
{
|
|
|
|
uint64_t peer_id;
|
2022-11-12 03:17:22 +10:30
|
|
|
buffer.ReadQWord(&peer_id, 64);
|
2022-09-12 18:44:47 +00:00
|
|
|
for (std::uint32_t i = 0; i < gta_util::get_network()->m_game_session_ptr->m_peer_count; i++)
|
|
|
|
{
|
|
|
|
if (gta_util::get_network()->m_game_session_ptr->m_peers[i]->m_peer_data.m_peer_id_2 == peer_id)
|
|
|
|
{
|
|
|
|
pl = g_player_service->get_by_host_token(gta_util::get_network()->m_game_session_ptr->m_peers[i]->m_peer_data.m_host_token);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (player && pl && player->id() != pl->id() && count == 1 && frame->m_msg_id == -1)
|
|
|
|
{
|
2022-10-24 14:08:37 +02:00
|
|
|
g_notification_service->push_error("Warning!", std::format("{} breakup kicked {}!", player->get_name(), pl->get_name()));
|
2022-09-12 18:44:47 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2022-05-20 18:17:41 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-30 19:32:51 +01:00
|
|
|
return g_hooking->get_original<hooks::receive_net_message>()(netConnectionManager, a2, frame);
|
2022-05-20 18:17:41 -04:00
|
|
|
}
|
2022-06-27 15:41:03 +02:00
|
|
|
}
|