DataTable_ParseClassInfosFromBuffer
0x00144a40 · 996 bytes · __cdecl
_Z35DataTable_ParseClassInfosFromBufferP12CClientStateP7bf_read
Decompiled
undefined (2 params)
/* DataTable_ParseClassInfosFromBuffer(CClientState*, bf_read*) */
undefined4 DataTable_ParseClassInfosFromBuffer(CClientState *param_1,bf_read *param_2)
{
int iVar1;
undefined4 *puVar2;
uint uVar3;
short sVar4;
ushort uVar5;
uint *puVar6;
undefined4 uVar7;
uint uVar8;
int iVar9;
C_ServerClassInfo *this;
C_ServerClassInfo *pCVar10;
byte local_28;
uint local_24;
C_ServerClassInfo *local_20;
pCVar10 = *(C_ServerClassInfo **)(param_1 + 0x41c4);
if (pCVar10 != (C_ServerClassInfo *)0x0) {
this = pCVar10 + *(int *)(pCVar10 + -4) * 0x10;
if (pCVar10 != this) {
do {
this = this + -0x10;
C_ServerClassInfo::~C_ServerClassInfo(this);
pCVar10 = *(C_ServerClassInfo **)(param_1 + 0x41c4);
} while (pCVar10 != this);
}
operator_delete__(pCVar10 + -4);
}
iVar9 = *(int *)(param_2 + 0x14);
if (iVar9 < 0x10) {
puVar6 = *(uint **)(param_2 + 0x18);
uVar7 = *(undefined4 *)(param_2 + 0x10);
if (puVar6 == *(uint **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar6 + 1;
param_2[4] = (bf_read)0x1;
}
else if (*(uint **)(param_2 + 0x1c) < puVar6) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar6 + 1;
uVar8 = *puVar6;
*(uint *)(param_2 + 0x10) = uVar8;
if (param_2[4] == (bf_read)0x0) {
uVar3 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar9];
*(int *)(param_2 + 0x14) = iVar9 + 0x10;
uVar5 = (ushort)((uVar3 & uVar8) << ((byte)iVar9 & 0x1f)) | (ushort)uVar7;
*(uint *)(param_2 + 0x10) = uVar8 >> ((byte)(0x10 - iVar9) & 0x1f);
goto LAB_00144abb;
}
}
iVar9 = -1;
local_24 = 0;
*(undefined4 *)(param_1 + 0x41c8) = 0;
uVar8 = 4;
LAB_00144b36:
puVar6 = operator_new__(uVar8);
pCVar10 = (C_ServerClassInfo *)(puVar6 + 1);
*puVar6 = local_24;
local_20 = pCVar10;
if (iVar9 == -1) goto LAB_00144b6b;
}
else {
*(int *)(param_2 + 0x14) = iVar9 + -0x10;
uVar5 = (ushort)*(uint *)(param_2 + 0x10);
if (iVar9 + -0x10 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
}
else if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
}
else {
*(uint *)(param_2 + 0x10) = *(uint *)(param_2 + 0x10) >> 0x10;
}
LAB_00144abb:
local_24 = (uint)(short)uVar5;
*(uint *)(param_1 + 0x41c8) = local_24;
if (local_24 < 0x7f00001) {
iVar9 = local_24 - 1;
uVar8 = local_24 * 0x10 + 4;
goto LAB_00144b36;
}
iVar9 = local_24 - 1;
puVar6 = operator_new__(0xffffffff);
pCVar10 = (C_ServerClassInfo *)(puVar6 + 1);
*puVar6 = local_24;
local_20 = pCVar10;
}
do {
/* try { // try from 00144b5b to 00144b5f has its CatchHandler @ 00144e61 */
C_ServerClassInfo::C_ServerClassInfo(pCVar10);
iVar9 = iVar9 + -1;
pCVar10 = pCVar10 + 0x10;
} while (iVar9 != -1);
LAB_00144b6b:
*(C_ServerClassInfo **)(param_1 + 0x41c4) = local_20;
if (local_20 == (C_ServerClassInfo *)0x0) {
Host_EndGame(true,"CL_ParseClassInfo: can\'t allocate %d C_ServerClassInfos.\n",
*(undefined4 *)(param_1 + 0x41c8));
uVar7 = 0;
}
else {
if (0 < *(int *)(param_1 + 0x41c8)) {
local_20 = (C_ServerClassInfo *)0x0;
do {
iVar9 = *(int *)(param_2 + 0x14);
if (iVar9 < 0x10) {
uVar7 = *(undefined4 *)(param_2 + 0x10);
puVar6 = *(uint **)(param_2 + 0x18);
if (puVar6 == *(uint **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(uint **)(param_2 + 0x18) = puVar6 + 1;
*(undefined4 *)(param_2 + 0x10) = 0;
param_2[4] = (bf_read)0x1;
}
else if (*(uint **)(param_2 + 0x1c) < puVar6) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar6 + 1;
uVar8 = *puVar6;
*(uint *)(param_2 + 0x10) = uVar8;
if (param_2[4] == (bf_read)0x0) {
uVar3 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar9];
*(int *)(param_2 + 0x14) = iVar9 + 0x10;
local_28 = (byte)(0x10 - iVar9);
*(uint *)(param_2 + 0x10) = uVar8 >> (local_28 & 0x1f);
iVar9 = (int)(short)((ushort)((uVar3 & uVar8) << ((byte)iVar9 & 0x1f)) | (ushort)uVar7
);
goto LAB_00144bbf;
}
}
iVar9 = 0;
if (*(int *)(param_1 + 0x41c8) < 1) {
LAB_00144c64:
Host_EndGame(true,"DataTable_ParseClassInfosFromBuffer: invalid class index (%d).\n",
iVar9);
return 0;
}
}
else {
*(int *)(param_2 + 0x14) = iVar9 + -0x10;
sVar4 = (short)*(uint *)(param_2 + 0x10);
if (iVar9 + -0x10 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
iVar9 = (int)sVar4;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
}
else if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
iVar9 = (int)sVar4;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
iVar9 = (int)sVar4;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
}
else {
iVar9 = (int)sVar4;
*(uint *)(param_2 + 0x10) = *(uint *)(param_2 + 0x10) >> 0x10;
}
LAB_00144bbf:
if (*(int *)(param_1 + 0x41c8) <= iVar9) goto LAB_00144c64;
}
iVar1 = *(int *)(param_1 + 0x41c4);
uVar7 = CBitRead::ReadAndAllocateString((CBitRead *)param_2,(bool *)0x0);
*(undefined4 *)(iVar9 * 0x10 + iVar1 + 4) = uVar7;
iVar1 = *(int *)(param_1 + 0x41c4);
uVar7 = CBitRead::ReadAndAllocateString((CBitRead *)param_2,(bool *)0x0);
local_20 = (C_ServerClassInfo *)((int)local_20 + 1);
*(undefined4 *)(iVar9 * 0x10 + iVar1 + 8) = uVar7;
} while ((int)local_20 < *(int *)(param_1 + 0x41c8));
}
uVar7 = 1;
}
return uVar7;
}
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.