L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)