From 324fcc242546ca6e627c5fee0c2caa9012c86848 Mon Sep 17 00:00:00 2001 From: bodnjenie14 <126781031+bodnjenie14@users.noreply.github.com> Date: Mon, 27 May 2024 17:04:52 +0100 Subject: [PATCH] Updated Console Added command line tag for external console --- source/proxy-dll/component/console.cpp | 322 ++++++++++++------------- 1 file changed, 153 insertions(+), 169 deletions(-) diff --git a/source/proxy-dll/component/console.cpp b/source/proxy-dll/component/console.cpp index be0b587..0bcc814 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 = "shield> "; + 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; @@ -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