CDmxSerializerKeyValues2::UnserializeAttributeValueFromToken
0x00bec9f0 · 279 bytes · __thiscall
_ZN24CDmxSerializerKeyValues234UnserializeAttributeValueFromTokenEP13CDmxAttribute17DmAttributeType_tR10CUtlBuffer
Decompiled
undefined (4 params)
/* CDmxSerializerKeyValues2::UnserializeAttributeValueFromToken(CDmxAttribute*, DmAttributeType_t,
CUtlBuffer&) */
undefined4 __thiscall
CDmxSerializerKeyValues2::UnserializeAttributeValueFromToken
(undefined4 this,undefined4 param_1,int param_3,int *param_4)
{
int iVar1;
undefined4 uVar2;
int iVar3;
int *piVar4;
int in_GS_OFFSET;
int aiStack_80 [3];
int aiStack_74 [3];
int *local_68;
undefined4 local_64;
undefined4 uStack_60;
undefined1 local_58 [56];
int local_20;
local_64 = param_1;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
iVar3 = param_4[7];
local_68 = (int *)*param_4;
iVar1 = -((iVar3 + 0x10U & 0xfffffff0) + 0x10);
uStack_60._3_1_ = param_3 == 0x13 || param_3 == 5;
if ((bool)uStack_60._3_1_) {
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbecb05;
uVar2 = GetCStringCharConversion();
*(undefined4 *)((int)aiStack_80 + iVar1 + 4) = uVar2;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbecb0d;
SetSerializationDelimiter(*(CUtlCharConversion **)((int)aiStack_80 + iVar1 + 4));
piVar4 = local_68;
}
else {
local_68 = param_4;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbeca49;
uVar2 = GetCStringCharConversion();
piVar4 = local_68;
*(undefined4 *)((int)aiStack_74 + iVar1) = 1;
*(undefined4 *)((int)aiStack_80 + iVar1 + 8) = uVar2;
*(int **)((int)aiStack_80 + iVar1 + 4) = piVar4;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbeca60;
iVar3 = CUtlBuffer::PeekDelimitedStringLength
(*(CUtlBuffer **)((int)aiStack_80 + iVar1 + 4),
*(CUtlCharConversion **)((int)aiStack_80 + iVar1 + 8),
*(bool *)((int)aiStack_74 + iVar1));
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbeca67;
uVar2 = GetCStringCharConversion();
piVar4 = local_68;
*(int *)((int)aiStack_74 + iVar1 + 4) = iVar3 + 1;
*(int **)((int)aiStack_74 + iVar1) = (int *)((int)&uStack_60 + iVar1);
*(undefined4 *)((int)aiStack_80 + iVar1 + 8) = uVar2;
*(int **)((int)aiStack_80 + iVar1 + 4) = piVar4;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbeca81;
CUtlBuffer::GetDelimitedString
(*(CUtlBuffer **)((int)aiStack_80 + iVar1 + 4),
*(CUtlCharConversion **)((int)aiStack_80 + iVar1 + 8),
*(char **)((int)aiStack_74 + iVar1),*(int *)((int)aiStack_74 + iVar1 + 4));
piVar4 = (int *)((int)&uStack_60 + iVar1);
}
*(int **)((int)aiStack_80 + iVar1 + 8) = piVar4;
*(undefined4 *)((int)aiStack_74 + iVar1 + 4) = 9;
*(int *)((int)aiStack_74 + iVar1) = iVar3;
*(undefined1 **)((int)aiStack_80 + iVar1 + 4) = local_58;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbeca9c;
CUtlBuffer::CUtlBuffer
(*(CUtlBuffer **)((int)aiStack_80 + iVar1 + 4),*(void **)((int)aiStack_80 + iVar1 + 8),
*(int *)((int)aiStack_74 + iVar1),*(int *)((int)aiStack_74 + iVar1 + 4));
uVar2 = local_64;
*(undefined1 **)((int)aiStack_74 + iVar1) = local_58;
*(int *)((int)aiStack_80 + iVar1 + 8) = param_3;
*(undefined4 *)((int)aiStack_80 + iVar1 + 4) = uVar2;
if (param_3 < 0xf) {
/* try { // try from 00becaaf to 00becaf4 has its CatchHandler @ 00becb1a */
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbecab4;
uVar2 = CDmxAttribute::Unserialize();
}
else {
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbecaf5;
uVar2 = CDmxAttribute::UnserializeElement();
}
if (uStack_60._3_1_ != '\0') {
*(undefined4 *)((int)aiStack_80 + iVar1 + 4) = 0;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbecac8;
SetSerializationDelimiter(*(CUtlCharConversion **)((int)aiStack_80 + iVar1 + 4));
}
*(undefined1 **)((int)aiStack_80 + iVar1 + 4) = local_58;
*(undefined4 *)((int)aiStack_80 + iVar1) = 0xbecad0;
CUtlMemory<unsigned_char,int>::Purge
(*(CUtlMemory<unsigned_char,int> **)((int)aiStack_80 + iVar1 + 4));
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return uVar2;
}
/* WARNING: Subroutine does not return */
*(undefined1 **)((int)aiStack_80 + iVar1) = &LAB_00becb1a;
__stack_chk_fail();
}
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.