CEnvEntityMaker::SpawnEntity
0x00690ad0 · 2185 bytes · __cdecl
_ZN15CEnvEntityMaker11SpawnEntityE6Vector6QAngle
Decompiled
undefined (2 params)
/* CEnvEntityMaker::SpawnEntity(Vector, QAngle) */
void CEnvEntityMaker::SpawnEntity
(CEnvEntityMaker *param_1,float param_2,float param_3,float param_4,
undefined4 param_5,undefined4 param_6,undefined4 param_7)
{
float fVar1;
int *piVar2;
float fVar3;
float fVar4;
char cVar5;
CPointTemplate *this;
undefined4 *puVar6;
uint uVar7;
undefined *puVar8;
CBaseEntity *pCVar9;
int iVar10;
CBaseEntity *pCVar11;
longdouble lVar12;
undefined1 local_94 [16];
float local_84;
float local_80;
float local_7c;
undefined4 local_78;
undefined4 local_74;
undefined4 local_70;
float local_6c;
float local_68;
float local_64;
float local_60;
float local_5c;
float local_58;
float local_54;
float local_50;
float local_4c;
float local_48;
float local_44;
float local_40;
float local_3c;
float local_38;
float local_34;
int *local_30;
undefined4 local_2c;
undefined4 local_28;
int local_24;
int *local_20;
this = (CPointTemplate *)FindTemplate(param_1);
if (this != (CPointTemplate *)0x0) {
if (((byte)param_1[0x14d] & 8) == 0) {
local_84 = *(float *)(param_1 + 0x2e0);
local_80 = *(float *)(param_1 + 0x2e4);
local_7c = *(float *)(param_1 + 0x2e8);
}
else {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
local_84 = *(float *)(param_1 + 0x2e0);
local_80 = *(float *)(param_1 + 0x2e4);
local_7c = *(float *)(param_1 + 0x2e8);
if ((*(uint *)(param_1 + 0x14c) & 0x800) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
}
local_78 = *(undefined4 *)(param_1 + 0x37c);
local_74 = *(undefined4 *)(param_1 + 0x380);
local_70 = *(undefined4 *)(param_1 + 900);
if (((param_2 != vec3_invalid) || (param_3 != DAT_01053d24)) || (param_4 != DAT_01053d28)) {
local_84 = param_2;
local_80 = param_3;
local_78 = param_5;
local_7c = param_4;
local_74 = param_6;
local_70 = param_7;
}
local_30 = (int *)0x0;
local_2c = 0;
local_28 = 0;
local_24 = 0;
local_20 = (int *)0x0;
/* try { // try from 00690be8 to 006910a7 has its CatchHandler @ 00691377 */
cVar5 = (**(code **)(*(int *)this + 0x324))(this,&local_84,&local_78,&local_30,param_1,0);
if ((cVar5 != '\0') && (local_24 != 0)) {
piVar2 = (int *)*local_30;
if (piVar2 == (int *)0x0) {
*(undefined4 *)(param_1 + 0x458) = 0xffffffff;
}
else {
puVar6 = (undefined4 *)(**(code **)(*piVar2 + 0xc))(piVar2);
*(undefined4 *)(param_1 + 0x458) = *puVar6;
}
puVar8 = g_pEntityList;
uVar7 = *(uint *)(param_1 + 0x458);
pCVar9 = (CBaseEntity *)0x0;
*(uint *)(param_1 + 0x45c) = uVar7;
if (((uVar7 != 0xffffffff) &&
(puVar8 = puVar8 + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
pCVar9 = *(CBaseEntity **)(puVar8 + 4);
}
if (((byte)pCVar9[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar9);
}
*(undefined4 *)(param_1 + 0x460) = *(undefined4 *)(pCVar9 + 0x2e0);
*(undefined4 *)(param_1 + 0x464) = *(undefined4 *)(pCVar9 + 0x2e4);
*(undefined4 *)(param_1 + 0x468) = *(undefined4 *)(pCVar9 + 0x2e8);
if (((vec3_origin == *(float *)(param_1 + 0x440)) &&
(DAT_01053d4c == *(float *)(param_1 + 0x444))) &&
(DAT_01053d50 == *(float *)(param_1 + 0x448))) {
uVar7 = *(uint *)(param_1 + 0x458);
iVar10 = 0;
if (((uVar7 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
iVar10 = *(int *)(puVar8 + 4);
}
/* try { // try from 00691189 to 00691353 has its CatchHandler @ 00691377 */
CCollisionProperty::CollisionAABBToWorldAABB
((CCollisionProperty *)(iVar10 + 0x194),(Vector *)(iVar10 + 0x19c),
(Vector *)(iVar10 + 0x1a8),(Vector *)(param_1 + 0x440),
(Vector *)(param_1 + 0x44c));
uVar7 = *(uint *)(param_1 + 0x458);
pCVar9 = (CBaseEntity *)0x0;
if (((uVar7 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
pCVar9 = *(CBaseEntity **)(puVar8 + 4);
}
if (((byte)pCVar9[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar9);
uVar7 = *(uint *)(param_1 + 0x458);
}
puVar8 = g_pEntityList;
*(float *)(param_1 + 0x440) = *(float *)(param_1 + 0x440) - *(float *)(pCVar9 + 0x2e0);
*(float *)(param_1 + 0x444) = *(float *)(param_1 + 0x444) - *(float *)(pCVar9 + 0x2e4);
pCVar11 = (CBaseEntity *)0x0;
*(float *)(param_1 + 0x448) = *(float *)(param_1 + 0x448) - *(float *)(pCVar9 + 0x2e8);
if (((uVar7 != 0xffffffff) &&
(puVar8 = puVar8 + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
pCVar11 = *(CBaseEntity **)(puVar8 + 4);
}
if (((byte)pCVar11[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar11);
}
*(float *)(param_1 + 0x44c) = *(float *)(param_1 + 0x44c) - *(float *)(pCVar11 + 0x2e0);
*(float *)(param_1 + 0x450) = *(float *)(param_1 + 0x450) - *(float *)(pCVar11 + 0x2e4);
*(float *)(param_1 + 0x454) = *(float *)(param_1 + 0x454) - *(float *)(pCVar11 + 0x2e8);
}
COutputEvent::FireOutput
((COutputEvent *)(param_1 + 0x488),(CBaseEntity *)param_1,(CBaseEntity *)param_1,0.0
);
if (((byte)param_1[0x148] & 1) != 0) {
CBaseEntity::ThinkSet((_func_void *)local_94,(float)param_1,(char *)CheckSpawnThink);
CBaseEntity::SetNextThink
((CBaseEntity *)param_1,*(float *)(gpGlobals + 0xc) + 0.5,(char *)0x0);
}
if ((*(float *)(param_1 + 0x47c) != 0.0) && (0 < local_24)) {
iVar10 = 0;
do {
while (pCVar9 = (CBaseEntity *)local_30[iVar10], pCVar9[0x186] == (CBaseEntity)0x0) {
LAB_00690d17:
iVar10 = iVar10 + 1;
if (local_24 <= iVar10) goto LAB_00690fd8;
}
local_48 = *(float *)(param_1 + 0x46c);
local_44 = *(float *)(param_1 + 0x470);
local_40 = *(float *)(param_1 + 0x474);
if (param_1[0x480] != (CEnvEntityMaker)0x0) {
uVar7 = *(uint *)(param_1 + 0x180);
if (((uVar7 == 0xffffffff) ||
(puVar8 = g_pEntityList + (uVar7 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)
) || ((*(uint *)(puVar8 + 8) != uVar7 >> 0xc ||
(pCVar11 = *(CBaseEntity **)(puVar8 + 4), pCVar11 == (CBaseEntity *)0x0)))) {
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
local_48 = local_48 + *(float *)(param_1 + 0x37c);
local_44 = local_44 + *(float *)(param_1 + 0x380);
local_40 = local_40 + *(float *)(param_1 + 900);
}
else {
if (((byte)pCVar11[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar11);
}
local_48 = local_48 + *(float *)(pCVar11 + 0x37c);
local_44 = local_44 + *(float *)(pCVar11 + 0x380);
local_40 = local_40 + *(float *)(pCVar11 + 900);
}
}
AngleVectors((QAngle *)&local_48,(Vector *)&local_6c,(Vector *)&local_60,
(Vector *)&local_54);
fVar3 = *(float *)(param_1 + 0x478);
local_3c = local_6c;
local_38 = local_68;
local_34 = local_64;
lVar12 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0xbf800000,0x3f800000);
fVar1 = (float)lVar12;
fVar4 = *(float *)(param_1 + 0x478);
local_38 = fVar3 * local_5c * fVar1 + local_38;
local_34 = fVar3 * local_58 * fVar1 + local_34;
local_3c = fVar3 * local_60 * fVar1 + local_3c;
lVar12 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0xbf800000,0x3f800000);
fVar1 = (float)lVar12;
fVar3 = *(float *)(param_1 + 0x478);
local_38 = fVar4 * local_68 * fVar1 + local_38;
local_34 = fVar4 * local_64 * fVar1 + local_34;
local_3c = fVar4 * local_6c * fVar1 + local_3c;
lVar12 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0xbf800000,0x3f800000);
fVar1 = (float)lVar12;
local_38 = fVar3 * local_50 * fVar1 + local_38;
local_34 = fVar3 * local_4c * fVar1 + local_34;
local_3c = fVar3 * local_54 * fVar1 + local_3c;
VectorNormalize((Vector *)&local_3c);
fVar1 = *(float *)(param_1 + 0x47c);
local_3c = local_3c * fVar1;
piVar2 = *(int **)(pCVar9 + 0x238);
local_38 = local_38 * fVar1;
local_34 = fVar1 * local_34;
if (piVar2 != (int *)0x0) {
(**(code **)(*piVar2 + 0xd8))(piVar2,(Vector *)&local_3c,0);
goto LAB_00690d17;
}
CBaseEntity::SetAbsVelocity(pCVar9,(Vector *)&local_3c);
iVar10 = iVar10 + 1;
} while (iVar10 < local_24);
}
LAB_00690fd8:
CPointTemplate::CreationComplete(this,(CUtlVector *)&local_30);
}
local_24 = 0;
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)&local_30);
local_20 = local_30;
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)&local_30);
}
return;
}
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.