diff --git a/BigBaseV2/src/features/custom_text.cpp b/BigBaseV2/src/features/custom_text.cpp new file mode 100644 index 00000000..91e8b58a --- /dev/null +++ b/BigBaseV2/src/features/custom_text.cpp @@ -0,0 +1,35 @@ +#include "custom_text.hpp" + +namespace big +{ + custom_text::custom_text() + { + g_custom_text = this; + } + + custom_text::~custom_text() + { + g_custom_text = nullptr; + } + + void custom_text::add_text(Hash hash, const char* text) + { + auto size = strlen(text) + 1; + auto buffer = std::make_unique(size); + std::copy_n(text, size, buffer.get()); + + this->m_text_map.emplace(hash, std::move(buffer)); + } + + const char* custom_text::get_text(Hash hash) + { + if (auto it = this->m_text_map.find(hash); it != m_text_map.end()) + return it->second.get(); + return nullptr; + } + + void custom_text::remove_text(Hash hash) + { + this->m_text_map.erase(hash); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/features/custom_text.hpp b/BigBaseV2/src/features/custom_text.hpp new file mode 100644 index 00000000..908ac26d --- /dev/null +++ b/BigBaseV2/src/features/custom_text.hpp @@ -0,0 +1,20 @@ +#pragma once + +namespace big +{ + class custom_text + { + public: + explicit custom_text(); + ~custom_text(); + + void add_text(Hash hash, const char* text); + const char* get_text(Hash hash); + void remove_text(Hash hash); + + private: + std::unordered_map> m_text_map; + }; + + inline custom_text* g_custom_text{}; +} \ No newline at end of file diff --git a/BigBaseV2/src/function_types.hpp b/BigBaseV2/src/function_types.hpp index 8cbade1e..c8e1b039 100644 --- a/BigBaseV2/src/function_types.hpp +++ b/BigBaseV2/src/function_types.hpp @@ -13,6 +13,7 @@ namespace big::functions using error_screen = void(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background); using increment_stat_event = bool(uint64_t net_event_struct, int64_t sender, int64_t a3); using get_event_data = bool(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount); + using get_label_text = const char*(void* unk, const char* label); using get_player_name = char*(Player player); using get_net_player = int(Player player); using script_event_handler = bool(void* events, CNetGamePlayer* sourcePlayer, CNetGamePlayer* targetPlayer); diff --git a/BigBaseV2/src/hooking.cpp b/BigBaseV2/src/hooking.cpp index 90b939fa..30b8e1d9 100644 --- a/BigBaseV2/src/hooking.cpp +++ b/BigBaseV2/src/hooking.cpp @@ -40,6 +40,7 @@ namespace big m_convert_thread_to_fiber_hook("ConvertThreadToFiber", memory::module("kernel32.dll").get_export("ConvertThreadToFiber").as(), &hooks::convert_thread_to_fiber), m_get_event_data("Get Event Data", g_pointers->m_get_event_data, &hooks::get_event_data), + m_get_label_text("Get Label Text", g_pointers->m_get_label_text, &hooks::get_label_text), m_error_screen_hook("Disable Warning/Error Screen", g_pointers->m_error_screen, &hooks::error_screen), m_increment_stat_hook("Increment Stat Event", g_pointers->m_increment_stat_event, &hooks::increment_stat_event), m_script_event_hook("Script Event Handler", g_pointers->m_script_event_handler, &hooks::script_event_handler), @@ -70,6 +71,7 @@ namespace big // New hooks enable m_get_event_data.enable(); + m_get_label_text.enable(); m_error_screen_hook.enable(); m_increment_stat_hook.enable(); m_script_event_hook.enable(); @@ -91,6 +93,7 @@ namespace big // New hooks disable m_get_event_data.disable(); + m_get_label_text.disable(); m_error_screen_hook.disable(); m_increment_stat_hook.disable(); m_script_event_hook.disable(); diff --git a/BigBaseV2/src/hooking.hpp b/BigBaseV2/src/hooking.hpp index 7fdbc16c..96cf1df4 100644 --- a/BigBaseV2/src/hooking.hpp +++ b/BigBaseV2/src/hooking.hpp @@ -23,6 +23,7 @@ namespace big // New Hook Definitions static bool get_event_data(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount); + static const char* get_label_text(void* unk, const char* label); static void error_screen(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background); static bool increment_stat_event(uint64_t net_event_struct, CNetGamePlayer* sender, int64_t a3); static bool script_event_handler(std::int64_t NetEventStruct, CNetGamePlayer* net_game_player); @@ -58,6 +59,7 @@ namespace big // New Detour Hook Definitions detour_hook m_get_event_data; + detour_hook m_get_label_text; detour_hook m_error_screen_hook; detour_hook m_increment_stat_hook; detour_hook m_script_event_hook; diff --git a/BigBaseV2/src/hooks/get_label_text.cpp b/BigBaseV2/src/hooks/get_label_text.cpp new file mode 100644 index 00000000..4d32fad5 --- /dev/null +++ b/BigBaseV2/src/hooks/get_label_text.cpp @@ -0,0 +1,15 @@ +#include "features/custom_text.hpp" +#include "hooking.hpp" +#include "natives.hpp" + +namespace big +{ + const char* hooks::get_label_text(void* unk, const char* label) + { + if (g_running) + if (auto text = g_custom_text->get_text(rage::joaat(label))) + return text; + + return g_hooking->m_get_label_text.get_original()(unk, label); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/main.cpp b/BigBaseV2/src/main.cpp index a049a24d..fa571235 100644 --- a/BigBaseV2/src/main.cpp +++ b/BigBaseV2/src/main.cpp @@ -1,5 +1,6 @@ #include "common.hpp" #include "features.hpp" +#include "features/custom_text.hpp" #include "fiber_pool.hpp" #include "gui.hpp" #include "logger.hpp" @@ -45,6 +46,9 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) auto hooking_instance = std::make_unique(); LOG(INFO) << "Hooking initialized."; + auto custom_text_instance = std::make_unique(); + LOG(INFO) << "Custom Text Initialized."; + g_settings.load(); LOG(INFO) << "Settings Loaded."; diff --git a/BigBaseV2/src/pointers.cpp b/BigBaseV2/src/pointers.cpp index cc46d14f..850dada1 100644 --- a/BigBaseV2/src/pointers.cpp +++ b/BigBaseV2/src/pointers.cpp @@ -133,10 +133,15 @@ namespace big m_ptr_to_handle = ptr.as(); }); - main_batch.add("Send Info To Lobby", "44 8D 47 78 48 8D 54 24 ? 48 8B CB E8", [this](memory::handle ptr) + main_batch.add("Send Net Info To Lobby", "44 8D 47 78 48 8D 54 24 ? 48 8B CB E8", [this](memory::handle ptr) { m_send_net_info_to_lobby = ptr.add(13).rip().as(); }); + + main_batch.add("Get Label Text", "75 ? E8 ? ? ? ? 8B 0D ? ? ? ? 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 04 C8 8B 0C 02 D1 E9", [this](memory::handle ptr) + { + m_get_label_text = ptr.sub(19).as(); + }); main_batch.run(memory::module(nullptr)); diff --git a/BigBaseV2/src/pointers.hpp b/BigBaseV2/src/pointers.hpp index bb789359..2076a724 100644 --- a/BigBaseV2/src/pointers.hpp +++ b/BigBaseV2/src/pointers.hpp @@ -40,6 +40,7 @@ namespace big functions::error_screen* m_error_screen{}; functions::get_event_data* m_get_event_data{}; + functions::get_label_text* m_get_label_text{}; functions::get_player_name* m_get_player_name{}; functions::get_net_player* m_get_net_game_player{}; functions::increment_stat_event* m_increment_stat_event{};