CServerRemoteAccess::LookupValue
0x0020f010 · 1582 bytes · __thiscall
_ZN19CServerRemoteAccess11LookupValueEPKcR10CUtlBuffer
Decompiled
undefined (3 params)
/* CServerRemoteAccess::LookupValue(char const*, CUtlBuffer&) */
undefined4 __thiscall
CServerRemoteAccess::LookupValue(CServerRemoteAccess *this,char *param_1,CUtlBuffer *param_2)
{
int iVar1;
code *pcVar2;
undefined4 *puVar3;
int iVar4;
char cVar5;
char *pcVar6;
undefined4 uVar7;
int iVar8;
uint uVar9;
void *pvVar10;
undefined1 *puVar11;
int iVar12;
int in_GS_OFFSET;
longdouble lVar13;
undefined4 uStackY_250;
int local_240 [3];
undefined8 local_234;
undefined4 local_22c;
ConVarRef local_228;
undefined1 local_227;
undefined1 local_226;
undefined1 local_225;
char local_220 [512];
int local_20;
puVar11 = &stack0xfffffdb4;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
uStackY_250 = 0x20f03c;
pcVar6 = (char *)LookupStringValue(this,param_1);
if (pcVar6 == (char *)0x0) {
uStackY_250 = 0x20f118;
iVar12 = _V_stricmp(param_1,"stats");
if (iVar12 == 0) {
uStackY_250 = 0x20f29a;
GetStatsString(this,local_220,0x200);
uStackY_250 = 0x20f2a6;
CUtlBuffer::PutString(param_2,local_220);
if (((((byte)param_2[0x15] & 1) != 0) && (*(int *)(param_2 + 0x10) != 0)) &&
(*(char *)(*(int *)param_2 + ((*(int *)(param_2 + 0x10) + -1) - *(int *)(param_2 + 0x20)))
== '\n')) {
iVar12 = 0;
if (((byte)param_2[0x15] & 0x10) == 0) {
iVar12 = *(int *)(param_2 + 0x18);
}
while (iVar12 = iVar12 + -1, -1 < iVar12) {
uStackY_250 = 0x20f2e5;
cVar5 = CUtlBuffer::CheckPut(param_2,1);
if (cVar5 != '\0') {
*(undefined1 *)(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20)))
= 9;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f301;
CUtlBuffer::AddNullTermination(param_2);
}
}
}
LAB_0020f308:
uStackY_250 = 0x20f318;
cVar5 = CUtlBuffer::CheckPut(param_2,1);
puVar11 = &stack0xfffffdb4;
if (cVar5 != '\0') {
*(undefined1 *)(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) = 0
;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f338;
CUtlBuffer::AddNullTermination(param_2);
puVar11 = &stack0xfffffdb4;
}
}
else {
uStackY_250 = 0x20f130;
iVar12 = _V_stricmp(param_1,"banlist");
if (iVar12 == 0) {
uVar7 = 1;
uStackY_250 = 0x20f351;
GetUserBanList(this,param_2);
goto LAB_0020f073;
}
uStackY_250 = 0x20f148;
iVar12 = _V_stricmp(param_1,"playerlist");
if (iVar12 == 0) {
uVar7 = 1;
uStackY_250 = 0x20f367;
GetPlayerList(this,param_2);
puVar11 = &stack0xfffffdb4;
goto LAB_0020f073;
}
uStackY_250 = 0x20f160;
iVar12 = _V_stricmp(param_1,"maplist");
if (iVar12 == 0) {
uVar7 = 1;
uStackY_250 = 0x20f37d;
GetMapList(this,param_2);
puVar11 = &stack0xfffffdb4;
goto LAB_0020f073;
}
uStackY_250 = 0x20f178;
iVar12 = _V_stricmp(param_1,"uptime");
if (iVar12 == 0) {
uStackY_250 = 0x20f387;
lVar13 = (longdouble)Plat_FloatTime();
local_234 = (double)lVar13;
if (((byte)param_2[0x15] & 1) == 0) {
uStackY_250 = 0x20f590;
local_22c = (int)lVar13;
cVar5 = CUtlBuffer::CheckPut(param_2,4);
if (cVar5 != '\0') {
if (((byte)param_2[0x34] & 1) == 0) {
*(int *)(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) =
(int)lVar13;
}
else {
pvVar10 = (void *)((*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20)) +
*(int *)param_2);
if (pvVar10 != (void *)0x0) {
local_228 = local_22c._3_1_;
local_227 = local_22c._2_1_;
local_226 = local_22c._1_1_;
local_225 = (undefined1)local_22c;
uStackY_250 = 0x20f612;
_V_memcpy(pvVar10,&local_228,4);
}
}
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 4;
uStackY_250 = 0x20f5b5;
CUtlBuffer::AddNullTermination(param_2);
}
}
else {
uStackY_250 = 0x20f3b7;
CUtlBuffer::Printf(param_2,"%d");
}
if (((((byte)param_2[0x15] & 1) != 0) && (*(int *)(param_2 + 0x10) != 0)) &&
(*(char *)(*(int *)param_2 + ((*(int *)(param_2 + 0x10) + -1) - *(int *)(param_2 + 0x20))
) == '\n')) {
iVar12 = 0;
if (((byte)param_2[0x15] & 0x10) == 0) {
iVar12 = *(int *)(param_2 + 0x18);
}
while (iVar12 = iVar12 + -1, -1 < iVar12) {
uStackY_250 = 0x20f409;
cVar5 = CUtlBuffer::CheckPut(param_2,1);
if (cVar5 != '\0') {
*(undefined1 *)
(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) = 9;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f425;
CUtlBuffer::AddNullTermination(param_2);
}
}
}
goto LAB_0020f058;
}
uStackY_250 = 0x20f190;
iVar12 = _V_stricmp(param_1,"ipaddress");
if (iVar12 == 0) {
uStackY_250 = 0x20f434;
uVar9 = NET_GetUDPPort(DAT_003b7f68);
uStackY_250 = 0x20f44b;
local_240[0] = netadr_s::ToString((netadr_s *)&net_local_adr,true);
uStackY_250 = 0x20f471;
local_240[1] = uVar9 & 0xffff;
V_snprintf(local_220,0x19,"%s:%i");
uStackY_250 = 0x20f47d;
CUtlBuffer::PutString(param_2,local_220);
if (((((byte)param_2[0x15] & 1) != 0) && (*(int *)(param_2 + 0x10) != 0)) &&
(*(char *)(*(int *)param_2 + ((*(int *)(param_2 + 0x10) + -1) - *(int *)(param_2 + 0x20))
) == '\n')) {
iVar12 = 0;
if (((byte)param_2[0x15] & 0x10) == 0) {
iVar12 = *(int *)(param_2 + 0x18);
}
while (iVar12 = iVar12 + -1, -1 < iVar12) {
uStackY_250 = 0x20f4c8;
cVar5 = CUtlBuffer::CheckPut(param_2,1);
if (cVar5 != '\0') {
*(undefined1 *)
(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) = 9;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f4e4;
CUtlBuffer::AddNullTermination(param_2);
}
}
}
goto LAB_0020f308;
}
uStackY_250 = 0x20f1a8;
iVar12 = _V_stricmp(param_1,"mapcycle");
if (iVar12 != 0) {
if (((((byte)param_2[0x15] & 1) != 0) && (*(int *)(param_2 + 0x10) != 0)) &&
(*(char *)(*(int *)param_2 + ((*(int *)(param_2 + 0x10) + -1) - *(int *)(param_2 + 0x20))
) == '\n')) {
iVar12 = 0;
if (((byte)param_2[0x15] & 0x10) == 0) {
iVar12 = *(int *)(param_2 + 0x18);
}
while (iVar12 = iVar12 + -1, -1 < iVar12) {
uStackY_250 = 0x20f523;
cVar5 = CUtlBuffer::CheckPut(param_2,1);
if (cVar5 != '\0') {
*(undefined1 *)
(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) = 9;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f53f;
CUtlBuffer::AddNullTermination(param_2);
}
}
}
uStackY_250 = 0x20f551;
uVar7 = CUtlBuffer::CheckPut(param_2,1);
puVar11 = &stack0xfffffdb4;
if ((char)uVar7 != '\0') {
uVar7 = 0;
*(undefined1 *)(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) =
0;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f575;
CUtlBuffer::AddNullTermination(param_2);
puVar11 = &stack0xfffffdb4;
}
goto LAB_0020f073;
}
uStackY_250 = 0x20f1c6;
ConVarRef::ConVarRef(&local_228,"mapcyclefile");
uStackY_250 = 0x20f1ce;
uVar7 = ConVarRef::IsValid(&local_228);
puVar11 = &stack0xfffffdb4;
if ((char)uVar7 == '\0') goto LAB_0020f06e;
local_240[0] = 0;
uStackY_250 = 0x20f206;
iVar12 = (**(code **)(*(int *)(g_pFileSystem + 4) + 8))();
puVar11 = &stack0xfffffdb4;
if (iVar12 == 0) goto LAB_0020f073;
uStackY_250 = 0x20f225;
iVar8 = (**(code **)(*(int *)(g_pFileSystem + 4) + 0x18))();
iVar4 = -((iVar8 + 0x10U & 0xfffffff0) + 0x10);
iVar1 = (int)&local_234 + iVar4 + 4;
if (iVar8 == 0) {
LAB_0020f241:
*(undefined1 **)(&stack0xfffffdb8 + iVar4) = &DAT_002c79d4;
}
else {
local_234 = (double)CONCAT44(local_234._4_4_,iVar8);
puVar3 = *(undefined4 **)(g_pFileSystem + 4);
*(int *)(&stack0xfffffdbc + iVar4) = iVar8;
*(int *)((int)local_240 + iVar4) = iVar12;
*(int *)(&stack0xfffffdb8 + iVar4) = iVar1;
*(int *)(&stack0xfffffdb4 + iVar4) = g_pFileSystem + 4;
pcVar2 = (code *)*puVar3;
*(undefined4 *)((int)&uStackY_250 + iVar4) = 0x20f63b;
iVar8 = (*pcVar2)();
if (iVar8 == 0) goto LAB_0020f241;
*(undefined1 *)(iVar1 + (int)local_234) = 0;
*(int *)(&stack0xfffffdb8 + iVar4) = iVar1;
}
*(CUtlBuffer **)(&stack0xfffffdb4 + iVar4) = param_2;
*(undefined4 *)((int)&uStackY_250 + iVar4) = 0x20f251;
CUtlBuffer::PutString
(*(CUtlBuffer **)(&stack0xfffffdb4 + iVar4),*(char **)(&stack0xfffffdb8 + iVar4));
*(undefined4 *)(&stack0xfffffdb8 + iVar4) = 0;
*(CUtlBuffer **)(&stack0xfffffdb4 + iVar4) = param_2;
*(undefined4 *)((int)&uStackY_250 + iVar4) = 0x20f261;
CUtlBuffer::PutChar(*(CUtlBuffer **)(&stack0xfffffdb4 + iVar4),(&stack0xfffffdb8)[iVar4]);
iVar1 = *(int *)(g_pFileSystem + 4);
*(int *)(&stack0xfffffdb8 + iVar4) = iVar12;
*(int *)(&stack0xfffffdb4 + iVar4) = g_pFileSystem + 4;
pcVar2 = *(code **)(iVar1 + 0xc);
*(undefined4 *)((int)&uStackY_250 + iVar4) = 0x20f276;
(*pcVar2)();
puVar11 = &stack0xfffffdb4 + iVar4;
}
}
else {
uStackY_250 = 0x20f050;
CUtlBuffer::PutString(param_2,pcVar6);
if (((((byte)param_2[0x15] & 1) != 0) && (*(int *)(param_2 + 0x10) != 0)) &&
(*(char *)(*(int *)param_2 + ((*(int *)(param_2 + 0x10) + -1) - *(int *)(param_2 + 0x20))) ==
'\n')) {
iVar12 = 0;
if (((byte)param_2[0x15] & 0x10) == 0) {
iVar12 = *(int *)(param_2 + 0x18);
}
while (iVar12 = iVar12 + -1, -1 < iVar12) {
uStackY_250 = 0x20f0c5;
cVar5 = CUtlBuffer::CheckPut(param_2,1);
if (cVar5 != '\0') {
*(undefined1 *)(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) =
9;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f0e1;
CUtlBuffer::AddNullTermination(param_2);
}
}
}
LAB_0020f058:
uStackY_250 = 0x20f068;
uVar7 = CUtlBuffer::CheckPut(param_2,1);
puVar11 = &stack0xfffffdb4;
if ((char)uVar7 != '\0') {
*(undefined1 *)(*(int *)param_2 + (*(int *)(param_2 + 0x10) - *(int *)(param_2 + 0x20))) = 0;
*(int *)(param_2 + 0x10) = *(int *)(param_2 + 0x10) + 1;
uStackY_250 = 0x20f100;
CUtlBuffer::AddNullTermination(param_2);
puVar11 = &stack0xfffffdb4;
goto LAB_0020f073;
}
}
LAB_0020f06e:
uVar7 = 1;
LAB_0020f073:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return uVar7;
}
/* WARNING: Subroutine does not return */
*(undefined4 *)(puVar11 + -4) = 0x20f619;
__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.