L L4D2node

CStudioHdr::RunFlexRulesOld

0x0059dd80 · 2841 bytes · __thiscall

_ZN10CStudioHdr15RunFlexRulesOldEPKfPf

Decompiled

undefined (3 params)

/* WARNING: Type propagation algorithm not settling */
/* CStudioHdr::RunFlexRulesOld(float const*, float*) */

void __thiscall CStudioHdr::RunFlexRulesOld(CStudioHdr *this,float *param_1,float *param_2)

{
  float fVar1;
  float fVar2;
  float fVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  int *piVar7;
  int iVar8;
  int iVar9;
  float *pfVar10;
  int iVar11;
  int iVar12;
  int iVar13;
  int iVar14;
  undefined4 *puVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  int local_b8;
  float local_a0;
  float local_9c [35];
  
  local_a0 = *(float *)this;
  if (0 < *(int *)((int)local_a0 + 0x104)) {
    iVar6 = 0;
    do {
      param_2[iVar6] = 0.0;
      iVar6 = iVar6 + 1;
      local_a0 = *(float *)this;
    } while (iVar6 < *(int *)((int)local_a0 + 0x104));
  }
  local_9c[0] = 0.0;
  local_9c[1] = 0.0;
  if (0 < *(int *)((int)local_a0 + 0x114)) {
    do {
      pfVar10 = local_9c + 2;
      for (iVar6 = 0x20; iVar6 != 0; iVar6 = iVar6 + -1) {
        *pfVar10 = 0.0;
        pfVar10 = pfVar10 + 1;
      }
      piVar7 = (int *)((int)local_9c[0] + *(int *)((int)local_a0 + 0x118) + (int)local_a0);
      iVar6 = *piVar7;
      if ((-1 < iVar6) && (iVar4 = *(int *)((int)local_a0 + 0x104), iVar6 < iVar4)) {
        iVar5 = piVar7[1];
        fVar16 = 0.0;
        if (0 < iVar5) {
          puVar15 = (undefined4 *)((int)piVar7 + piVar7[2]);
          iVar11 = 0;
          iVar14 = 0;
          do {
            switch(*puVar15) {
            case 1:
              if (iVar11 < 0x20) {
                local_9c[iVar11 + 2] = (float)puVar15[1];
                iVar11 = iVar11 + 1;
              }
              break;
            case 2:
              if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) &&
                 (iVar9 < *(int *)((int)local_a0 + 0x10c))) {
                local_9c[iVar11 + 2] =
                     param_1[*(int *)((int)local_a0 + iVar9 * 0x14 + *(int *)((int)local_a0 + 0x110)
                                     + 8)];
                iVar11 = iVar11 + 1;
              }
              break;
            case 3:
              if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) && (iVar9 < iVar4)) {
                local_9c[iVar11 + 2] = param_2[iVar9];
                iVar11 = iVar11 + 1;
              }
              break;
            case 4:
              if (1 < iVar11) {
                local_9c[iVar11] = local_9c[iVar11] + local_9c[iVar11 + 1];
                iVar11 = iVar11 + -1;
              }
              break;
            case 5:
              if (1 < iVar11) {
                local_9c[iVar11] = local_9c[iVar11] - local_9c[iVar11 + 1];
                iVar11 = iVar11 + -1;
              }
              break;
            case 6:
              if (1 < iVar11) {
                local_9c[iVar11] = local_9c[iVar11] * local_9c[iVar11 + 1];
                iVar11 = iVar11 + -1;
              }
              break;
            case 7:
              if (1 < iVar11) {
                if (local_9c[iVar11 + 1] <= 0.0001) {
                  local_9c[iVar11] = 0.0;
                  iVar11 = iVar11 + -1;
                }
                else {
                  local_9c[iVar11] = local_9c[iVar11] / local_9c[iVar11 + 1];
                  iVar11 = iVar11 + -1;
                }
              }
              break;
            case 8:
              if (0 < iVar11) {
                local_9c[iVar11 + 1] = (float)((uint)local_9c[iVar11 + 1] ^ 0x80000000);
              }
              break;
            case 0xd:
              if (1 < iVar11) {
                fVar16 = local_9c[iVar11];
                if (local_9c[iVar11] <= local_9c[iVar11 + 1]) {
                  fVar16 = local_9c[iVar11 + 1];
                }
                local_9c[iVar11] = fVar16;
                iVar11 = iVar11 + -1;
              }
              break;
            case 0xe:
              if (1 < iVar11) {
                fVar16 = local_9c[iVar11];
                if (local_9c[iVar11 + 1] <= local_9c[iVar11]) {
                  fVar16 = local_9c[iVar11 + 1];
                }
                local_9c[iVar11] = fVar16;
                iVar11 = iVar11 + -1;
              }
              break;
            case 0xf:
              if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) &&
                 (iVar9 < *(int *)((int)local_a0 + 0x10c))) {
                fVar16 = param_1[*(int *)((int)local_a0 + iVar9 * 0x14 +
                                          *(int *)((int)local_a0 + 0x110) + 8)] + 1.0;
                if (1.0 <= param_1[*(int *)((int)local_a0 + iVar9 * 0x14 +
                                            *(int *)((int)local_a0 + 0x110) + 8)] + 1.0) {
                  fVar16 = 1.0;
                }
                if (fVar16 <= 0.0) {
                  fVar16 = 0.0;
                }
                local_9c[iVar11 + 2] = 1.0 - fVar16;
                iVar11 = iVar11 + 1;
              }
              break;
            case 0x10:
              if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) &&
                 (iVar9 < *(int *)((int)local_a0 + 0x10c))) {
                fVar16 = param_1[*(int *)((int)local_a0 + iVar9 * 0x14 +
                                          *(int *)((int)local_a0 + 0x110) + 8)];
                if (1.0 <= fVar16) {
                  fVar16 = 1.0;
                }
                if (fVar16 <= 0.0) {
                  fVar16 = 0.0;
                }
                local_9c[iVar11 + 2] = fVar16;
                iVar11 = iVar11 + 1;
              }
              break;
            case 0x11:
              if ((((4 < iVar11) && (iVar9 = puVar15[1], -1 < iVar9)) &&
                  (iVar9 < *(int *)((int)local_a0 + 0x10c))) &&
                 ((iVar13 = (int)local_9c[iVar11 + 1], -1 < iVar13 &&
                  (iVar13 < *(int *)((int)local_a0 + 0x10c))))) {
                fVar17 = 0.0;
                fVar16 = param_1[*(int *)((int)local_a0 + 8 +
                                         *(int *)((int)local_a0 + 0x110) + iVar13 * 0x14)];
                fVar18 = (&local_a0)[iVar11];
                fVar1 = local_9c[iVar11];
                fVar2 = local_9c[iVar11 + 0xfffffffd];
                fVar3 = local_9c[iVar11 + 0xfffffffe];
                if ((fVar2 < fVar16) && (fVar16 < fVar1)) {
                  if (fVar3 <= fVar16) {
                    fVar17 = 1.0;
                    if ((fVar18 < fVar16) && (fVar1 != fVar18)) {
                      fVar16 = (fVar16 - fVar18) / (fVar1 - fVar18);
                      if (1.0 <= fVar16) {
                        fVar16 = 1.0;
                      }
                      if (fVar16 <= 0.0) {
                        fVar16 = 0.0;
                      }
                      fVar17 = 1.0 - fVar16;
                    }
                  }
                  else if (fVar3 != fVar2) {
                    fVar16 = (fVar16 - fVar2) / (fVar3 - fVar2);
                    if (1.0 <= fVar16) {
                      fVar16 = 1.0;
                    }
                    if (0.0 <= fVar16) {
                      fVar17 = fVar16;
                    }
                  }
                }
                local_9c[iVar11 + 0xfffffffd] =
                     fVar17 * param_1[*(int *)((int)local_a0 + 8 +
                                              *(int *)((int)local_a0 + 0x110) + iVar9 * 0x14)];
                iVar11 = iVar11 + -4;
              }
              break;
            case 0x12:
              iVar9 = puVar15[1];
              if (((iVar9 < 0) || (*(int *)((int)local_a0 + 0x10c) <= iVar9)) ||
                 ((iVar11 < iVar9 || ((iVar9 == 0 && (0x1f < iVar11)))))) break;
              iVar9 = iVar11 - iVar9;
              iVar13 = iVar9 + 1;
              fVar16 = local_9c[2];
              if (iVar13 < iVar11) {
                fVar18 = local_9c[iVar9 + 2];
                pfVar10 = local_9c + iVar9 + 3;
                do {
                  fVar18 = fVar18 * *pfVar10;
                  pfVar10 = pfVar10 + 1;
                  local_9c[iVar9 + 2] = fVar18;
                  fVar16 = local_9c[2];
                } while (pfVar10 != local_9c + iVar11 + 2);
              }
              goto joined_r0x0059e252;
            case 0x13:
              iVar9 = puVar15[1];
              if (((-1 < iVar9) && (iVar9 < *(int *)((int)local_a0 + 0x10c))) && (iVar9 < iVar11)) {
                iVar9 = iVar11 - iVar9;
                fVar16 = local_9c[iVar9 + 2];
                if (iVar9 + 1 < iVar11) {
                  pfVar10 = local_9c + iVar9 + 3;
                  do {
                    fVar16 = fVar16 * *pfVar10;
                    pfVar10 = pfVar10 + 1;
                  } while (pfVar10 != local_9c + iVar11 + 2);
                }
                local_9c[iVar9 + 1] = (1.0 - fVar16) * local_9c[iVar9 + 1];
                iVar11 = iVar9;
              }
              break;
            case 0x14:
              if ((((2 < iVar11) && (iVar9 = puVar15[1], -1 < iVar9)) &&
                  (iVar13 = *(int *)((int)local_a0 + 0x10c), iVar9 < iVar13)) &&
                 ((iVar12 = (int)local_9c[iVar11 + 1], -1 < iVar12 && (iVar12 < iVar13)))) {
                if (((-1 < (int)local_9c[iVar11]) &&
                    (((int)local_9c[iVar11] < iVar13 &&
                     (iVar8 = (int)local_9c[iVar11 + 0xffffffff], -1 < iVar8)))) && (iVar8 < iVar13)
                   ) {
                  iVar13 = *(int *)((int)local_a0 + 0x110);
                  iVar9 = iVar13 + iVar9 * 0x14 + (int)local_a0;
                  fVar16 = *(float *)(iVar9 + 0x10);
                  fVar18 = *(float *)(iVar9 + 0xc);
                  if (fVar16 == fVar18) {
                    fVar16 = (float)(~-(uint)(fVar16 <= param_1[*(int *)(iVar9 + 8)]) & 0x3f800000);
                  }
                  else {
                    fVar16 = (param_1[*(int *)(iVar9 + 8)] - fVar18) / (fVar16 - fVar18);
                    if (1.0 <= fVar16) {
                      fVar16 = 1.0;
                    }
                    if (fVar16 <= 0.0) {
                      fVar16 = 0.0;
                    }
                    fVar16 = 1.0 - fVar16;
                  }
                  iVar9 = iVar13 + iVar12 * 0x14 + (int)local_a0;
                  fVar18 = *(float *)(iVar9 + 0x10);
                  fVar1 = *(float *)(iVar9 + 0xc);
                  if (fVar18 == fVar1) {
                    fVar16 = (float)((uint)fVar16 & -(uint)(fVar18 <= param_1[*(int *)(iVar9 + 8)]))
                    ;
                  }
                  else {
                    fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
                    if (1.0 <= fVar18) {
                      fVar18 = 1.0;
                    }
                    if (fVar18 <= 0.0) {
                      fVar18 = 0.0;
                    }
                    fVar16 = fVar16 * fVar18;
                  }
                  iVar9 = iVar13 + iVar8 * 0x14 + (int)local_a0;
                  fVar18 = *(float *)(iVar9 + 0x10);
                  fVar1 = *(float *)(iVar9 + 0xc);
                  if (fVar18 == fVar1) {
                    if (param_1[*(int *)(iVar9 + 8)] < fVar18) goto LAB_0059e7c3;
                    fVar16 = 0.0;
                  }
                  else {
                    fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
                    if (1.0 <= fVar18) {
                      fVar18 = 1.0;
                    }
                    if (fVar18 <= 0.0) {
                      fVar18 = 0.0;
                    }
                    fVar18 = (fVar18 + fVar18) - 1.0;
                    if (fVar18 <= 0.0) goto LAB_0059e7c3;
                    fVar16 = (1.0 - fVar18) * fVar16;
                  }
                  local_9c[iVar11 + 0xffffffff] = fVar16;
                  iVar11 = iVar11 + -2;
                }
              }
              break;
            case 0x15:
              if ((((2 < iVar11) && (iVar9 = puVar15[1], -1 < iVar9)) &&
                  (iVar13 = *(int *)((int)local_a0 + 0x10c), iVar9 < iVar13)) &&
                 ((iVar12 = (int)local_9c[iVar11 + 1], -1 < iVar12 && (iVar12 < iVar13)))) {
                if (((-1 < (int)local_9c[iVar11]) &&
                    (((int)local_9c[iVar11] < iVar13 &&
                     (iVar8 = (int)local_9c[iVar11 + 0xffffffff], -1 < iVar8)))) && (iVar8 < iVar13)
                   ) {
                  iVar13 = *(int *)((int)local_a0 + 0x110);
                  iVar9 = iVar13 + iVar9 * 0x14 + (int)local_a0;
                  fVar16 = *(float *)(iVar9 + 0x10);
                  fVar18 = *(float *)(iVar9 + 0xc);
                  if (fVar16 == fVar18) {
                    fVar16 = (float)(-(uint)(fVar16 <= param_1[*(int *)(iVar9 + 8)]) & 0x3f800000);
                  }
                  else {
                    fVar16 = (param_1[*(int *)(iVar9 + 8)] - fVar18) / (fVar16 - fVar18);
                    if (1.0 <= fVar16) {
                      fVar16 = 1.0;
                    }
                    if (fVar16 <= 0.0) {
                      fVar16 = 0.0;
                    }
                  }
                  iVar9 = iVar13 + iVar12 * 0x14 + (int)local_a0;
                  fVar18 = *(float *)(iVar9 + 0x10);
                  fVar1 = *(float *)(iVar9 + 0xc);
                  if (fVar18 == fVar1) {
                    fVar16 = (float)((uint)fVar16 & -(uint)(fVar18 <= param_1[*(int *)(iVar9 + 8)]))
                    ;
                  }
                  else {
                    fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
                    if (1.0 <= fVar18) {
                      fVar18 = 1.0;
                    }
                    if (fVar18 <= 0.0) {
                      fVar18 = 0.0;
                    }
                    fVar16 = fVar16 * fVar18;
                  }
                  iVar9 = iVar13 + iVar8 * 0x14 + (int)local_a0;
                  fVar18 = *(float *)(iVar9 + 0x10);
                  fVar1 = *(float *)(iVar9 + 0xc);
                  if (fVar18 == fVar1) {
                    if (fVar18 <= param_1[*(int *)(iVar9 + 8)]) {
LAB_0059e001:
                      local_9c[iVar11 + 0xffffffff] = fVar16;
                      iVar11 = iVar11 + -2;
                      break;
                    }
                    fVar16 = 0.0;
                  }
                  else {
                    fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
                    if (1.0 <= fVar18) {
                      fVar18 = 1.0;
                    }
                    if (fVar18 <= 0.0) {
                      fVar18 = 0.0;
                    }
                    fVar18 = (fVar18 + fVar18) - 1.0;
                    if (0.0 <= fVar18) goto LAB_0059e001;
                    fVar16 = (fVar18 + 1.0) * fVar16;
                  }
LAB_0059e7c3:
                  local_b8 = iVar11 + -2;
                  local_9c[iVar11 + 0xffffffff] = fVar16;
                  iVar11 = local_b8;
                }
              }
            }
            iVar13 = iVar11;
            fVar16 = local_9c[2];
joined_r0x0059e252:
            iVar11 = iVar13;
            puVar15 = puVar15 + 2;
            iVar14 = iVar14 + 1;
            local_9c[2] = fVar16;
          } while (iVar14 != iVar5);
        }
        param_2[iVar6] = fVar16;
        local_a0 = *(float *)this;
      }
      local_9c[1] = (float)((int)local_9c[1] + 1);
      local_9c[0] = (float)((int)local_9c[0] + 0xc);
    } while ((int)local_9c[1] < *(int *)((int)local_a0 + 0x114));
  }
  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)