CPropData::ParsePropFromKV
0x00498230 · 2823 bytes · __thiscall
_ZN9CPropData15ParsePropFromKVEP11CBaseEntityP22IBreakableWithPropDataP9KeyValuesS5_
Decompiled
undefined (5 params)
/* WARNING: Removing unreachable block (ram,0x0049886a) */
/* WARNING: Removing unreachable block (ram,0x00498d56) */
/* CPropData::ParsePropFromKV(CBaseEntity*, IBreakableWithPropData*, KeyValues*, KeyValues*) */
uint __thiscall
CPropData::ParsePropFromKV
(CPropData *this,CBaseEntity *param_1,IBreakableWithPropData *param_2,KeyValues *param_3,
KeyValues *param_4)
{
code *pcVar1;
code *pcVar2;
undefined4 *puVar3;
uint *puVar4;
undefined *puVar5;
float fVar6;
char cVar7;
char *pcVar8;
int iVar9;
float *pfVar10;
int iVar11;
int iVar12;
int *piVar13;
int *piVar14;
uint uVar15;
undefined **ppuVar16;
longdouble lVar17;
int aiStack_68 [3];
int local_5c [2];
uint local_34;
char *local_30 [2];
float local_28;
float local_24;
float local_20 [4];
if (param_2 == (IBreakableWithPropData *)0x0) {
return 3;
}
pcVar8 = (char *)KeyValues::GetString(param_3,"base","");
local_34 = 0;
if (((pcVar8 != (char *)0x0) && (*pcVar8 != '\0')) &&
(local_34 = ParsePropFromBase(this,param_1,param_2,pcVar8), 1 < local_34)) {
return local_34;
}
lVar17 = (longdouble)KeyValues::GetFloat(param_3,"blockLOS",-1.0);
if ((int)lVar17 != -1) {
(**(code **)(*(int *)param_2 + 0x70))();
}
lVar17 = (longdouble)KeyValues::GetFloat(param_3,"AIWalkable",-1.0);
if ((int)lVar17 != -1) {
(**(code **)(*(int *)param_2 + 0x74))();
}
(**(code **)(*(int *)param_2 + 0x4c))();
piVar13 = (int *)&stack0xffffffb0;
if (local_30[0] == (char *)0x0) {
pcVar8 = (char *)KeyValues::GetString(param_3,"damage_table",(char *)0x0);
}
else {
(**(code **)(*(int *)param_2 + 0x4c))();
piVar13 = (int *)&stack0xffffffac;
pcVar8 = "";
if (local_30[0] != (char *)0x0) {
pcVar8 = local_30[0];
}
pcVar8 = (char *)KeyValues::GetString(param_3,"damage_table",pcVar8);
}
if ((pcVar8 == (char *)0x0) || (*pcVar8 == '\0')) {
pcVar1 = *(code **)(*(int *)param_2 + 0x48);
piVar13[1] = 0;
*piVar13 = (int)param_2;
piVar13[-1] = 0x498367;
(*pcVar1)();
}
else {
pcVar1 = *(code **)(*(int *)param_2 + 0x48);
piVar13[1] = (int)pcVar8;
*piVar13 = (int)local_30;
piVar13[-1] = 0x498bf1;
AllocPooledString((char *)*piVar13);
*piVar13 = (int)param_2;
piVar13[1] = (int)local_30[0];
piVar13[-1] = 0x498c00;
(*pcVar1)();
}
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 0x80);
*piVar13 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x84);
piVar13[-1] = 0x498378;
iVar9 = (*pcVar2)();
piVar13[1] = (int)"physicsmode";
piVar13[2] = iVar9;
*piVar13 = (int)param_3;
piVar13[-1] = 0x49838f;
iVar9 = KeyValues::GetInt((KeyValues *)*piVar13,(char *)piVar13[1],piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = iVar9;
piVar13[-1] = 0x498398;
(*pcVar1)();
piVar13[2] = 0;
piVar13[1] = (int)"multiplayer_break";
*piVar13 = (int)param_3;
piVar13[-1] = 0x4983b3;
pcVar8 = (char *)KeyValues::GetString((KeyValues *)*piVar13,(char *)piVar13[1],(char *)piVar13[2])
;
if (pcVar8 != (char *)0x0) {
if (pcVar8 == "server") {
LAB_004983dc:
iVar9 = 1;
}
else {
piVar13[1] = (int)"server";
*piVar13 = (int)pcVar8;
piVar13[-1] = 0x4983d1;
iVar9 = _V_stricmp((char *)*piVar13,(char *)piVar13[1]);
if (iVar9 == 0) goto LAB_004983dc;
if (pcVar8 == "client") {
LAB_00498c08:
iVar9 = 2;
}
else {
*piVar13 = (int)pcVar8;
piVar13[1] = (int)"client";
piVar13[-1] = 0x498af7;
iVar9 = _V_stricmp((char *)*piVar13,(char *)piVar13[1]);
if (iVar9 == 0) goto LAB_00498c08;
if (pcVar8 == "both") {
LAB_00498b22:
iVar9 = 3;
}
else {
piVar13[1] = (int)&DAT_00c19fe9;
*piVar13 = (int)pcVar8;
piVar13[-1] = 0x498b1a;
iVar9 = _V_stricmp((char *)*piVar13,(char *)piVar13[1]);
if (iVar9 == 0) goto LAB_00498b22;
iVar9 = 0;
}
}
}
iVar11 = *(int *)param_2;
piVar13[1] = iVar9;
*piVar13 = (int)param_2;
pcVar1 = *(code **)(iVar11 + 0x88);
piVar13[-1] = 0x4983f0;
(*pcVar1)();
}
puVar3 = *(undefined4 **)param_2;
pcVar1 = (code *)*puVar3;
*piVar13 = (int)param_2;
pcVar2 = (code *)puVar3[4];
piVar13[-1] = 0x4983fa;
lVar17 = (longdouble)(*pcVar2)();
piVar13[1] = (int)"dmg.bullets";
*piVar13 = (int)param_3;
piVar13[2] = (int)(float)lVar17;
piVar13[-1] = 0x49841b;
lVar17 = (longdouble)
KeyValues::GetFloat((KeyValues *)*piVar13,(char *)piVar13[1],(float)piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = (int)(float)lVar17;
piVar13[-1] = 0x49842e;
(*pcVar1)();
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 4);
*piVar13 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x14);
piVar13[-1] = 0x498439;
lVar17 = (longdouble)(*pcVar2)();
piVar13[1] = (int)"dmg.club";
*piVar13 = (int)param_3;
piVar13[2] = (int)(float)lVar17;
piVar13[-1] = 0x49845a;
lVar17 = (longdouble)
KeyValues::GetFloat((KeyValues *)*piVar13,(char *)piVar13[1],(float)piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = (int)(float)lVar17;
piVar13[-1] = 0x49846d;
(*pcVar1)();
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 8);
*piVar13 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x18);
piVar13[-1] = 0x498478;
lVar17 = (longdouble)(*pcVar2)();
piVar13[1] = (int)"dmg.explosive";
*piVar13 = (int)param_3;
piVar13[2] = (int)(float)lVar17;
piVar13[-1] = 0x498499;
lVar17 = (longdouble)
KeyValues::GetFloat((KeyValues *)*piVar13,(char *)piVar13[1],(float)piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = (int)(float)lVar17;
piVar13[-1] = 0x4984ac;
(*pcVar1)();
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 0xc);
*piVar13 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x1c);
piVar13[-1] = 0x4984b7;
lVar17 = (longdouble)(*pcVar2)();
piVar13[1] = (int)"dmg.fire";
*piVar13 = (int)param_3;
piVar13[2] = (int)(float)lVar17;
piVar13[-1] = 0x4984d8;
lVar17 = (longdouble)
KeyValues::GetFloat((KeyValues *)*piVar13,(char *)piVar13[1],(float)piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = (int)(float)lVar17;
piVar13[-1] = 0x4984eb;
(*pcVar1)();
if (*(char **)(param_1 + 0x7c) == "prop_physics_override") goto LAB_00498780;
piVar13[1] = (int)"prop_physics_override";
*piVar13 = (int)param_1;
piVar13[-1] = 0x49850b;
cVar7 = CBaseEntity::ClassMatchesComplex((CBaseEntity *)*piVar13,(char *)piVar13[1]);
if ((cVar7 != '\0') || (*(char **)(param_1 + 0x7c) == "prop_dynamic_override")) goto LAB_00498780;
piVar13[1] = (int)"prop_dynamic_override";
*piVar13 = (int)param_1;
piVar13[-1] = 0x498533;
cVar7 = CBaseEntity::ClassMatchesComplex((CBaseEntity *)*piVar13,(char *)piVar13[1]);
if (cVar7 != '\0') goto LAB_00498780;
iVar9 = *(int *)(param_1 + 0x100);
piVar13[1] = (int)"health";
piVar13[2] = iVar9;
*piVar13 = (int)param_3;
piVar13[-1] = 0x49855b;
iVar9 = KeyValues::GetInt((KeyValues *)*piVar13,(char *)piVar13[1],piVar13[2]);
if (iVar9 != *(int *)(param_1 + 0x100)) {
iVar11 = *(int *)param_1;
*piVar13 = (int)param_1;
piVar13[1] = (int)(param_1 + 0x100);
pcVar1 = *(code **)(iVar11 + 0x214);
piVar13[-1] = 0x498581;
(*pcVar1)();
*(int *)(param_1 + 0x100) = iVar9;
}
piVar13[2] = 0;
piVar13[1] = (int)"explosion_type";
*piVar13 = (int)param_3;
piVar13[-1] = 0x4985a8;
pcVar8 = (char *)KeyValues::GetString((KeyValues *)*piVar13,(char *)piVar13[1],(char *)piVar13[2])
;
if (pcVar8 != (char *)0x0) {
if (pcVar8 != "grenade") {
piVar13[1] = (int)"grenade";
*piVar13 = (int)pcVar8;
piVar13[-1] = 0x4985c6;
iVar9 = _V_stricmp((char *)*piVar13,(char *)piVar13[1]);
if (iVar9 != 0) {
if (pcVar8 != "molotov") {
*piVar13 = (int)pcVar8;
piVar13[1] = (int)"molotov";
piVar13[-1] = 0x498c6d;
iVar9 = _V_stricmp((char *)*piVar13,(char *)piVar13[1]);
if (iVar9 != 0) {
if (pcVar8 != "fireworks") {
piVar13[1] = (int)"fireworks";
*piVar13 = (int)pcVar8;
piVar13[-1] = 0x498c90;
iVar9 = _V_stricmp((char *)*piVar13,(char *)piVar13[1]);
if (iVar9 != 0) {
iVar9 = *(int *)param_2;
piVar13[1] = 0;
*piVar13 = (int)param_2;
pcVar1 = *(code **)(iVar9 + 0x30);
piVar13[-1] = 0x498ca8;
(*pcVar1)();
goto LAB_004985ee;
}
}
iVar9 = *(int *)param_2;
piVar13[1] = 3;
*piVar13 = (int)param_2;
pcVar1 = *(code **)(iVar9 + 0x30);
piVar13[-1] = 0x498d30;
(*pcVar1)();
*(undefined4 *)(param_1 + 0x14c) = 0x80000000;
goto LAB_004985ee;
}
}
iVar9 = *(int *)param_2;
piVar13[1] = 2;
*piVar13 = (int)param_2;
pcVar1 = *(code **)(iVar9 + 0x30);
piVar13[-1] = 0x498cc4;
(*pcVar1)();
*(undefined4 *)(param_1 + 0x14c) = 0x80000000;
goto LAB_004985ee;
}
}
iVar9 = *(int *)param_2;
piVar13[1] = 1;
*piVar13 = (int)param_2;
pcVar1 = *(code **)(iVar9 + 0x30);
piVar13[-1] = 0x4985e1;
(*pcVar1)();
*(undefined4 *)(param_1 + 0x14c) = 0x80000000;
}
LAB_004985ee:
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 0x24);
*piVar13 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x2c);
piVar13[-1] = 0x4985f9;
lVar17 = (longdouble)(*pcVar2)();
piVar13[1] = (int)"explosive_damage";
*piVar13 = (int)param_3;
piVar13[2] = (int)(float)lVar17;
piVar13[-1] = 0x49861a;
lVar17 = (longdouble)
KeyValues::GetFloat((KeyValues *)*piVar13,(char *)piVar13[1],(float)piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = (int)(float)lVar17;
piVar13[-1] = 0x49862d;
(*pcVar1)();
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 0x38);
*piVar13 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x3c);
piVar13[-1] = 0x498638;
lVar17 = (longdouble)(*pcVar2)();
piVar13[1] = (int)"explosion_delay";
*piVar13 = (int)param_3;
piVar13[2] = (int)(float)lVar17;
piVar13[-1] = 0x498659;
lVar17 = (longdouble)
KeyValues::GetFloat((KeyValues *)*piVar13,(char *)piVar13[1],(float)piVar13[2]);
*piVar13 = (int)param_2;
piVar13[1] = (int)(float)lVar17;
piVar13[-1] = 0x49866c;
(*pcVar1)();
iVar9 = *(int *)param_2;
piVar13[1] = (int)param_2;
*piVar13 = (int)local_30;
pcVar1 = *(code **)(iVar9 + 0x44);
piVar13[-1] = 0x49867d;
(*pcVar1)();
*piVar13 = (int)"explosion_buildup";
pcVar8 = local_30[0];
if (local_30[0] == (char *)0x0) {
pcVar8 = "";
}
piVar13[1] = (int)pcVar8;
piVar13[-1] = (int)param_3;
piVar13[-2] = 0x49869f;
pcVar8 = (char *)KeyValues::GetString
((KeyValues *)piVar13[-1],(char *)*piVar13,(char *)piVar13[1]);
if ((pcVar8 == (char *)0x0) || (*pcVar8 == '\0')) {
pcVar1 = *(code **)(*(int *)param_2 + 0x40);
*piVar13 = 0;
piVar13[-1] = (int)param_2;
piVar13[-2] = 0x4986be;
(*pcVar1)();
piVar13 = piVar13 + -1;
}
else {
pcVar1 = *(code **)(*(int *)param_2 + 0x40);
*piVar13 = (int)pcVar8;
piVar13[-1] = (int)local_30;
piVar13[-2] = 0x498cea;
AllocPooledString((char *)piVar13[-1]);
piVar13[-1] = (int)param_2;
*piVar13 = (int)local_30[0];
piVar13[-2] = 0x498cfc;
(*pcVar1)();
iVar9 = *(int *)param_2;
*piVar13 = (int)param_2;
piVar13[-1] = (int)local_30;
pcVar1 = *(code **)(iVar9 + 0x44);
piVar13[-2] = 0x498d08;
(*pcVar1)();
pcVar8 = local_30[0];
if (local_30[0] == (char *)0x0) {
pcVar8 = "";
}
piVar13[-2] = (int)pcVar8;
piVar13[-3] = 0x498d1b;
CBaseEntity::PrecacheScriptSound((char *)piVar13[-2]);
piVar13 = piVar13 + -2;
}
if ((*(int *)(param_1 + 0x100) != 0) &&
(uVar15 = *(uint *)(param_1 + 0x148) & 0xfffffffd, *(uint *)(param_1 + 0x148) != uVar15)) {
if (param_1[0x6c] == (CBaseEntity)0x0) {
puVar4 = *(uint **)(param_1 + 0x30);
if (puVar4 != (uint *)0x0) {
*puVar4 = *puVar4 | 0x101;
*piVar13 = (int)puVar4;
piVar13[-1] = 0x4986ff;
iVar9 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*piVar13);
*(undefined2 *)(iVar9 + 2) = 0;
}
}
else {
param_1[0x70] = (CBaseEntity)((byte)param_1[0x70] | 1);
}
*(uint *)(param_1 + 0x148) = uVar15;
}
piVar13[2] = 0;
piVar13[1] = (int)"glow";
*piVar13 = (int)param_3;
piVar13[-1] = 0x498729;
iVar9 = KeyValues::GetInt((KeyValues *)*piVar13,(char *)piVar13[1],piVar13[2]);
if ((iVar9 != 0) &&
(uVar15 = *(uint *)(param_1 + 0x148) | 0x8000, *(uint *)(param_1 + 0x148) != uVar15)) {
if (param_1[0x6c] == (CBaseEntity)0x0) {
puVar4 = *(uint **)(param_1 + 0x30);
if (puVar4 != (uint *)0x0) {
*puVar4 = *puVar4 | 0x101;
*piVar13 = (int)puVar4;
piVar13[-1] = 0x498767;
iVar9 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*piVar13);
*(undefined2 *)(iVar9 + 2) = 0;
}
}
else {
param_1[0x70] = (CBaseEntity)((byte)param_1[0x70] | 1);
}
*(uint *)(param_1 + 0x148) = uVar15;
}
LAB_00498780:
iVar9 = *(int *)param_2;
piVar13[1] = (int)param_2;
*piVar13 = (int)local_30;
pcVar1 = *(code **)(iVar9 + 0x54);
piVar13[-1] = 0x49878c;
(*pcVar1)();
piVar14 = piVar13 + -1;
if (local_30[0] == (char *)0x0) {
piVar13[1] = 0;
*piVar13 = (int)"breakable_model";
piVar13[-1] = (int)param_3;
piVar13[-2] = 0x498c2d;
pcVar8 = (char *)KeyValues::GetString
((KeyValues *)piVar13[-1],(char *)*piVar13,(char *)piVar13[1]);
}
else {
iVar9 = *(int *)param_2;
*piVar13 = (int)param_2;
piVar13[-1] = (int)local_30;
pcVar1 = *(code **)(iVar9 + 0x54);
piVar13[-2] = 0x4987a6;
(*pcVar1)();
piVar14 = piVar13 + -2;
piVar13[-1] = (int)"breakable_model";
pcVar8 = "";
if (local_30[0] != (char *)0x0) {
pcVar8 = local_30[0];
}
*piVar13 = (int)pcVar8;
piVar13[-2] = (int)param_3;
piVar13[-3] = 0x4987cd;
pcVar8 = (char *)KeyValues::GetString
((KeyValues *)piVar13[-2],(char *)piVar13[-1],(char *)*piVar13);
}
if ((pcVar8 == (char *)0x0) || (*pcVar8 == '\0')) {
pcVar1 = *(code **)(*(int *)param_2 + 0x50);
piVar14[1] = 0;
*piVar14 = (int)param_2;
piVar14[-1] = 0x4987ec;
(*pcVar1)();
}
else {
pcVar1 = *(code **)(*(int *)param_2 + 0x50);
piVar14[1] = (int)pcVar8;
*piVar14 = (int)local_30;
piVar14[-1] = 0x498bc9;
AllocPooledString((char *)*piVar14);
*piVar14 = (int)param_2;
piVar14[1] = (int)local_30[0];
piVar14[-1] = 0x498bd8;
(*pcVar1)();
}
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 0x58);
*piVar14 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 0x5c);
piVar14[-1] = 0x4987f7;
iVar9 = (*pcVar2)();
piVar14[1] = (int)"breakable_skin";
piVar14[2] = iVar9;
*piVar14 = (int)param_3;
piVar14[-1] = 0x49880e;
iVar9 = KeyValues::GetInt((KeyValues *)*piVar14,(char *)piVar14[1],piVar14[2]);
*piVar14 = (int)param_2;
piVar14[1] = iVar9;
piVar14[-1] = 0x498817;
(*pcVar1)();
iVar9 = *(int *)param_2;
pcVar1 = *(code **)(iVar9 + 0x60);
*piVar14 = (int)param_2;
pcVar2 = *(code **)(iVar9 + 100);
piVar14[-1] = 0x498822;
iVar9 = (*pcVar2)();
piVar14[1] = (int)"breakable_count";
piVar14[2] = iVar9;
*piVar14 = (int)param_3;
piVar14[-1] = 0x498839;
iVar9 = KeyValues::GetInt((KeyValues *)*piVar14,(char *)piVar14[1],piVar14[2]);
*piVar14 = (int)param_2;
piVar14[1] = iVar9;
piVar14[-1] = 0x498842;
(*pcVar1)();
if (AllocTempVector()::s_vecTemp == '\0') {
*piVar14 = (int)&AllocTempVector()::s_vecTemp;
piVar14[-1] = 0x498b9c;
iVar9 = __cxa_guard_acquire();
if (iVar9 != 0) {
*piVar14 = (int)&AllocTempVector()::s_vecTemp;
piVar14[-1] = 0x498bb0;
__cxa_guard_release();
}
}
if (AllocTempVector()::s_nIndex == '\0') {
*piVar14 = (int)&AllocTempVector()::s_nIndex;
piVar14[-1] = 0x498b6c;
iVar9 = __cxa_guard_acquire();
if (iVar9 != 0) {
*piVar14 = (int)&AllocTempVector()::s_nIndex;
AllocTempVector()::s_nIndex = 0;
piVar14[-1] = 0x498b8a;
__cxa_guard_release();
}
}
AllocTempVector()::s_nIndex = AllocTempVector()::s_nIndex + 0x10001 & 0x7f;
LOCK();
UNLOCK();
iVar9 = AllocTempVector()::s_nIndex * 0xc;
*(float *)(AllocTempVector()::s_vecTemp + iVar9) =
*(float *)(param_1 + 0x1a8) - *(float *)(param_1 + 0x19c);
*(float *)(AllocTempVector()::s_vecTemp + iVar9 + 4) =
*(float *)(param_1 + 0x1ac) - *(float *)(param_1 + 0x1a0);
*(float *)(AllocTempVector()::s_vecTemp + iVar9 + 8) =
*(float *)(param_1 + 0x1b0) - *(float *)(param_1 + 0x1a4);
local_28 = *(float *)(AllocTempVector()::s_vecTemp + iVar9);
local_24 = *(float *)(AllocTempVector()::s_vecTemp + iVar9 + 4);
local_20[0] = *(float *)(AllocTempVector()::s_vecTemp + iVar9 + 8);
if (local_24 <= local_28) {
pfVar10 = &local_24;
fVar6 = local_24;
}
else {
pfVar10 = &local_28;
fVar6 = local_28;
}
if (local_20[0] <= fVar6) {
pfVar10 = local_20;
}
*pfVar10 = 1.0;
ppuVar16 = &sPropdataInteractionSections;
fVar6 = local_24 * local_28 * local_20[0] * 0.0009765625;
iVar9 = (int)fVar6;
if (fVar6 < (float)iVar9) {
iVar9 = iVar9 + -1;
}
iVar11 = *(int *)param_2;
*piVar14 = (int)param_2;
iVar12 = 0;
piVar14[1] = iVar9;
pcVar1 = *(code **)(iVar11 + 0x68);
piVar14[-1] = 0x49894c;
(*pcVar1)();
do {
puVar5 = *ppuVar16;
if (puVar5 != (undefined *)0x0) {
piVar14[2] = 0;
piVar14[1] = (int)puVar5;
*piVar14 = (int)param_4;
piVar14[-1] = 0x49897d;
iVar9 = KeyValues::FindKey((KeyValues *)*piVar14,(char *)piVar14[1],SUB41(piVar14[2],0));
if (iVar9 != 0) {
piVar14[2] = (int)&DAT_00d539c2;
puVar5 = ppuVar16[1];
*piVar14 = iVar9;
piVar14[1] = (int)puVar5;
piVar14[-1] = 0x498998;
pcVar8 = (char *)KeyValues::GetString
((KeyValues *)*piVar14,(char *)piVar14[1],(char *)piVar14[2]);
if ((pcVar8 != (char *)0x0) && (*pcVar8 != '\0')) {
puVar5 = ppuVar16[2];
*piVar14 = (int)pcVar8;
piVar14[1] = (int)puVar5;
piVar14[-1] = 0x4989b0;
iVar9 = _V_stricmp((char *)*piVar14,(char *)piVar14[1]);
if (iVar9 == 0) {
iVar9 = *(int *)param_2;
piVar14[1] = iVar12;
*piVar14 = (int)param_2;
pcVar1 = *(code **)(iVar9 + 0x78);
piVar14[-1] = 0x4989cc;
(*pcVar1)();
}
}
}
}
ppuVar16 = ppuVar16 + 3;
iVar12 = iVar12 + 1;
} while (iVar12 != 0x16);
piVar14[2] = 0;
piVar14[1] = (int)"prop_contexts";
*piVar14 = (int)param_4;
piVar14[-1] = 0x4989f3;
iVar9 = KeyValues::FindKey((KeyValues *)*piVar14,(char *)piVar14[1],SUB41(piVar14[2],0));
if (iVar9 != 0) {
*piVar14 = iVar9;
piVar14[-1] = 0x498a03;
iVar9 = KeyValues::GetFirstSubKey((KeyValues *)*piVar14);
while (iVar9 != 0) {
while( true ) {
*piVar14 = iVar9;
piVar14[-1] = 0x498a26;
iVar11 = KeyValues::GetName((KeyValues *)*piVar14);
piVar14[2] = (int)&DAT_00d539c2;
piVar14[1] = 0;
*piVar14 = iVar9;
piVar14[-1] = 0x498a40;
iVar12 = KeyValues::GetString((KeyValues *)*piVar14,(char *)piVar14[1],(char *)piVar14[2]);
if ((iVar12 == 0) || (iVar11 == 0)) break;
piVar14[2] = iVar12;
piVar14[1] = iVar11;
*piVar14 = (int)"%s:%s";
piVar14[-1] = 0x498a5c;
iVar11 = UTIL_VarArgs((char *)*piVar14);
*piVar14 = (int)param_1;
piVar14[1] = iVar11;
piVar14[-1] = 0x498a68;
CBaseEntity::AddContext((CBaseEntity *)*piVar14,(char *)piVar14[1]);
*piVar14 = iVar9;
piVar14[-1] = 0x498a70;
iVar9 = KeyValues::GetNextKey((KeyValues *)*piVar14);
if (iVar9 == 0) goto LAB_00498a80;
}
*piVar14 = iVar9;
piVar14[-1] = 0x498a18;
iVar9 = KeyValues::GetNextKey((KeyValues *)*piVar14);
}
}
LAB_00498a80:
uVar15 = 1;
if (local_34 != 1) {
piVar14[2] = 0;
piVar14[1] = (int)"allowstatic";
*piVar14 = (int)param_3;
piVar14[-1] = 0x498aa6;
iVar9 = KeyValues::GetInt((KeyValues *)*piVar14,(char *)piVar14[1],piVar14[2]);
uVar15 = (uint)(iVar9 != 0);
}
return uVar15;
}
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.