CPureServerWhitelist::DecodeCommandList
0x001d7fc0 · 816 bytes · __thiscall
_ZN20CPureServerWhitelist17DecodeCommandListER8CUtlDictIPNS_8CCommandEiER10CUtlBuffer
Decompiled
undefined (3 params)
/* CPureServerWhitelist::DecodeCommandList(CUtlDict<CPureServerWhitelist::CCommand*, int>&,
CUtlBuffer&) */
void __thiscall
CPureServerWhitelist::DecodeCommandList
(CPureServerWhitelist *this,CUtlDict *param_1,CUtlBuffer *param_2)
{
byte bVar1;
CCommand *pCVar2;
CCommand CVar3;
char cVar4;
int iVar5;
undefined2 *puVar6;
undefined4 *puVar7;
CCommand CVar8;
undefined2 uVar9;
CCommand *pCVar10;
int in_GS_OFFSET;
CCommand *local_144;
undefined2 local_12e;
undefined4 local_12c;
undefined4 local_128;
char local_124 [260];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (((byte)param_2[0x15] & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet(param_2,4);
if (cVar4 == '\0') goto LAB_001d81e0;
if (((byte)param_2[0x34] & 1) == 0) {
iVar5 = *(int *)(param_2 + 0xc);
local_144 = *(CCommand **)(*(int *)param_2 + (iVar5 - *(int *)(param_2 + 0x20)));
}
else {
puVar7 = (undefined4 *)
((*(int *)(param_2 + 0xc) - *(int *)(param_2 + 0x20)) + *(int *)param_2);
if (puVar7 == (undefined4 *)0x0) {
puVar7 = &local_12c;
}
local_128 = local_12c;
local_128 = (CCommand *)
CONCAT31((int3)((uint)local_12c >> 8),*(undefined1 *)((int)puVar7 + 3));
local_128._2_2_ = (undefined2)((uint)local_12c >> 0x10);
local_128._0_2_ = CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
local_128._3_1_ = (undefined1)((uint)local_12c >> 0x18);
local_128._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_128);
local_128 = (CCommand *)CONCAT13(*(undefined1 *)puVar7,(undefined3)local_128);
_V_memcpy(&local_12c,&local_128,4);
iVar5 = *(int *)(param_2 + 0xc);
local_144 = local_12c;
}
*(int *)(param_2 + 0xc) = iVar5 + 4;
}
else {
local_12c = (CCommand *)0x0;
CUtlBuffer::Scanf(param_2,"%d",&local_12c);
local_144 = local_12c;
}
if (0 < (int)local_144) {
pCVar10 = (CCommand *)0x0;
do {
local_128 = operator_new(4);
if (((byte)param_2[0x15] & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet(param_2,1);
CVar8 = (CCommand)0x0;
CVar3 = (CCommand)0x0;
if (cVar4 != '\0') {
bVar1 = *(byte *)(*(int *)param_2 + (*(int *)(param_2 + 0xc) - *(int *)(param_2 + 0x20)));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
CVar3 = (CCommand)(bVar1 & 1);
CVar8 = (CCommand)(bVar1 >> 1 & 1);
}
}
else {
local_12c = (CCommand *)((uint)local_12c & 0xffffff00);
CUtlBuffer::Scanf(param_2,"%u",&local_12c);
CVar3 = (CCommand)((byte)local_12c & 1);
CVar8 = (CCommand)((byte)local_12c >> 1 & 1);
}
pCVar2 = local_128;
*local_128 = CVar3;
local_128[1] = CVar8;
if (((byte)param_2[0x15] & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet(param_2,2);
uVar9 = 0;
if (cVar4 != '\0') {
if (((byte)param_2[0x34] & 1) == 0) {
iVar5 = *(int *)(param_2 + 0xc);
uVar9 = *(undefined2 *)(*(int *)param_2 + (iVar5 - *(int *)(param_2 + 0x20)));
}
else {
puVar6 = (undefined2 *)
((*(int *)(param_2 + 0xc) - *(int *)(param_2 + 0x20)) + *(int *)param_2);
if (puVar6 == (undefined2 *)0x0) {
puVar6 = &local_12e;
}
uVar9 = local_12c._2_2_;
local_12c = (CCommand *)CONCAT22(local_12c._2_2_,local_12e);
local_12c = (CCommand *)CONCAT31(local_12c._1_3_,*(undefined1 *)((int)puVar6 + 1));
local_12c = (CCommand *)
CONCAT22(uVar9,CONCAT11(*(undefined1 *)puVar6,
*(undefined1 *)((int)puVar6 + 1)));
_V_memcpy(&local_12e,&local_12c,2);
iVar5 = *(int *)(param_2 + 0xc);
uVar9 = local_12e;
}
*(int *)(param_2 + 0xc) = iVar5 + 2;
}
}
else {
local_12e = 0;
CUtlBuffer::Scanf(param_2,"%u",&local_12e);
uVar9 = local_12e;
}
pCVar10 = pCVar10 + 1;
*(undefined2 *)(pCVar2 + 2) = uVar9;
CUtlBuffer::GetString(param_2,local_124,0x104);
V_FixSlashes(local_124,'/');
CUtlDict<CPureServerWhitelist::CCommand*,int>::Insert
((CUtlDict<CPureServerWhitelist::CCommand*,int> *)param_1,local_124,
(CCommand **)&local_128);
} while (pCVar10 != local_144);
}
LAB_001d81e0:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.