Merge branch 'main' of https://github.com/skkuull/h1-mod
This commit is contained in:
commit
698ad43d43
@ -20,10 +20,11 @@ namespace branding
|
|||||||
{
|
{
|
||||||
utils::hook::detour ui_get_formatted_build_number_hook;
|
utils::hook::detour ui_get_formatted_build_number_hook;
|
||||||
|
|
||||||
|
float color[4] = {0.666f, 0.666f, 0.666f, 0.666f};
|
||||||
|
|
||||||
const char* ui_get_formatted_build_number_stub()
|
const char* ui_get_formatted_build_number_stub()
|
||||||
{
|
{
|
||||||
const auto* const build_num = ui_get_formatted_build_number_hook.invoke<const char*>();
|
const auto* const build_num = ui_get_formatted_build_number_hook.invoke<const char*>();
|
||||||
|
|
||||||
return utils::string::va("%s (%s)", VERSION, build_num);
|
return utils::string::va("%s (%s)", VERSION, build_num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,8 +42,8 @@ namespace branding
|
|||||||
|
|
||||||
if (game::environment::is_mp())
|
if (game::environment::is_mp())
|
||||||
{
|
{
|
||||||
localized_strings::override("LUA_MENU_MULTIPLAYER_CAPS", "H1-Mod: MULTIPLAYER\n");
|
localized_strings::override("LUA_MENU_MULTIPLAYER_CAPS", "H1-MOD: MULTIPLAYER\n");
|
||||||
localized_strings::override("MENU_MULTIPLAYER_CAPS", "H1-Mod: MULTIPLAYER");
|
localized_strings::override("MENU_MULTIPLAYER_CAPS", "H1-MOD: MULTIPLAYER");
|
||||||
}
|
}
|
||||||
|
|
||||||
dvars::override::Dvar_SetString("version", utils::string::va("H1-Mod %s", VERSION));
|
dvars::override::Dvar_SetString("version", utils::string::va("H1-Mod %s", VERSION));
|
||||||
@ -52,22 +53,10 @@ namespace branding
|
|||||||
|
|
||||||
scheduler::loop([]()
|
scheduler::loop([]()
|
||||||
{
|
{
|
||||||
|
const auto font = game::R_RegisterFont("fonts/fira_mono_bold.ttf", 20);
|
||||||
|
|
||||||
const auto x = 4;
|
game::R_AddCmdDrawText("H1-Mod: " VERSION, 0x7FFFFFFF, font, 10.f,
|
||||||
const auto y = 4;
|
5.f + static_cast<float>(font->pixelHeight), 1.f, 1.f, 0.0f, color, 0);
|
||||||
const auto scale = 1.0f;
|
|
||||||
float color[4] = {0.666f, 0.666f, 0.666f, 0.666f};
|
|
||||||
|
|
||||||
const auto* text = "H1-Mod: " VERSION;
|
|
||||||
|
|
||||||
auto* font = game::R_RegisterFont("fonts/fira_mono_bold.ttf", 20);
|
|
||||||
|
|
||||||
if (!font) return;
|
|
||||||
|
|
||||||
game::R_AddCmdDrawText(text, 0x7FFFFFFF, font, static_cast<float>(x),
|
|
||||||
y + static_cast<float>(font->pixelHeight) * scale,
|
|
||||||
scale, scale, 0.0f, color, 0);
|
|
||||||
|
|
||||||
}, scheduler::pipeline::renderer);
|
}, scheduler::pipeline::renderer);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -93,6 +93,42 @@ namespace command
|
|||||||
parse_command_line();
|
parse_command_line();
|
||||||
reinterpret_cast<void(*)()>(0x1400D8210)(); // mwr: test
|
reinterpret_cast<void(*)()>(0x1400D8210)(); // mwr: test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
game::dvar_t* dvar_command_stub()
|
||||||
|
{
|
||||||
|
const params args;
|
||||||
|
|
||||||
|
if (args.size() <= 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto dvar = game::Dvar_FindVar(args[0]);
|
||||||
|
|
||||||
|
if (dvar)
|
||||||
|
{
|
||||||
|
if (args.size() == 1)
|
||||||
|
{
|
||||||
|
const auto current = game::Dvar_ValueToString(dvar, dvar->current);
|
||||||
|
const auto reset = game::Dvar_ValueToString(dvar, dvar->reset);
|
||||||
|
|
||||||
|
console::info("\"%s\" is: \"%s\" default: \"%s\" hash: 0x%08lX",
|
||||||
|
args[0], current, reset, dvar->hash);
|
||||||
|
|
||||||
|
console::info(" %s\n", dvars::dvar_get_domain(dvar->type, dvar->domain).data());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char command[0x1000] = { 0 };
|
||||||
|
game::Dvar_GetCombinedString(command, 1);
|
||||||
|
game::Dvar_SetCommand(dvar->hash, "", command);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dvar;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_startup_variable(const std::string& dvar)
|
void read_startup_variable(const std::string& dvar)
|
||||||
@ -110,7 +146,7 @@ namespace command
|
|||||||
// only +set dvar value
|
// only +set dvar value
|
||||||
if (game::Cmd_Argc() >= 3 && game::Cmd_Argv(0) == "set"s && game::Cmd_Argv(1) == dvar)
|
if (game::Cmd_Argc() >= 3 && game::Cmd_Argv(0) == "set"s && game::Cmd_Argv(1) == dvar)
|
||||||
{
|
{
|
||||||
game::Dvar_SetCommand(game::Cmd_Argv(1), game::Cmd_Argv(2));
|
game::Dvar_SetCommand(game::generateHashValue(game::Cmd_Argv(1)), "", game::Cmd_Argv(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
game::Cmd_EndTokenizeString();
|
game::Cmd_EndTokenizeString();
|
||||||
@ -258,6 +294,7 @@ namespace command
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
utils::hook::call(0x1400D728F, &parse_commandline_stub); // MWR TEST
|
utils::hook::call(0x1400D728F, &parse_commandline_stub); // MWR TEST
|
||||||
|
utils::hook::jump(0x14041D750, dvar_command_stub);
|
||||||
|
|
||||||
add_commands_mp();
|
add_commands_mp();
|
||||||
}
|
}
|
||||||
@ -268,7 +305,7 @@ namespace command
|
|||||||
private:
|
private:
|
||||||
static void add_commands_generic()
|
static void add_commands_generic()
|
||||||
{
|
{
|
||||||
add("quit", game::Com_Quit_f);
|
add("quit", game::Quit);
|
||||||
//add("quit_hard", utils::nt::raise_hard_exception); /* this command delivers you to a windows blue screen, its quit hard from windows xD */
|
//add("quit_hard", utils::nt::raise_hard_exception); /* this command delivers you to a windows blue screen, its quit hard from windows xD */
|
||||||
add("crash", []()
|
add("crash", []()
|
||||||
{
|
{
|
||||||
|
@ -30,7 +30,9 @@ namespace console
|
|||||||
|
|
||||||
if (process == GetCurrentProcessId() || IsDebuggerPresent())
|
if (process == GetCurrentProcessId() || IsDebuggerPresent())
|
||||||
{
|
{
|
||||||
|
#ifndef NATIVE_CONSOLE
|
||||||
ShowWindow(con_window, SW_HIDE);
|
ShowWindow(con_window, SW_HIDE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,12 +68,14 @@ namespace console
|
|||||||
{
|
{
|
||||||
hide_console();
|
hide_console();
|
||||||
|
|
||||||
|
#ifdef NATIVE_CONSOLE
|
||||||
|
setvbuf(stdout, nullptr, _IONBF, 0);
|
||||||
|
setvbuf(stderr, nullptr, _IONBF, 0);
|
||||||
|
#else
|
||||||
(void)_pipe(this->handles_, 1024, _O_TEXT);
|
(void)_pipe(this->handles_, 1024, _O_TEXT);
|
||||||
(void)_dup2(this->handles_[1], 1);
|
(void)_dup2(this->handles_[1], 1);
|
||||||
(void)_dup2(this->handles_[1], 2);
|
(void)_dup2(this->handles_[1], 2);
|
||||||
|
#endif
|
||||||
//setvbuf(stdout, nullptr, _IONBF, 0);
|
|
||||||
//setvbuf(stderr, nullptr, _IONBF, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void post_start() override
|
void post_start() override
|
||||||
@ -79,9 +83,9 @@ namespace console
|
|||||||
this->terminate_runner_ = false;
|
this->terminate_runner_ = false;
|
||||||
|
|
||||||
this->console_runner_ = utils::thread::create_named_thread("Console IO", [this]
|
this->console_runner_ = utils::thread::create_named_thread("Console IO", [this]
|
||||||
{
|
{
|
||||||
this->runner();
|
this->runner();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void pre_destroy() override
|
void pre_destroy() override
|
||||||
@ -105,9 +109,9 @@ namespace console
|
|||||||
_close(this->handles_[1]);
|
_close(this->handles_[1]);
|
||||||
|
|
||||||
messages.access([&](message_queue& msgs)
|
messages.access([&](message_queue& msgs)
|
||||||
{
|
{
|
||||||
msgs = {};
|
msgs = {};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void post_unpack() override
|
void post_unpack() override
|
||||||
@ -133,7 +137,9 @@ namespace console
|
|||||||
{
|
{
|
||||||
if (game::environment::is_dedi() || !utils::flags::has_flag("noconsole"))
|
if (game::environment::is_dedi() || !utils::flags::has_flag("noconsole"))
|
||||||
{
|
{
|
||||||
|
#ifndef NATIVE_CONSOLE
|
||||||
game::Sys_ShowConsole();
|
game::Sys_ShowConsole();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!game::environment::is_dedi())
|
if (!game::environment::is_dedi())
|
||||||
@ -181,10 +187,10 @@ namespace console
|
|||||||
|
|
||||||
{
|
{
|
||||||
messages.access([&](message_queue& msgs)
|
messages.access([&](message_queue& msgs)
|
||||||
{
|
{
|
||||||
message_queue_copy = std::move(msgs);
|
message_queue_copy = std::move(msgs);
|
||||||
msgs = {};
|
msgs = {};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!message_queue_copy.empty())
|
while (!message_queue_copy.empty())
|
||||||
|
@ -12,11 +12,12 @@ namespace fps
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
game::dvar_t* cg_drawfps;
|
||||||
|
game::dvar_t* cg_drawping;
|
||||||
|
|
||||||
float fps_color_good[4] = {0.6f, 1.0f, 0.0f, 1.0f};
|
float fps_color_good[4] = {0.6f, 1.0f, 0.0f, 1.0f};
|
||||||
float fps_color_ok[4] = {1.0f, 0.7f, 0.3f, 1.0f};
|
float fps_color_ok[4] = {1.0f, 0.7f, 0.3f, 1.0f};
|
||||||
float fps_color_bad[4] = {1.0f, 0.3f, 0.3f, 1.0f};
|
float fps_color_bad[4] = {1.0f, 0.3f, 0.3f, 1.0f};
|
||||||
|
|
||||||
//float origin_color[4] = {1.0f, 0.67f, 0.13f, 1.0f};
|
|
||||||
float ping_color[4] = {1.0f, 1.0f, 1.0f, 0.65f};
|
float ping_color[4] = {1.0f, 1.0f, 1.0f, 0.65f};
|
||||||
|
|
||||||
struct cg_perf_data
|
struct cg_perf_data
|
||||||
@ -90,57 +91,46 @@ namespace fps
|
|||||||
|
|
||||||
void cg_draw_fps()
|
void cg_draw_fps()
|
||||||
{
|
{
|
||||||
const auto* draw_fps = game::Dvar_FindVar("cg_drawFPS");
|
if (cg_drawfps->current.integer > 0)
|
||||||
if (draw_fps && draw_fps->current.integer > 0 /*&& game::CL_IsCgameInitialized()*/)
|
|
||||||
{
|
{
|
||||||
const auto fps = static_cast<std::int32_t>(static_cast<float>(1000.0f / static_cast<float>(cg_perf.
|
const auto fps = static_cast<std::int32_t>(static_cast<float>(1000.0f / static_cast<float>(cg_perf.
|
||||||
average))
|
average))
|
||||||
+ 9.313225746154785e-10);
|
+ 9.313225746154785e-10);
|
||||||
|
|
||||||
auto* font = game::R_RegisterFont("fonts/fira_mono_regular.ttf", 19);
|
const auto font = game::R_RegisterFont("fonts/fira_mono_regular.ttf", 25);
|
||||||
if (!font) return;
|
const auto fps_string = utils::string::va("%i", fps);
|
||||||
|
|
||||||
const auto* const fps_string = utils::string::va("%i", fps);
|
const auto x = (game::ScrPlace_GetViewPlacement()->realViewportSize[0] - 15.0f) - game::R_TextWidth(
|
||||||
|
fps_string, 0x7FFFFFFF, font);
|
||||||
const auto scale = 1.0f;
|
const auto y = font->pixelHeight + 10.f;
|
||||||
|
|
||||||
const auto x = (game::ScrPlace_GetViewPlacement()->realViewportSize[0] - 10.0f) - game::R_TextWidth(
|
|
||||||
fps_string, 0x7FFFFFFF, font) * scale;
|
|
||||||
|
|
||||||
const auto y = font->pixelHeight * 1.2f;
|
|
||||||
|
|
||||||
const auto fps_color = fps >= 60 ? fps_color_good : (fps >= 30 ? fps_color_ok : fps_color_bad);
|
const auto fps_color = fps >= 60 ? fps_color_good : (fps >= 30 ? fps_color_ok : fps_color_bad);
|
||||||
game::R_AddCmdDrawText(fps_string, 0x7FFFFFFF, font, x, y, scale, scale, 0.0f, fps_color, 6);
|
game::R_AddCmdDrawText(fps_string, 0x7FFFFFFF, font, x, y, 1.f, 1.f, 0.0f, fps_color, 6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cg_draw_ping()
|
void cg_draw_ping()
|
||||||
{
|
{
|
||||||
const auto* draw_ping = game::Dvar_FindVar("cg_drawPing");
|
if (cg_drawping->current.integer > 0 && game::CL_IsCgameInitialized())
|
||||||
if (draw_ping && draw_ping->current.integer > 0 && game::CL_IsCgameInitialized())
|
|
||||||
{
|
{
|
||||||
const auto ping = *reinterpret_cast<int*>(0x142D106F0); // H1MP(1.4)
|
const auto ping = *reinterpret_cast<int*>(0x142D106F0);
|
||||||
|
|
||||||
auto* font = game::R_RegisterFont("fonts/consolefont", 20);
|
const auto font = game::R_RegisterFont("fonts/consolefont", 20);
|
||||||
if (!font) return;
|
const auto ping_string = utils::string::va("Ping: %i", ping);
|
||||||
|
|
||||||
auto* const ping_string = utils::string::va("Ping: %i", ping);
|
|
||||||
|
|
||||||
const auto scale = 1.0f;
|
|
||||||
|
|
||||||
const auto x = (game::ScrPlace_GetViewPlacement()->realViewportSize[0] - 375.0f) - game::R_TextWidth(
|
const auto x = (game::ScrPlace_GetViewPlacement()->realViewportSize[0] - 375.0f) - game::R_TextWidth(
|
||||||
ping_string, 0x7FFFFFFF, font) * scale;
|
ping_string, 0x7FFFFFFF, font);
|
||||||
|
|
||||||
const auto y = font->pixelHeight * 1.2f;
|
const auto y = font->pixelHeight + 15.f;
|
||||||
|
game::R_AddCmdDrawText(ping_string, 0x7FFFFFFF, font, x, y, 1.f, 1.f, 0.0f, ping_color, 6);
|
||||||
game::R_AddCmdDrawText(ping_string, 0x7FFFFFFF, font, x, y, scale, scale, 0.0f, ping_color, 6);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cg_draw_fps_register_stub(const char* name, const char** _enum, const int value, unsigned int /*flags*/,
|
game::dvar_t* cg_draw_fps_register_stub(const char* name, const char** _enum, const int value, unsigned int /*flags*/,
|
||||||
const char* desc)
|
const char* desc)
|
||||||
{
|
{
|
||||||
game::Dvar_RegisterEnum(name, _enum, value, game::DVAR_FLAG_SAVED);
|
cg_drawfps = dvars::register_int("cg_drawFps", 0, 0, 2, game::DVAR_FLAG_SAVED, false);
|
||||||
|
return cg_drawfps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,18 +146,24 @@ namespace fps
|
|||||||
|
|
||||||
// fps setup
|
// fps setup
|
||||||
cg_perf.perf_start = std::chrono::high_resolution_clock::now();
|
cg_perf.perf_start = std::chrono::high_resolution_clock::now();
|
||||||
utils::hook::call(SELECT_VALUE(0x14018D261, 0x14025B747), &perf_update); // H1(1.4)
|
utils::hook::call(SELECT_VALUE(0x14018D261, 0x14025B747), &perf_update);
|
||||||
|
|
||||||
// change cg_drawfps flags to saved
|
// change cg_drawfps flags to saved
|
||||||
utils::hook::call(SELECT_VALUE(0x140139F48, 0x1401A4B8E), &cg_draw_fps_register_stub); //h1sp
|
utils::hook::call(SELECT_VALUE(0x140139F48, 0x140222A46), &cg_draw_fps_register_stub);
|
||||||
|
|
||||||
scheduler::loop(cg_draw_fps, scheduler::pipeline::renderer);
|
scheduler::loop(cg_draw_fps, scheduler::pipeline::renderer);
|
||||||
|
|
||||||
|
if (game::environment::is_sp())
|
||||||
|
{
|
||||||
|
cg_drawfps = dvars::register_int("cg_drawFps", 0, 0, 2, game::DVAR_FLAG_SAVED, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (game::environment::is_mp())
|
if (game::environment::is_mp())
|
||||||
{
|
{
|
||||||
// fix ping value
|
// fix ping value
|
||||||
utils::hook::nop(0x14025AC41, 2); // H1MP(1.4)
|
utils::hook::nop(0x14025AC41, 2);
|
||||||
|
|
||||||
dvars::register_int("cg_drawPing", 0, 0, 1, game::DVAR_FLAG_SAVED, true);
|
cg_drawping = dvars::register_int("cg_drawPing", 0, 0, 1, game::DVAR_FLAG_SAVED, true);
|
||||||
|
|
||||||
scheduler::loop(cg_draw_ping, scheduler::pipeline::renderer);
|
scheduler::loop(cg_draw_ping, scheduler::pipeline::renderer);
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,4 @@ namespace game_console
|
|||||||
{
|
{
|
||||||
bool console_char_event(int local_client_num, int key);
|
bool console_char_event(int local_client_num, int key);
|
||||||
bool console_key_event(int local_client_num, int key, int down);
|
bool console_key_event(int local_client_num, int key, int down);
|
||||||
|
|
||||||
bool match_compare(const std::string& input, const std::string& text, const bool exact);
|
|
||||||
void find_matches(std::string input, std::vector<std::string>& suggestions, const bool exact);
|
|
||||||
}
|
}
|
@ -94,6 +94,8 @@ namespace patches
|
|||||||
|
|
||||||
// Disable data validation error popup
|
// Disable data validation error popup
|
||||||
dvars::register_int("data_validation_allow_drop", 0, 0, 0, game::DVAR_FLAG_NONE, true);
|
dvars::register_int("data_validation_allow_drop", 0, 0, 0, game::DVAR_FLAG_NONE, true);
|
||||||
|
|
||||||
|
dvars::register_int("com_maxfps", 0, 10, 1000, game::DVAR_FLAG_SAVED, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return com_register_dvars_hook.invoke<void>();
|
return com_register_dvars_hook.invoke<void>();
|
||||||
@ -157,7 +159,6 @@ namespace patches
|
|||||||
|
|
||||||
reinterpret_cast<void(*)(game::mp::client_t*, game::msg_t*)>(0x14043AA90)(client, msg);
|
reinterpret_cast<void(*)(game::mp::client_t*, game::msg_t*)>(0x14043AA90)(client, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class component final : public component_interface
|
class component final : public component_interface
|
||||||
|
75
src/client/component/renderer.cpp
Normal file
75
src/client/component/renderer.cpp
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
#include "game/game.hpp"
|
||||||
|
#include "game/dvars.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
|
||||||
|
namespace renderer
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
utils::hook::detour r_init_draw_method_hook;
|
||||||
|
utils::hook::detour r_update_front_end_dvar_options_hook;
|
||||||
|
|
||||||
|
int get_fullbright_technique()
|
||||||
|
{
|
||||||
|
return game::TECHNIQUE_UNLIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfxdrawmethod()
|
||||||
|
{
|
||||||
|
game::gfxDrawMethod->drawScene = game::GFX_DRAW_SCENE_STANDARD;
|
||||||
|
|
||||||
|
game::gfxDrawMethod->baseTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : game::TECHNIQUE_LIT;
|
||||||
|
game::gfxDrawMethod->emissiveTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : game::TECHNIQUE_EMISSIVE;
|
||||||
|
game::gfxDrawMethod->forceTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : 242;
|
||||||
|
}
|
||||||
|
|
||||||
|
void r_init_draw_method_stub()
|
||||||
|
{
|
||||||
|
gfxdrawmethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool r_update_front_end_dvar_options_stub()
|
||||||
|
{
|
||||||
|
if (dvars::r_fullbright->modified)
|
||||||
|
{
|
||||||
|
game::Dvar_ClearModified(dvars::r_fullbright);
|
||||||
|
game::R_SyncRenderThread();
|
||||||
|
|
||||||
|
gfxdrawmethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
return r_update_front_end_dvar_options_hook.invoke<bool>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
if (game::environment::is_dedi())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dvars::r_fullbright = dvars::register_int("r_fullbright", 0, 0, 3, game::DVAR_FLAG_SAVED);
|
||||||
|
|
||||||
|
r_init_draw_method_hook.create(SELECT_VALUE(0x1404BD140, 0x1405C46E0), &r_init_draw_method_stub);
|
||||||
|
r_update_front_end_dvar_options_hook.create(SELECT_VALUE(0x1404F8870, 0x1405FF9E0), &r_update_front_end_dvar_options_stub);
|
||||||
|
|
||||||
|
// use "saved" flags for "r_normalMap"
|
||||||
|
utils::hook::set<uint8_t>(SELECT_VALUE(0x0, 0x1405D460E), game::DVAR_FLAG_SAVED);
|
||||||
|
|
||||||
|
// use "saved" flags for "r_specularMap"
|
||||||
|
utils::hook::set<uint8_t>(SELECT_VALUE(0x0, 0x1405D4639), game::DVAR_FLAG_SAVED);
|
||||||
|
|
||||||
|
// use "saved" flags for "r_specOccMap"
|
||||||
|
utils::hook::set<uint8_t>(SELECT_VALUE(0x0, 0x1405D4664), game::DVAR_FLAG_SAVED);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_COMPONENT(renderer::component)
|
63
src/client/component/virtuallobby.cpp
Normal file
63
src/client/component/virtuallobby.cpp
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include "game/game.hpp"
|
||||||
|
#include "game/dvars.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
|
||||||
|
namespace virtuallobby
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
game::dvar_t* virtualLobby_fovscale;
|
||||||
|
|
||||||
|
const auto get_fovscale_stub = utils::hook::assemble([](utils::hook::assembler& a)
|
||||||
|
{
|
||||||
|
const auto ret = a.newLabel();
|
||||||
|
const auto original = a.newLabel();
|
||||||
|
|
||||||
|
a.pushad64();
|
||||||
|
a.mov(rax, qword_ptr(0x1425F7210)); // virtualLobbyInFiringRange
|
||||||
|
a.cmp(byte_ptr(rax, 0x10), 1);
|
||||||
|
a.je(original);
|
||||||
|
a.call_aligned(game::VirtualLobby_Loaded);
|
||||||
|
a.cmp(al, 0);
|
||||||
|
a.je(original);
|
||||||
|
|
||||||
|
// virtuallobby
|
||||||
|
a.popad64();
|
||||||
|
a.mov(rax, ptr(reinterpret_cast<int64_t>(&virtualLobby_fovscale)));
|
||||||
|
a.jmp(ret);
|
||||||
|
|
||||||
|
// original
|
||||||
|
a.bind(original);
|
||||||
|
a.popad64();
|
||||||
|
a.mov(rax, qword_ptr(0x1413A8580));
|
||||||
|
a.jmp(ret);
|
||||||
|
|
||||||
|
a.bind(ret);
|
||||||
|
a.mov(rcx, 0x142935000);
|
||||||
|
a.jmp(0x1400B556A);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
if (!game::environment::is_mp())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtualLobby_fovscale = dvars::register_float("virtualLobby_fovScale", 0.7f, 0.0f, 2.0f, game::DVAR_FLAG_SAVED);
|
||||||
|
|
||||||
|
utils::hook::nop(0x1400B555C, 14);
|
||||||
|
utils::hook::jump(0x1400B555C, get_fovscale_stub, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_COMPONENT(virtuallobby::component)
|
@ -562,7 +562,6 @@ namespace dvars
|
|||||||
return game::Dvar_RegisterString(hash, "", value, flags);
|
return game::Dvar_RegisterString(hash, "", value, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
game::dvar_t* register_float(const std::string& name, float value, float min,
|
game::dvar_t* register_float(const std::string& name, float value, float min,
|
||||||
float max, game::DvarFlags flags, bool add_to_list)
|
float max, game::DvarFlags flags, bool add_to_list)
|
||||||
{
|
{
|
||||||
|
@ -23,6 +23,11 @@ namespace game
|
|||||||
return sv_cmd_args->argv[sv_cmd_args->nesting][index];
|
return sv_cmd_args->argv[sv_cmd_args->nesting][index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VirtualLobby_Loaded()
|
||||||
|
{
|
||||||
|
return !game::environment::is_sp() && *mp::virtualLobby_loaded == 1;
|
||||||
|
}
|
||||||
|
|
||||||
namespace environment
|
namespace environment
|
||||||
{
|
{
|
||||||
launcher::mode mode = launcher::mode::none;
|
launcher::mode mode = launcher::mode::none;
|
||||||
|
@ -8,215 +8,181 @@ namespace game
|
|||||||
* Functions
|
* Functions
|
||||||
**************************************************************/
|
**************************************************************/
|
||||||
|
|
||||||
|
WEAK symbol<void(int type, VariableUnion u)> AddRefToValue{0, 0x1405C0EB0};
|
||||||
|
WEAK symbol<void(unsigned int id)> AddRefToObject{0, 0x1405C0EA0};
|
||||||
|
WEAK symbol<unsigned int(unsigned int id)> AllocThread{0, 0x1405C1200};
|
||||||
|
WEAK symbol<void(int type, VariableUnion u)> RemoveRefToValue{0, 0x1405C29B0};
|
||||||
|
WEAK symbol<void(unsigned int id)> RemoveRefToObject{0, 0x1405C28A0};
|
||||||
|
|
||||||
WEAK symbol<void(unsigned int weapon, bool isAlternate,
|
WEAK symbol<void(unsigned int weapon, bool isAlternate,
|
||||||
char* output, unsigned int maxStringLen)> BG_GetWeaponNameComplete{0, 0x140165580};
|
char* output, unsigned int maxStringLen)> BG_GetWeaponNameComplete{0, 0x140165580};
|
||||||
|
|
||||||
WEAK symbol<void(int localClientNum, const char* text)> Cbuf_AddText{0x140342EB0, 0x1404033B0}; // H1(1.4)
|
WEAK symbol<void(int localClientNum, const char* text)> Cbuf_AddText{0x140342EB0, 0x1404033B0};
|
||||||
WEAK symbol<void(const char* message)> Conbuf_AppendText{0x1403E3300, 0x140513FF0}; // H1(1.4)
|
WEAK symbol<void(const char* message)> Conbuf_AppendText{0x1403E3300, 0x140513FF0};
|
||||||
WEAK symbol<void(int localClientNum, int controllerIndex, const char* text)> Cmd_ExecuteSingleCommand{0x140343980, 0x140343980}; // H1SP64[CODEX]
|
WEAK symbol<void(int localClientNum, int controllerIndex, const char* text)> Cmd_ExecuteSingleCommand{0x140343980, 0x140343980};
|
||||||
WEAK symbol<void(const char* cmdName, void(), cmd_function_s* allocedCmd)> Cmd_AddCommandInternal{0x1403433E0, 0x140403950}; // H1(1.4)
|
WEAK symbol<void(const char* cmdName, void(), cmd_function_s* allocedCmd)> Cmd_AddCommandInternal{0x1403433E0, 0x140403950};
|
||||||
WEAK symbol<void(const char* text_in)> Cmd_TokenizeString{0x140344110, 0x1404046F0}; // H1(1.4)
|
WEAK symbol<void(const char* text_in)> Cmd_TokenizeString{0x140344110, 0x1404046F0};
|
||||||
WEAK symbol<void()> Cmd_EndTokenizeString{0x140343630, 0x140403C20}; // H1(1.4)
|
WEAK symbol<void()> Cmd_EndTokenizeString{0x140343630, 0x140403C20};
|
||||||
|
|
||||||
WEAK symbol<void()> Com_Frame_Try_Block_Function{0, 0x1400D8310}; //H1MP MWR TEST
|
WEAK symbol<void()> Com_Frame_Try_Block_Function{0, 0x1400D8310};
|
||||||
WEAK symbol<CodPlayMode()> Com_GetCurrentCoDPlayMode{0, 0x1405039A0}; // H1(1.4)
|
WEAK symbol<CodPlayMode()> Com_GetCurrentCoDPlayMode{0, 0x1405039A0};
|
||||||
WEAK symbol<void(float, float, int)> Com_SetSlowMotion{0, 0x1400DB790}; // H1(1.4)
|
WEAK symbol<void(float, float, int)> Com_SetSlowMotion{0, 0x1400DB790};
|
||||||
WEAK symbol<void(errorParm code, const char* message, ...)> Com_Error{0x1403509C0, 0x1400D78A0}; // H1(1.4)
|
WEAK symbol<void(errorParm code, const char* message, ...)> Com_Error{0x1403509C0, 0x1400D78A0};
|
||||||
WEAK symbol<void()> Com_Quit_f{0x140352BE0, 0x1400DA830}; // H1(1.4)
|
WEAK symbol<void()> Com_Quit_f{0x140352BE0, 0x1400DA830};
|
||||||
|
WEAK symbol<void()> Quit{0x140352D90, 0x1400DA830};
|
||||||
|
|
||||||
WEAK symbol<const char* (int, int, int)> Key_KeynumToString{0x140187CC0, 0x14024FE10}; // H1(1.4)
|
WEAK symbol<void(int localClientNum, const char* message)> CG_GameMessage{0x1401389A0, 0x140220CC0};
|
||||||
|
WEAK symbol<void(int localClientNum, const char* message)> CG_GameMessageBold{0x140138750, 0x140220620};
|
||||||
|
|
||||||
WEAK symbol<void(int localClientNum, const char* message)> CG_GameMessage{0x1401389A0, 0x140220CC0}; // H1(1.4)
|
WEAK symbol<bool()> CL_IsCgameInitialized{0x14017EE30, 0x140245650};
|
||||||
WEAK symbol<void(int localClientNum, const char* message)> CG_GameMessageBold{0x140138750, 0x140220620}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(const char* dvar, const char* buffer)> Dvar_SetCommand{0x1403C72B0, 0x1404FD0A0}; // H1(1.4)
|
WEAK symbol<void(int hash, const char* name, const char* buffer)> Dvar_SetCommand{0x1403C72B0, 0x1404FD0A0};
|
||||||
WEAK symbol<dvar_t* (const char* name)> Dvar_FindVar{0x1403C5D50, 0x1404FBB00}; // H1(1.4)
|
WEAK symbol<dvar_t*(const char* name)> Dvar_FindVar{0x1403C5D50, 0x1404FBB00};
|
||||||
WEAK symbol<void(char* buffer, int index)> Dvar_GetCombinedString{0x140354DF0, 0x14041D830}; // H1(1.4)
|
WEAK symbol<void(const dvar_t* dvar)> Dvar_ClearModified{0x0, 0x1404FB930};
|
||||||
//WEAK symbol<const char* (const dvar_t* dvar, dvar_value value, __int64 a3)> Dvar_ValueToString{0x1403C8560,0x1404FE660}; // H1(1.4); different typedef from previous titles
|
WEAK symbol<void(char* buffer, int index)> Dvar_GetCombinedString{0x140354DF0, 0x14041D830};
|
||||||
WEAK symbol<const char* (dvar_t* dvar, dvar_value value)> Dvar_ValueToString{0x1403C8560, 0x1404FE660}; // H1(1.4)
|
WEAK symbol<const char*(dvar_t* dvar, dvar_value value)> Dvar_ValueToString{0x1403C8560, 0x1404FE660};
|
||||||
//WEAK symbol<void(int hash, const char* name, const char* buffer)> Dvar_SetCommand{0, 0x1404FD0A0}; // H1(1.4)
|
WEAK symbol<dvar_t*(int hash, const char* name, bool value, unsigned int flags)> Dvar_RegisterBool{0x1403C47E0, 0x1404FA540};
|
||||||
|
WEAK symbol<dvar_t*(int hash, const char* name, int value, int min, int max, unsigned int flags)> Dvar_RegisterInt{0x1403C4CC0, 0x1404FAA20};
|
||||||
|
WEAK symbol<dvar_t*(int hash, const char* dvarName, float value, float min, float max, unsigned int flags)> Dvar_RegisterFloat{0x1403C4BB0, 0x1404FA910};
|
||||||
|
WEAK symbol<dvar_t*(int hash, const char* dvarName, const char* value, unsigned int flags)> Dvar_RegisterString{0x1403C4DA0, 0x1404FAB00};
|
||||||
|
WEAK symbol<dvar_t*(int dvarName, const char* a2, float x, float y, float z, float w, float min, float max, unsigned int flags)> Dvar_RegisterVec4{0x1403C5220, 0x1404FAF40};
|
||||||
|
WEAK symbol<dvar_t*(const char* dvarName, const char** valueList, int defaultIndex, unsigned int flags)> Dvar_RegisterEnum{0x1403C4AC0, 0x1404C0EC0};
|
||||||
|
|
||||||
WEAK symbol<dvar_t* (int hash, const char* name, bool value, unsigned int flags)> Dvar_RegisterBool{0x1403C47E0,0x1404FA540}; // H1
|
WEAK symbol<long long(const char* qpath, char** buffer)> FS_ReadFile{0x1403B9020, 0x1404EE720};
|
||||||
WEAK symbol<dvar_t* (int hash, const char* name, int value, int min, int max, unsigned int flags)> Dvar_RegisterInt{0x1403C4CC0, 0x1404FAA20}; // H1
|
WEAK symbol<void(void* buffer)> FS_FreeFile{0x1403B9010, 0x1404EE710};
|
||||||
WEAK symbol<dvar_t* (int hash, const char* dvarName, float value, float min, float max, unsigned int flags)> Dvar_RegisterFloat{0x1403C4BB0,0x1404FA910}; // H1(1.4)
|
WEAK symbol<void(const char* gameName)> FS_Startup{0x1403B85D0, 0x1404EDD30};
|
||||||
WEAK symbol<dvar_t* (int hash, const char* dvarName, const char* value, unsigned int flags)> Dvar_RegisterString{0x1403C4DA0,0x1404FAB00}; // H1(1.4)
|
WEAK symbol<void(const char* path, const char* dir)> FS_AddLocalizedGameDirectory{0x1403B6030, 0x1404EBE20};
|
||||||
WEAK symbol<dvar_t* (int dvarName, const char* a2, float x, float y, float z, float w, float min, float max, unsigned int flags)> Dvar_RegisterVec4{0x1403C5220, 0x1404FAF40}; // H1(1.4)
|
|
||||||
WEAK symbol<dvar_t* (const char* dvarName, const char** valueList, int defaultIndex, unsigned int flags)> Dvar_RegisterEnum{0x1403C4AC0, 0x1404C0EC0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<float(int index)> Scr_GetFloat{0x140374D20, 0x140442D10}; // H1(1.4)
|
WEAK symbol<int(const char* fname)> generateHashValue{0x1400FE8A0, 0x1401B1010};
|
||||||
WEAK symbol<int()> Scr_GetNumParam{0x140374F30, 0x140442E70}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<long long(const char* qpath, char** buffer)> FS_ReadFile{0x1403B9020, 0x1404EE720}; // H1(1.4)
|
|
||||||
WEAK symbol<void(void* buffer)> FS_FreeFile{0x1403B9010, 0x1404EE710}; // H1(1.4)
|
|
||||||
WEAK symbol<void(const char* gameName)> FS_Startup{0x1403B85D0, 0x1404EDD30}; // H1(1.4)
|
|
||||||
WEAK symbol<void(const char* path, const char* dir)> FS_AddLocalizedGameDirectory{0x1403B6030, 0x1404EBE20}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<int(const char* fname)> generateHashValue{0x1400FE8A0, 0x1401B1010}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<bool()> CL_IsCgameInitialized{0x14017EE30, 0x140245650}; // H1(1.4)
|
|
||||||
WEAK symbol<unsigned int(int)> Live_SyncOnlineDataFlags{0, 0x14059A700}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<int()> Sys_Milliseconds{0x1403E2B10, 0x140513710}; // H1(1.4)
|
|
||||||
WEAK symbol<bool()> Sys_IsDatabaseReady2{0x1403580B0, 0x14042B090}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(int localClientNum)> SV_FastRestart{ 0, 0x14047E990 }; // H1(1.4)
|
|
||||||
WEAK symbol<void(int clientNum, svscmd_type type, const char* text)> SV_GameSendServerCommand{
|
|
||||||
0x1403F3A70, 0x140484AD0
|
|
||||||
}; // H1MP(1.4)
|
|
||||||
WEAK symbol<void(netadr_s* from)> SV_DirectConnect{0, 0x140480860}; // H1(1.4)
|
|
||||||
WEAK symbol<void(const char* text_in)> SV_Cmd_TokenizeString{0x1402EF050, 0x140404D20}; // H1(1.4)
|
|
||||||
WEAK symbol<void()> SV_Cmd_EndTokenizedString{0x140344700, 0x140404CE0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<bool(int clientNum)> SV_BotIsBot{ 0, 0x14046E6C0 }; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<bool(int, void const*, const netadr_s*)> Sys_SendPacket{0x1403E2820, 0x1405133B0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(netadr_s*, sockaddr*)> NetadrToSockadr{0x1403C11C0, 0x1404F62F0}; // H1(1.4)
|
|
||||||
WEAK symbol<void(netsrc_t, netadr_s*, const char*)> NET_OutOfBandPrint{0x140357560, 0x1404255D0}; // H1(1.4)
|
|
||||||
WEAK symbol<void(netsrc_t sock, int length, const void* data, const netadr_s* to)> NET_SendLoopPacket{0, 0x140425790}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<bool(const char* s, netadr_s* a)> NET_StringToAdr{ 0, 0x140425870 }; // H1(1.4)
|
|
||||||
|
|
||||||
//WEAK symbol<Font_s* (const char* font)> R_RegisterFont{ 0x140481F90, 0x1405D91E0 }; // H1MP(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<char* (char* string)> I_CleanStr{0x1403CD230, 0}; // H1(1.4)
|
|
||||||
WEAK symbol<ScreenPlacement* ()> ScrPlace_GetViewPlacement{0x1401981F0, 0x140288550}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<Material* (const char* material)> Material_RegisterHandle{0x1404E48B0, 0x1405EAB30}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(float x, float y, float width, float height, float s0, float t0, float s1, float t1,
|
|
||||||
float* color, Material* material)> R_AddCmdDrawStretchPic{0x14017E5C0, 0x1402443A0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<Font_s* (const char* font, int size)> R_RegisterFont{0x1404D4100, 0x1405D91E0}; // H1(1.4)
|
|
||||||
WEAK symbol<int(void* font)> R_GetFontHeight{0x1405EA360, 0x1405D92C0}; // H1(1.4)
|
|
||||||
WEAK symbol<void* (int a1)> JUST_DO_OUR_DIRTY_WORK{0x1404D37B0, 0x1405D8890}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<int(int clientNum)> G_GetClientScore{0, 0x140342F90}; // H1(1.4)
|
|
||||||
WEAK symbol<const char* (int clientNum)> SV_GetGuid{0, 0x140484B90}; // H1(1.4)
|
|
||||||
WEAK symbol<int(int clientNum)> SV_GetClientPing{0, 0x140484B70}; // H1(1.4)
|
|
||||||
WEAK symbol<playerState_s* (int num)> SV_GetPlayerstateForClientNum{0x1404426D0, 0}; // H1SP(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void* (const char* text, int maxChars, void* font, int fontHeight, float x, float y, float xScale, float yScale,
|
|
||||||
float rotation, float* color, int style, int cursor_pos, char cursor_char, void* style_unk)> H1_AddBaseDrawTextCmd{0x1404F3DC0,0x1405FB1F0}; // H1(1.4)
|
|
||||||
|
|
||||||
#define R_AddCmdDrawText(TXT,MC,F,X,Y,XS,YS,R,C,S) H1_AddBaseDrawTextCmd(TXT,MC,F,game::R_GetFontHeight(F),X,Y,XS,YS,R,C,S,-1,0,game::JUST_DO_OUR_DIRTY_WORK(S))
|
|
||||||
|
|
||||||
#define R_AddCmdDrawTextWithCursor(TXT,MC,F,UNK,X,Y,XS,YS,R,C,S,CP,CC) H1_AddBaseDrawTextCmd(TXT,MC,F,game::R_GetFontHeight(F),X,Y,XS,YS,R,C,S,CP,CC,game::JUST_DO_OUR_DIRTY_WORK(S))
|
|
||||||
|
|
||||||
WEAK symbol<int(const char* text, int maxChars, Font_s* font)> R_TextWidth{0x1404D43B0, 0x1405D94A0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<cmd_function_s*> cmd_functions{0x14AD99AB8,0x14946BAC8}; // H1(1.4)
|
|
||||||
WEAK symbol<int> keyCatchers{0x14243DAF0,0x142D0BA9C}; // H1(1.4)
|
|
||||||
WEAK symbol<PlayerKeyState> playerKeys{0x1422A873C,0x142C19AFC}; // H1(1.4)
|
|
||||||
WEAK symbol<CmdArgs> cmd_args{0x14AD99960, 0x14946B970}; // H1(1.4)
|
|
||||||
WEAK symbol<SOCKET> query_socket{0, 0x14DDFBF98}; // H1(1.4)
|
|
||||||
|
|
||||||
//###########################################################################################################################################################################
|
|
||||||
//###########################################################################################################################################################################
|
|
||||||
//###########################################################################################################################################################################
|
|
||||||
|
|
||||||
WEAK symbol<void()> G_Glass_Update{0, 0x14033A640}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(int type, VariableUnion u)> AddRefToValue{0, 0x1405C0EB0};
|
|
||||||
WEAK symbol<void(unsigned int id)> AddRefToObject{0,0x1405C0EA0};
|
|
||||||
WEAK symbol<unsigned int(unsigned int id)> AllocThread{0,0x1405C1200};
|
|
||||||
WEAK symbol<void(int type, VariableUnion u)> RemoveRefToValue{0, 0x1405C29B0};
|
|
||||||
WEAK symbol<void(unsigned int id)> RemoveRefToObject{0,0x1405C28A0};
|
|
||||||
|
|
||||||
WEAK symbol<void(XAssetType type, void(__cdecl* func)(game::XAssetHeader, void*), const void* inData, bool includeOverride)>
|
|
||||||
DB_EnumXAssets_Internal{0, 0x1404129F0};
|
|
||||||
WEAK symbol<const char* (const XAsset* asset)> DB_GetXAssetName{0,0x1403E4090};
|
|
||||||
WEAK symbol<void(XZoneInfo* zoneInfo, unsigned int zoneCount, DBSyncMode syncMode)> DB_LoadXAssets{0,0x140414FF0};
|
|
||||||
WEAK symbol<XAssetHeader(XAssetType type, const char* name, int allowCreateDefault)> DB_FindXAssetHeader{0, 0x140412F60};
|
|
||||||
WEAK symbol<int(const RawFile* rawfile)> DB_GetRawFileLen{0,0x140413D80};
|
|
||||||
WEAK symbol<int(const RawFile* rawfile, char* buf, int size)> DB_GetRawBuffer{0,0x140413C40};
|
|
||||||
WEAK symbol<int(XAssetType type)> DB_GetXAssetTypeSize{0x14019A3B0, 0x14028BE70}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<unsigned int(unsigned int parentId, unsigned int name)> FindVariable{0,0x1405C1D50};
|
|
||||||
WEAK symbol<unsigned int(int entnum, unsigned int classnum)> FindEntityId{0, 0x1405C1C50};
|
|
||||||
WEAK symbol<void(VariableValue* result, unsigned int classnum, int entnum, int offset)> GetEntityFieldValue{0, 0x1405C6100};
|
|
||||||
|
|
||||||
WEAK symbol<unsigned int(const char* name)> G_GetWeaponForName{0x1402C2A90, 0}; // H1SP(1.4)
|
|
||||||
//WEAK symbol<int(void* ps, unsigned int weapon, int a3, int a4, __int64 a5, int a6)>
|
|
||||||
//G_GivePlayerWeapon{0, 0x14051B660};
|
|
||||||
|
|
||||||
WEAK symbol<int(playerState_s* ps, unsigned int weapon, int dualWield, int startInAltMode, int, int, int, char,
|
|
||||||
...)>
|
|
||||||
G_GivePlayerWeapon{0x1402C2DF0, 0x14051B660}; // h1sp
|
|
||||||
|
|
||||||
|
WEAK symbol<void()> G_Glass_Update{0, 0x14033A640};
|
||||||
|
WEAK symbol<int(int clientNum)> G_GetClientScore{0, 0x140342F90};
|
||||||
|
WEAK symbol<unsigned int(const char* name)> G_GetWeaponForName{0x1402C2A90, 0};
|
||||||
|
WEAK symbol<int(playerState_s* ps, unsigned int weapon, int dualWield,
|
||||||
|
int startInAltMode, int, int, int, char, ...)> G_GivePlayerWeapon{0x1402C2DF0, 0x14051B660};
|
||||||
WEAK symbol<void(void* ps, const unsigned int weapon, int hadWeapon)> G_InitializeAmmo{0, 0x1404C4110};
|
WEAK symbol<void(void* ps, const unsigned int weapon, int hadWeapon)> G_InitializeAmmo{0, 0x1404C4110};
|
||||||
WEAK symbol<void(int clientNum, const unsigned int weapon)> G_SelectWeapon{0,0x14051C0D0};
|
WEAK symbol<void(int clientNum, const unsigned int weapon)> G_SelectWeapon{0, 0x14051C0D0};
|
||||||
WEAK symbol<int(playerState_s* ps, unsigned int weapon)> G_TakePlayerWeapon{0x1402C3900, 0}; // H1SP(1.4)
|
WEAK symbol<int(playerState_s* ps, unsigned int weapon)> G_TakePlayerWeapon{0x1402C3900, 0};
|
||||||
|
|
||||||
|
WEAK symbol<char* (char* string)> I_CleanStr{0x1403CD230, 0};
|
||||||
|
|
||||||
WEAK symbol<char* (GfxImage* image, uint32_t width, uint32_t height, uint32_t depth, uint32_t mipCount,
|
WEAK symbol<char* (GfxImage* image, uint32_t width, uint32_t height, uint32_t depth, uint32_t mipCount,
|
||||||
uint32_t imageFlags, DXGI_FORMAT imageFormat, int a8, const char* name, const void* initData)> Image_Setup{0, 0x14074B2A0};
|
uint32_t imageFlags, DXGI_FORMAT imageFormat, int a8, const char* name, const void* initData)> Image_Setup{0, 0x14074B2A0};
|
||||||
|
|
||||||
WEAK symbol<void(int clientNum, const char* menu, int a3, int a4, unsigned int a5)> LUI_OpenMenu{0, 0x1404CD210}; // H1(1.4)
|
WEAK symbol<const char* (int, int, int)> Key_KeynumToString{0x140187CC0, 0x14024FE10};
|
||||||
|
|
||||||
|
WEAK symbol<unsigned int(int)> Live_SyncOnlineDataFlags{0, 0x14059A700};
|
||||||
|
|
||||||
|
WEAK symbol<Material* (const char* material)> Material_RegisterHandle{0x1404E48B0, 0x1405EAB30};
|
||||||
|
|
||||||
|
WEAK symbol<void(netadr_s*, sockaddr*)> NetadrToSockadr{0x1403C11C0, 0x1404F62F0};
|
||||||
|
WEAK symbol<void(netsrc_t, netadr_s*, const char*)> NET_OutOfBandPrint{0x140357560, 0x1404255D0};
|
||||||
|
WEAK symbol<void(netsrc_t sock, int length, const void* data, const netadr_s* to)> NET_SendLoopPacket{0, 0x140425790};
|
||||||
|
WEAK symbol<bool(const char* s, netadr_s* a)> NET_StringToAdr{0, 0x140425870};
|
||||||
|
|
||||||
|
WEAK symbol<void(float x, float y, float width, float height, float s0, float t0, float s1, float t1,
|
||||||
|
float* color, Material* material)> R_AddCmdDrawStretchPic{0x14017E5C0, 0x1402443A0};
|
||||||
|
WEAK symbol<Font_s* (const char* font, int size)> R_RegisterFont{0x1404D4100, 0x1405D91E0};
|
||||||
|
WEAK symbol<int(const char* text, int maxChars, Font_s* font)> R_TextWidth{0x1404D43B0, 0x1405D94A0};
|
||||||
|
WEAK symbol<int(void* font)> R_GetFontHeight{0x1405EA360, 0x1405D92C0};
|
||||||
|
WEAK symbol<void* (int a1)> R_DrawSomething{0x1404D37B0, 0x1405D8890};
|
||||||
|
WEAK symbol<void()> R_SyncRenderThread{0,0x1405FF3A0};
|
||||||
|
WEAK symbol<void(const void* obj, void* pose, unsigned int entnum, unsigned int renderFxFlags, float* lightingOrigin,
|
||||||
|
float materialTime, __int64 a7, __int64 a8)> R_AddDObjToScene{0, 0x140775C40};
|
||||||
|
WEAK symbol<void* (const char* text, int maxChars, void* font, int fontHeight, float x, float y, float xScale, float yScale,
|
||||||
|
float rotation, float* color, int style, int cursor_pos, char cursor_char, void* style_unk)> H1_AddBaseDrawTextCmd{0x1404F3DC0, 0x1405FB1F0};
|
||||||
|
|
||||||
|
#define R_AddCmdDrawText(TXT, MC, F, X, Y, XS, YS, R, C, S) \
|
||||||
|
H1_AddBaseDrawTextCmd(TXT, MC, F, game::R_GetFontHeight(F), X, Y, XS, YS, R, C, S,-1, 0, game::R_DrawSomething(S))
|
||||||
|
#define R_AddCmdDrawTextWithCursor(TXT, MC, F, UNK, X, Y, XS, YS, R, C, S, CP, CC) \
|
||||||
|
H1_AddBaseDrawTextCmd(TXT, MC, F, game::R_GetFontHeight(F), X, Y, XS, YS, R, C, S, CP, CC, game::R_DrawSomething(S))
|
||||||
|
|
||||||
|
WEAK symbol<float(int index)> Scr_GetFloat{0x140374D20, 0x140442D10};
|
||||||
|
WEAK symbol<int()> Scr_GetNumParam{0x140374F30, 0x140442E70};
|
||||||
|
|
||||||
|
WEAK symbol<ScreenPlacement* ()> ScrPlace_GetViewPlacement{0x1401981F0, 0x140288550};
|
||||||
|
|
||||||
|
WEAK symbol<void(XAssetType type, void(__cdecl* func)(game::XAssetHeader, void*), const void* inData, bool includeOverride)>
|
||||||
|
DB_EnumXAssets_Internal{0, 0x1404129F0};
|
||||||
|
WEAK symbol<const char* (const XAsset* asset)> DB_GetXAssetName{0, 0x1403E4090};
|
||||||
|
WEAK symbol<void(XZoneInfo* zoneInfo, unsigned int zoneCount, DBSyncMode syncMode)> DB_LoadXAssets{0, 0x140414FF0};
|
||||||
|
WEAK symbol<XAssetHeader(XAssetType type, const char* name, int allowCreateDefault)> DB_FindXAssetHeader{0, 0x140412F60};
|
||||||
|
WEAK symbol<int(const RawFile* rawfile)> DB_GetRawFileLen{0, 0x140413D80};
|
||||||
|
WEAK symbol<int(const RawFile* rawfile, char* buf, int size)> DB_GetRawBuffer{0, 0x140413C40};
|
||||||
|
WEAK symbol<int(XAssetType type)> DB_GetXAssetTypeSize{0x14019A3B0, 0x14028BE70};
|
||||||
|
|
||||||
|
WEAK symbol<unsigned int(unsigned int parentId, unsigned int name)> FindVariable{0, 0x1405C1D50};
|
||||||
|
WEAK symbol<unsigned int(int entnum, unsigned int classnum)> FindEntityId{0, 0x1405C1C50};
|
||||||
|
WEAK symbol<void(VariableValue* result, unsigned int classnum, int entnum, int offset)> GetEntityFieldValue{0, 0x1405C6100};
|
||||||
|
|
||||||
|
WEAK symbol<void(int clientNum, const char* menu, int a3, int a4, unsigned int a5)> LUI_OpenMenu{0, 0x1404CD210};
|
||||||
WEAK symbol<bool(int clientNum, const char* menu)> Menu_IsMenuOpenAndVisible{0, 0x1405EE1A0};
|
WEAK symbol<bool(int clientNum, const char* menu)> Menu_IsMenuOpenAndVisible{0, 0x1405EE1A0};
|
||||||
|
|
||||||
WEAK symbol<const float* (const float* v)> Scr_AllocVector{0, 0x1405C3220};
|
WEAK symbol<const float* (const float* v)> Scr_AllocVector{0, 0x1405C3220};
|
||||||
WEAK symbol<void()> Scr_ClearOutParams{0, 0x1405C6E50};
|
WEAK symbol<void()> Scr_ClearOutParams{0, 0x1405C6E50};
|
||||||
WEAK symbol<scr_entref_t(unsigned int entId)> Scr_GetEntityIdRef{0, 0x1405C56C0};
|
WEAK symbol<scr_entref_t(unsigned int entId)> Scr_GetEntityIdRef{0, 0x1405C56C0};
|
||||||
WEAK symbol<int(unsigned int classnum, int entnum, int offset)> Scr_SetObjectField{0,0x140512190};
|
WEAK symbol<int(unsigned int classnum, int entnum, int offset)> Scr_SetObjectField{0, 0x140512190};
|
||||||
WEAK symbol<void(unsigned int id, scr_string_t stringValue, unsigned int paramcount)> Scr_NotifyId{0,0x1405C8240};
|
WEAK symbol<void(unsigned int id, scr_string_t stringValue, unsigned int paramcount)> Scr_NotifyId{0, 0x1405C8240};
|
||||||
|
|
||||||
WEAK symbol<unsigned int(unsigned int localId, const char* pos, unsigned int paramcount)> VM_Execute{0, 0x1405C8DB0};
|
|
||||||
|
|
||||||
WEAK symbol<void()> R_SyncRenderThread{0,0x14076E7D0};
|
|
||||||
WEAK symbol<void(const void* obj, void* pose, unsigned int entnum, unsigned int renderFxFlags, float* lightingOrigin,
|
|
||||||
float materialTime, __int64 a7, __int64 a8)> R_AddDObjToScene{0, 0x140775C40};
|
|
||||||
|
|
||||||
WEAK symbol<const char* (scr_string_t stringValue)> SL_ConvertToString{0x14036D420, 0x1405BFBB0};
|
WEAK symbol<const char* (scr_string_t stringValue)> SL_ConvertToString{0x14036D420, 0x1405BFBB0};
|
||||||
WEAK symbol<scr_string_t(const char* str)> SL_FindString{ 0x140314AF0, 0x14043B470 }; // H1(1.4)
|
WEAK symbol<scr_string_t(const char* str)> SL_FindString{ 0x140314AF0, 0x14043B470 }; // H1(1.4)
|
||||||
|
|
||||||
WEAK symbol<scr_string_t(const char* str, unsigned int user)> SL_GetString{0x14036D9A0, 0x1405C0170};
|
WEAK symbol<scr_string_t(const char* str, unsigned int user)> SL_GetString{0x14036D9A0, 0x1405C0170};
|
||||||
|
|
||||||
WEAK symbol<void(int index, const char* string)> SV_SetConfigstring{0, 0x140486720}; // H1(1.4)
|
WEAK symbol<void(netadr_s* from)> SV_DirectConnect{0, 0x140480860};
|
||||||
|
WEAK symbol<void(const char* text_in)> SV_Cmd_TokenizeString{0x1402EF050, 0x140404D20};
|
||||||
WEAK symbol<bool()> SV_Loaded{0x140442F60, 0x1404864A0}; // H1(1.4)
|
WEAK symbol<void()> SV_Cmd_EndTokenizedString{0x140344700, 0x140404CE0};
|
||||||
|
WEAK symbol<bool(int clientNum)> SV_BotIsBot{0, 0x14046E6C0};
|
||||||
WEAK symbol<void(int clientNum, const char* reason)> SV_KickClientNum{ 0, 0x14047ED00 }; // H1(1.4)
|
WEAK symbol<const char* (int clientNum)> SV_GetGuid{0, 0x140484B90};
|
||||||
|
WEAK symbol<int(int clientNum)> SV_GetClientPing{0, 0x140484B70};
|
||||||
WEAK symbol<bool(const char* map)> SV_MapExists{0, 0x14047ED60}; // H1(1.4)
|
WEAK symbol<playerState_s* (int num)> SV_GetPlayerstateForClientNum{0x1404426D0, 0};
|
||||||
|
WEAK symbol<void(int index, const char* string)> SV_SetConfigstring{0, 0x140486720};
|
||||||
WEAK symbol<void()> Sys_ShowConsole{0x1403E3B90, 0x140514910}; // H1(1.4)
|
WEAK symbol<bool()> SV_Loaded{0x140442F60, 0x1404864A0};
|
||||||
|
WEAK symbol<void(int clientNum, const char* reason)> SV_KickClientNum{0, 0x14047ED00};
|
||||||
WEAK symbol<const char* (const char*)> UI_GetMapDisplayName{0, 0x140408CC0}; // H1(1.4)
|
WEAK symbol<bool(const char* map)> SV_MapExists{0, 0x14047ED60};
|
||||||
|
|
||||||
WEAK symbol<const char* (const char*)> UI_GetGameTypeDisplayName{0, 0x1404086A0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(const char* error, ...)> Sys_Error{0x1403E0C40, 0x140511520}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<const char* (const char* string)> UI_SafeTranslateString{0x140350430, 0x1405A2930}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(unsigned int localClientNum, const char** args)> UI_RunMenuScript{0, 0x1404CFE60}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void* (jmp_buf* Buf, int Value)> longjmp{0x140648FD4, 0x14089EED0}; // H1(1.4)
|
|
||||||
WEAK symbol<int(jmp_buf* Buf)> _setjmp{0x1406BFDD0, 0x1408EC2E0}; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<int(const char* text, int maxChars, Font_s* font, float scale)> UI_TextWidth{ 0, 0x1404D21A0 }; // H1(1.4)
|
|
||||||
|
|
||||||
WEAK symbol<void(int arg, char* buffer, int bufferLength)> SV_Cmd_ArgvBuffer{0x1402EEFD0, 0x1403B05C0};
|
WEAK symbol<void(int arg, char* buffer, int bufferLength)> SV_Cmd_ArgvBuffer{0x1402EEFD0, 0x1403B05C0};
|
||||||
|
WEAK symbol<void(int localClientNum)> SV_FastRestart{0, 0x14047E990};
|
||||||
|
WEAK symbol<void(int clientNum, svscmd_type type, const char* text)> SV_GameSendServerCommand{
|
||||||
|
0x1403F3A70, 0x140484AD0
|
||||||
|
};
|
||||||
|
|
||||||
|
WEAK symbol<void()> Sys_ShowConsole{0x1403E3B90, 0x140514910};
|
||||||
|
WEAK symbol<void(const char* error, ...)> Sys_Error{0x1403E0C40, 0x140511520};
|
||||||
WEAK symbol<void(char* path, int pathSize, Sys_Folder folder, const char* filename, const char* ext)>
|
WEAK symbol<void(char* path, int pathSize, Sys_Folder folder, const char* filename, const char* ext)>
|
||||||
Sys_BuildAbsPath{0x1403CFF90, 0x140507010}; // H1(1.4)
|
Sys_BuildAbsPath{0x1403CFF90, 0x140507010};
|
||||||
|
WEAK symbol<int()> Sys_Milliseconds{0x1403E2B10, 0x140513710};
|
||||||
|
WEAK symbol<bool()> Sys_IsDatabaseReady2{0x1403580B0, 0x14042B090};
|
||||||
|
WEAK symbol<bool(int, void const*, const netadr_s*)> Sys_SendPacket{0x1403E2820, 0x1405133B0};
|
||||||
|
WEAK symbol<bool(const char* path)> Sys_FileExists{0x1403E0CE0, 0x1405115E0};
|
||||||
|
|
||||||
WEAK symbol<bool(const char* path)> Sys_FileExists{0x1403E0CE0, 0x1405115E0}; // H1(1.4)
|
WEAK symbol<const char* (const char*)> UI_GetMapDisplayName{0, 0x140408CC0};
|
||||||
|
WEAK symbol<const char* (const char*)> UI_GetGameTypeDisplayName{0, 0x1404086A0};
|
||||||
|
WEAK symbol<const char* (const char* string)> UI_SafeTranslateString{0x140350430, 0x1405A2930};
|
||||||
|
WEAK symbol<void(unsigned int localClientNum, const char** args)> UI_RunMenuScript{0, 0x1404CFE60};
|
||||||
|
WEAK symbol<int(const char* text, int maxChars, Font_s* font, float scale)> UI_TextWidth{0, 0x1404D21A0};
|
||||||
|
|
||||||
// Variables
|
WEAK symbol<unsigned int(unsigned int localId, const char* pos, unsigned int paramcount)> VM_Execute{0, 0x1405C8DB0};
|
||||||
|
|
||||||
WEAK symbol<CmdArgs> sv_cmd_args{0, 0x14946BA20}; // H1(1.4)
|
WEAK symbol<void* (jmp_buf* Buf, int Value)> longjmp{0x140648FD4, 0x14089EED0};
|
||||||
|
WEAK symbol<int(jmp_buf* Buf)> _setjmp{0x1406BFDD0, 0x1408EC2E0};
|
||||||
|
|
||||||
WEAK symbol<const char*> command_whitelist{0x141079A60, 0x14120C360}; // H1(1.4)
|
/***************************************************************
|
||||||
|
* Variables
|
||||||
|
**************************************************************/
|
||||||
|
|
||||||
|
WEAK symbol<CmdArgs> sv_cmd_args{0, 0x14946BA20};
|
||||||
|
|
||||||
|
WEAK symbol<const char*> command_whitelist{0x141079A60, 0x14120C360};
|
||||||
|
WEAK symbol<cmd_function_s*> cmd_functions{0x14AD99AB8, 0x14946BAC8};
|
||||||
|
WEAK symbol<CmdArgs> cmd_args{0x14AD99960, 0x14946B970};
|
||||||
|
|
||||||
WEAK symbol<const char*> g_assetNames{0, 0x140BEF280};
|
WEAK symbol<const char*> g_assetNames{0, 0x140BEF280};
|
||||||
WEAK symbol<int> g_poolSize{0, 0x140FEADF0}; // H1(1.4)
|
WEAK symbol<int> g_poolSize{0, 0x140FEADF0};
|
||||||
|
|
||||||
WEAK symbol<GfxDrawMethod_s> gfxDrawMethod{0, 0x14EDF9E00};
|
WEAK symbol<GfxDrawMethod_s> gfxDrawMethod{0, 0x14FD21180};
|
||||||
|
|
||||||
WEAK symbol<int> dvarCount{0, 0x14D064CF4}; //h1mp
|
WEAK symbol<int> dvarCount{0, 0x14D064CF4};
|
||||||
WEAK symbol<dvar_t*> sortedDvars{0, 0x14D064D00}; //h1mp
|
WEAK symbol<dvar_t*> sortedDvars{0, 0x14D064D00};
|
||||||
|
|
||||||
WEAK symbol<unsigned int> levelEntityId{0, 0x14B5E0B30};
|
WEAK symbol<unsigned int> levelEntityId{0, 0x14B5E0B30};
|
||||||
WEAK symbol<int> g_script_error_level{0, 0x14BA9CC24};
|
WEAK symbol<int> g_script_error_level{0, 0x14BA9CC24};
|
||||||
@ -226,19 +192,26 @@ namespace game
|
|||||||
WEAK symbol<scrVarGlob_t> scr_VarGlob{0, 0x14B617C00};
|
WEAK symbol<scrVarGlob_t> scr_VarGlob{0, 0x14B617C00};
|
||||||
WEAK symbol<scrVmPub_t> scr_VmPub{0, 0x14BA9EE40};
|
WEAK symbol<scrVmPub_t> scr_VmPub{0, 0x14BA9EE40};
|
||||||
WEAK symbol<function_stack_t> scr_function_stack{0, 0x14BAA93C0};
|
WEAK symbol<function_stack_t> scr_function_stack{0, 0x14BAA93C0};
|
||||||
WEAK symbol<void*> DB_XAssetPool{0x140DE8C80, 0x140FEB5D0}; // H1(1.4)
|
WEAK symbol<void*> DB_XAssetPool{0x140DE8C80, 0x140FEB5D0};
|
||||||
|
|
||||||
WEAK symbol<DWORD> threadIds{0x14B19B880, 0x149810E00}; // H1(1.4)
|
WEAK symbol<int> keyCatchers{0x14243DAF0, 0x142D0BA9C};
|
||||||
|
WEAK symbol<PlayerKeyState> playerKeys{0x1422A873C, 0x142C19AFC};
|
||||||
|
|
||||||
|
WEAK symbol<SOCKET> query_socket{0, 0x14DDFBF98};
|
||||||
|
|
||||||
|
WEAK symbol<DWORD> threadIds{0x14B19B880, 0x149810E00};
|
||||||
|
|
||||||
namespace mp
|
namespace mp
|
||||||
{
|
{
|
||||||
WEAK symbol<gentity_s> g_entities{0, 0x14621E530}; // H1(1.4)
|
WEAK symbol<gentity_s> g_entities{0, 0x14621E530};
|
||||||
WEAK symbol<client_t> svs_clients{0, 0x14B204A10}; // H1(1.4)
|
WEAK symbol<client_t> svs_clients{0, 0x14B204A10};
|
||||||
WEAK symbol<int> gameTime{0, 0x14621BDBC}; // H1(1.4)
|
WEAK symbol<int> gameTime{0, 0x14621BDBC};
|
||||||
|
|
||||||
|
WEAK symbol<bool> virtualLobby_loaded{ 0, 0x142D077FD };
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace sp
|
namespace sp
|
||||||
{
|
{
|
||||||
WEAK symbol<gentity_s> g_entities{0x14550DD90, 0}; // H1(1.4)
|
WEAK symbol<gentity_s> g_entities{0x14550DD90, 0};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,18 @@
|
|||||||
#include <std_include.hpp>
|
#include <std_include.hpp>
|
||||||
#include "../steam.hpp"
|
#include "../steam.hpp"
|
||||||
|
|
||||||
|
#include <game/game.hpp>
|
||||||
|
|
||||||
namespace steam
|
namespace steam
|
||||||
{
|
{
|
||||||
const char* friends::GetPersonaName()
|
const char* friends::GetPersonaName()
|
||||||
{
|
{
|
||||||
|
static const auto* name = game::Dvar_FindVar("name");
|
||||||
|
if (name)
|
||||||
|
{
|
||||||
|
return name->current.string;
|
||||||
|
}
|
||||||
|
|
||||||
return "1337";
|
return "1337";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user