diff --git a/README.md b/README.md index 12cf571..b4fb490 100644 --- a/README.md +++ b/README.md @@ -3,52 +3,52 @@ ![code](https://raw.githubusercontent.com/project-bo4/shield-development/master/assets/readme_header.jpg) ## SHIELD -A very experimental modification platform for Call of Duty®: Black Ops 4 run by community, aiming at improving both functionality and performance of original game. +A very experimental modification platform for Call of Duty®: Black Ops 4 run by the community, aiming at improving both functionality and performance of the original game. ## DEMONWARE -As of May11, 2023 we merged 'demonware' branch into 'master'. it includes a built-in demonware server emulator which allows player to start game without connection to official online servers. +As of May 11, 2023, we have merged the 'demonware' branch into 'master'. It includes a built-in demonware server emulator which allows the player to start a game without an active connection to the official online servers. ## INSTRUCTIONS -> You should have publisher files required for playing online under LPC folder of your game directory. -> If its not the case then start original game through battlenet launcher once to get those downloaded. +> You should already have the publisher files required for playing online (found under the LPC folder of your game directory). +> If this is not the case, then run Black Ops 4 through Battle.NET Launcher once to get those files downloaded. -1- Clone repository with its sub-modules and use generate.bat to make visual studio solution then compile project and copy ``d3d11.dll`` into your bo4 folder. +1- Clone repository with its sub-modules and use ```generate.bat``` to make a Visual Studio solution, then compile project and copy ``d3d11.dll`` into your BO4 folder. 2- Start BlackOps4.exe -*In case you wanted to revert back to original battlenet servers just delete ``d3d11.dll``. you can put it back later whenever you want to re-install client.* +*In case you wanted to revert back to using the original Battle.NET servers, just delete the generated ``d3d11.dll`` file from your game folder. You can re-generate and copy ```d3d11.dll``` back later whenever you want to re-install the client.* ## SHIELD DOCUMENTATION Documentation on shield can be found [here](https://shield-bo4.gitbook.io/). ## SUBMITTING ISSUES -Github issues section is only for reporting programmatically errors of client. please dont use it for requesting features or seeking help with personal issues such as faulty game data or similar problems. use battlenet's scan and repair feature to fix those problems. +The Github Issues section is only for reporting programmatical errors related to the client. Please don't use it for requesting features or seeking help with personal issues such as experiencing faulty game data or similar problems. Use Battle.NET's 'Scan And Repair' feature to fix those problems. ## NOTES -- Base SDK(well kinda...) used by this project is developed by [Maurice Heumann](https://github.com/momo5502); Thanks to the guy. +- Base SDK (well kinda...) used by this project is developed by [Maurice Heumann](https://github.com/momo5502); Thanks to the guy. -- There are some 3rd-party project/tools that have influenced and helped the project in particular ways; If you belive there is something originated from you and want to be credited please contact any of our social media accounts. +- There are some 3rd-party project/tools that have influenced and helped the project in particular ways; If you belive there is something originated from you and want to be credited, please contact any of our social media accounts. -- This Project is created purely for educational purposes. its free and open-sourced under gnu license. developers are not responsible or liable for misuse of this product. +- This Project is created purely for educational purposes. It's free and open-sourced under the GNU License. Developers are not responsible or liable for misuse of this product. ## Roadmap ### CLIENT-SIDE: -- [x] Online Battlenet Connection Requirement Removal +- [x] Online Battle.NET Connection Requirement Removal - [x] Built-in Demonware Server Emulation - [x] BlackBox Crash Reporting Component - [x] In-game Interactable Console -- [x] Gsc & Lua Modding Support +- [x] GSC & Lua Modding Support - [ ] Enable Aim-Assist for Game Controllers -- [ ] Miscellaneous Features such as 1st person view fov -- [ ] Fix *uncommon* runtime black screen issue along other instabilities +- [ ] Miscellaneous Features such as 1st-Person View FOV +- [ ] Fix *uncommon* Runtime "Black Screen" issue along other instabilities ### SERVER-SIDE: - [x] Fully Functional Online Server Emulator -- [ ] Implement Basic Matchmaking with QOS Logics +- [ ] Implement Basic Matchmaking with QOS Logic - [ ] Try to Create Dedicated Server off Public Ship Builds diff --git a/source/proxy-dll/component/console.cpp b/source/proxy-dll/component/console.cpp index be0b587..f0e2a64 100644 --- a/source/proxy-dll/component/console.cpp +++ b/source/proxy-dll/component/console.cpp @@ -1,5 +1,3 @@ -//TODO: Fix console branding - #include #include "loader/component_loader.hpp" #include @@ -14,9 +12,8 @@ namespace console { namespace { - const char* branding_str = "Project-Bo4 >"; - - size_t branding_lenght = std::strlen(branding_str); + const char* branding_str = "T8-Mod >"; + size_t branding_length = std::strlen(branding_str); utilities::hook::detour printf_hook; std::recursive_mutex print_mutex; @@ -64,7 +61,7 @@ namespace console return {}; } - return {buffer, static_cast(count)}; + return { buffer, static_cast(count) }; } void update() @@ -73,11 +70,8 @@ namespace console show_cursor(false); set_cursor_pos(0); - invoke_printf("%s", con.buffer); - //invoke_printf("%s %s", branding_str, con.buffer); - - set_cursor_pos(con.cursor); - //set_cursor_pos(branding_lenght + con.cursor); + invoke_printf("%s%s", branding_str, con.buffer); + set_cursor_pos(branding_length + con.cursor); show_cursor(true); } @@ -88,18 +82,17 @@ namespace console show_cursor(false); set_cursor_pos(0); - for (auto i = 0; i < std::strlen(con.buffer); i++) + for (auto i = 0; i < branding_length + std::strlen(con.buffer); i++) { invoke_printf(" "); } - set_cursor_pos(con.cursor); + set_cursor_pos(0); show_cursor(true); } int dispatch_message(const int type, const std::string& message) { - std::lock_guard _0(print_mutex); clear_output(); @@ -132,7 +125,7 @@ namespace console CONSOLE_SCREEN_BUFFER_INFO info{}; GetConsoleScreenBufferInfo(OUTPUT_HANDLE, &info); const auto columns = static_cast(info.srWindow.Right - info.srWindow.Left - 1); - return std::max(size_t(0), std::min(columns, sizeof(con.buffer))); + return std::max(size_t(0), std::min(columns, sizeof(con.buffer) - branding_length)); } void handle_resize() @@ -159,143 +152,135 @@ namespace console const auto key = record.Event.KeyEvent.wVirtualKeyCode; switch (key) { - case VK_UP: + case VK_UP: + { + if (++con.history_index >= con.history.size()) { - if (++con.history_index >= con.history.size()) - { - con.history_index = static_cast(con.history.size()) - 1; - } - - clear(); - - if (con.history_index != -1) - { - strncpy_s(con.buffer, con.history.at(con.history_index).data(), sizeof(con.buffer)); - con.cursor = static_cast(strlen(con.buffer)); - } - - update(); - break; + con.history_index = static_cast(con.history.size()) - 1; } - case VK_DOWN: + + clear(); + + if (con.history_index != -1) { - if (--con.history_index < -1) - { - con.history_index = -1; - } - - clear(); - - if (con.history_index != -1) - { - strncpy_s(con.buffer, con.history.at(con.history_index).data(), sizeof(con.buffer)); - con.cursor = static_cast(strlen(con.buffer)); - } - - update(); - break; + strncpy_s(con.buffer, con.history.at(con.history_index).data(), sizeof(con.buffer)); + con.cursor = static_cast(strlen(con.buffer)); } - case VK_LEFT: + + update(); + break; + } + case VK_DOWN: + { + if (--con.history_index < -1) { - if (con.cursor > 0) - { - con.cursor--; - set_cursor_pos(con.cursor); - //set_cursor_pos(branding_lenght + con.cursor); - - } - - break; - } - case VK_RIGHT: - { - if (con.cursor < std::strlen(con.buffer)) - { - con.cursor++; - set_cursor_pos(con.cursor); - //set_cursor_pos(branding_lenght + con.cursor); - } - - break; - } - case VK_RETURN: - { - if (con.history_index != -1) - { - const auto itr = con.history.begin() + con.history_index; - - if (*itr == con.buffer) - { - con.history.erase(con.history.begin() + con.history_index); - } - } - - if (con.buffer[0]) - { - con.history.push_front(con.buffer); - } - - if (con.history.size() > 10) - { - con.history.erase(con.history.begin() + 10); - } - con.history_index = -1; - game::Cbuf_AddText(0, utilities::string::va("%s \n", con.buffer)); - - con.cursor = 0; - - clear_output(); - - invoke_printf("]%s\r\n", con.buffer); - - strncpy_s(con.buffer, "", sizeof(con.buffer)); - break; } - case VK_BACK: + + clear(); + + if (con.history_index != -1) { - if (con.cursor <= 0) - { - break; - } + strncpy_s(con.buffer, con.history.at(con.history_index).data(), sizeof(con.buffer)); + con.cursor = static_cast(strlen(con.buffer)); + } - clear_output(); - - std::memmove(con.buffer + con.cursor - 1, con.buffer + con.cursor, strlen(con.buffer) + 1 - con.cursor); - con.buffer - 1; + update(); + break; + } + case VK_LEFT: + { + if (con.cursor > 0) + { con.cursor--; - - update(); - break; + set_cursor_pos(branding_length + con.cursor); } - case VK_ESCAPE: - { - con.cursor = 0; - clear_output(); - strncpy_s(con.buffer, "", sizeof(con.buffer)); - break; - } - default: - { - const auto c = record.Event.KeyEvent.uChar.AsciiChar; - if (!c) - { - break; - } - if (std::strlen(con.buffer) + 1 >= get_max_input_length()) - { - break; - } - - std::memmove(con.buffer + con.cursor + 1, - con.buffer + con.cursor, std::strlen(con.buffer) + 1 - con.cursor); - con.buffer[con.cursor] = c; + break; + } + case VK_RIGHT: + { + if (con.cursor < std::strlen(con.buffer)) + { con.cursor++; + set_cursor_pos(branding_length + con.cursor); + } - update(); + break; + } + case VK_RETURN: + { + if (con.history_index != -1) + { + const auto itr = con.history.begin() + con.history_index; + + if (*itr == con.buffer) + { + con.history.erase(con.history.begin() + con.history_index); + } + } + + if (con.buffer[0]) + { + con.history.push_front(con.buffer); + } + + if (con.history.size() > 10) + { + con.history.erase(con.history.begin() + 10); + } + + con.history_index = -1; + game::Cbuf_AddText(0, utilities::string::va("%s \n", con.buffer)); + + con.cursor = 0; + + clear_output(); + invoke_printf("%s%s\r\n", branding_str, con.buffer); + strncpy_s(con.buffer, "", sizeof(con.buffer)); + break; + } + case VK_BACK: + { + if (con.cursor <= 0) + { break; } + + clear_output(); + std::memmove(con.buffer + con.cursor - 1, con.buffer + con.cursor, strlen(con.buffer) + 1 - con.cursor); + con.cursor--; + + update(); + break; + } + case VK_ESCAPE: + { + con.cursor = 0; + clear_output(); + strncpy_s(con.buffer, "", sizeof(con.buffer)); + break; + } + default: + { + const auto c = record.Event.KeyEvent.uChar.AsciiChar; + if (!c) + { + break; + } + + if (std::strlen(con.buffer) + 1 >= get_max_input_length()) + { + break; + } + + std::memmove(con.buffer + con.cursor + 1, con.buffer + con.cursor, std::strlen(con.buffer) + 1 - con.cursor); + con.buffer[con.cursor] = c; + con.cursor++; + + update(); + break; + } } } @@ -309,7 +294,7 @@ namespace console return dispatch_message(con_type_info, result); } } - + void print(const int type, const char* fmt, ...) { va_list ap; @@ -336,7 +321,7 @@ namespace console freopen_s(&empty, "CONOUT$", "r", stdin); freopen_s(&empty, "CONOUT$", "w", stdout); freopen_s(&empty, "CONOUT$", "w", stderr); - SetConsoleTitle("Project-Bo4:"); + SetConsoleTitle("T8-Mod:"); printf_hook.create(printf, printf_stub); @@ -345,48 +330,47 @@ namespace console con.kill_event = CreateEvent(NULL, TRUE, FALSE, NULL); con.thread = utilities::thread::create_named_thread("Console", []() - { - const auto handle = GetStdHandle(STD_INPUT_HANDLE); - HANDLE handles[2] = {handle, con.kill_event}; - MSG msg{}; - - INPUT_RECORD record{}; - DWORD num_events{}; - - while (!con.kill) { - const auto result = MsgWaitForMultipleObjects(2, handles, FALSE, INFINITE, QS_ALLINPUT); - if (con.kill) - { - return; - } + const auto handle = GetStdHandle(STD_INPUT_HANDLE); + HANDLE handles[2] = { handle, con.kill_event }; + MSG msg{}; - switch (result) + INPUT_RECORD record{}; + DWORD num_events{}; + + while (!con.kill) { - case WAIT_OBJECT_0: - { - if (!ReadConsoleInput(handle, &record, 1, &num_events) || num_events == 0) + const auto result = MsgWaitForMultipleObjects(2, handles, FALSE, INFINITE, QS_ALLINPUT); + if (con.kill) { - break; + return; } - handle_input(record); - break; - } - case WAIT_OBJECT_0 + 1: - { - if (!PeekMessageA(&msg, GetConsoleWindow(), NULL, NULL, PM_REMOVE)) + switch (result) { + case WAIT_OBJECT_0: + { + if (!ReadConsoleInput(handle, &record, 1, &num_events) || num_events == 0) + { + break; + } + + handle_input(record); break; } + case WAIT_OBJECT_0 + 1: + { + if (!PeekMessageA(&msg, GetConsoleWindow(), NULL, NULL, PM_REMOVE)) + { + break; + } - TranslateMessage(&msg); - DispatchMessage(&msg); - break; - } - } - } - }); + TranslateMessage(&msg); + DispatchMessage(&msg); + break; + } + } + } }); } void pre_destroy() override @@ -402,4 +386,4 @@ namespace console }; } -REGISTER_COMPONENT(console::component) +REGISTER_COMPONENT(console::component) \ No newline at end of file