add logprint
This commit is contained in:
parent
483aad7425
commit
e90301acd9
@ -385,23 +385,6 @@ namespace gsc
|
||||
return utils::string::to_upper(string);
|
||||
});
|
||||
|
||||
/*
|
||||
function::add("logprint", [](const function_args& args)
|
||||
{
|
||||
std::string buffer{};
|
||||
|
||||
for (auto i = 0u; i < args.size(); ++i)
|
||||
{
|
||||
const auto string = args[i].as<std::string>();
|
||||
buffer.append(string);
|
||||
}
|
||||
|
||||
game::G_LogPrintf("%s", buffer.data());
|
||||
|
||||
return scripting::script_value{};
|
||||
});
|
||||
*/
|
||||
|
||||
function::add("executecommand", [](const function_args& args)
|
||||
{
|
||||
command::execute(args[0].as<std::string>(), false);
|
||||
|
79
src/client/component/logprint.cpp
Normal file
79
src/client/component/logprint.cpp
Normal file
@ -0,0 +1,79 @@
|
||||
#include <std_include.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
|
||||
#include "game/game.hpp"
|
||||
#include "game/dvars.hpp"
|
||||
|
||||
#include "scheduler.hpp"
|
||||
|
||||
#include "gsc/script_extension.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
namespace logprint
|
||||
{
|
||||
namespace
|
||||
{
|
||||
utils::hook::detour g_say_hook;
|
||||
void g_say_stub(game::gentity_s* ent, game::gentity_s* target, int mode, const char* chat_text)
|
||||
{
|
||||
const char* cmd = mode == game::SAY_TEAM ? "say_team" : "say";
|
||||
if (mode == game::SAY_TEAM && (ent->client->sess.cs.team - 1 > 1 || game::Com_GameMode_GetActiveGameMode() == game::GAME_MODE_CP))
|
||||
{
|
||||
cmd = "say";
|
||||
}
|
||||
|
||||
game::G_LogPrintf("%s;%s;%i;%s;%s\n",
|
||||
cmd,
|
||||
game::SV_GameMP_GetGuid(ent->s.number),
|
||||
ent->s.number,
|
||||
ent->client->sess.cs.name,
|
||||
&chat_text[1]);
|
||||
|
||||
g_say_hook.invoke<void>(ent, target, mode, chat_text);
|
||||
}
|
||||
|
||||
void touch_log_pickup_stub(char* buffer, const char* guid, const unsigned int ent_number, const char* name, const char* weapon_name)
|
||||
{
|
||||
game::G_LogPrintf(buffer, guid, ent_number, name, weapon_name);
|
||||
game::LUI_Interface_DebugPrint(buffer, guid, ent_number, name, weapon_name);
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
gsc::function::add("logprint", [](const gsc::function_args& args)
|
||||
{
|
||||
std::string buffer{};
|
||||
|
||||
for (auto i = 0u; i < args.size(); ++i)
|
||||
{
|
||||
const auto string = args[i].as<std::string>();
|
||||
buffer.append(string);
|
||||
}
|
||||
|
||||
game::G_LogPrintf("%s", buffer.data());
|
||||
|
||||
return scripting::script_value{};
|
||||
});
|
||||
|
||||
// Reimplement game log
|
||||
scheduler::once([]()
|
||||
{
|
||||
dvars::logfile = game::Dvar_RegisterBool("logfile", true, game::DVAR_FLAG_NONE, "Enable game logging");
|
||||
dvars::g_log = game::Dvar_RegisterString("g_log", "iw7-mod\\logs\\games_mp.log", game::DVAR_FLAG_NONE, "Log file path");
|
||||
}, scheduler::pipeline::main);
|
||||
|
||||
// Hook say client command
|
||||
g_say_hook.create(0x140B10C00, g_say_stub);
|
||||
|
||||
// Hook LUI_Interface_DebugPrint call in GItemsMP::TouchLogPickup
|
||||
utils::hook::call(0x140448F1D, touch_log_pickup_stub);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
REGISTER_COMPONENT(logprint::component)
|
@ -293,7 +293,7 @@ namespace party
|
||||
if (game::g_entities[i].client)
|
||||
{
|
||||
char client_name[32] = { 0 };
|
||||
strncpy_s(client_name, game::g_entities[i].client->name, sizeof(client_name));
|
||||
strncpy_s(client_name, game::g_entities[i].client->sess.name, sizeof(client_name));
|
||||
game::I_CleanStr(client_name);
|
||||
|
||||
if (client_name == name)
|
||||
|
@ -96,7 +96,7 @@ namespace rcon
|
||||
if (client->header.state >= 1 && client->gentity && client->gentity->client)
|
||||
{
|
||||
char clean_name[32] = { 0 };
|
||||
strncpy_s(clean_name, client->gentity->client->name, sizeof(clean_name));
|
||||
strncpy_s(clean_name, client->gentity->client->sess.name, sizeof(clean_name));
|
||||
game::I_CleanStr(clean_name);
|
||||
|
||||
buffer.append(utils::string::va("%3i %5i %3s %s %32s %16s %21s %5i\n",
|
||||
|
@ -188,8 +188,8 @@ namespace scripting
|
||||
console::info("gamename: %s\n", "IW7");
|
||||
console::info("gamedate: %s\n", __DATE__);
|
||||
|
||||
//G_LogPrintf("------------------------------------------------------------\n");
|
||||
//G_LogPrintf("InitGame: %s\n", serverinfo);
|
||||
game::G_LogPrintf("------------------------------------------------------------\n");
|
||||
game::G_LogPrintf("InitGame\n");
|
||||
}
|
||||
|
||||
sv_initgame_vm_hook.invoke<void>(init_settings);
|
||||
@ -206,8 +206,8 @@ namespace scripting
|
||||
{
|
||||
console::info("==== ShutdownGame (%d) ====\n", full_clear);
|
||||
|
||||
//G_LogPrintf("ShutdownGame:\n");
|
||||
//G_LogPrintf("------------------------------------------------------------\n");
|
||||
game::G_LogPrintf("ShutdownGame:\n");
|
||||
game::G_LogPrintf("------------------------------------------------------------\n");
|
||||
}
|
||||
|
||||
shutdown_game_pre(full_clear);
|
||||
|
@ -40,6 +40,9 @@ namespace dvars
|
||||
game::dvar_t* bg_bounces = nullptr;
|
||||
game::dvar_t* bg_playerEjection = nullptr;
|
||||
|
||||
game::dvar_t* logfile = nullptr;
|
||||
game::dvar_t* g_log = nullptr;
|
||||
|
||||
std::string dvar_get_vector_domain(const int components, const game::DvarLimits& domain)
|
||||
{
|
||||
if (domain.vector.min == -FLT_MAX)
|
||||
|
@ -37,6 +37,9 @@ namespace dvars
|
||||
extern game::dvar_t* bg_bounces;
|
||||
extern game::dvar_t* bg_playerEjection;
|
||||
|
||||
extern game::dvar_t* logfile;
|
||||
extern game::dvar_t* g_log;
|
||||
|
||||
std::string dvar_get_vector_domain(const int components, const game::DvarLimits& domain);
|
||||
std::string dvar_get_domain(const game::DvarType type, const game::DvarLimits& domain);
|
||||
std::string dvar_get_name(const game::dvar_t* dvar);
|
||||
|
@ -1,8 +1,10 @@
|
||||
#include <std_include.hpp>
|
||||
#include "game.hpp"
|
||||
#include "dvars.hpp"
|
||||
|
||||
#include <utils/flags.hpp>
|
||||
#include <utils/string.hpp>
|
||||
#include <utils/io.hpp>
|
||||
|
||||
namespace game
|
||||
{
|
||||
@ -226,6 +228,31 @@ namespace game
|
||||
{
|
||||
return svs_clients[client_num]->remoteAddress.type == NA_BOT;
|
||||
}
|
||||
|
||||
void G_LogPrintf(const char* fmt, ...)
|
||||
{
|
||||
if (!dvars::logfile->current.enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
char va_buffer[0x400] = { 0 };
|
||||
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsprintf_s(va_buffer, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
const auto file = dvars::g_log->current.string;
|
||||
const auto time = *game::level_time / 1000;
|
||||
|
||||
utils::io::write_file(file, utils::string::va("%3i:%i%i %s",
|
||||
time / 60,
|
||||
time % 60 / 10,
|
||||
time % 60 % 10,
|
||||
va_buffer
|
||||
), true);
|
||||
}
|
||||
}
|
||||
|
||||
size_t reverse_b(const size_t ptr)
|
||||
|
@ -67,6 +67,8 @@ namespace game
|
||||
|
||||
bool SV_ClientIsBot(client_t* client);
|
||||
bool SV_ClientIsBot(unsigned int client_num);
|
||||
|
||||
void G_LogPrintf(const char* fmt, ...);
|
||||
}
|
||||
|
||||
size_t reverse_b(const size_t ptr);
|
||||
|
@ -553,6 +553,13 @@ namespace game
|
||||
XAnimEntry entries[1];
|
||||
};
|
||||
|
||||
enum SayModes
|
||||
{
|
||||
SAY_ALL = 0x0,
|
||||
SAY_TEAM = 0x1,
|
||||
SAY_TELL = 0x2,
|
||||
};
|
||||
|
||||
namespace entity
|
||||
{
|
||||
enum connstate_t : std::uint32_t
|
||||
@ -770,16 +777,65 @@ namespace game
|
||||
};
|
||||
assert_offsetof(pml_t, msec, 40);
|
||||
|
||||
enum clientConnected_t
|
||||
{
|
||||
CON_DISCONNECTED = 0x0,
|
||||
CON_CONNECTING = 0x1,
|
||||
CON_CONNECTED = 0x2,
|
||||
};
|
||||
|
||||
enum sessionState_t
|
||||
{
|
||||
SESS_STATE_PLAYING = 0x0,
|
||||
SESS_STATE_DEAD = 0x1,
|
||||
SESS_STATE_SPECTATOR = 0x2,
|
||||
SESS_STATE_INTERMISSION = 0x3,
|
||||
};
|
||||
|
||||
enum team_t : std::int32_t
|
||||
{
|
||||
TEAM_FREE = 0x0,
|
||||
TEAM_BAD = 0x0,
|
||||
TEAM_AXIS = 0x1,
|
||||
TEAM_ALLIES = 0x2,
|
||||
TEAM_SPECTATOR = 0x3,
|
||||
TEAM_NUM_TEAMS = 0x4,
|
||||
};
|
||||
|
||||
struct clientState_s
|
||||
{
|
||||
int clientIndex;
|
||||
team_t team;
|
||||
char __pad0[108];
|
||||
char name[32];
|
||||
};
|
||||
|
||||
struct clientSession_t
|
||||
{
|
||||
clientConnected_t connected;
|
||||
sessionState_t sessionState;
|
||||
char __pad0[280];
|
||||
char name[32];
|
||||
char __pad1[12];
|
||||
clientState_s cs;
|
||||
}; // unk size
|
||||
|
||||
struct gclient_s
|
||||
{
|
||||
playerState_s ps;
|
||||
char __pad0[19376 - sizeof(playerState_s)];
|
||||
char name[32]; // 19376
|
||||
char __pad1[1516];
|
||||
char __pad0[19088 - sizeof(playerState_s)];
|
||||
clientSession_t sess; // 19088
|
||||
char __pad1[20924 - sizeof(clientSession_t) - 19088];
|
||||
int flags; // 20924
|
||||
}; // sizeof = 29208?
|
||||
|
||||
static_assert(offsetof(gclient_s, name) == 19376);
|
||||
assert_offsetof(gclient_s, sess.sessionState, 19092);
|
||||
assert_offsetof(gclient_s, sess.name, 19376);
|
||||
|
||||
assert_offsetof(gclient_s, sess.cs, 19420);
|
||||
assert_offsetof(gclient_s, sess.cs.team, 19424);
|
||||
assert_offsetof(gclient_s, sess.cs.name, 19536);
|
||||
|
||||
static_assert(offsetof(gclient_s, flags) == 20924);
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
@ -152,15 +152,15 @@ namespace game
|
||||
WEAK symbol<void(int localClientNum, const char* menuName, int isPopup, int isModal, int isExclusive)> LUI_OpenMenu{ 0x140CC0CA0 };
|
||||
WEAK symbol<void(int localClientNum, const char* menuName, int immediate)> LUI_CloseMenu{ 0x140CC0C40 };
|
||||
WEAK symbol<void(int localClientNum)> LUI_CoD_CLoseAll{ 0x1406135C0 };
|
||||
WEAK symbol<void(const char* fmt, ...)> LUI_Interface_DebugPrint{ 0x14061C43F };
|
||||
WEAK symbol<void()> LUI_EnterCriticalSection{ 0x140600080 };
|
||||
WEAK symbol<void()> LUI_LeaveCriticalSection{ 0x140602280 };
|
||||
|
||||
WEAK symbol<unsigned int(int controllerIndex)> Live_SyncOnlineDataFlags{ 0x140DC5CE0 };
|
||||
WEAK symbol<std::uint64_t(int controllerIndex)> Live_GetXuid{ 0x140D32A20 };
|
||||
|
||||
WEAK symbol<PartyData* ()> Lobby_GetPartyData{ 0x1409C3E20 };
|
||||
|
||||
WEAK symbol<void()> LUI_EnterCriticalSection{ 0x140600080 };
|
||||
WEAK symbol<void()> LUI_LeaveCriticalSection{ 0x140602280 };
|
||||
|
||||
WEAK symbol<Material* (const char* material)> Material_RegisterHandle{ 0x140E11CE0 };
|
||||
|
||||
WEAK symbol<bool(int localClientNum, const char* menuName)> Menu_IsMenuOpenAndVisible{ 0x14061CA70 };
|
||||
|
Loading…
Reference in New Issue
Block a user