z_spawn_old
0x00a5f5b0 · 3783 bytes · __cdecl
_ZL11z_spawn_oldRK8CCommand
Decompiled
undefined (1 param)
/* z_spawn_old(CCommand const&) */
void z_spawn_old(CCommand *param_1)
{
float fVar1;
char *pcVar2;
code *pcVar3;
uint *puVar4;
char cVar5;
CBasePlayer *this;
int iVar6;
undefined1 *puVar7;
int iVar8;
int *piVar9;
int *piVar10;
bool bVar11;
bool bVar12;
bool bVar13;
longdouble lVar14;
float fVar15;
float fVar16;
float fVar17;
undefined4 local_158;
long local_124;
char *local_11c;
int local_118;
float local_104;
float local_100;
float local_fc;
int *local_f8;
float local_f4;
float local_f0;
float local_ec;
float local_e8;
float local_e4;
undefined4 local_e0;
undefined4 local_dc;
undefined4 local_d8;
Vector local_d0 [12];
int *local_c4;
float local_c0;
float local_bc;
float local_a4;
char local_99;
int *local_7c;
float local_78;
float local_74;
float local_6c;
float local_68;
float local_64;
float local_5c;
float local_58;
float local_54;
float local_4c;
float local_48;
float local_44;
undefined4 local_3c;
undefined1 local_38;
undefined1 local_37;
this = (CBasePlayer *)UTIL_GetCommandClient();
if (this == (CBasePlayer *)0x0) {
return;
}
fVar1 = *(float *)(ZombieSpawnHeight._28_4_ + 0x2c);
CBasePlayer::EyeVectors(this,(Vector *)&local_104,(Vector *)0x0,(Vector *)0x0);
fVar17 = local_104 * 10000.0;
fVar16 = local_100 * 10000.0;
fVar15 = local_fc * 10000.0;
(**(code **)(*(int *)this + 0x234))();
(**(code **)(*(int *)this + 0x234))();
piVar10 = (int *)&stack0xfffffeac;
local_38 = 1;
local_7c = local_f8;
local_6c = (fVar17 - (float)local_f8) + local_ec;
local_78 = local_f4;
local_68 = (fVar16 - local_f4) + local_e8;
local_74 = local_f0;
local_3c = 0;
local_64 = (fVar15 - local_f0) + local_e4;
local_44 = 0.0;
local_48 = 0.0;
local_4c = 0.0;
local_37 = local_68 * local_68 + local_6c * local_6c + local_64 * local_64 != 0.0;
local_54 = 0.0;
local_58 = 0.0;
local_5c = 0.0;
local_158 = 0xa5f785;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_e0,(IHandleEntity *)this,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
local_158 = 0xa5f7b5;
(**(code **)(*enginetrace + 0x14))();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
local_158 = 0xa5f811;
DebugDrawLine(local_d0,(Vector *)&local_c4,0xff,0,0,true,-1.0);
}
fVar15 = *(float *)(ZombieSpawnConstDistance._28_4_ + 0x2c);
if (0.0 <= fVar15) {
local_158 = 0xa5f872;
(**(code **)(*(int *)this + 0x234))();
piVar10 = &local_158;
local_c0 = local_100 * fVar15 + local_78;
local_bc = fVar15 * local_fc + local_74;
local_c4 = (int *)(local_104 * fVar15 + (float)local_7c);
local_a4 = *(float *)(ZombieSpawnConstDistance._28_4_ + 0x2c) * 0.0001;
}
if (local_a4 == 1.0) {
return;
}
if (*(int *)param_1 < 2) {
local_11c = "Common";
bVar11 = false;
local_118 = 0;
local_124 = -1;
bVar12 = false;
bVar13 = false;
}
else {
local_11c = *(char **)(param_1 + 0x40c);
if (local_11c == "mob") {
LAB_00a5fec0:
*piVar10 = TheDirector;
piVar10[-1] = 0xa5fecd;
iVar6 = CDirector::GetCommonInfectedLimit((CDirector *)*piVar10);
piVar10[1] = iVar6;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa5fede;
ZombieManager::SpawnMob((ZombieManager *)*piVar10,piVar10[1]);
return;
}
piVar10[1] = (int)local_11c;
*piVar10 = (int)"mob";
piVar10[-1] = 0xa5f907;
iVar6 = _V_stricmp((char *)*piVar10,(char *)piVar10[1]);
if (iVar6 == 0) goto LAB_00a5fec0;
*piVar10 = (int)local_11c;
piVar10[-1] = 0xa5f91d;
local_118 = GetZombieClassFromName((char *)*piVar10);
iVar6 = *(int *)param_1;
if (iVar6 < 4) {
LAB_00a5f95c:
local_124 = -1;
}
else {
pcVar2 = *(char **)(param_1 + 0x410);
if (pcVar2 == "wound") {
LAB_00a5f937:
puVar7 = *(undefined1 **)(param_1 + 0x414);
}
else {
piVar10[1] = (int)"wound";
*piVar10 = (int)pcVar2;
piVar10[-1] = 0xa5f952;
iVar6 = _V_stricmp((char *)*piVar10,(char *)piVar10[1]);
if (iVar6 != 0) {
iVar6 = *(int *)param_1;
goto LAB_00a5f95c;
}
puVar7 = &DAT_00d539c2;
if (3 < *(int *)param_1) goto LAB_00a5f937;
}
piVar10[2] = 10;
piVar10[1] = 0;
*piVar10 = (int)puVar7;
piVar10[-1] = 0xa602c3;
local_124 = strtol((char *)*piVar10,(char **)piVar10[1],piVar10[2]);
iVar6 = *(int *)param_1;
}
if (iVar6 < 3) {
bVar11 = false;
bVar12 = false;
bVar13 = false;
}
else {
iVar6 = 2;
bVar11 = false;
bVar12 = false;
bVar13 = false;
do {
if (!bVar13) {
piVar10[1] = (int)"auto";
*piVar10 = *(undefined4 *)(param_1 + iVar6 * 4 + 0x408);
piVar10[-1] = 0xa60187;
iVar8 = _V_stricmp((char *)*piVar10,(char *)piVar10[1]);
bVar13 = iVar8 == 0;
}
if (!bVar12) {
puVar7 = &DAT_00d539c2;
if (iVar6 < *(int *)param_1) {
puVar7 = *(undefined1 **)(param_1 + iVar6 * 4 + 0x408);
}
piVar10[1] = (int)"ragdoll";
*piVar10 = (int)puVar7;
piVar10[-1] = 0xa60150;
iVar8 = _V_stricmp((char *)*piVar10,(char *)piVar10[1]);
bVar12 = iVar8 == 0;
}
if (!bVar11) {
puVar7 = &DAT_00d539c2;
if (iVar6 < *(int *)param_1) {
puVar7 = *(undefined1 **)(param_1 + iVar6 * 4 + 0x408);
}
piVar10[1] = (int)"area";
*piVar10 = (int)puVar7;
piVar10[-1] = 0xa5f9ce;
iVar8 = _V_stricmp((char *)*piVar10,(char *)piVar10[1]);
bVar11 = iVar8 == 0;
}
iVar6 = iVar6 + 1;
} while (iVar6 < *(int *)param_1);
}
}
piVar10[1] = 0x43b40000;
*piVar10 = 0;
local_f8 = local_c4;
local_f4 = local_c0;
local_f0 = fVar1 + local_bc;
piVar10[-1] = 0xa5fa28;
lVar14 = (longdouble)RandomFloat();
local_ec = 0.0;
local_e8 = (float)lVar14;
local_e4 = 0.0;
if (g_bSpawnAtConstPos != '\0') {
local_f8 = g_vConstSpawnPos;
local_f4 = DAT_01028648;
local_f0 = DAT_0102864c;
}
if (g_bSpawnAtConstAng != '\0') {
local_e8 = g_flConstSpawnAng;
}
if (bVar13) {
piVar10[3] = 0;
piVar10[4] = (int)&local_f8;
piVar10[2] = 5;
piVar10[1] = local_118;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa5fade;
cVar5 = ZombieManager::GetRandomPZSpawnPosition();
if (cVar5 == '\0') {
piVar10[2] = 5;
*piVar10 = (int)"Couldn\'t find a %s Spawn position in %d tries\n";
piVar10[1] = (int)local_11c;
piVar10[-1] = 0xa602fe;
Warning();
return;
}
}
iVar6 = *g_pGameRules;
*piVar10 = (int)g_pGameRules;
pcVar3 = *(code **)(iVar6 + 0x7c);
piVar10[-1] = 0xa5faf3;
iVar8 = (*pcVar3)();
iVar6 = *g_pGameRules;
*piVar10 = (int)g_pGameRules;
pcVar3 = *(code **)(iVar6 + 0x7c);
piVar10[-1] = 0xa5fb02;
iVar6 = (*pcVar3)();
local_6c = 0.0;
local_68 = 0.0;
local_64 = 0.0;
local_3c = 0;
local_37 = 0;
local_4c = (*(float *)(iVar8 + 0x18) - *(float *)(iVar6 + 0xc)) * 0.5;
local_48 = (*(float *)(iVar8 + 0x1c) - *(float *)(iVar6 + 0x10)) * 0.5;
local_44 = (*(float *)(iVar8 + 0x20) - *(float *)(iVar6 + 0x14)) * 0.5;
local_38 = local_48 * local_48 + local_4c * local_4c + local_44 * local_44 < 1e-06;
local_5c = (*(float *)(iVar8 + 0x18) + *(float *)(iVar6 + 0xc)) * 0.5;
local_7c = (int *)((float)local_f8 + local_5c);
local_58 = (*(float *)(iVar8 + 0x1c) + *(float *)(iVar6 + 0x10)) * 0.5;
local_78 = local_f4 + local_58;
local_54 = (*(float *)(iVar8 + 0x20) + *(float *)(iVar6 + 0x14)) * 0.5;
local_5c = -local_5c;
local_58 = -local_58;
local_74 = local_f0 + local_54;
local_54 = -local_54;
*piVar10 = (int)&local_e0;
piVar10[3] = 0;
piVar10[2] = 0;
piVar10[1] = 0;
piVar10[-1] = 0xa5fc43;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)*piVar10,(IHandleEntity *)piVar10[1],piVar10[2],
(_func_bool_IHandleEntity_ptr_int *)piVar10[3]);
iVar6 = *enginetrace;
piVar10[4] = (int)local_d0;
piVar10[3] = (int)&local_e0;
*piVar10 = (int)enginetrace;
piVar10[2] = 0x202420b;
piVar10[1] = (int)&local_7c;
pcVar3 = *(code **)(iVar6 + 0x14);
piVar10[-1] = 0xa5fc73;
(*pcVar3)();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
piVar10[6] = -0x40800000;
piVar10[1] = (int)&local_c4;
piVar10[5] = 1;
piVar10[4] = 0;
piVar10[3] = 0xff;
piVar10[2] = 0xff;
*piVar10 = (int)local_d0;
piVar10[-1] = 0xa5fcbf;
DebugDrawLine((Vector *)*piVar10,(Vector *)piVar10[1],piVar10[2],piVar10[3],piVar10[4],
SUB41(piVar10[5],0),(float)piVar10[6]);
}
piVar10[6] = 0;
piVar10[1] = (int)&local_f8;
piVar10[5] = 1;
piVar10[4] = 0;
piVar10[3] = 0x461c4000;
piVar10[2] = 0;
*piVar10 = TheNavMesh;
piVar10[-1] = 0xa5fcfe;
iVar6 = CNavMesh::GetNearestNavArea
((CNavMesh *)*piVar10,(Vector *)piVar10[1],SUB41(piVar10[2],0),(float)piVar10[3]
,SUB41(piVar10[4],0),SUB41(piVar10[5],0),SUB41(piVar10[6],0));
if (((local_99 != '\0') || (local_a4 < 1.0)) && (iVar6 != 0)) {
piVar10[1] = iVar6;
*piVar10 = (int)&local_7c;
piVar10[-1] = 0xa601af;
TerrorNavArea::FindRandomSpot();
local_f8 = local_7c;
local_f0 = fVar1 + local_74;
local_f4 = local_78;
}
if (local_118 == 7) {
if (bVar12) {
*piVar10 = (int)"ragdoll flag is not implemented\n";
piVar10[-1] = 0xa602dc;
Warning();
}
s_ManualSpawn = 1;
piVar10[2] = (int)&local_ec;
piVar10[1] = (int)&local_f8;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa60291;
ZombieManager::SpawnWitch((ZombieManager *)*piVar10,(Vector *)piVar10[1],(QAngle *)piVar10[2]);
s_ManualSpawn = 0;
return;
}
if (local_11c == "witch_bride") {
LAB_00a60228:
s_ManualSpawn = 1;
piVar10[2] = (int)&local_ec;
piVar10[1] = (int)&local_f8;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa60250;
ZombieManager::SpawnWitchBride
((ZombieManager *)*piVar10,(Vector *)piVar10[1],(QAngle *)piVar10[2]);
s_ManualSpawn = 0;
return;
}
piVar10[1] = (int)"witch_bride";
*piVar10 = (int)local_11c;
piVar10[-1] = 0xa5fd50;
iVar8 = _V_stricmp((char *)*piVar10,(char *)piVar10[1]);
if (iVar8 == 0) goto LAB_00a60228;
if ((5 < local_118 - 1U) && (local_118 != 8)) {
piVar10[1] = iVar6;
piVar10[2] = (int)&local_f8;
piVar10[3] = 0;
s_ManualSpawn = 1;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa5fdab;
piVar9 = (int *)ZombieManager::SpawnCommonZombie();
if (piVar9 == (int *)0x0) {
piVar10[6] = 0;
piVar10[1] = (int)&local_f8;
piVar10[5] = 1;
piVar10[4] = 0;
piVar10[3] = 0x461c4000;
piVar10[2] = 0;
*piVar10 = TheNavMesh;
piVar10[-1] = 0xa60424;
iVar6 = CNavMesh::GetNearestNavArea
((CNavMesh *)*piVar10,(Vector *)piVar10[1],SUB41(piVar10[2],0),
(float)piVar10[3],SUB41(piVar10[4],0),SUB41(piVar10[5],0),
SUB41(piVar10[6],0));
if (iVar6 == 0) {
s_ManualSpawn = 0;
return;
}
piVar10[1] = iVar6;
*piVar10 = (int)&local_7c;
piVar10[-1] = 0xa6043d;
TerrorNavArea::FindRandomSpot();
piVar10[2] = (int)&local_f8;
local_f0 = fVar1 + local_74;
local_f8 = local_7c;
piVar10[3] = 0;
piVar10[1] = iVar6;
*piVar10 = TheZombieManager;
local_f4 = local_78;
piVar10[-1] = 0xa60492;
ZombieManager::SpawnCommonZombie();
s_ManualSpawn = 0;
return;
}
s_ManualSpawn = 0;
if (-1 < local_124) {
iVar6 = *piVar9;
*piVar10 = (int)piVar9;
pcVar3 = *(code **)(iVar6 + 0x14c);
piVar10[-1] = 0xa5fdd1;
iVar6 = (*pcVar3)();
fVar16 = DAT_01053d50;
fVar15 = DAT_01053d4c;
fVar1 = vec3_origin;
if (iVar6 != 0) {
if (((vec3_origin != *(float *)(iVar6 + 0x1cdc)) ||
(DAT_01053d4c != *(float *)(iVar6 + 0x1ce0))) ||
(DAT_01053d50 != *(float *)(iVar6 + 0x1ce4))) {
if (*(char *)(iVar6 + 0x6c) == '\0') {
puVar4 = *(uint **)(iVar6 + 0x30);
if (puVar4 != (uint *)0x0) {
*puVar4 = *puVar4 | 0x101;
*piVar10 = (int)puVar4;
piVar10[-1] = 0xa60375;
iVar8 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*piVar10);
*(undefined2 *)(iVar8 + 2) = 0;
}
}
else {
*(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
}
*(float *)(iVar6 + 0x1cdc) = fVar1;
*(float *)(iVar6 + 0x1ce0) = fVar15;
*(float *)(iVar6 + 0x1ce4) = fVar16;
}
*piVar10 = iVar6;
piVar10[1] = local_124;
piVar10[-1] = 0xa5fe28;
Infected::RequestWound((Infected *)*piVar10,piVar10[1]);
}
}
if (!bVar12) {
return;
}
piVar10[5] = 0;
*piVar10 = (int)&local_7c;
piVar10[4] = 1;
piVar10[3] = 0x461c4000;
piVar10[2] = (int)piVar9;
piVar10[1] = (int)piVar9;
piVar10[-1] = 0xa5fe5c;
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)*piVar10,(CBaseEntity *)piVar10[1],(CBaseEntity *)piVar10[2],
(float)piVar10[3],piVar10[4],piVar10[5]);
local_e0 = 0;
local_dc = 0;
local_d8 = 0x3f800000;
iVar6 = *piVar9;
piVar10[2] = (int)&local_e0;
piVar10[1] = (int)&local_7c;
*piVar10 = (int)piVar9;
pcVar3 = *(code **)(iVar6 + 0x4dc);
piVar10[-1] = 0xa5fe96;
(*pcVar3)();
return;
}
if (bVar12) {
*piVar10 = (int)"ragdoll flag is not implemented";
piVar10[-1] = 0xa6030f;
Warning();
}
local_7c = (int *)0x0;
local_78 = 0.0;
local_74 = (float)local_118;
*piVar10 = (int)&local_7c;
piVar10[-1] = 0xa5ff1f;
ForEachTerrorPlayer<SpawnablePZScan>((SpawnablePZScan *)*piVar10);
if (local_7c != (int *)0x0) {
piVar10[1] = 6;
*piVar10 = (int)local_7c;
piVar10[-1] = 0xa5ff3a;
CCSPlayer::State_Transition();
piVar9 = local_7c;
if (local_7c != (int *)0x0) {
if ((*(int *)(ZombieDebugTankSpawn._28_4_ + 0x30) == 0) && (local_118 == 8))
goto LAB_00a5ff62;
if (*(int *)(tank_raffle_debug._28_4_ + 0x30) == 0) {
piVar10[1] = 0;
*piVar10 = (int)local_7c;
piVar10[-1] = 0xa5ffd9;
CCSPlayer::State_Transition();
*piVar10 = (int)piVar9;
piVar10[1] = (int)&local_f8;
piVar10[-1] = 0xa5ffeb;
CBaseEntity::SetAbsOrigin((CBaseEntity *)*piVar10,(Vector *)piVar10[1]);
*piVar10 = (int)piVar9;
piVar10[1] = (int)&local_ec;
piVar10[-1] = 0xa5fffd;
CBaseEntity::SetAbsAngles((CBaseEntity *)*piVar10,(QAngle *)piVar10[1]);
if ((*(byte *)((int)piVar9 + 0x14d) & 8) != 0) {
*piVar10 = (int)piVar9;
piVar10[-1] = 0xa603de;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar10);
}
iVar8 = TheZombieManager;
*(int *)(TheZombieManager + 0x27c) = piVar9[0xb8];
g_ZombieClass = local_118;
*(int *)(iVar8 + 0x280) = piVar9[0xb9];
iVar6 = piVar9[0xba];
*(undefined1 *)(iVar8 + 0x288) = 1;
*(int *)(iVar8 + 0x284) = iVar6;
iVar6 = *piVar9;
*(undefined1 *)((int)piVar9 + 0x3fe1) = 1;
piVar9[0xff9] = -1;
piVar9[0xffa] = -0x40800000;
*piVar10 = (int)piVar9;
pcVar3 = *(code **)(iVar6 + 100);
piVar10[-1] = 0xa60075;
(*pcVar3)();
iVar6 = *(int *)(z_spawn_health._28_4_ + 0x30);
if ((0 < iVar6) && (iVar6 != piVar9[0x40])) {
iVar8 = *piVar9;
*piVar10 = (int)piVar9;
piVar10[1] = (int)(piVar9 + 0x40);
pcVar3 = *(code **)(iVar8 + 0x214);
piVar10[-1] = 0xa6009f;
(*pcVar3)();
piVar9[0x40] = iVar6;
}
iVar6 = *piVar9;
piVar10[3] = (int)&vec3_origin;
piVar10[2] = (int)&local_ec;
piVar10[1] = (int)&local_f8;
*piVar10 = (int)piVar9;
pcVar3 = *(code **)(iVar6 + 0x1dc);
piVar10[-1] = 0xa600cc;
(*pcVar3)();
*(undefined1 *)(TheZombieManager + 0x288) = 0;
return;
}
}
}
s_ManualSpawn = 1;
if (local_118 != 8) {
piVar10[3] = (int)&local_ec;
if ((iVar6 != 0) && (bVar11)) {
piVar10[2] = iVar6;
piVar10[1] = local_118;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa6012b;
ZombieManager::SpawnSpecial();
s_ManualSpawn = 0;
return;
}
piVar10[2] = (int)&local_f8;
piVar10[1] = local_118;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa60339;
ZombieManager::SpawnSpecial();
s_ManualSpawn = 0;
return;
}
LAB_00a5ff62:
s_ManualSpawn = 1;
if ((iVar6 == 0) || (!bVar11)) {
piVar10[2] = (int)&local_ec;
piVar10[1] = (int)&local_f8;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa603d1;
iVar6 = ZombieManager::SpawnTank
((ZombieManager *)*piVar10,(Vector *)piVar10[1],(QAngle *)piVar10[2]);
}
else {
piVar10[3] = 0;
piVar10[2] = (int)&local_ec;
piVar10[1] = iVar6;
*piVar10 = TheZombieManager;
piVar10[-1] = 0xa5ff97;
iVar6 = ZombieManager::SpawnTank
((ZombieManager *)*piVar10,(TerrorNavArea *)piVar10[1],(QAngle *)piVar10[2],
SUB41(piVar10[3],0));
}
piVar10[1] = iVar6;
piVar10[2] = 1;
*piVar10 = TheDirector;
piVar10[-1] = 0xa5ffb0;
CDirector::TryOfferingTankBot((CDirector *)*piVar10,(CBaseEntity *)piVar10[1],SUB41(piVar10[2],0))
;
s_ManualSpawn = 0;
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.