CCvarUtilities::CvarList
0x001298a0 · 2352 bytes · __thiscall
_ZN14CCvarUtilities8CvarListERK8CCommand
Decompiled
undefined (2 params)
/* CCvarUtilities::CvarList(CCommand const&) */
void __thiscall CCvarUtilities::CvarList(CCvarUtilities *this,CCommand *param_1)
{
ushort *puVar1;
float fVar2;
int *piVar3;
code *pcVar4;
bool bVar5;
char cVar6;
ushort uVar7;
int iVar8;
undefined1 *puVar9;
int *piVar10;
ConCommandBase *pCVar11;
undefined4 uVar12;
undefined4 uVar13;
int extraout_ECX;
int extraout_ECX_00;
int extraout_ECX_01;
int extraout_ECX_02;
char *pcVar14;
undefined **ppuVar15;
ushort uVar16;
int iVar17;
int in_GS_OFFSET;
int local_d64;
char *local_d60;
ConCommandBase *local_d40;
code *local_d3c;
int local_d38;
int local_d34;
undefined4 local_d30;
undefined2 local_d2c;
ushort local_d2a;
ushort local_d28;
ushort local_d26;
undefined4 local_d24;
char local_d20 [32];
char local_d00 [32];
char local_ce0 [64];
char local_ca0 [64];
char local_c60 [64];
char local_c20 [128];
char local_ba0 [128];
char local_b20 [128];
char local_aa0 [128];
char local_a20 [256];
char local_920 [256];
char local_820 [1024];
char local_420 [1024];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
iVar17 = *(int *)param_1;
iVar8 = iVar17;
if (iVar17 == 2) {
iVar8 = V_strcasecmp(*(char **)(param_1 + 0x40c),"?");
if (iVar8 == 0) {
ConMsg("cvarlist: [log logfile] [ partial ]\n");
goto LAB_00129e43;
}
iVar8 = *(int *)param_1;
}
pcVar14 = "";
if (1 < iVar8) {
pcVar14 = *(char **)(param_1 + 0x40c);
}
iVar8 = V_strcasecmp(pcVar14,"log");
if ((iVar8 == 0) && (2 < iVar17)) {
puVar9 = &DAT_002c79d4;
if (2 < *(int *)param_1) {
puVar9 = *(undefined1 **)(param_1 + 0x410);
}
V_snprintf(local_420,0x100,"%s",puVar9);
local_d64 = (**(code **)(g_pFileSystem[1] + 8))(g_pFileSystem + 1,local_420,&DAT_002a5c80,0);
if (local_d64 == 0) {
ConMsg("Couldn\'t open \'%s\' for writing!\n",local_420);
goto LAB_00129e43;
}
if (iVar17 == 4) {
local_d60 = "";
if (3 < *(int *)param_1) {
local_d60 = *(char **)(param_1 + 0x414);
}
iVar17 = _V_strlen(local_d60);
}
else {
local_d60 = (char *)0x0;
iVar17 = 0;
}
bVar5 = true;
}
else {
local_d60 = "";
if (1 < *(int *)param_1) {
local_d60 = *(char **)(param_1 + 0x40c);
}
iVar17 = _V_strlen(local_d60);
bVar5 = false;
local_d64 = 0;
}
ConMsg("cvar list\n--------------\n");
local_d3c = ConCommandBaseLessFunc;
local_d28 = 0xffff;
local_d26 = 0xffff;
local_d38 = 0;
local_d34 = 0;
local_d30 = 0;
local_d2c = 0xffff;
local_d2a = 0;
local_d24 = 0;
/* try { // try from 00129a2a to 00129a2f has its CatchHandler @ 0012a1f2 */
piVar10 = (int *)(**(code **)(*g_pCVar + 0x98))(g_pCVar);
/* try { // try from 00129a49 to 0012a145 has its CatchHandler @ 0012a216 */
(**(code **)(*piVar10 + 8))(piVar10);
while (cVar6 = (**(code **)(*piVar10 + 0x10))(piVar10), cVar6 != '\0') {
pCVar11 = (ConCommandBase *)(**(code **)(*piVar10 + 0x14))(piVar10);
cVar6 = (**(code **)(*(int *)pCVar11 + 0xc))(pCVar11,2);
if ((cVar6 == '\0') &&
(cVar6 = (**(code **)(*(int *)pCVar11 + 0xc))(pCVar11,0x10), cVar6 == '\0')) {
if (local_d60 != (char *)0x0) {
pcVar14 = (char *)(**(code **)(*(int *)pCVar11 + 0x1c))(pCVar11);
iVar8 = V_strncasecmp(pcVar14,local_d60,iVar17);
if (iVar8 != 0) goto LAB_00129a68;
}
local_d40 = pCVar11;
CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::Insert((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
*)&local_d3c,&local_d40);
}
LAB_00129a68:
(**(code **)(*piVar10 + 0xc))(piVar10);
}
if (bVar5) {
local_820[0] = '\0';
ppuVar15 = &PTR_s_ARCHIVE_00340cc4;
do {
V_snprintf(local_ce0,0x40,"\"%s\",",*ppuVar15);
V_strncat(local_820,local_ce0,0x400,-1);
ppuVar15 = ppuVar15 + 3;
} while (ppuVar15 !=
(undefined **)
&CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel);
(**(code **)(*g_pFileSystem + 100))
(g_pFileSystem,local_d64,"\"%s\",\"%s\",%s,\"%s\"\n","Name","Value",local_820,
"Help Text");
}
for (uVar7 = CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::FirstInorder((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
*)&local_d3c); uVar7 != 0xffff;
uVar7 = CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::NextInorder((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
*)&local_d3c,uVar7)) {
piVar3 = *(int **)(local_d38 + (uint)uVar7 * 0xc + 8);
cVar6 = (**(code **)(*piVar3 + 8))(piVar3);
if (cVar6 == '\0') {
local_b20[0] = '\0';
ppuVar15 = (undefined **)&g_ConVarFlags;
local_420[0] = '\0';
do {
cVar6 = (**(code **)(*piVar3 + 0xc))(piVar3,*ppuVar15);
if (cVar6 == '\0') {
V_snprintf(local_c60,0x40,",");
}
else {
V_snprintf(local_d00,0x20,", %s",ppuVar15[2]);
V_strncat(local_b20,local_d00,0x80,-1);
V_snprintf(local_c60,0x40,"\"%s\",",ppuVar15[1]);
}
V_strncat(local_420,local_c60,0x400,-1);
ppuVar15 = ppuVar15 + 3;
} while (ppuVar15 != &cv);
fVar2 = *(float *)(piVar3[7] + 0x2c);
iVar17 = *(int *)(piVar3[7] + 0x30);
if (iVar17 == (int)fVar2) {
V_snprintf(local_d20,0x20,"%-8i",iVar17);
}
else {
V_snprintf(local_d20,0x20,"%-8.3f",(double)fVar2);
}
pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
StripTabsAndReturns(pcVar14,local_aa0,extraout_ECX_01);
uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
ConMsg("%-40s : %-8s : %-16s : %s\n",uVar12,local_d20,local_b20);
if (bVar5) {
pcVar4 = *(code **)(*g_pFileSystem + 100);
pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
uVar12 = StripQuotes(pcVar14,local_aa0,extraout_ECX_02);
uVar13 = (**(code **)(*piVar3 + 0x1c))(piVar3);
(*pcVar4)(g_pFileSystem,local_d64,"\"%s\",\"%s\",%s,\"%s\"\n",uVar13,local_d20,local_420,
uVar12);
}
}
else {
pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
StripTabsAndReturns(pcVar14,local_c20,extraout_ECX);
uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
ConMsg("%-40s : %-8s : %-16s : %s\n",uVar12,"cmd",&DAT_002c79d4);
if (bVar5) {
local_a20[0] = '\0';
iVar17 = 0x12;
do {
V_snprintf(local_ca0,0x40,",");
V_strncat(local_a20,local_ca0,0x100,-1);
iVar17 = iVar17 + -1;
} while (iVar17 != 0);
uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
V_snprintf(local_920,0x100,"%s",uVar12);
if ((local_920[0] == '-') || (local_920[0] == '+')) {
uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
V_snprintf(local_920,0x100,"\'%s\'",uVar12);
}
pcVar4 = *(code **)(*g_pFileSystem + 100);
pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
uVar12 = StripQuotes(pcVar14,local_ba0,extraout_ECX_00);
(*pcVar4)(g_pFileSystem,local_d64,"\"%s\",\"%s\",%s,\"%s\"\n",local_920,"cmd",local_a20,
uVar12);
}
}
}
if ((local_d60 == (char *)0x0) || (*local_d60 == '\0')) {
ConMsg("--------------\n%3i total convars/concommands\n",(uint)local_d2a);
}
else {
/* try { // try from 0012a18c to 0012a190 has its CatchHandler @ 0012a216 */
ConMsg("--------------\n%3i convars/concommands for [%s]\n",(uint)local_d2a,local_d60);
}
if (bVar5) {
(**(code **)(g_pFileSystem[1] + 0xc))(g_pFileSystem + 1,local_d64);
}
(**(code **)(*piVar10 + 4))(piVar10);
if (local_d26 != 0xffff) {
iVar17 = 0;
uVar7 = local_d26;
if (0 < local_d34) {
do {
uVar16 = (ushort)iVar17;
if ((iVar17 < local_d34) && (uVar16 <= uVar7)) {
if ((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel == '\0') &&
(iVar8 = __cxa_guard_acquire(&CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel), iVar8 != 0)) {
DAT_00340d9e = 0xffff;
CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel = 0xffff;
DAT_00340da0 = 0xffff;
__cxa_guard_release(&CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel);
}
puVar1 = (ushort *)(local_d38 + iVar17 * 0xc);
uVar7 = local_d26;
if (*puVar1 != uVar16) {
puVar1[1] = local_d28;
*(ushort *)(local_d38 + iVar17 * 0xc) = uVar16;
local_d28 = uVar16;
}
}
} while (((uVar7 != uVar16) && ((int)(iVar17 + 1U & 0xffff) < local_d34)) &&
(iVar17 = iVar17 + 1, iVar17 != 0xffff));
}
local_d2c = 0xffff;
local_d2a = 0;
}
local_d28 = 0xffff;
CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>::Purge
((CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short> *)
&local_d38);
local_d26 = 0xffff;
CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>::Purge
((CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short> *)
&local_d38);
LAB_00129e43:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.