CDmxSerializerKeyValues2::SerializeAttributes
0x00bec1b0 · 1115 bytes · __thiscall
_ZN24CDmxSerializerKeyValues219SerializeAttributesER10CUtlBufferR27CDmxSerializationDictionaryP11CDmxElement
Decompiled
undefined (4 params)
/* CDmxSerializerKeyValues2::SerializeAttributes(CUtlBuffer&, CDmxSerializationDictionary&,
CDmxElement*) */
undefined4 __thiscall
CDmxSerializerKeyValues2::SerializeAttributes
(CDmxSerializerKeyValues2 *this,CUtlBuffer *param_1,CDmxSerializationDictionary *param_2,
CDmxElement *param_3)
{
int *piVar1;
undefined *puVar2;
int iVar3;
CDmxSerializationDictionary *pCVar4;
CDmxSerializerKeyValues2 *pCVar5;
int iVar6;
CUtlBuffer *pCVar7;
char cVar8;
int iVar9;
undefined4 uVar10;
int in_GS_OFFSET;
size_t sStack_60;
CDmxSerializationDictionary *local_40;
CDmxSerializerKeyValues2 *local_3c;
int local_38;
int local_34;
CUtlBuffer *local_30;
int local_20;
local_3c = this;
local_40 = param_2;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
sStack_60 = 0xbec1de;
iVar9 = CDmxElement::AttributeCount(param_3);
local_34 = iVar9;
iVar3 = -((iVar9 * 4 + 0xfU & 0xfffffff0) + 0x10);
local_38 = (int)&local_40 + iVar3;
if (iVar9 < 1) {
*(code **)(&stack0xffffffb0 + iVar3) = SortAttributeByName;
*(undefined4 *)(&stack0xffffffac + iVar3) = 4;
*(int *)(&stack0xffffffa8 + iVar3) = iVar9;
*(int *)(&stack0xffffffa4 + iVar3) = local_38;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec617;
qsort(*(void **)(&stack0xffffffa4 + iVar3),*(size_t *)(&stack0xffffffa8 + iVar3),
*(size_t *)(&stack0xffffffac + iVar3),*(__compar_fn_t *)(&stack0xffffffb0 + iVar3));
}
else {
local_30 = param_1;
iVar9 = 0;
do {
*(int *)(&stack0xffffffa8 + iVar3) = iVar9;
*(CDmxElement **)(&stack0xffffffa4 + iVar3) = param_3;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec21c;
uVar10 = CDmxElement::GetAttribute
(*(CDmxElement **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
iVar6 = local_34;
*(undefined4 *)((int)&local_40 + iVar3 + iVar9 * 4) = uVar10;
iVar9 = iVar9 + 1;
} while (iVar9 != local_34);
*(code **)(&stack0xffffffb0 + iVar3) = SortAttributeByName;
pCVar7 = local_30;
*(undefined4 *)(&stack0xffffffac + iVar3) = 4;
*(int *)(&stack0xffffffa8 + iVar3) = iVar6;
*(int *)(&stack0xffffffa4 + iVar3) = local_38;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec24e;
qsort(*(void **)(&stack0xffffffa4 + iVar3),*(size_t *)(&stack0xffffffa8 + iVar3),
*(size_t *)(&stack0xffffffac + iVar3),*(__compar_fn_t *)(&stack0xffffffb0 + iVar3));
local_30 = (CUtlBuffer *)0x0;
do {
piVar1 = *(int **)(local_38 + (int)local_30 * 4);
*(int **)(&stack0xffffffa4 + iVar3) = piVar1;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec269;
uVar10 = CDmxAttribute::GetName(*(CDmxAttribute **)(&stack0xffffffa4 + iVar3));
iVar9 = *piVar1;
if (iVar9 == 1) {
*(undefined4 *)(&stack0xffffffac + iVar3) = uVar10;
*(char **)(&stack0xffffffa8 + iVar3) = "\"%s\" ";
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec394;
CUtlBuffer::Printf(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(char **)(&stack0xffffffa8 + iVar3));
pCVar4 = local_40;
*(int **)(&stack0xffffffb0 + iVar3) = piVar1;
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
*(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3) = pCVar4;
*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3) = local_3c;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3ae;
SerializeElementAttribute
(*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3),
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3),
*(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3),
*(CDmxAttribute **)(&stack0xffffffb0 + iVar3));
}
else {
puVar2 = (&g_pAttributeTypeName)[iVar9];
*(undefined4 *)(&stack0xffffffac + iVar3) = uVar10;
*(undefined **)(&stack0xffffffa8 + iVar3) = &DAT_00d57980;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined **)(&stack0xffffffb0 + iVar3) = puVar2;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec293;
CUtlBuffer::Printf(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(char **)(&stack0xffffffa8 + iVar3));
pCVar5 = local_3c;
pCVar4 = local_40;
if (iVar9 == 5) {
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
*(int **)(&stack0xffffffa4 + iVar3) = piVar1;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3e4;
CDmxAttribute::Serialize
(*(CDmxAttribute **)(&stack0xffffffa4 + iVar3),
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3));
}
else if (iVar9 == 0xf) {
*(int **)(&stack0xffffffb0 + iVar3) = piVar1;
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
*(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3) = pCVar4;
*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3) = local_3c;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec2bf;
SerializeElementArrayAttribute
(*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3),
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3),
*(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3),
*(CDmxAttribute **)(&stack0xffffffb0 + iVar3));
}
else if (iVar9 < 0xf) {
*(int **)(&stack0xffffffa4 + iVar3) = piVar1;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3f8;
cVar8 = CDmxAttribute::SerializesOnMultipleLines
(*(CDmxAttribute **)(&stack0xffffffa4 + iVar3));
if (cVar8 != '\0') {
if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
(*(char *)(*(int *)pCVar7 +
((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20))) == '\n')) {
iVar9 = 0;
if (((byte)pCVar7[0x15] & 0x10) == 0) {
iVar9 = *(int *)(pCVar7 + 0x18);
}
while (iVar9 = iVar9 + -1, -1 < iVar9) {
while( true ) {
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec595;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 == '\0') break;
*(undefined1 *)
(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 9;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec5b1;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
iVar9 = iVar9 + -1;
if (iVar9 < 0) goto LAB_00bec5c0;
}
}
}
LAB_00bec5c0:
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec5d0;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 != '\0') {
*(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20)))
= 10;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec5f0;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
}
}
if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
(*(char *)(*(int *)pCVar7 + ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20)))
== '\n')) {
iVar9 = 0;
if (((byte)pCVar7[0x15] & 0x10) == 0) {
iVar9 = *(int *)(pCVar7 + 0x18);
}
while (iVar9 = iVar9 + -1, -1 < iVar9) {
while( true ) {
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec445;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 == '\0') break;
*(undefined1 *)
(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 9;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec461;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
iVar9 = iVar9 + -1;
if (iVar9 < 0) goto LAB_00bec470;
}
}
}
LAB_00bec470:
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec480;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 != '\0') {
*(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) =
0x22;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec49c;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
}
*(int *)(pCVar7 + 0x18) = *(int *)(pCVar7 + 0x18) + 1;
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
*(int **)(&stack0xffffffa4 + iVar3) = piVar1;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec4ac;
CDmxAttribute::Serialize
(*(CDmxAttribute **)(&stack0xffffffa4 + iVar3),
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3));
iVar9 = *(int *)(pCVar7 + 0x18) + -1;
if (iVar9 < 0) {
iVar9 = 0;
}
*(int *)(pCVar7 + 0x18) = iVar9;
if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
(*(char *)(*(int *)pCVar7 + ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20)))
== '\n')) {
if (((byte)pCVar7[0x15] & 0x10) != 0) {
iVar9 = 0;
}
while (iVar9 = iVar9 + -1, -1 < iVar9) {
while( true ) {
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec4f5;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 == '\0') break;
*(undefined1 *)
(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 9;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec511;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
iVar9 = iVar9 + -1;
if (iVar9 < 0) goto LAB_00bec520;
}
}
}
LAB_00bec520:
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec530;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 != '\0') {
*(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) =
0x22;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec550;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
}
}
else {
*(int **)(&stack0xffffffac + iVar3) = piVar1;
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3) = pCVar5;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3d0;
SerializeArrayAttribute
(*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3),
*(CUtlBuffer **)(&stack0xffffffa8 + iVar3),
*(CDmxAttribute **)(&stack0xffffffac + iVar3));
}
}
if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
(*(char *)(*(int *)pCVar7 + ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20))) ==
'\n')) {
iVar9 = 0;
if (((byte)pCVar7[0x15] & 0x10) == 0) {
iVar9 = *(int *)(pCVar7 + 0x18);
}
while (iVar9 = iVar9 + -1, -1 < iVar9) {
while( true ) {
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec2fd;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 == '\0') break;
*(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) =
9;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec319;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
iVar9 = iVar9 + -1;
if (iVar9 < 0) goto LAB_00bec320;
}
}
}
LAB_00bec320:
*(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec330;
cVar8 = CUtlBuffer::CheckPut
(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
*(int *)(&stack0xffffffa8 + iVar3));
if (cVar8 != '\0') {
*(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 10;
*(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
*(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
*(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec34c;
CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
}
local_30 = (CUtlBuffer *)((int)local_30 + 1);
} while (local_30 != (CUtlBuffer *)local_34);
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined **)((int)&sStack_60 + iVar3) = &UNK_00bec621;
__stack_chk_fail();
}
return 1;
}
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.