CChangeLevel::AddDependentEntities
0x00b18f80 · 726 bytes · __cdecl
_ZN12CChangeLevel20AddDependentEntitiesEiPP11CBaseEntityPii
Decompiled
undefined (4 params)
/* CChangeLevel::AddDependentEntities(int, CBaseEntity**, int*, int) */
uint CChangeLevel::AddDependentEntities(int param_1,CBaseEntity **param_2,int *param_3,int param_4)
{
byte bVar1;
code *pcVar2;
int *piVar3;
CBaseEntity *pCVar4;
undefined4 *puVar5;
uint *puVar6;
uint uVar7;
uint uVar8;
uint uVar9;
undefined4 uVar10;
byte bVar11;
int iVar12;
undefined1 *puVar13;
uint uVar14;
CBaseEntity **ppCVar15;
CBaseEntity **ppCVar16;
uint uVar17;
byte *pbVar18;
int in_GS_OFFSET;
CBaseEntity *local_25c [5];
int *local_248;
int *local_244;
CBaseEntity **local_240;
int local_23c;
uint local_238;
CBaseEntity *local_234;
uint local_230;
byte local_220 [512];
int local_20;
ppCVar16 = local_25c;
local_240 = param_2;
local_248 = param_3;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
pbVar18 = local_220;
for (iVar12 = 0x80; iVar12 != 0; iVar12 = iVar12 + -1) {
pbVar18[0] = 0;
pbVar18[1] = 0;
pbVar18[2] = 0;
pbVar18[3] = 0;
pbVar18 = pbVar18 + 4;
}
if (param_1 < 1) {
GetEntitySaveUtils();
}
else {
iVar12 = 0;
do {
local_25c[0] = param_2[iVar12];
iVar12 = iVar12 + 1;
puVar6 = (uint *)(**(code **)(*(int *)local_25c[0] + 0xc))();
local_220[(int)(*puVar6 & 0xfff) >> 3] =
local_220[(int)(*puVar6 & 0xfff) >> 3] | (byte)(1 << ((byte)*puVar6 & 7));
} while (iVar12 != param_1);
local_244 = (int *)GetEntitySaveUtils();
local_23c = 0;
ppCVar15 = local_25c;
do {
piVar3 = local_244;
local_234 = local_240[local_23c];
iVar12 = *local_244;
ppCVar15[1] = local_234;
*ppCVar15 = (CBaseEntity *)piVar3;
pcVar2 = *(code **)(iVar12 + 4);
ppCVar15[-1] = (CBaseEntity *)0xb19057;
uVar7 = (*pcVar2)();
pCVar4 = local_234;
piVar3 = local_244;
puVar5 = ppCVar15;
if (uVar7 != 0) {
uVar8 = ((uVar7 * 4 + 0xf & 0xfffffff0) + 0x1e) / 0x10;
ppCVar16 = ppCVar15 + uVar8 * -4;
iVar12 = *local_244;
ppCVar15[uVar8 * -4 + 2] = (CBaseEntity *)uVar7;
uVar17 = (int)ppCVar15 + uVar8 * -0x10 + 0x1f & 0xfffffff0;
ppCVar15[uVar8 * -4 + 1] = pCVar4;
ppCVar15[uVar8 * -4 + 3] = (CBaseEntity *)uVar17;
ppCVar15[uVar8 * -4] = (CBaseEntity *)piVar3;
pcVar2 = *(code **)(iVar12 + 8);
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb190a1;
(*pcVar2)();
puVar5 = ppCVar15 + uVar8 * -4;
if (0 < (int)uVar7) {
uVar14 = 0;
local_230 = uVar7;
do {
piVar3 = *(int **)(uVar17 + uVar14 * 4);
if (piVar3 != (int *)0x0) {
iVar12 = *piVar3;
ppCVar15[uVar8 * -4] = (CBaseEntity *)piVar3;
pcVar2 = *(code **)(iVar12 + 0xc);
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb190dc;
puVar6 = (uint *)(*pcVar2)();
bVar11 = (byte)*puVar6 & 7;
bVar1 = local_220[(int)(*puVar6 & 0xfff) >> 3];
local_238 = (int)(char)bVar1 >> bVar11 & 1;
if (local_238 == 0) {
local_220[(int)(*puVar6 & 0xfff) >> 3] = bVar1 | (byte)(1 << bVar11);
ppCVar15[uVar8 * -4] = local_234;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19119;
uVar9 = ComputeEntitySaveFlags(ppCVar15[uVar8 * -4]);
pCVar4 = local_234;
uVar7 = local_238;
if (uVar9 == 0) {
ppCVar15[uVar8 * -4] =
(CBaseEntity *)
"Warning!! Save dependency is linked to an entity that doesn\'t want to be saved!\n"
;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb191c4;
Warning();
}
else {
if (param_4 <= param_1) {
ppCVar15[uVar8 * -4] = (CBaseEntity *)"Too many entities across a transition!\n"
;
local_230 = uVar7;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19252;
Warning();
param_1 = local_230;
goto LAB_00b19224;
}
if (*(int *)(g_debug_transitions._28_4_ + 0x30) != 0) {
local_238 = uVar9;
ppCVar15[uVar8 * -4] = local_234;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb191e4;
uVar10 = CBaseEntity::GetDebugName(ppCVar15[uVar8 * -4]);
puVar13 = *(undefined1 **)(pCVar4 + 0x7c);
ppCVar15[uVar8 * -4 + 2] = (CBaseEntity *)uVar10;
ppCVar15[uVar8 * -4] = (CBaseEntity *)"ADDED DEPENDANCY: %s (%s)\n";
if (puVar13 == (undefined1 *)0x0) {
puVar13 = &DAT_00d539c2;
}
ppCVar15[uVar8 * -4 + 1] = (CBaseEntity *)puVar13;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19205;
Msg();
uVar9 = local_238;
}
pCVar4 = local_234;
iVar12 = param_1 + 1;
local_240[param_1] = local_234;
local_248[param_1] = uVar9;
param_1 = iVar12;
if (g_iDebuggingTransition != 0) {
if (g_iDebuggingTransition == 2) {
ppCVar15[uVar8 * -4] = (CBaseEntity *)"ADDED.\n";
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb1921c;
Msg();
}
else {
ppCVar15[uVar8 * -4] = local_234;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19182;
uVar10 = CBaseEntity::GetDebugName(ppCVar15[uVar8 * -4]);
puVar13 = *(undefined1 **)(pCVar4 + 0x7c);
ppCVar15[uVar8 * -4 + 2] = (CBaseEntity *)uVar10;
ppCVar15[uVar8 * -4] = (CBaseEntity *)"ADDED %s (%s) to transition.\n";
if (puVar13 == (undefined1 *)0x0) {
puVar13 = &DAT_00d539c2;
}
ppCVar15[uVar8 * -4 + 1] = (CBaseEntity *)puVar13;
ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb191a3;
Msg();
}
*(uint *)(local_234 + 0x110) = *(uint *)(local_234 + 0x110) | 6;
}
}
}
}
uVar14 = uVar14 + 1;
puVar5 = ppCVar15 + uVar8 * -4;
} while (uVar14 != local_230);
}
}
ppCVar16 = (CBaseEntity **)puVar5;
local_23c = local_23c + 1;
ppCVar15 = ppCVar16;
} while (local_23c < param_1);
}
LAB_00b19224:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined **)((int)ppCVar16 + -4) = &UNK_00b19269;
__stack_chk_fail();
}
return param_1;
}
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.