L L4D2node

CCurveData::GetIntensityArea

0x00bae240 · 843 bytes · __thiscall

_ZN10CCurveData16GetIntensityAreaEP18ICurveDataAccessorf

Decompiled

undefined (3 params)

/* CCurveData::GetIntensityArea(ICurveDataAccessor*, float) */

longdouble __thiscall
CCurveData::GetIntensityArea(CCurveData *this,ICurveDataAccessor *param_1,float param_2)

{
  bool bVar1;
  char cVar2;
  undefined4 *puVar3;
  undefined4 *puVar4;
  int iVar5;
  undefined4 *puVar6;
  undefined4 *puVar7;
  int iVar8;
  uint uVar9;
  int iVar10;
  int iVar11;
  uint uVar12;
  float fVar13;
  float fVar14;
  int local_7c;
  float local_78;
  Vector *local_70;
  bool local_66;
  bool local_65;
  int local_64;
  int local_60;
  int local_5c;
  float local_58;
  undefined4 local_54;
  undefined4 local_50;
  float local_4c;
  undefined4 local_48;
  undefined4 local_44;
  float local_40;
  undefined4 local_3c;
  undefined4 local_38;
  float local_34;
  undefined4 local_30;
  undefined4 local_2c;
  Vector local_28 [4];
  float local_24;
  
  cVar2 = (**(code **)(*(int *)param_1 + 4))(param_1);
  fVar13 = 0.0;
  if (cVar2 != '\0') {
    iVar5 = *(int *)(this + 0xc);
    if (iVar5 < 1) {
      fVar13 = 1.0;
    }
    else {
      if (iVar5 < 4) {
        local_7c = 2;
        iVar10 = 1;
      }
      else {
        iVar10 = iVar5 >> 1;
        local_7c = iVar10 + 1;
      }
      if (iVar5 < iVar10) {
        puVar4 = (undefined4 *)0x0;
        puVar3 = (undefined4 *)0x0;
      }
      else {
        iVar11 = iVar10;
        do {
          puVar3 = (undefined4 *)GetBoundedSample(this,param_1,iVar10,(bool *)local_28);
          local_7c = iVar10 + 1;
          puVar4 = (undefined4 *)GetBoundedSample(this,param_1,local_7c,(bool *)local_28);
          iVar8 = iVar11 >> 1;
          bVar1 = 3 < iVar11;
          iVar11 = 1;
          if (bVar1) {
            iVar11 = iVar8;
          }
          if (param_2 < (float)puVar3[1]) {
            iVar8 = -iVar11;
          }
          else {
            iVar8 = iVar11;
            if (param_2 < (float)puVar4[1] || param_2 == (float)puVar4[1]) goto LAB_00bae324;
          }
          iVar10 = iVar10 + iVar8;
        } while ((iVar10 <= iVar5) && (-2 < iVar10));
        local_7c = iVar10 + 1;
      }
LAB_00bae324:
      local_70 = local_28;
      UpdateIntensityArea(this,param_1);
      fVar13 = *(float *)(*(int *)(this + 0x24) + local_7c * 4);
      iVar11 = iVar10 + 2;
      if (iVar5 < iVar10 + 2) {
        iVar11 = iVar5;
      }
      iVar5 = -1;
      if (-1 < iVar10 + -1) {
        iVar5 = iVar10 + -1;
      }
      puVar6 = (undefined4 *)GetBoundedSample(this,param_1,iVar5,&local_66);
      puVar7 = (undefined4 *)GetBoundedSample(this,param_1,iVar11,&local_65);
      local_54 = *puVar6;
      local_50 = 0;
      local_48 = *puVar3;
      local_4c = (float)puVar3[1];
      local_44 = 0;
      local_40 = (float)puVar4[1];
      local_3c = *puVar4;
      local_38 = 0;
      local_30 = *puVar7;
      local_34 = (float)puVar7[1];
      local_2c = 0;
      local_58 = (float)puVar6[1];
      if (local_66 != false) {
        local_58 = local_4c;
      }
      if (local_65 != false) {
        local_34 = local_40;
      }
      if ((float)puVar4[1] - (float)puVar3[1] <= 0.0) {
        fVar14 = 0.0;
      }
      else {
        fVar14 = (param_2 - (float)puVar3[1]) / ((float)puVar4[1] - (float)puVar3[1]);
        if (fVar14 <= 0.0) {
          fVar14 = 0.0;
        }
        if (1.0 <= fVar14) {
          fVar14 = 1.0;
        }
      }
      local_78 = 1.0;
      uVar9 = (uint)*(byte *)((int)puVar4 + 9) << 7 | (uint)(*(byte *)(puVar4 + 2) >> 1);
      uVar12 = (uint)(*(byte *)(puVar3 + 2) >> 1) | (uint)*(byte *)((int)puVar3 + 9) << 7;
      if (uVar12 == 0) {
        uVar12 = (**(code **)(*(int *)param_1 + 8))(param_1);
      }
      if (uVar9 == 0) {
        uVar9 = (**(code **)(*(int *)param_1 + 8))(param_1);
      }
      Interpolator_CurveInterpolatorsForType(uVar12,&local_64,&local_60);
      Interpolator_CurveInterpolatorsForType(uVar9,&local_5c,&local_64);
      Catmull_Rom_Spline_Integral_Normalize
                ((Vector *)&local_58,(Vector *)&local_4c,(Vector *)&local_40,(Vector *)&local_34,
                 fVar14,local_70);
      fVar14 = 0.0;
      if (0.0 <= local_24) {
        fVar14 = local_24;
      }
      if (1.0 <= fVar14) {
        fVar14 = local_78;
      }
      fVar13 = fVar14 * (local_40 - local_4c) + fVar13;
    }
  }
  return (longdouble)fVar13;
}

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)