feat(console): add meme console and cbuf addtext recreation

This commit is contained in:
Skull 2025-03-22 02:11:20 +03:00
parent e1449183fb
commit 4a1556a04f
5 changed files with 128 additions and 4 deletions

View File

@ -0,0 +1,66 @@
#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include <utils/string.hpp>
#include <utils/thread.hpp>
#include "game/game.hpp"
#include "console.hpp"
#include "version.hpp"
namespace console
{
static std::atomic_bool ingame = false;
static std::atomic_bool exit = false;
DWORD WINAPI console_thread(LPVOID)
{
ShowWindow(GetConsoleWindow(), SW_SHOW);
SetConsoleTitleA("S2-Mod: " VERSION);
std::string cmd;
exit = false;
while (!exit)
{
std::getline(std::cin, cmd);
if (ingame)
{
game::Cbuf_AddText(0, utils::string::va("%s \n", cmd.data()));
}
}
return 0;
}
class component final : public component_interface
{
public:
component()
{
ShowWindow(GetConsoleWindow(), SW_SHOW);
}
void post_start() override
{
const auto handle = CreateThread(0, 0, console::console_thread, 0, 0, 0);
utils::thread::set_name(handle, "Console");
}
void post_unpack() override
{
console::ingame = true;
}
void pre_destroy() override
{
console::ingame = false;
console::exit = true;
}
};
}
REGISTER_COMPONENT(console::component)

View File

@ -0,0 +1,6 @@
#pragma once
namespace console
{
}

View File

@ -10,6 +10,45 @@ namespace game
{
uint64_t base_address;
cmd_text* cmd_textArray = (cmd_text*)0x14BD83728;
void Cbuf_AddText(int localClientNum, const char* text)
{
Sys_EnterCriticalSection(193);
cmd_text* cmd_text_array = &cmd_textArray[localClientNum];
int v4 = strlen(text);
int v5 = cmd_text_array->cmdsize;
if ((int)v5 + v4 < cmd_text_array->maxsize)
{
memcpy(&cmd_text_array->data[v5], text, v4 + 1);
cmd_text_array->cmdsize += v4;
}
Sys_LeaveCriticalSection(193);
}
int Cmd_Argc()
{
return cmd_args->argc[cmd_args->nesting];
}
const char* Cmd_Argv(const int index)
{
return cmd_args->argv[cmd_args->nesting][index];
}
int SV_Cmd_Argc()
{
return sv_cmd_args->argc[sv_cmd_args->nesting];
}
const char* SV_Cmd_Argv(const int index)
{
return sv_cmd_args->argv[sv_cmd_args->nesting][index];
}
namespace environment
{
launcher::mode mode = launcher::mode::none;
@ -72,6 +111,9 @@ namespace game
case launcher::mode::multiplayer:
return "Multiplayer";
case launcher::mode::zombies:
return "Zombies";
case launcher::mode::singleplayer:
return "Singleplayer";

View File

@ -9,6 +9,8 @@ namespace game
{
extern uint64_t base_address;
void Cbuf_AddText(int localClientNum, const char* text);
namespace environment
{
launcher::mode get_mode();
@ -51,10 +53,11 @@ namespace game
T* address_;
};
namespace environment
{
bool is_dedi();
}
int Cmd_Argc();
const char* Cmd_Argv(int index);
int SV_Cmd_Argc();
const char* SV_Cmd_Argv(int index);
}
size_t reverse_b(const size_t ptr);

View File

@ -31,4 +31,11 @@ namespace game
E_GAMEUSER_MAX_USERS_ADDED = 0x89245100,
E_GAMEUSER_SIGNED_OUT = 0x89245101,
};
struct cmd_text
{
byte* data;
int maxsize;
int cmdsize;
};
}