Unserialize
0x00bf46a0 · 1130 bytes · __cdecl
_Z11UnserializeR10CUtlBufferR15CUtlBinaryBlock
Decompiled
undefined (2 params)
/* Unserialize(CUtlBuffer&, CUtlBinaryBlock&) */
undefined4 Unserialize(CUtlBuffer *param_1,CUtlBinaryBlock *param_2)
{
undefined4 uVar1;
char cVar2;
byte bVar3;
int *piVar4;
int iVar5;
uint uVar6;
byte bVar7;
bool bVar8;
char cVar9;
int iVar10;
uint uVar11;
char local_35;
int local_34;
int local_30;
int local_24;
undefined4 local_20;
if (((byte)param_1[0x15] & 1) != 0) {
uVar1 = *(undefined4 *)(param_1 + 0xc);
iVar10 = 0;
CUtlBuffer::EatWhiteSpace(param_1);
local_30 = *(int *)(param_1 + 0xc);
if (param_1[0x14] == (CUtlBuffer)0x0) {
do {
if (((byte)param_1[0x15] & 1) == 0) {
bVar8 = true;
cVar2 = CUtlBuffer::CheckGet(param_1,1);
if (cVar2 != '\0') {
bVar3 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20))
);
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
goto LAB_00bf4817;
}
}
else {
local_20 = local_20 & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%c",&local_20);
bVar3 = (byte)local_20;
LAB_00bf4817:
bVar8 = 5 < (byte)((bVar3 & 0xdf) + 0xbf) && 9 < (byte)(bVar3 - 0x30);
}
if (((byte)param_1[0x15] & 1) == 0) {
cVar2 = CUtlBuffer::CheckGet(param_1,1);
bVar7 = 0xbf;
bVar3 = 0xd0;
if (cVar2 != '\0') {
bVar7 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20))
);
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
bVar3 = bVar7 - 0x30;
bVar7 = (bVar7 & 0xdf) + 0xbf;
}
}
else {
local_20 = local_20 & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%c",&local_20);
bVar3 = (byte)local_20 - 0x30;
bVar7 = ((byte)local_20 & 0xdf) + 0xbf;
}
if ((bVar8) || ((5 < bVar7 && (9 < bVar3)))) break;
iVar10 = iVar10 + 1;
CUtlBuffer::EatWhiteSpace(param_1);
local_30 = *(int *)(param_1 + 0xc);
} while (param_1[0x14] == (CUtlBuffer)0x0);
}
else {
iVar10 = 0;
}
CUtlBuffer::SeekGet(param_1,0,uVar1);
CUtlBuffer::EatWhiteSpace(param_1);
CUtlBinaryBlock::SetLength(param_2,iVar10);
local_34 = 0;
iVar10 = *(int *)(param_1 + 0xc);
do {
if (local_30 <= iVar10) {
return 1;
}
if (((byte)param_1[0x15] & 1) == 0) {
cVar2 = CUtlBuffer::CheckGet(param_1,1);
if (cVar2 == '\0') {
uVar11 = 0xffffffd0;
iVar10 = 0;
local_35 = '\0';
}
else {
local_35 = *(char *)(*(int *)param_1 +
(*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
iVar10 = (int)local_35;
uVar11 = iVar10 - 0x30;
}
}
else {
local_20 = local_20 & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%c",&local_20);
iVar10 = (int)(char)(byte)local_20;
local_35 = (byte)local_20;
uVar11 = iVar10 - 0x30;
}
if (((byte)param_1[0x15] & 1) == 0) {
cVar2 = CUtlBuffer::CheckGet(param_1,1);
if (cVar2 == '\0') {
uVar6 = 0xffffffd0;
iVar5 = 0;
cVar2 = '\0';
}
else {
cVar2 = *(char *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
iVar5 = (int)cVar2;
uVar6 = iVar5 - 0x30;
}
}
else {
local_20 = local_20 & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%c",&local_20);
iVar5 = (int)(char)(byte)local_20;
uVar6 = iVar5 - 0x30;
cVar2 = (byte)local_20;
}
if (uVar11 < 10) {
cVar9 = local_35 + -0x30;
LAB_00bf48d7:
if (9 < uVar6) goto LAB_00bf49a2;
LAB_00bf48e0:
bVar3 = cVar2 - 0x30;
}
else {
if (5 < iVar10 - 0x41U) {
cVar9 = -1;
if (iVar10 - 0x61U < 6) {
cVar9 = local_35 + -0x57;
}
goto LAB_00bf48d7;
}
cVar9 = local_35 + -0x37;
if (uVar6 < 10) goto LAB_00bf48e0;
LAB_00bf49a2:
if (iVar5 - 0x41U < 6) {
bVar3 = cVar2 - 0x37;
}
else {
if (5 < iVar5 - 0x61U) {
return 0;
}
bVar3 = cVar2 + 0xa9;
}
}
if ((bVar3 == 0xff) || (cVar9 == -1)) {
return 0;
}
*(byte *)(*(int *)param_2 + local_34) = cVar9 << 4 | bVar3;
CUtlBuffer::EatWhiteSpace(param_1);
local_34 = local_34 + 1;
iVar10 = *(int *)(param_1 + 0xc);
} while( true );
}
cVar2 = CUtlBuffer::CheckGet(param_1,4);
iVar10 = 0;
if (cVar2 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar10 = *(int *)(param_1 + 0xc);
local_24 = *(int *)(*(int *)param_1 + (iVar10 - *(int *)(param_1 + 0x20)));
}
else {
piVar4 = (int *)((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (piVar4 == (int *)0x0) {
piVar4 = &local_24;
}
local_20 = local_24;
local_20 = CONCAT31((int3)((uint)local_24 >> 8),*(undefined1 *)((int)piVar4 + 3));
local_20._2_2_ = (undefined2)((uint)local_24 >> 0x10);
local_20._0_2_ = CONCAT11(*(undefined1 *)((int)piVar4 + 2),*(undefined1 *)((int)piVar4 + 3));
local_20._3_1_ = (undefined1)((uint)local_24 >> 0x18);
local_20._0_3_ = CONCAT12(*(undefined1 *)((int)piVar4 + 1),(undefined2)local_20);
local_20 = CONCAT13((char)*piVar4,(undefined3)local_20);
_V_memcpy(&local_24,&local_20,4);
iVar10 = *(int *)(param_1 + 0xc);
}
*(int *)(param_1 + 0xc) = iVar10 + 4;
iVar10 = local_24;
}
CUtlBinaryBlock::SetLength(param_2,iVar10);
iVar5 = 0;
if (*(int *)(param_2 + 0xc) == 0) {
if (iVar10 == 0) {
LAB_00bf4b00:
return CONCAT31((int3)((uint)iVar5 >> 8),param_1[0x14] == (CUtlBuffer)0x0);
}
}
else {
CUtlBuffer::Get(param_1,*(void **)param_2,*(int *)(param_2 + 0xc));
iVar5 = *(int *)(param_2 + 0xc);
if (iVar10 == iVar5) goto LAB_00bf4b00;
}
CUtlBuffer::SeekGet(param_1,1,iVar10 - iVar5);
return 0;
}
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.