feat(Network): Send Chat Message (#594)

This commit is contained in:
Aure7138 2022-11-14 23:37:38 +08:00 committed by GitHub
parent 32839fb9b1
commit 69d636f065
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 52 additions and 4 deletions

View File

@ -195,6 +195,7 @@ namespace big
bool log_text_messages = false;
bool decloak_players = false;
bool force_session_host = false;
bool is_team = false;
};
struct settings {
@ -602,6 +603,7 @@ namespace big
this->session.disable_chat_filter = j["session"]["disable_chat_filter"];
this->session.decloak_players = j["session"]["decloak_players"];
this->session.force_session_host = j["session"]["force_session_host"];
this->session.is_team = j["session"]["is_team"];
this->settings.dev_dlc = j["settings"]["dev_dlc"];
this->settings.hotkeys.menu_toggle = j["settings"]["hotkeys"]["menu_toggle"];
@ -918,7 +920,8 @@ namespace big
{ "log_text_messages", this->session.log_text_messages },
{ "disable_chat_filter", this->session.disable_chat_filter },
{ "decloak_players", this->session.decloak_players },
{ "force_session_host", this->session.force_session_host }
{ "force_session_host", this->session.force_session_host },
{ "is_team", this->session.is_team }
}
},
{

View File

@ -1,5 +1,6 @@
#pragma once
#include "datanodes/player/CPlayerGameStateDataNode.hpp"
#include "rage/rlGamerInfo.hpp"
namespace big::functions
{
@ -67,4 +68,6 @@ namespace big::functions
using join_session_by_info = bool(*)(Network* network, rage::rlSessionInfo* info, int unk, int flags, rage::rlGamerHandle* handles, int handlecount);
using generate_uuid = bool(*)(std::uint64_t* uuid);
using send_chat_message = bool(*)(int64_t* send_chat_ptr, rage::rlGamerInfo* game_info, char* message, bool is_team);
}

View File

@ -4,6 +4,7 @@
#include "gta/tls_context.hpp"
#include "ped/CPedFactory.hpp"
#include "pointers.hpp"
#include "network/CNetworkPlayerMgr.hpp"
namespace big::gta_util
{

View File

@ -64,7 +64,7 @@ namespace big
buffer.ReadString(message, 256);
buffer.ReadQWord(&unk, 64);
buffer.ReadBool(&is_team);
LOG(INFO) << "[CHAT] from " << player->get_name() << ": " << message << (is_team) ? " [TEAM]" : " [ALL]";
LOG(INFO) << "[CHAT] from " << player->get_name() << ": " << message << (is_team ? " [TEAM]" : " [ALL]");
}
break;
}

View File

@ -410,6 +410,18 @@ namespace big
m_invalid_mods_crash_detour = ptr.add(1).rip().as<PVOID>();
});
// Send Chat Ptr
main_batch.add("SCP", "41 83 7F ? ? 4C 8B 35", [this](memory::handle ptr)
{
m_send_chat_ptr = ptr.add(8).rip().as<int64_t**>();
});
// Send Chat Message
main_batch.add("SCM", "48 83 EC 20 48 8B F9 48 8B CA 45 8A F1", [this](memory::handle ptr)
{
m_send_chat_message = ptr.sub(21).as<functions::send_chat_message>();
});
// Format Metric For Sending
main_batch.add("FMFS", "48 8B C4 48 89 58 ? 48 89 70 ? 48 89 78 ? 4C 89 70 ? 55 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 83 3D", [this](memory::handle ptr)
{

View File

@ -138,6 +138,9 @@ namespace big
PVOID m_invalid_mods_crash_detour{};
int64_t** m_send_chat_ptr{};
functions::send_chat_message m_send_chat_message{};
PVOID m_init_native_tables{};
PVOID m_script_vm{};
@ -147,8 +150,8 @@ namespace big
rage::rlGamerInfo* m_player_info_gamer_info{}; // the gamer info that is applied to CPlayerInfo
CCommunications** m_communications{};
PVOID m_update_presence_attribute_int;
PVOID m_update_presence_attribute_string;
PVOID m_update_presence_attribute_int{};
PVOID m_update_presence_attribute_string{};
};
inline pointers* g_pointers{};

View File

@ -53,4 +53,15 @@ namespace big::notify
std::format("<C>{}</C> joined.", net_game_player->get_name())
);
}
inline void draw_chat(char* msg, const char* player_name, bool is_team)
{
int scaleform = GRAPHICS::REQUEST_SCALEFORM_MOVIE("MULTIPLAYER_CHAT");
GRAPHICS::BEGIN_SCALEFORM_MOVIE_METHOD(scaleform, "ADD_MESSAGE");
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME_STRING(player_name); // player name
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(msg); // content
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_TEXTURE_NAME_STRING(HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION(is_team ? "MP_CHAT_TEAM" : "MP_CHAT_ALL")); // scope
GRAPHICS::DRAW_SCALEFORM_MOVIE_FULLSCREEN(scaleform, 255, 255, 255, 255, 0);
GRAPHICS::END_SCALEFORM_MOVIE_METHOD();
}
}

View File

@ -2,6 +2,8 @@
#include "fiber_pool.hpp"
#include "util/session.hpp"
#include "core/data/region_codes.hpp"
#include "gta_util.hpp"
#include "util/notify.hpp"
namespace big
{
@ -44,6 +46,19 @@ namespace big
ImGui::Checkbox("Disable Filter", &g->session.disable_chat_filter);
ImGui::Checkbox("Log Chat Messages", &g->session.log_chat_messages);
ImGui::Checkbox("Log Text Messages", &g->session.log_text_messages);
static char msg[256];
ImGui::InputText("##message", msg, sizeof(msg));
ImGui::SameLine();
ImGui::Checkbox("Is Team", &g->session.is_team);
ImGui::SameLine();
components::button("Send", []
{
if(const auto net_game_player = gta_util::get_network_player_mgr()->m_local_net_player; net_game_player)
{
if(g_pointers->m_send_chat_message(*g_pointers->m_send_chat_ptr, net_game_player->get_net_data(), msg, g->session.is_team))
notify::draw_chat(msg, net_game_player->get_name(), g->session.is_team);
}
});
components::sub_title("Decloak");
components::script_patch_checkbox("Reveal OTR Players", &g->session.decloak_players);