From 1ce4b8b50e5e9e5bd4febca8b6d8dbdc0d186d92 Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Mon, 12 Aug 2024 01:11:59 +0400 Subject: [PATCH] Replace all code that uses the old method for game directory find with the new one --- BunnymodXT/discord_integration.cpp | 338 ++++++++++++----------------- BunnymodXT/discord_integration.hpp | 4 +- BunnymodXT/helper_functions.cpp | 34 ++- BunnymodXT/helper_functions.hpp | 3 + BunnymodXT/modules/ClientDLL.cpp | 88 +------- BunnymodXT/modules/ClientDLL.hpp | 6 - BunnymodXT/modules/HwDLL.cpp | 48 ++-- BunnymodXT/modules/HwDLL.hpp | 32 ++- BunnymodXT/modules/ServerDLL.cpp | 68 +++--- BunnymodXT/shared.hpp | 3 + 10 files changed, 274 insertions(+), 350 deletions(-) diff --git a/BunnymodXT/discord_integration.cpp b/BunnymodXT/discord_integration.cpp index 5997ad11..53e44381 100644 --- a/BunnymodXT/discord_integration.cpp +++ b/BunnymodXT/discord_integration.cpp @@ -83,235 +83,177 @@ namespace discord_integration // Declare these outside of the following block, so they are in scope for Discord_UpdatePresence(). char map_name[64]; + const char* game_dir = hw.GetGameDir(false).c_str(); char buffer_details[128]; - // Convert BXT timer to seconds - const auto& gt = CustomHud::GetTime(); - int total_time = (gt.hours * 60 * 60) + (gt.minutes * 60) + gt.seconds; + #define set_discord_image(img) \ + if (BXT_CONCAT(img, _map_name_to_thumbnail).find(map_name) != BXT_CONCAT(img, _map_name_to_thumbnail).cend()) \ + { \ + presence.largeImageKey = BXT_CONCAT(img, _map_name_to_thumbnail).find(map_name)->second.data(); \ + presence.largeImageText = BXT_CONCAT(img, _thumbnail_to_chapter).find(presence.largeImageKey)->second.data(); \ + } - if (cl.pEngfuncs) + #define set_discord_image_as_map_name(map_list) \ + if (BXT_CONCAT(map_list, _maps).find(map_name) != BXT_CONCAT(map_list, _maps).cend()) \ + { \ + presence.largeImageKey = map_name; \ + presence.largeImageText = map_name; \ + } + + if (game_dir && game_dir[0]) { - char gd[1024]; - // Game directory. - const char* gameDir = cl.pEngfuncs->pfnGetGameDirectory(); - if (gameDir && gameDir[0]) + // Yes GCC we know this can be truncated. + #if defined(__GNUC__) && !defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-truncation" + #endif + snprintf(buffer_details, sizeof(buffer_details), "Build: %i | Game: %s", hw.GetBuildNumber(), game_dir); + #if defined(__GNUC__) && !defined(__clang__) + #pragma GCC diagnostic pop + #endif + + presence.details = buffer_details; + } + + if (cur_state != game_state::NOT_PLAYING) + { + // Get the map name and icon. + cl.GetMapName(map_name, ARRAYSIZE_HL(map_name)); + if (game_dir && game_dir[0] && map_name[0]) { - cl.FileBase(gameDir, gd); + // Adjust map_name to lowercase + helper_functions::convert_to_lowercase(map_name); // Yes GCC we know this can be truncated. #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-truncation" #endif - if (hw.ORIG_build_number) - snprintf(buffer_details, sizeof(buffer_details), "Game: %s | Build: %i", gd, hw.ORIG_build_number()); - else - snprintf(buffer_details, sizeof(buffer_details), "Game: %s", gd); + snprintf(buffer_details, sizeof(buffer_details), "Build: %i | Map: %s | Game: %s", hw.GetBuildNumber(), map_name, game_dir); #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop #endif + presence.largeImageText = map_name; presence.details = buffer_details; - } - if (cur_state != game_state::NOT_PLAYING) - { - // Get the map name and icon. - cl.GetMapName(map_name, ARRAYSIZE_HL(map_name)); - if (gameDir && gameDir[0] && map_name[0]) + if (IsGameDirMatch(HL)) { - // Adjust map_name to lowercase - cl.ConvertToLowerCase(map_name); - - // Yes GCC we know this can be truncated. - #if defined(__GNUC__) && !defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wformat-truncation" - #endif - if (hw.ORIG_build_number) - snprintf(buffer_details, sizeof(buffer_details), "Map: %s | Game: %s | Build: %i", map_name, gd, hw.ORIG_build_number()); - else - snprintf(buffer_details, sizeof(buffer_details), "Map: %s | Game: %s", map_name, gd); - #if defined(__GNUC__) && !defined(__clang__) - #pragma GCC diagnostic pop - #endif - - presence.largeImageText = map_name; - presence.details = buffer_details; - - // Adjust gameDir to lowercase - cl.ConvertToLowerCase(gd); - - if (!strncmp(gd, "valve", 5) || !strcmp(gd, "abh") || !strncmp(gd, "glitchless", 10)) - { - if (hl1_map_name_to_thumbnail.find(map_name) != hl1_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = hl1_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = hl1_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "gearbox", 7)) - { - if (op4_map_name_to_thumbnail.find(map_name) != op4_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = op4_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = op4_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "bshift", 6)) - { - if (bs_map_name_to_thumbnail.find(map_name) != bs_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = bs_map_name_to_thumbnail.find(map_name)->second.data(); - - int state; - if (!strcmp(map_name, "ba_teleport2") && sv.GetGlobalState("powercomplete"s, state) && state == 1) - presence.largeImageText = "A Leap of Faith"; - else - presence.largeImageText = bs_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "rewolf", 6)) - { - if (gmc_map_name_to_thumbnail.find(map_name) != gmc_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = gmc_map_name_to_thumbnail.find(map_name)->second.data(); - - if (!strncmp(presence.largeImageKey, "gmcchapter4", 11)) - presence.largeImageText = "Rust"; - else - presence.largeImageText = gmc_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "czeror", 6)) - { - if (czds_map_name_to_thumbnail.find(map_name) != czds_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = czds_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = czds_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "wantedsp", 8)) - { - if (wanted_map_name_to_thumbnail.find(map_name) != wanted_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = wanted_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = wanted_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "echoes", 6)) - { - if (echoes_map_name_to_thumbnail.find(map_name) != echoes_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = echoes_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = echoes_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "caged_fgs", 9)) - { - if (caged_map_name_to_thumbnail.find(map_name) != caged_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = caged_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = caged_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "poke646", 7)) - { - if (poke646_map_name_to_thumbnail.find(map_name) != poke646_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = poke646_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = poke646_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "paranoia", 8)) - { - if (paranoia_map_name_to_thumbnail.find(map_name) != paranoia_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = paranoia_map_name_to_thumbnail.find(map_name)->second.data(); - - if (!strncmp(presence.largeImageKey, "paranoiachapter1", 16)) - presence.largeImageText = "Army"; - else if (!strncmp(presence.largeImageKey, "paranoiachapter2", 16)) - presence.largeImageText = "Industrial"; - else if (!strncmp(presence.largeImageKey, "paranoiachapter3", 16)) - presence.largeImageText = "Bunker"; - } - } - else if (!strncmp(gd, "twhltower2", 10)) - { - if (twhltower2_map_name_to_thumbnail.find(map_name) != twhltower2_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = twhltower2_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = twhltower2_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } - } - else if (!strncmp(gd, "aomdc", 5)) - { - if (aomdc_map_name_to_thumbnail.find(map_name) != aomdc_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = aomdc_map_name_to_thumbnail.find(map_name)->second.data(); - - if (aomdc_map_name_to_chapter_misc.find(map_name) != aomdc_map_name_to_chapter_misc.cend()) - presence.largeImageText = aomdc_map_name_to_chapter_misc.find(map_name)->second.data(); - else if (!strncmp(map_name, "1", 1) || !strncmp(map_name, "cityx", 5)) - presence.largeImageText = "Ending 1 or 4"; - else if (!strncmp(map_name, "2", 1)) - presence.largeImageText = "Ending 2 or 4"; - else if (!strncmp(map_name, "3", 1) || !strncmp(map_name, "cityz", 5)) - presence.largeImageText = "Ending 3 or 4"; - else if (!strncmp(map_name, "4", 1)) - presence.largeImageText = "Ending 4"; - else - presence.largeImageText = "All Endings"; - } - } - else if (!strncmp(gd, "hrp", 3)) + set_discord_image(hl1) + } + else if (IsGameDirMatch(OPFOR)) + { + set_discord_image(op4) + } + else if (IsGameDirStartsWith(BSHIFT)) + { + set_discord_image(bs) + } + else if (IsGameDirStartsWith(GUNMAN)) + { + if (gmc_map_name_to_thumbnail.find(map_name) != gmc_map_name_to_thumbnail.cend()) { - if (hlrats_parasomnia_map_name_to_thumbnail.find(map_name) != hlrats_parasomnia_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = hlrats_parasomnia_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = hlrats_parasomnia_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } + presence.largeImageKey = gmc_map_name_to_thumbnail.find(map_name)->second.data(); + + if (!strncmp(presence.largeImageKey, "gmcchapter4", 11)) + presence.largeImageText = "Rust"; + else + presence.largeImageText = gmc_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); } - else if (!strncmp(gd, "hl_urbicide", 11)) + } + else if (IsGameDirStartsWith(CSCZDS)) + { + set_discord_image(czds) + } + else if (IsGameDirMatch(WANTED)) + { + set_discord_image(wanted) + } + else if (IsGameDirMatch(ECHOES)) + { + set_discord_image(echoes) + } + else if (IsGameDirMatch(CAGED)) + { + set_discord_image(caged) + } + else if (IsGameDirStartsWith(POKE646)) + { + set_discord_image(poke646) + } + else if (IsGameDirStartsWith(PARANOIA)) + { + if (paranoia_map_name_to_thumbnail.find(map_name) != paranoia_map_name_to_thumbnail.cend()) { - if (urbicide_maps.find(map_name) != urbicide_maps.cend()) - { - presence.largeImageKey = map_name; - presence.largeImageText = map_name; - } + presence.largeImageKey = paranoia_map_name_to_thumbnail.find(map_name)->second.data(); + + if (!strncmp(presence.largeImageKey, "paranoiachapter1", 16)) + presence.largeImageText = "Army"; + else if (!strncmp(presence.largeImageKey, "paranoiachapter2", 16)) + presence.largeImageText = "Industrial"; + else if (!strncmp(presence.largeImageKey, "paranoiachapter3", 16)) + presence.largeImageText = "Bunker"; } - else if (!strncmp(gd, "hunger", 6)) + } + else if (IsGameDirMatch(TWHLTOWER2)) + { + set_discord_image(twhltower2) + } + else if (IsGameDirMatch(AOMDC)) + { + if (aomdc_map_name_to_thumbnail.find(map_name) != aomdc_map_name_to_thumbnail.cend()) { - if (th_map_name_to_thumbnail.find(map_name) != th_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = th_map_name_to_thumbnail.find(map_name)->second.data(); - - if (!strncmp(presence.largeImageKey, "thchapter1", 10)) - presence.largeImageText = "They Hunger Episode 1"; - else if (!strncmp(presence.largeImageKey, "thchapter2", 10)) - presence.largeImageText = "They Hunger Episode 2"; - else if (!strncmp(presence.largeImageKey, "thchapter3", 10)) - presence.largeImageText = "They Hunger Episode 3"; - } + presence.largeImageKey = aomdc_map_name_to_thumbnail.find(map_name)->second.data(); + + if (aomdc_map_name_to_chapter_misc.find(map_name) != aomdc_map_name_to_chapter_misc.cend()) + presence.largeImageText = aomdc_map_name_to_chapter_misc.find(map_name)->second.data(); + else if (!strncmp(map_name, "1", 1) || !strncmp(map_name, "cityx", 5)) + presence.largeImageText = "Ending 1 or 4"; + else if (!strncmp(map_name, "2", 1)) + presence.largeImageText = "Ending 2 or 4"; + else if (!strncmp(map_name, "3", 1) || !strncmp(map_name, "cityz", 5)) + presence.largeImageText = "Ending 3 or 4"; + else if (!strncmp(map_name, "4", 1)) + presence.largeImageText = "Ending 4"; + else + presence.largeImageText = "All Endings"; } - else if (!strncmp(gd, "cryoffear", 9)) + } + else if (IsGameDirMatch(HLRATS_PARASOMNIA)) + { + set_discord_image(hlrats_parasomnia) + } + else if (IsGameDirMatch(URBICIDE)) + { + set_discord_image_as_map_name(urbicide) + } + else if (IsGameDirStartsWith(HUNGER)) + { + if (th_map_name_to_thumbnail.find(map_name) != th_map_name_to_thumbnail.cend()) { - if (cof_map_name_to_thumbnail.find(map_name) != cof_map_name_to_thumbnail.cend()) - { - presence.largeImageKey = cof_map_name_to_thumbnail.find(map_name)->second.data(); - presence.largeImageText = cof_thumbnail_to_chapter.find(presence.largeImageKey)->second.data(); - } + presence.largeImageKey = th_map_name_to_thumbnail.find(map_name)->second.data(); + + if (!strncmp(presence.largeImageKey, "thchapter1", 10)) + presence.largeImageText = "They Hunger Episode 1"; + else if (!strncmp(presence.largeImageKey, "thchapter2", 10)) + presence.largeImageText = "They Hunger Episode 2"; + else if (!strncmp(presence.largeImageKey, "thchapter3", 10)) + presence.largeImageText = "They Hunger Episode 3"; } } + else if (IsGameDirStartsWith(COF)) + { + set_discord_image(cof) + } } } char buffer_state[128]; char buffer_stop[128]; + double total_time = helper_functions::ret_bxt_time(); const auto current_timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - start_timestamp = current_timestamp - total_time; + start_timestamp = current_timestamp - static_cast(total_time); const char *skillName; @@ -330,6 +272,8 @@ namespace discord_integration skillName = ""; } + const auto& gt = CustomHud::GetTime(); + if (CVars::host_framerate.GetFloat() > 0.0f) snprintf(buffer_state, sizeof(buffer_state), "%s | FPS (HFR): %.1f | %s", state.c_str(), 1.0f / CVars::host_framerate.GetFloat(), skillName); else @@ -351,7 +295,7 @@ namespace discord_integration presence.startTimestamp = start_timestamp; } - else if ((gt.milliseconds == 0 && total_time == 0) && !CustomHud::GetCountingTime()) + else if ((total_time == 0.0) && !CustomHud::GetCountingTime()) { if (cl.pEngfuncs && cl.pEngfuncs->pDemoAPI->IsPlayingback()) { presence.smallImageKey = "discord_brown"; @@ -363,7 +307,7 @@ namespace discord_integration presence.startTimestamp = current_timestamp; } - else if ((gt.milliseconds > 0 || total_time > 0) && !CustomHud::GetCountingTime()) + else if ((total_time > 0.0) && !CustomHud::GetCountingTime()) { snprintf(buffer_stop, sizeof(buffer_stop), "Timer stopped at %d:%02d:%02d.%03d", gt.hours, gt.minutes, gt.seconds, gt.milliseconds); presence.state = buffer_stop; diff --git a/BunnymodXT/discord_integration.hpp b/BunnymodXT/discord_integration.hpp index 2c23b645..9313bcb8 100644 --- a/BunnymodXT/discord_integration.hpp +++ b/BunnymodXT/discord_integration.hpp @@ -228,7 +228,7 @@ namespace discord_integration {"bschapter3", "Captive Freight"}, {"bschapter4", "Focal Point"}, {"bschapter5", "Power Struggle"}, - {"bschapter6", "Captive Freight"}, + {"bschapter6", "Captive Freight / A Leap of Faith"}, {"bschapter7", "Outro"}, {"bschapter8", "Hazard Course"}, {"bschapter9", "Living Quarters Outbound"}, @@ -830,7 +830,7 @@ namespace discord_integration {"paraschool", "hrpchapter10"}, }; - const std::unordered_set urbicide_maps { + const std::unordered_set urbicide_maps { "urbicide1"s, "urbicide2"s, "urbicide3"s, diff --git a/BunnymodXT/helper_functions.cpp b/BunnymodXT/helper_functions.cpp index 38f6074f..00db9ebb 100644 --- a/BunnymodXT/helper_functions.cpp +++ b/BunnymodXT/helper_functions.cpp @@ -4,6 +4,10 @@ namespace helper_functions { + auto &cl = ClientDLL::GetInstance(); + auto &sv = ServerDLL::GetInstance(); + auto &hw = HwDLL::GetInstance(); + void com_fixslashes(std::string &str) { // https://github.com/ValveSoftware/halflife/blob/c7240b965743a53a29491dd49320c88eecf6257b/game_shared/bot/nav_file.cpp#L680 @@ -44,7 +48,6 @@ namespace helper_functions void disable_vsync() { #ifdef _WIN32 - auto &hw = HwDLL::GetInstance(); if (hw.check_vsync) { const bool bxtDisableVSync = getenv("BXT_DISABLE_VSYNC"); @@ -63,7 +66,7 @@ namespace helper_functions void _com_filebase(const char *in, int &len, int &start) { - int len, start, end; + int end; len = strlen(in); @@ -121,9 +124,27 @@ namespace helper_functions std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return tolower(c); }); } + double ret_bxt_time() + { + const auto& gt = CustomHud::GetTime(); + return (gt.hours * 60 * 60) + (gt.minutes * 60) + gt.seconds + (gt.milliseconds / 1000); + } + + void reset_gamedir() + { + hw.gamedir.clear(); + hw.gamedir_lw.clear(); + hw.GameDirMatchID = hw.GameDirStartsWithID = -1; + } + void set_gamedir_starts_with() { - #define FIND_GAMEDIR_STARTS_WITH(name, id) + #define FIND_GAMEDIR_STARTS_WITH(name, id) \ + if (!hw.GetGameDir().compare(0, sizeof(#name) - 1, #name)) \ + { \ + hw.GameDirStartsWithID = BXT_CONCAT(GAMEDIR_STARTS_WITH_, id); \ + return; \ + } FIND_GAMEDIR_STARTS_WITH(valve, HL) FIND_GAMEDIR_STARTS_WITH(gearbox, OPFOR) @@ -143,7 +164,12 @@ namespace helper_functions void set_gamedir_match() { - #define FIND_GAMEDIR_MATCH(name, id) + #define FIND_GAMEDIR_MATCH(name, id) \ + if (!hw.GetGameDir().compare(#name)) \ + { \ + hw.GameDirMatchID = BXT_CONCAT(GAMEDIR_MATCH_, id); \ + return; \ + } FIND_GAMEDIR_MATCH(valve, HL) FIND_GAMEDIR_MATCH(gearbox, OPFOR) diff --git a/BunnymodXT/helper_functions.hpp b/BunnymodXT/helper_functions.hpp index 5382c00d..066dbc51 100644 --- a/BunnymodXT/helper_functions.hpp +++ b/BunnymodXT/helper_functions.hpp @@ -26,6 +26,9 @@ namespace helper_functions void convert_to_lowercase(const char *str); void convert_to_lowercase(std::string &str); + double ret_bxt_time(); + + void reset_gamedir(); void set_gamedir_starts_with(); void set_gamedir_match(); diff --git a/BunnymodXT/modules/ClientDLL.cpp b/BunnymodXT/modules/ClientDLL.cpp index dedce96c..281dfc2f 100644 --- a/BunnymodXT/modules/ClientDLL.cpp +++ b/BunnymodXT/modules/ClientDLL.cpp @@ -1157,84 +1157,6 @@ void ClientDLL::StudioAdjustViewmodelAttachments(Vector &vOrigin) vOrigin = last_vieworg + vOut; } -void ClientDLL::FileBase(const char *in, char *out) -{ - int len, start, end; - - len = strlen(in); - - // scan backward for '.' - end = len - 1; - while (0 != end && in[end] != '.' && in[end] != '/' && in[end] != '\\') - end--; - - if (in[end] != '.') // no '.', copy to end - end = len - 1; - else - end--; // Found ',', copy to left of '.' - - // Scan backward for '/' - start = len - 1; - while (start >= 0 && in[start] != '/' && in[start] != '\\') - start--; - - if (in[start] != '/' && in[start] != '\\') - start = 0; - else - start++; - - // Length of new sting - len = end - start + 1; - - // Copy partial string - strncpy(out, &in[start], len); - // Terminate it - out[len] = 0; -} - -void ClientDLL::ConvertToLowerCase(const char *str) -{ - unsigned char *str_lw = (unsigned char *)str; - while (*str_lw) { - *str_lw = tolower(*str_lw); - str_lw++; - } -} - -bool ClientDLL::DoesGameDirMatch(const char *game) -{ - if (!pEngfuncs) - return false; - - const char *gameDir = pEngfuncs->pfnGetGameDirectory(); - char gd[1024]; - - if (gameDir && gameDir[0]) - { - FileBase(gameDir, gd); - ConvertToLowerCase(gd); - } - - return !std::strcmp(gd, game); -} - -bool ClientDLL::DoesGameDirContain(const char *game) -{ - if (!pEngfuncs) - return false; - - const char *gameDir = pEngfuncs->pfnGetGameDirectory(); - char gd[1024]; - - if (gameDir && gameDir[0]) - { - FileBase(gameDir, gd); - ConvertToLowerCase(gd); - } - - return std::strstr(gd, game); -} - size_t ClientDLL::GetMapName(char* dest, size_t count) { auto map_path = pEngfuncs->pfnGetLevelName(); @@ -1265,7 +1187,7 @@ bool ClientDLL::DoesMapNameMatch(const char *map) GetMapName(map_name, ARRAYSIZE_HL(map_name)); if (map_name[0]) - ConvertToLowerCase(map_name); + helper_functions::convert_to_lowercase(map_name); return !std::strcmp(map_name, map); } @@ -1280,9 +1202,9 @@ bool ClientDLL::DoesMapNameContain(const char *map) GetMapName(map_name, ARRAYSIZE_HL(map_name)); if (map_name[0]) - ConvertToLowerCase(map_name); + helper_functions::convert_to_lowercase(map_name); - return std::strstr(map_name, map); + return !std::strncmp(map_name, map, strlen(map)); } void ClientDLL::SetAngleSpeedCap(bool capped) @@ -1861,7 +1783,7 @@ HOOK_DEF_1(ClientDLL, void, __cdecl, CStudioModelRenderer__StudioSetupBones_Linu { ptrdiff_t offpCurrentEntity_Linux; ptrdiff_t offpStudioHeader_Linux; - if (DoesGameDirMatch("dod")) { + if (IsGameDirMatch(MP_DOD)) { offpCurrentEntity_Linux = 52; offpStudioHeader_Linux = 72; } else { @@ -1988,7 +1910,7 @@ HOOK_DEF_1(ClientDLL, void, __fastcall, CStudioModelRenderer__StudioRenderModel, HOOK_DEF_1(ClientDLL, void, __cdecl, CStudioModelRenderer__StudioRenderModel_Linux, void*, thisptr) { ptrdiff_t offpCurrentEntity_Linux; - if (DoesGameDirMatch("dod")) + if (IsGameDirMatch(MP_DOD)) offpCurrentEntity_Linux = 52; else offpCurrentEntity_Linux = 44; diff --git a/BunnymodXT/modules/ClientDLL.hpp b/BunnymodXT/modules/ClientDLL.hpp index e5ebb92e..6a25fb33 100644 --- a/BunnymodXT/modules/ClientDLL.hpp +++ b/BunnymodXT/modules/ClientDLL.hpp @@ -76,9 +76,6 @@ class ClientDLL : public IHookableNameFilter void StudioAdjustViewmodelAttachments(Vector &vOrigin); - bool DoesGameDirMatch(const char *game); - bool DoesGameDirContain(const char *game); - size_t GetMapName(char* dest, size_t count); bool DoesMapNameMatch(const char *map); bool DoesMapNameContain(const char *map); @@ -110,9 +107,6 @@ class ClientDLL : public IHookableNameFilter void SetSpeedScaling(bool scaled); - void FileBase(const char *in, char *out); - void ConvertToLowerCase(const char *str); - void SetupTraceVectors(float start[3], float end[3]); private: diff --git a/BunnymodXT/modules/HwDLL.cpp b/BunnymodXT/modules/HwDLL.cpp index e337b824..207f2045 100644 --- a/BunnymodXT/modules/HwDLL.cpp +++ b/BunnymodXT/modules/HwDLL.cpp @@ -753,6 +753,8 @@ void HwDLL::Clear() pEngStudio = nullptr; pEngineAPI = nullptr; + helper_functions::reset_gamedir(); + registeredVarsAndCmds = false; autojump = false; ducktap = false; @@ -3136,7 +3138,12 @@ struct HwDLL::Cmd_BXT_Debug_Dump static void handler(const char *name) { - if (!strcmp(name, "sizeof")) + if (!strcmp(name, "gamedir")) + { + auto &hw = HwDLL::GetInstance(); + hw.ORIG_Con_Printf("%d, %d, %s, %s\n", hw.GameDirMatchID, hw.GameDirStartsWithID, hw.gamedir.c_str(), hw.gamedir_lw.c_str()); + } + else if (!strcmp(name, "sizeof")) { auto &hw = HwDLL::GetInstance(); std::ostringstream ss; @@ -3401,7 +3408,6 @@ struct HwDLL::Cmd_BXT_CH_CheckPoint_Create static void handler() { auto &hw = HwDLL::GetInstance(); - auto &cl = ClientDLL::GetInstance(); auto pl = hw.GetPlayerEdict(); @@ -3506,7 +3512,7 @@ struct HwDLL::Cmd_BXT_CH_CheckPoint_GoTo pl->v.origin = cp_origin; // for CS 1.6 stamina reset - if (hw.is_cstrike_dir) + if (IsGameDirMatch(MP_CS)) pl->v.fuser2 = 0; pl->v.gravity = cp_gravity; @@ -5744,7 +5750,7 @@ void HwDLL::SetTASLogging(bool enabled) return; } const int buildNumber = ORIG_build_number ? ORIG_build_number() : -1; - const char *gameDir = ClientDLL::GetInstance().pEngfuncs->pfnGetGameDirectory(); + const char *gameDir = GetGameDir(false).c_str(); logWriter.StartLog(tasLogFile, BUNNYMODXT_VERSION, buildNumber, gameDir); tasLogging = true; ORIG_Con_Printf("Started TAS logging into %s\n", filename.c_str()); @@ -6833,7 +6839,7 @@ bool HwDLL::GetNextMovementFrame(HLTAS::Frame& f) return false; } -std::string GetGameDir(bool lowercase) +std::string HwDLL::GetGameDir(bool lowercase) { if (gamedir.empty()) { @@ -6860,14 +6866,25 @@ std::string GetGameDir(bool lowercase) } } - if (lowercase) ? return gamedir_lw; : return gamedir; + if (lowercase) + return gamedir_lw; + else + return gamedir; } -std::string GetGameDir() +std::string HwDLL::GetGameDir() { return GetGameDir(true); } +int HwDLL::GetBuildNumber() +{ + if (ORIG_build_number) + return ORIG_build_number(); + else + return 0; +} + HLStrafe::PlayerData HwDLL::GetPlayerData() { HLStrafe::PlayerData player{}; @@ -6951,11 +6968,9 @@ HLStrafe::MovementVars HwDLL::GetMovementVars() vars.Bounce = CVars::sv_bounce.GetFloat(); vars.Bhopcap = CVars::bxt_bhopcap.GetBool(); - static bool is_paranoia_dir = cl.DoesGameDirMatch("paranoia"); - is_tfc_dir = cl.DoesGameDirMatch("tfc"); - is_cstrike_dir = cl.DoesGameDirMatch("cstrike") || cl.DoesGameDirMatch("czero"); + bool is_cstrike_dir = IsGameDirMatch(MP_CS) || IsGameDirMatch(MP_CSCZ); - if (is_paranoia_dir) + if (IsGameDirMatch(PARANOIA)) vars.Maxspeed = cl.pEngfuncs->GetClientMaxspeed() * CVars::sv_maxspeed.GetFloat() / 100.0f; // GetMaxSpeed is factor here else if (cl.pEngfuncs && (cl.pEngfuncs->GetClientMaxspeed() > 0.0f) && (CVars::sv_maxspeed.GetFloat() > cl.pEngfuncs->GetClientMaxspeed())) vars.Maxspeed = cl.pEngfuncs->GetClientMaxspeed(); // Get true maxspeed in other mods (example: CS 1.6) @@ -6972,7 +6987,7 @@ HLStrafe::MovementVars HwDLL::GetMovementVars() vars.BhopcapMaxspeedScale = 1.7f; } - if (!is_cstrike_dir && !is_tfc_dir) + if (!is_cstrike_dir && !IsGameDirMatch(MP_TFC)) vars.UseSlow = true; if (svs->maxclients >= 1) { @@ -8054,7 +8069,7 @@ HOOK_DEF_1(HwDLL, void, __cdecl, VGuiWrap_Paint, int, paintAll) HOOK_DEF_3(HwDLL, int, __cdecl, DispatchDirectUserMsg, char*, pszName, int, iSize, void*, pBuf) { - if (ClientDLL::GetInstance().DoesGameDirContain("czeror") && !std::strcmp(pszName, "InitHUD")) + if (IsGameDirStartsWith(CSCZDS) && !std::strcmp(pszName, "InitHUD")) return ORIG_DispatchDirectUserMsg(0, iSize, pBuf); else return ORIG_DispatchDirectUserMsg(pszName, iSize, pBuf); @@ -8235,7 +8250,7 @@ HOOK_DEF_0(HwDLL, void, __cdecl, R_DrawParticles) HOOK_DEF_0(HwDLL, int, __cdecl, BUsesSDLInput) { - if (ClientDLL::GetInstance().DoesGameDirMatch("bshift_cutsceneless") || CVars::bxt_fix_mouse_horizontal_limit.GetBool()) + if (IsGameDirStartsWith(BSHIFT) || CVars::bxt_fix_mouse_horizontal_limit.GetBool()) return true; else return ORIG_BUsesSDLInput(); @@ -8435,16 +8450,13 @@ HOOK_DEF_1(HwDLL, void, __cdecl, LoadThisDll, const char*, szDllFilename) auto oldszDllFilename = szDllFilename; std::string newszDllFilename; - auto &hw = HwDLL::GetInstance(); - hw.is_cstrike_dir = ClientDLL::GetInstance().DoesGameDirMatch("cstrike"); - if (boost::ends_with(szDllFilename, "metamod" DLL_EXTENSION)) { EngineDevMsg("[hw dll] Metamod detected.\n"); bool is_failed = false; - if (hw.is_cstrike_dir) + if (IsGameDirMatch(MP_CS)) { #ifdef _WIN32 const std::string cs_lib = "dlls\\mp"; diff --git a/BunnymodXT/modules/HwDLL.hpp b/BunnymodXT/modules/HwDLL.hpp index f9e609ac..a650a819 100644 --- a/BunnymodXT/modules/HwDLL.hpp +++ b/BunnymodXT/modules/HwDLL.hpp @@ -322,9 +322,6 @@ class HwDLL : public IHookableNameFilterOrdered int lastRecordedHealth; - bool is_cstrike_dir = false; - bool is_tfc_dir = false; - globalvars_t *ppGlobals; engine_studio_api_t *pEngStudio; engine_api_t *pEngineAPI; @@ -546,11 +543,34 @@ class HwDLL : public IHookableNameFilterOrdered std::string GetGameDir(bool lowercase); std::string GetGameDir(); int GameDirMatchID = -1, GameDirStartsWithID = -1; - inline void GameDirInit() { if (gamedir.empty()) GetGameDir(); } - inline bool _IsGameDirMatch(int val) { GameDirInit(); if (val == GameDirMatchID) ? return true; : return false; } - inline bool _IsGameDirStartsWith(int val) { GameDirInit(); if (val == GameDirStartsWithID) ? return true; : return false; } + + inline void GameDirInit() + { + if (gamedir.empty()) + GetGameDir(); + } + + inline bool _IsGameDirMatch(int val) + { + GameDirInit(); + if (val == GameDirMatchID) + return true; + else + return false; + } + + inline bool _IsGameDirStartsWith(int val) + { + GameDirInit(); + if (val == GameDirStartsWithID) + return true; + else + return false; + } // End of gamedir block + int GetBuildNumber(); + bool ducktap; edict_t **sv_player; protected: diff --git a/BunnymodXT/modules/ServerDLL.cpp b/BunnymodXT/modules/ServerDLL.cpp index 62c5bc37..4dc15d86 100644 --- a/BunnymodXT/modules/ServerDLL.cpp +++ b/BunnymodXT/modules/ServerDLL.cpp @@ -993,37 +993,37 @@ void ServerDLL::FindStuff() if (ORIG_CBasePlayer__ForceClientDllUpdate_Linux) { offm_rgAmmoLast = 0x56C; // 6153: 0x568 offm_iClientFOV = 0x4C4; // 6153: 0x4C0 - if (ClientDLL::GetInstance().DoesGameDirContain("czeror")) { + if (IsGameDirStartsWith(CSCZDS)) { offm_rgAmmoLast = 0x554; // 6153: 0x550 offm_iClientFOV = 0x8B0; // 6153: 0x8AC offFuncIsPlayer = 0xA8; offFuncCenter = 0xDC; offFuncObjectCaps = 0x18; } - if (ClientDLL::GetInstance().DoesGameDirContain("bshift")) { + else if (IsGameDirStartsWith(BSHIFT)) { offm_rgAmmoLast = 0x568; // 8684: 0x56C offm_iClientFOV = 0x4C0; // 8684: 0x4C4 } - if (ClientDLL::GetInstance().DoesGameDirMatch("cstrike") || ClientDLL::GetInstance().DoesGameDirMatch("czero")) { + else if (IsGameDirMatch(MP_CS) || IsGameDirMatch(MP_CSCZ)) { offm_rgAmmoLast = 0x674; offm_iClientFOV = 0x5C4; offFuncIsPlayer = 0xA0; offFuncCenter = 0xCC; offFuncObjectCaps = 0x18; } - if (ClientDLL::GetInstance().DoesGameDirMatch("tfc")) { + else if (IsGameDirMatch(MP_TFC)) { offm_rgAmmoLast = 0x98C; // 6153: 0x988 offm_iClientFOV = 0x8E0; // 6153: 0x8DC offFuncObjectCaps = 0x1C; } - if (ClientDLL::GetInstance().DoesGameDirMatch("dod")) { + else if (IsGameDirMatch(MP_DOD)) { offm_rgAmmoLast = 0x4F8; // 6153: 0x4F4 offm_iClientFOV = 0x448; // 6153: 0x444 offFuncIsPlayer = 0xB4; offFuncCenter = 0xE0; offFuncObjectCaps = 0x20; } - if (ClientDLL::GetInstance().DoesGameDirMatch("dmc")) { + else if (IsGameDirMatch(MP_DMC)) { offm_rgAmmoLast = 0x534; offm_iClientFOV = 0x48C; } @@ -1105,7 +1105,7 @@ void ServerDLL::FindStuff() offm_pNodes = 0x0C; offm_vecOrigin = 0x00; offm_cNodes = 0x18; - if (ClientDLL::GetInstance().DoesGameDirContain("czeror")) + if (IsGameDirStartsWith(CSCZDS)) size_CNode = 0x60; else size_CNode = 0x58; @@ -2211,7 +2211,7 @@ HOOK_DEF_1(ServerDLL, void, __fastcall, CApache__DyingThink, void*, thisptr) auto pev = GET_PEV(thisptr); if (pev && pev->targetname) { const char *targetname = HwDLL::GetInstance().ppGlobals->pStringBase + pev->targetname; - if (!std::strcmp(targetname, "sheriffs_chppr") && ClientDLL::GetInstance().DoesGameDirContain("hunger")) { // They Hunger Episode 3 + if (IsGameDirStartsWith(HUNGER) && !std::strcmp(targetname, "sheriffs_chppr")) { // They Hunger Episode 3 DoAutoStopTasks(); } } @@ -2226,7 +2226,7 @@ HOOK_DEF_2(ServerDLL, void, __fastcall, CBreakable__Die, void*, thisptr, int, ed auto pev = GET_PEV(thisptr); if (pev && pev->target) { const char *target = HwDLL::GetInstance().ppGlobals->pStringBase + pev->target; - if (!std::strcmp(target, "BLOOOM") && ClientDLL::GetInstance().DoesGameDirContain("czeror")) { // CSCZDS + if (IsGameDirStartsWith(CSCZDS) && !std::strcmp(target, "BLOOOM")) { // CSCZDS DoAutoStopTasks(); } } @@ -2241,7 +2241,7 @@ HOOK_DEF_1(ServerDLL, void, __cdecl, CBreakable__Die_Linux, void*, thisptr) auto pev = GET_PEV(thisptr); if (pev && pev->target) { const char *target = HwDLL::GetInstance().ppGlobals->pStringBase + pev->target; - if (!std::strcmp(target, "BLOOOM") && ClientDLL::GetInstance().DoesGameDirContain("czeror")) { + if (IsGameDirStartsWith(CSCZDS) && !std::strcmp(target, "BLOOOM")) { DoAutoStopTasks(); } } @@ -2270,7 +2270,7 @@ HOOK_DEF_1(ServerDLL, void, __fastcall, CBaseDoor__DoorGoUp, void*, thisptr) auto pev = GET_PEV(thisptr); if (pev && pev->target) { const char *target = HwDLL::GetInstance().ppGlobals->pStringBase + pev->target; - if (!std::strcmp(target, "oil_spouts1_mm") && ClientDLL::GetInstance().DoesGameDirContain("hunger")) { // They Hunger Episode 2 + if (IsGameDirStartsWith(HUNGER) && !std::strcmp(target, "oil_spouts1_mm")) { // They Hunger Episode 2 DoAutoStopTasks(); } } @@ -2289,7 +2289,7 @@ HOOK_DEF_1(ServerDLL, void, __fastcall, CBaseDoor__DoorHitTop, void*, thisptr) char pVolumeName[] = "lm15"; const char *targetname = HwDLL::GetInstance().ppGlobals->pStringBase + pev->targetname; - if (!std::strcmp(targetname, "rocket_dr") && ClientDLL::GetInstance().DoesGameDirMatch("lm_txp") // The Xeno Project + if (IsGameDirMatch(TXP) && !std::strcmp(targetname, "rocket_dr") // The Xeno Project && ORIG_CChangeLevel__InTransitionVolume(classPtr, pVolumeName)) DoAutoStopTasks(); } @@ -2304,7 +2304,7 @@ HOOK_DEF_4(ServerDLL, void, __fastcall, CBaseMonster__Killed, void*, thisptr, in auto pev = GET_PEV(thisptr); if (pev && pev->classname) { const char* classname = HwDLL::GetInstance().ppGlobals->pStringBase + pev->classname; - if (!std::strcmp(classname, "monster_gargantua") && ClientDLL::GetInstance().DoesGameDirMatch("tetsu0_cot")) { + if (IsGameDirMatch(CROWBAROFTIME) && !std::strcmp(classname, "monster_gargantua")) { DoAutoStopTasks(); } } @@ -2359,27 +2359,27 @@ void ServerDLL::OnMultiManagerFired(const char *targetname) { auto &cl = ClientDLL::GetInstance(); - if ((!std::strcmp(targetname, "roll_the_credits") && cl.DoesGameDirContain("bshift")) // Blue Shift - || (!std::strcmp(targetname, "youwinmulti") && cl.DoesGameDirContain("rewolf")) // Gunman Chronicles - || (!std::strcmp(targetname, "previctory_mm") && cl.DoesGameDirContain("decay")) // Decay - || (!std::strcmp(targetname, "stairscene_mngr") && cl.DoesGameDirContain("hunger")) // They Hunger Episode 1 - || (!std::strcmp(targetname, "boot_radio_seq") && cl.DoesGameDirContain("gearbox")) // Opposing Force: Boot Camp - || (!std::strcmp(targetname, "telmm") && cl.DoesGameDirMatch("biglolly")) // Big Lolly - || (!std::strcmp(targetname, "mm_player_camera1") && cl.DoesGameDirMatch("htc")) // HTC - || (!std::strcmp(targetname, "multimanager_1") && cl.DoesGameDirMatch("construction")) // Construction - || (!std::strcmp(targetname, "the_endgame_mm") && cl.DoesGameDirMatch("gloom")) // The Gloom - || (!std::strcmp(targetname, "endbox_mm0") && cl.DoesGameDirContain("echoes")) // Echoes - || (!std::strcmp(targetname, "sendmm") && cl.DoesGameDirMatch("minimicus")) // Minimicus - || (!std::strcmp(targetname, "kill2") && cl.DoesGameDirMatch("before")) // Before - || (!std::strcmp(targetname, "tele_in") && cl.DoesGameDirMatch("plague")) // Plague - || (!std::strcmp(targetname, "exit_seq") && cl.DoesGameDirMatch("timeline2") && cl.DoesMapNameMatch("ice29")) // Timeline 2 - || (!std::strcmp(targetname, "spawn_garg_sci_mm") && cl.DoesGameDirMatch("steamlink")) // Uplink - || (!std::strcmp(targetname, "fc_mm1") && cl.DoesGameDirMatch("hc")) // Hazardous Course 2 - || (!std::strcmp(targetname, "medicosprey") && cl.DoesGameDirMatch("visitors")) // Visitors - || (!std::strcmp(targetname, "change_mm") && cl.DoesGameDirMatch("wantedsp") && cl.DoesMapNameMatch("want36")) // Wanted - || (!std::strcmp(targetname, "multiend1") && cl.DoesGameDirMatch("cryoffear") && !cl.DoesMapNameContain("cof_suicide")) // Cry of Fear (Ending 1, 2, 3) - || (!std::strcmp(targetname, "multicrash") && cl.DoesGameDirMatch("cryoffear")) // Cry of Fear (Ending 5) - || (!std::strcmp(targetname, "multicoopend") && cl.DoesGameDirMatch("cryoffear"))) { // Cry of Fear (Co-op) + if ((IsGameDirStartsWith(BSHIFT) && !std::strcmp(targetname, "roll_the_credits")) // Half-Life: Blue Shift + || (IsGameDirStartsWith(GUNMAN) && !std::strcmp(targetname, "youwinmulti")) // Gunman Chronicles + || (IsGameDirMatch(DECAY) && !std::strcmp(targetname, "previctory_mm")) // Half-Life: Decay, fan-made port + || (IsGameDirStartsWith(HUNGER) && !std::strcmp(targetname, "stairscene_mngr")) // They Hunger (Episode 1) + || (IsGameDirStartsWith(OPFOR) && !std::strcmp(targetname, "boot_radio_seq")) // Half-Life: Opposing Force (Boot Camp) + || (IsGameDirMatch(BIGLOLLY) && !std::strcmp(targetname, "telmm")) // Big Lolly + || (IsGameDirMatch(HTC) && !std::strcmp(targetname, "mm_player_camera1")) // HTC + || (IsGameDirMatch(CONSTRUCTION) && !std::strcmp(targetname, "multimanager_1")) // Construction + || (IsGameDirMatch(GLOOM) && !std::strcmp(targetname, "the_endgame_mm")) // Gloom + || (IsGameDirStartsWith(ECHOES) && !std::strcmp(targetname, "endbox_mm0")) // Echoes + || (IsGameDirMatch(MINIMICUS) && !std::strcmp(targetname, "sendmm")) // Minimicus + || (IsGameDirMatch(BEFORE) && !std::strcmp(targetname, "kill2")) // Half-Life: Before + || (IsGameDirMatch(PLAGUE) && !std::strcmp(targetname, "tele_in")) // Plague + || (IsGameDirMatch(TIMELINE2) && !std::strcmp(targetname, "exit_seq") && cl.DoesMapNameMatch("ice29")) // Timeline 2 + || ((IsGameDirMatch(UPLINK) || IsGameDirMatch(HL)) && !std::strcmp(targetname, "spawn_garg_sci_mm")) // Half-life: Uplink + || (IsGameDirMatch(HC2) && !std::strcmp(targetname, "fc_mm1")) // Hazardous Course 2 + || (IsGameDirMatch(VISITORS) && !std::strcmp(targetname, "medicosprey")) // Visitors + || (IsGameDirStartsWith(WANTED) && !std::strcmp(targetname, "change_mm") && cl.DoesMapNameMatch("want36")) // Wanted + || (IsGameDirStartsWith(COF) && !std::strcmp(targetname, "multiend1") && !cl.DoesMapNameContain("cof_suicide")) // Cry of Fear (Ending 1, 2, 3) + || (IsGameDirStartsWith(COF) && !std::strcmp(targetname, "multicrash")) // Cry of Fear (Ending 5) + || (IsGameDirStartsWith(COF) && !std::strcmp(targetname, "multicoopend"))) { // Cry of Fear (Co-op) DoAutoStopTasks(); } diff --git a/BunnymodXT/shared.hpp b/BunnymodXT/shared.hpp index f7b1f81e..7c0f9bde 100644 --- a/BunnymodXT/shared.hpp +++ b/BunnymodXT/shared.hpp @@ -52,6 +52,9 @@ constexpr steamid_t STEAMID64_CONST = 76561197960265728; // 0x110000100000000 // - Custom macros #define GET_PEV(thisptr) *reinterpret_cast(reinterpret_cast(thisptr) + off_pev); +#define BXT_CONCAT(x, y) x##y +#define IsGameDirMatch(id) HwDLL::GetInstance()._IsGameDirMatch(BXT_CONCAT(GAMEDIR_MATCH_, id)) +#define IsGameDirStartsWith(id) HwDLL::GetInstance()._IsGameDirStartsWith(BXT_CONCAT(GAMEDIR_STARTS_WITH_, id)) // - Custom enums