CInferno::Spread
0x008c91b0 · 2964 bytes · __thiscall
_ZN8CInferno6SpreadERK6Vector
Decompiled
undefined (2 params)
/* CInferno::Spread(Vector const&) */
void __thiscall CInferno::Spread(CInferno *this,Vector *param_1)
{
float fVar1;
float fVar2;
Vector *pVVar3;
float *pfVar4;
char cVar5;
int iVar6;
int iVar7;
longdouble lVar8;
float fVar9;
float fVar10;
float fVar11;
float fVar12;
int local_134;
int local_130;
int local_12c;
int local_118;
float local_114;
float local_110;
float local_10c;
float local_108;
float local_104;
float local_100;
float local_fc;
float local_f8;
float local_f4;
float local_f0;
float local_ec;
undefined4 local_e8;
undefined4 local_e4;
undefined4 local_e0;
float local_dc;
float local_d8;
float local_d4;
float local_cc;
float local_c8;
float local_c4;
float local_bc;
float local_b8;
float local_b4;
undefined4 local_ac;
undefined4 local_a8;
undefined4 local_a4;
undefined4 local_9c;
undefined4 local_98;
undefined4 local_94;
undefined4 local_8c;
undefined1 local_88;
undefined1 local_87;
Vector local_70 [12];
Vector local_64 [8];
float local_5c;
undefined4 local_58;
undefined4 local_54;
undefined4 local_50;
float local_44;
char local_3a;
char local_39;
if ((*(float *)(this + 0xbb0) <= 0.0) ||
(lVar8 = (longdouble)CountdownTimer::Now(), *(float *)(this + 0xbb0) <= (float)lVar8)) {
lVar8 = (longdouble)(**(code **)(*(int *)this + 0x340))(this);
fVar9 = (float)lVar8;
lVar8 = (longdouble)CountdownTimer::Now();
if ((float)lVar8 + fVar9 != *(float *)(this + 0xbb0)) {
(**(code **)(*(int *)(this + 0xba8) + 4))(this + 0xba8);
*(float *)(this + 0xbb0) = (float)lVar8 + fVar9;
}
if (fVar9 != *(float *)(this + 0xbac)) {
(**(code **)(*(int *)(this + 0xba8) + 4))(this + 0xba8);
*(float *)(this + 0xbac) = fVar9;
}
if (*(int *)(this + 0xa40) < 1) {
local_134 = *(int *)(this + 0xba0) + 1;
}
else {
iVar7 = 0;
do {
while( true ) {
iVar6 = *(int *)(this + iVar7 * 4 + 0xa48);
lVar8 = (longdouble)CountdownTimer::Now();
if ((float)lVar8 < *(float *)(iVar6 + 0x38)) break;
LAB_008c9260:
iVar6 = *(int *)(this + 0xa40);
iVar7 = iVar7 + 1;
if (iVar6 <= iVar7) goto LAB_008c9323;
}
lVar8 = (longdouble)CountdownTimer::Now();
if ((float)lVar8 < *(float *)(iVar6 + 0x44)) goto LAB_008c9260;
lVar8 = (longdouble)CountdownTimer::Now();
fVar9 = (float)lVar8 + *(float *)(iVar6 + 0x40);
if (fVar9 != *(float *)(iVar6 + 0x44)) {
(**(code **)(*(int *)(iVar6 + 0x3c) + 4))(iVar6 + 0x3c);
*(float *)(iVar6 + 0x44) = fVar9;
}
*(int *)(iVar6 + 0x28) = *(int *)(iVar6 + 0x28) + 1;
iVar7 = iVar7 + 1;
iVar6 = *(int *)(this + 0xa40);
} while (iVar7 < iVar6);
LAB_008c9323:
local_130 = *(int *)(inferno_max_trace_per_tick._28_4_ + 0x30);
iVar7 = *(int *)(this + 0xba0);
local_134 = iVar7 + 1;
if ((0 < iVar6) && (local_118 = 0, 0 < local_130)) {
do {
local_134 = (iVar7 + local_118) % iVar6;
pVVar3 = *(Vector **)(this + local_134 * 4 + 0xa48);
if ((*(int *)(pVVar3 + 0x28) != 0) &&
(iVar7 = *(int *)(pVVar3 + 0x24),
iVar7 + 1 < *(int *)(InfernoChildSpawnMaxDepth._28_4_ + 0x30))) {
local_12c = 4;
*(int *)(pVVar3 + 0x28) = *(int *)(pVVar3 + 0x28) + -1;
do {
pfVar4 = *(float **)(pVVar3 + 0x2c);
if (pfVar4 == (float *)0x0) {
lVar8 = (longdouble)
(**(code **)(*random_valve + 4))(random_valve,0xc0490fd0,0x40490fd0);
sincosf((float)lVar8,&local_110,&local_114);
local_10c = local_114;
local_104 = 0.0;
local_108 = local_110;
}
else {
local_dc = *(float *)pVVar3 - *pfVar4;
local_d8 = *(float *)(pVVar3 + 4) - pfVar4[1];
local_d4 = *(float *)(pVVar3 + 8) - pfVar4[2];
VectorNormalize((Vector *)&local_dc);
VectorAngles((Vector *)&local_dc,(QAngle *)&local_cc);
iVar6 = InfernoAcidSpawnAngle._28_4_;
if (*(int *)(this + 0xa44) != 1) {
iVar6 = InfernoSpawnAngle._28_4_;
}
lVar8 = (longdouble)
(**(code **)(*random_valve + 4))
(random_valve,*(uint *)(iVar6 + 0x2c) ^ 0x80000000,
*(uint *)(iVar6 + 0x2c));
local_c8 = (float)lVar8 + local_c8;
AngleVectors((QAngle *)&local_cc,(Vector *)&local_10c);
}
lVar8 = (longdouble)
__pow_finite((double)*(float *)(InfernoVelocityDecayFactor._28_4_ + 0x2c),
(double)*(int *)(pVVar3 + 0x24));
fVar9 = *(float *)(pVVar3 + 0x50);
fVar11 = (float)lVar8;
if (fVar9 <= 0.0) {
fVar9 = 0.0;
}
else {
lVar8 = (longdouble)CountdownTimer::Now();
fVar9 = (fVar9 - (float)lVar8) / *(float *)(pVVar3 + 0x4c);
if (1.0 <= fVar9) {
fVar9 = 1.0;
}
if (fVar9 <= 0.0) {
fVar9 = 0.0;
}
}
fVar10 = *(float *)(InfernoVelocityFactor._28_4_ + 0x2c);
fVar1 = *(float *)(pVVar3 + 0x1c);
fVar2 = *(float *)(pVVar3 + 0x18);
local_10c = *(float *)param_1 * fVar10 * fVar11 * fVar9 + local_10c;
local_108 = *(float *)(param_1 + 4) * fVar10 * fVar11 * fVar9 + local_108;
local_104 = fVar10 * *(float *)(param_1 + 8) * fVar11 * fVar9 + local_104;
fVar12 = local_108 * fVar2 - local_10c * fVar1;
fVar9 = *(float *)(pVVar3 + 0x20);
fVar10 = local_10c * fVar9 - local_104 * fVar2;
fVar11 = local_104 * fVar1 - local_108 * fVar9;
local_10c = fVar10 * fVar9 - fVar12 * fVar1;
local_108 = fVar12 * fVar2 - fVar9 * fVar11;
local_104 = fVar11 * fVar1 - fVar10 * fVar2;
lVar8 = (longdouble)
(**(code **)(*random_valve + 4))(random_valve,0x42480000,0x42960000);
fVar9 = (float)lVar8;
local_fc = local_108 * fVar9 + *(float *)(pVVar3 + 4);
local_f8 = local_104 * fVar9 + *(float *)(pVVar3 + 8);
local_100 = fVar9 * local_10c + *(float *)pVVar3;
local_f0 = local_fc - *(float *)(this + 0xb90);
local_ec = local_f8 - *(float *)(this + 0xb94);
local_f4 = local_100 - *(float *)(this + 0xb8c);
if (*(float *)(InfernoMaxRange._28_4_ + 0x2c) *
*(float *)(InfernoMaxRange._28_4_ + 0x2c) <
local_ec * local_ec + local_f4 * local_f4 + local_f0 * local_f0) {
VectorNormalize((Vector *)&local_f4);
fVar9 = *(float *)(InfernoMaxRange._28_4_ + 0x2c);
local_f4 = local_f4 * fVar9;
local_f0 = local_f0 * fVar9;
local_ec = fVar9 * local_ec;
local_100 = local_f4 + *(float *)(this + 0xb8c);
local_fc = local_f0 + *(float *)(this + 0xb90);
local_f8 = local_ec + *(float *)(this + 0xb94);
}
local_c4 = local_f8 + 50.0;
local_b4 = (*(float *)(pVVar3 + 8) - 200.0) - local_c4;
local_bc = 0.0;
local_b8 = 0.0;
local_94 = 0;
local_98 = 0;
local_87 = local_b4 * local_b4 != 0.0;
local_9c = 0;
local_8c = 0;
local_88 = 1;
local_a4 = 0;
local_a8 = 0;
local_ac = 0;
local_cc = local_100;
local_c8 = local_fc;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_dc,(IHandleEntity *)0x0,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_cc,0x4003,(Vector *)&local_dc,local_70);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,local_64,0xff,0,0,true,-1.0);
}
if (((local_44 < 1.0) || (local_3a != '\0')) || (local_39 != '\0')) {
local_f8 = local_5c;
local_e8 = local_58;
local_e4 = local_54;
local_e0 = local_50;
local_cc = *(float *)pVVar3;
local_c8 = *(float *)(pVVar3 + 4);
local_c4 = *(float *)(pVVar3 + 8) + 30.0;
local_bc = local_100 - local_cc;
local_b8 = local_fc - local_c8;
local_94 = 0;
local_b4 = (local_5c + 30.0) - local_c4;
local_98 = 0;
local_9c = 0;
local_88 = 1;
local_8c = 0;
local_a4 = 0;
local_a8 = 0;
local_ac = 0;
local_87 = local_bc * local_bc + local_b8 * local_b8 + local_b4 * local_b4 != 0.0;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_dc,(IHandleEntity *)0x0,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_cc,0x4003,(Vector *)&local_dc,local_70);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,local_64,0xff,0,0,true,-1.0);
}
local_130 = local_130 + -2;
if (local_44 < 1.0) {
if (*(int *)(InfernoDebug._28_4_ + 0x30) != 0) {
local_cc = local_100;
local_c8 = local_fc;
local_c4 = local_f8 + 30.0;
local_dc = *(float *)pVVar3;
local_d8 = *(float *)(pVVar3 + 4);
local_d4 = *(float *)(pVVar3 + 8) + 30.0;
NDebugOverlay::Line((Vector *)&local_dc,(Vector *)&local_cc,0xff,0,0,true,1.0);
}
goto LAB_008c9938;
}
cVar5 = CreateFire(this,(Vector *)&local_100,(Vector *)&local_e8,(FireInfo *)pVVar3,
iVar7 + 1);
if (cVar5 != '\0') break;
}
else {
if (*(int *)(InfernoDebug._28_4_ + 0x30) != 0) {
NDebugOverlay::Line(pVVar3,(Vector *)&local_100,0xff,0xff,0,true,1.0);
NDebugOverlay::Cross3D((Vector *)&local_100,5.0,0xff,0,0,true,1.0);
}
local_130 = local_130 + -1;
LAB_008c9938:
fVar9 = *(float *)(inferno_forward_reduction_factor._28_4_ + 0x2c);
*(float *)(this + 0xb80) = *(float *)(this + 0xb80) * fVar9;
*(float *)(this + 0xb84) = *(float *)(this + 0xb84) * fVar9;
*(float *)(this + 0xb88) = fVar9 * *(float *)(this + 0xb88);
}
local_12c = local_12c + -1;
} while (local_12c != 0);
iVar6 = *(int *)(this + 0xa40);
}
local_118 = local_118 + 1;
if ((iVar6 <= local_118) || (local_130 < 1)) break;
iVar7 = *(int *)(this + 0xba0);
} while( true );
}
}
*(int *)(this + 0xba0) = local_134 + 1;
}
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.