CPointTemplate::CreateInstance
0x007e0390 · 1059 bytes · __thiscall
_ZN14CPointTemplate14CreateInstanceERK6VectorRK6QAngleP10CUtlVectorIP11CBaseEntity10CUtlMemoryIS8_iEES8_b
Decompiled
undefined (6 params)
/* CPointTemplate::CreateInstance(Vector const&, QAngle const&, CUtlVector<CBaseEntity*,
CUtlMemory<CBaseEntity*, int> >*, CBaseEntity*, bool) */
undefined4 __thiscall
CPointTemplate::CreateInstance
(CPointTemplate *this,Vector *param_1,QAngle *param_2,CUtlVector *param_3,
CBaseEntity *param_4,bool param_5)
{
uint *puVar1;
int iVar2;
int *piVar3;
CUtlVector *pCVar4;
undefined4 uVar5;
char cVar6;
undefined4 uVar7;
undefined1 *puVar8;
int iVar9;
float fVar10;
int *piVar11;
char **ppcVar12;
float fVar13;
int iVar14;
int in_GS_OFFSET;
float fVar15;
undefined3 in_stack_00000019;
undefined4 uStack_100;
char *local_fc [2];
int aiStack_f4 [4];
undefined4 local_e4;
int *local_e0;
CUtlVector *local_dc;
QAngle *local_d8;
Vector *local_d4;
float local_d0;
undefined1 *local_cc;
float local_c8;
float local_c4;
undefined1 *local_c0;
int local_bc;
undefined4 local_b8;
undefined4 local_b4;
undefined4 local_b0;
undefined1 local_ac [12];
undefined1 local_a0 [64];
undefined1 local_60 [12];
undefined4 local_54;
undefined4 local_44;
undefined4 local_34;
int local_20;
local_d4 = param_1;
local_d8 = param_2;
local_dc = param_3;
local_e4 = _param_5;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_d0 = *(float *)(this + 0x4a0);
if (local_d0 == 0.0) {
local_fc[0] = "CreateInstance called on a point_template that has no templates: %s\n";
local_fc[1] = &DAT_00d539c2;
if (*(undefined1 **)(this + 0x154) != (undefined1 *)0x0) {
local_fc[1] = *(undefined1 **)(this + 0x154);
}
uStack_100 = 0x7e03fe;
Msg();
uVar7 = 0;
ppcVar12 = local_fc;
goto LAB_007e0400;
}
uStack_100 = 0x7e0425;
Templates_StartUniqueInstance();
iVar2 = -((int)local_d0 * 0x10 + 0x10);
ppcVar12 = (char **)((int)local_fc + iVar2);
piVar11 = (int *)((int)aiStack_f4 + iVar2 + 4);
local_e0 = piVar11;
if ((int)local_d0 < 1) {
*(undefined4 *)((int)aiStack_f4 + iVar2) = 1;
*(int **)((int)aiStack_f4 + iVar2 + -4) = piVar11;
*(float *)((int)local_fc + iVar2) = local_d0;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0770;
SpawnHierarchicalList
(*(int *)((int)local_fc + iVar2),
*(HierarchicalSpawn_t **)((int)aiStack_f4 + iVar2 + -4),
*(bool *)((int)aiStack_f4 + iVar2));
if ((char)local_e4 != '\0') goto LAB_007e06c1;
LAB_007e077d:
uVar7 = 1;
ppcVar12 = (char **)((int)local_fc + iVar2);
}
else {
local_c8 = 0.0;
do {
local_bc = 0;
iVar14 = (int)local_c8 * 0x44;
local_c4 = *(float *)(*(int *)(this + 0x494) + iVar14);
if (((byte)this[0x148] & 2) == 0) {
*(float *)((int)local_fc + iVar2) = local_c4;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e062d;
cVar6 = Templates_IndexRequiresEntityIOFixup(*(int *)((int)local_fc + iVar2));
if ((cVar6 == '\0') && (*(int *)(this + 1000) == -1)) goto LAB_007e0468;
*(float *)((int)local_fc + iVar2) = local_c4;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e064c;
puVar8 = (undefined1 *)Templates_GetEntityIOFixedMapData(*(int *)((int)local_fc + iVar2));
}
else {
LAB_007e0468:
*(float *)((int)aiStack_f4 + iVar2 + -4) = local_c4;
*(undefined1 ***)((int)local_fc + iVar2) = &local_c0;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0480;
Templates_FindByIndex(*(int *)((int)local_fc + iVar2));
puVar8 = local_c0;
if (local_c0 == (undefined1 *)0x0) {
puVar8 = &DAT_00d539c2;
}
}
*(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = puVar8;
*(undefined4 *)((int)aiStack_f4 + iVar2) = 0;
*(int **)((int)local_fc + iVar2) = &local_bc;
local_cc = puVar8;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e04b3;
MapEntity_ParseEntity
(*(CBaseEntity ***)((int)local_fc + iVar2),*(char **)((int)aiStack_f4 + iVar2 + -4),
*(IMapEntityFilter **)((int)aiStack_f4 + iVar2));
if (local_bc == 0) {
*(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = local_cc;
*(char **)((int)local_fc + iVar2) =
"Failed to initialize templated entity with mapdata: %s\n";
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0688;
Msg();
uVar7 = 0;
goto LAB_007e0400;
}
*(QAngle **)((int)aiStack_f4 + iVar2) = local_d8;
*(Vector **)((int)aiStack_f4 + iVar2 + -4) = local_d4;
*(undefined1 **)((int)local_fc + iVar2) = local_a0;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e04e9;
VMatrix::SetupMatrixOrgAngles
(*(VMatrix **)((int)local_fc + iVar2),*(Vector **)((int)aiStack_f4 + iVar2 + -4),
*(QAngle **)((int)aiStack_f4 + iVar2));
*(undefined1 **)((int)aiStack_f4 + iVar2) = local_60;
iVar9 = *(int *)(this + 0x494);
local_cc = local_60;
*(undefined1 **)((int)local_fc + iVar2) = local_a0;
*(int *)((int)aiStack_f4 + iVar2 + -4) = iVar14 + iVar9 + 4;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0517;
MatrixMultiply(*(VMatrix **)((int)local_fc + iVar2),
*(VMatrix **)((int)aiStack_f4 + iVar2 + -4),
*(VMatrix **)((int)aiStack_f4 + iVar2));
uVar7 = local_54;
*(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = local_ac;
uVar5 = local_34;
local_b8 = uVar7;
local_b4 = local_44;
*(undefined1 **)((int)local_fc + iVar2) = local_cc;
local_b0 = uVar5;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0550;
MatrixToAngles(*(VMatrix **)((int)local_fc + iVar2),*(QAngle **)((int)aiStack_f4 + iVar2 + -4)
);
*(undefined4 **)((int)aiStack_f4 + iVar2 + -4) = &local_b8;
*(int *)((int)local_fc + iVar2) = local_bc;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0568;
CBaseEntity::SetAbsOrigin
(*(CBaseEntity **)((int)local_fc + iVar2),*(Vector **)((int)aiStack_f4 + iVar2 + -4)
);
iVar14 = local_bc;
*(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = local_ac;
*(int *)((int)local_fc + iVar2) = iVar14;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e057a;
CBaseEntity::SetAbsAngles
(*(CBaseEntity **)((int)local_fc + iVar2),*(QAngle **)((int)aiStack_f4 + iVar2 + -4)
);
*(float *)((int)aiStack_f4 + iVar2 + -4) = local_c4;
*(undefined1 ***)((int)local_fc + iVar2) = &local_c0;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0592;
Templates_FindByIndex(*(int *)((int)local_fc + iVar2));
*(undefined1 **)((int)aiStack_f4 + iVar2) = local_c0;
*(int *)((int)aiStack_f4 + iVar2 + -4) = local_bc;
*(CPointTemplate **)((int)local_fc + iVar2) = this + 1000;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e05b7;
cVar6 = ScriptPreInstanceSpawn();
if (cVar6 == '\0') {
*piVar11 = 0;
*(int *)((int)local_fc + iVar2) = local_bc;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e066c;
UTIL_RemoveImmediate(*(CBaseEntity **)((int)local_fc + iVar2));
}
else {
*piVar11 = local_bc;
}
piVar3 = local_e0;
piVar11[1] = 0;
local_c8 = (float)((int)local_c8 + 1);
piVar11[2] = 0;
piVar11 = piVar11 + 4;
} while (local_c8 != local_d0);
*(undefined4 *)((int)aiStack_f4 + iVar2) = 1;
*(int **)((int)aiStack_f4 + iVar2 + -4) = piVar3;
*(float *)((int)local_fc + iVar2) = local_d0;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e06b4;
SpawnHierarchicalList
(*(int *)((int)local_fc + iVar2),
*(HierarchicalSpawn_t **)((int)aiStack_f4 + iVar2 + -4),
*(bool *)((int)aiStack_f4 + iVar2));
if ((char)local_e4 != '\0') {
LAB_007e06c1:
fVar15 = *(float *)(gpGlobals + 0xc);
if ((int)local_d0 < 1) goto LAB_007e077d;
fVar13 = 0.0;
fVar10 = local_d0;
piVar11 = local_e0;
do {
iVar14 = *piVar11;
if ((iVar14 != 0) && (fVar15 != *(float *)(iVar14 + 0x98))) {
if (*(char *)(iVar14 + 0x6c) == '\0') {
puVar1 = *(uint **)(iVar14 + 0x30);
if (puVar1 != (uint *)0x0) {
*puVar1 = *puVar1 | 0x101;
*(uint **)((int)local_fc + iVar2) = puVar1;
local_c8 = fVar15;
local_c4 = fVar10;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0732;
iVar9 = CBaseEdict::GetChangeAccessor(*(CBaseEdict **)((int)local_fc + iVar2));
*(undefined2 *)(iVar9 + 2) = 0;
fVar10 = local_c4;
fVar15 = local_c8;
}
}
else {
*(byte *)(iVar14 + 0x70) = *(byte *)(iVar14 + 0x70) | 1;
}
*(float *)(iVar14 + 0x98) = fVar15;
}
fVar13 = (float)((int)fVar13 + 1);
piVar11 = piVar11 + 4;
} while (fVar13 != fVar10);
}
pCVar4 = local_dc;
iVar14 = 0;
piVar11 = local_e0;
do {
if (*piVar11 != 0) {
*(int **)((int)aiStack_f4 + iVar2) = piVar11;
uVar7 = *(undefined4 *)(pCVar4 + 0xc);
*(CUtlVector **)((int)local_fc + iVar2) = pCVar4;
*(undefined4 *)((int)aiStack_f4 + iVar2 + -4) = uVar7;
*(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e07b9;
CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
(*(CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> **)
((int)local_fc + iVar2),*(int *)((int)aiStack_f4 + iVar2 + -4),
*(CBaseEntity ***)((int)aiStack_f4 + iVar2));
}
iVar14 = iVar14 + 1;
piVar11 = piVar11 + 4;
} while (iVar14 < (int)local_d0);
uVar7 = 1;
ppcVar12 = (char **)((int)local_fc + iVar2);
}
LAB_007e0400:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return uVar7;
}
/* WARNING: Subroutine does not return */
*(undefined4 *)((int)ppcVar12 + -4) = 0x7e0694;
__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.