add bindlist cmd

This commit is contained in:
quaK 2024-07-15 20:07:53 +03:00
parent f35b102d44
commit 4967ed9569
6 changed files with 75 additions and 11 deletions

View File

@ -477,6 +477,11 @@ namespace command
game::Com_GameMode_SetDesiredGameMode(game::GAME_MODE_CP);
});
add("bindlist", []()
{
game::Key_Bindlist_f();
});
add_sv("god", [](const int client_num, const params_sv&)
{
if (!game::shared::cheats_ok(client_num, true))

View File

@ -17,7 +17,6 @@ namespace input
utils::hook::detour cl_char_event_hook;
utils::hook::detour cl_key_event_hook;
utils::hook::detour cl_execute_key_hook;
utils::hook::detour key_get_binding_for_key_hook;
int key_get_binding_for_cmd_stub(const char* command);
@ -125,6 +124,18 @@ namespace input
return index;
}
std::optional<std::string*> get_custom_binding_for_key(int key)
{
key -= get_num_keys();
if (static_cast<size_t>(key) < custom_binds.size() && !custom_binds[key].empty())
{
return { &custom_binds[key] };
}
return {};
}
int key_get_binding_for_cmd_stub(const char* command)
{
// original binds
@ -140,16 +151,19 @@ namespace input
return get_num_keys() + get_binding_for_custom_command(command);
}
std::optional<std::string> get_custom_binding_for_key(int key)
const char* key_get_cmd_for_binding_stub(int localClientNum, int keyBinding)
{
key -= get_num_keys();
if (static_cast<size_t>(key) < custom_binds.size() && !custom_binds[key].empty())
if (keyBinding >= get_num_keys())
{
return { custom_binds[key] };
const auto bind = get_custom_binding_for_key(keyBinding);
if (bind.has_value())
{
return bind.value()->data();
}
return "";
}
return {};
return game::command_whitelist[keyBinding];
}
void cl_execute_key_stub(const int local_client_num, int key, const int down, const unsigned int time)
@ -162,7 +176,7 @@ namespace input
return;
}
return game::Cbuf_AddText(local_client_num, utils::string::va("%s\n", bind.value().data()));
return game::Cbuf_AddText(local_client_num, utils::string::va("%s\n", bind.value()->data()));
}
cl_execute_key_hook.invoke<void>(local_client_num, key, down, time);
@ -190,6 +204,7 @@ namespace input
// links a custom command to an index
utils::hook::jump(0x1409A8EA0, key_get_binding_for_cmd_stub);
utils::hook::jump(0x1409A91D0, key_get_cmd_for_binding_stub);
// execute custom binds
cl_execute_key_hook.create(0x14032A3B0, &cl_execute_key_stub);

View File

@ -2,6 +2,8 @@
#include "game.hpp"
#include "dvars.hpp"
#include "component/console/console.hpp"
#include <utils/flags.hpp>
#include <utils/string.hpp>
#include <utils/io.hpp>
@ -253,6 +255,22 @@ namespace game
va_buffer
), true);
}
void Key_Bindlist_f()
{
for (int keynum = 0; keynum < 256; ++keynum)
{
auto value = game::Key_GetActiveBinding(0, keynum);
if (value)
{
auto* binding = game::Key_GetCmdForBinding(0, value);
if (*binding)
{
console::info("%s \"%s\"\n", game::Key_KeynumToString(keynum, 0, 0), binding);
}
}
}
}
}
size_t reverse_b(const size_t ptr)

View File

@ -69,6 +69,8 @@ namespace game
bool SV_ClientIsBot(unsigned int client_num);
void G_LogPrintf(const char* fmt, ...);
void Key_Bindlist_f();
}
size_t reverse_b(const size_t ptr);

View File

@ -347,7 +347,7 @@ namespace game
int overstrikeMode;
int anyKeyDown;
KeyState keys[256];
field_t test;
field_t chatField;
char __pad0[8];
}; static_assert(sizeof(PlayerKeyState) == 0x1128);
@ -897,7 +897,27 @@ namespace game
entityState_t s; // 0
char __pad0[368 - sizeof(entityState_t)];
gclient_s* client; // 368
char __pad1[80];
void* turret;
void* agent;
void* sentient;
void* vehicle;
__int64 physObjId;
unsigned __int16 model;
unsigned __int8 physicsObject;
unsigned __int8 takedamage;
unsigned __int8 active;
unsigned __int8 handler;
unsigned __int8 team;
bool freeAfterEvent;
unsigned __int16 disconnectedLinks;
__int16 padding_short2;
scr_string_t classname;
scr_string_t script_classname;
scr_string_t script_linkName;
scr_string_t target;
scr_string_t targetname;
unsigned int attachIgnoreCollision;
int spawnflags;
int flags; // 456
char __pad3[556];
}; static_assert(sizeof(gentity_s) == 1016);

View File

@ -89,6 +89,7 @@ namespace game
WEAK symbol<char* (const char* filename, char* buf, int size)> DB_ReadRawFile{ 0x140A79E30 };
WEAK symbol<int(const RawFile* rawfile)> DB_GetRawFileLen{ 0x140F20AF0 };
WEAK symbol<void(int flags)> DB_UnloadFastfilesByZoneFlags{ 0x140A7BCE0 };
WEAK symbol<int()> DB_Zones_GetInUseFlags{ 0x1403BC160 };
WEAK symbol<const char* (const DDLState* state, int enumValue)> DDL_Lookup_GetEnumString{ 0x140030430 };
WEAK symbol<bool(const DDLState* state)> DDL_StateIsLeaf{ 0x14002E3C0 };
@ -151,7 +152,10 @@ namespace game
WEAK symbol<char* (char* string)> I_CleanStr{ 0x140CFACC0 };
WEAK symbol<const char* (int, int, int)> Key_KeynumToString{ 0x1409A95E0 };
WEAK symbol<const char* (int keynum, int translate, int gamePadOnly)> Key_KeynumToString{ 0x1409A95E0 };
WEAK symbol<int (int localClientNum, int keynum)> Key_GetActiveBinding{ 0x1409A8E80 };
WEAK symbol<const char* (int localClientNum, int keyBinding)> Key_GetCmdForBinding{ 0x1409A91D0 };
WEAK symbol<const char* (const char* cmd)> Key_GetBindingForCmd{ 0x1409A8EA0 };
WEAK symbol<bool()> LUI_CoD_InFrontEnd{ 0x140615080 };
WEAK symbol<void(bool frontend, bool errorRecovery)> LUI_CoD_Init{ 0x140615090 };