s1-mod/src/client/component/logger.cpp
Jack Back 215030f626 init
2024-01-15 12:14:55 +01:00

173 lines
3.8 KiB
C++

#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include "party.hpp"
#include "console.hpp"
#include <utils/hook.hpp>
namespace logger
{
namespace
{
utils::hook::detour com_error_hook;
game::dvar_t* logger_dev = nullptr;
void print_error(const char* msg, ...)
{
char buffer[2048]{};
va_list ap;
va_start(ap, msg);
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
va_end(ap);
console::error("%s", buffer);
}
void print_com_error(int, const char* msg, ...)
{
char buffer[2048]{};
va_list ap;
va_start(ap, msg);
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
va_end(ap);
console::error("%s", buffer);
}
void com_error_stub(const int error, const char* msg, ...)
{
char buffer[2048]{};
va_list ap;
va_start(ap, msg);
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
va_end(ap);
console::error("Error: %s\n", buffer);
party::clear_sv_motd(); // clear sv_motd on error if it exists
com_error_hook.invoke<void>(error, "%s", buffer);
}
void print_warning(const char* msg, ...)
{
char buffer[2048]{};
va_list ap;
va_start(ap, msg);
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
va_end(ap);
console::warn("%s", buffer);
}
void print(const char* msg, ...)
{
char buffer[2048]{};
va_list ap;
va_start(ap, msg);
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
va_end(ap);
console::info("%s", buffer);
}
void print_dev(const char* msg, ...)
{
if (!logger_dev->current.enabled)
{
return;
}
char buffer[2048]{};
va_list ap;
va_start(ap, msg);
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
va_end(ap);
console::info("%s", buffer);
}
// nullsub_56
void nullsub_56()
{
utils::hook::call(0x1400D2572, print_warning);
utils::hook::call(0x1400D257E, print_warning);
utils::hook::call(0x1400D2586, print_warning);
utils::hook::call(0x1400D2592, print_warning);
utils::hook::call(0x1400D2B7D, print_warning);
utils::hook::call(0x1400D2B89, print_warning);
utils::hook::call(0x1400D2B91, print_warning);
utils::hook::call(0x1400D2B9D, print_warning);
utils::hook::call(0x1400D78ED, print_warning);
utils::hook::call(0x1400D78F9, print_warning);
utils::hook::call(0x1400D7901, print_warning);
utils::hook::call(0x1400D790D, print_warning);
utils::hook::call(0x1400D84F8, print_warning);
utils::hook::call(0x1400D850C, print_warning);
utils::hook::call(0x1400D8C08, print_warning);
utils::hook::call(0x1400D8C28, print_warning);
utils::hook::call(0x1400D8C34, print_warning);
utils::hook::call(0x1400D8CD8, print_warning);
utils::hook::call(0x1400D8CF8, print_warning);
utils::hook::call(0x1400D8D04, print_warning);
utils::hook::call(0x1400D8D1D, print_warning);
utils::hook::call(0x1400DAE67, print_warning);
utils::hook::call(0x1400DB019, print_warning);
}
// sub_1400E7420
void sub_1400E7420()
{
utils::hook::call(0x1400CEC1C, print_warning);
utils::hook::call(0x1400D218E, print_warning);
utils::hook::call(0x1400D2319, print_warning);
utils::hook::call(0x1400D65BC, print_dev);
utils::hook::call(0x1400D7C94, print_dev);
utils::hook::call(0x1400DAB6A, print_dev);
utils::hook::call(0x1400DB9BC, print_dev);
}
}
class component final : public component_interface
{
public:
void post_unpack() override
{
if (game::environment::is_mp())
{
nullsub_56();
sub_1400E7420();
// Make havok script's print function actually print
utils::hook::jump(0x140701A1C, print);
}
if (!game::environment::is_sp())
{
utils::hook::call(0x1404D8543, print_com_error);
}
com_error_hook.create(game::Com_Error, com_error_stub);
logger_dev = game::Dvar_RegisterBool("logger_dev", false, game::DVAR_FLAG_SAVED, "Print dev stuff");
}
};
}
REGISTER_COMPONENT(logger::component)