L L4D2node

Studio_IKSequenceError

0x00b86500 · 3376 bytes · __cdecl

_Z22Studio_IKSequenceErrorPK10CStudioHdrR16mstudioseqdesc_tifiPKfPP17mstudioanimdesc_tPfR17ikcontextikrule_t

Decompiled

undefined (9 params)

/* Studio_IKSequenceError(CStudioHdr const*, mstudioseqdesc_t&, int, float, int, float const*,
   mstudioanimdesc_t**, float*, ikcontextikrule_t&) */

undefined4
Studio_IKSequenceError
          (CStudioHdr *param_1,mstudioseqdesc_t *param_2,int param_3,float param_4,int param_5,
          float *param_6,mstudioanimdesc_t **param_7,float *param_8,ikcontextikrule_t *param_9)

{
  float fVar1;
  ushort uVar2;
  short sVar3;
  char cVar4;
  byte bVar5;
  mstudioikrule_t *pmVar6;
  mstudioanimdesc_t *pmVar7;
  int iVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  mstudioanimdesc_t **ppmVar12;
  ikcontextikrule_t *piVar13;
  float *pfVar14;
  longdouble lVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  float local_3c;
  float local_38;
  float local_34;
  float local_30;
  Quaternion local_2c [28];
  
  fVar16 = 0.0;
  fVar18 = 0.0;
  piVar13 = param_9;
  for (iVar9 = 0x21; iVar9 != 0; iVar9 = iVar9 + -1) {
    *(undefined4 *)piVar13 = 0;
    piVar13 = piVar13 + 4;
  }
  ppmVar12 = param_7;
  pfVar14 = param_8;
  do {
    if (*pfVar14 != 0.0) {
      iVar9 = *(int *)(*ppmVar12 + 0x3c);
      if (iVar9 <= param_5) {
        return 0;
      }
      if (iVar9 != *(int *)(*param_7 + 0x3c)) {
        return 0;
      }
      iVar9 = mstudioanimdesc_t::pIKRule(*ppmVar12,param_5);
      if (iVar9 == 0) {
        iVar9 = *(int *)(*ppmVar12 + 0x1c);
        if (iVar9 == 0) {
          return 0;
        }
        pmVar7 = *ppmVar12 + iVar9 + param_5 * 0xc;
        if (pmVar7 == (mstudioanimdesc_t *)0x0) {
          return 0;
        }
        fVar19 = fVar16;
        if (fVar18 == 0.0) {
          uVar2 = *(ushort *)(pmVar7 + 4);
          uVar10 = (uint)uVar2;
          if ((uVar2 & 0x7fff) == 0x7c00) {
            fVar18 = 65504.0;
            if ((short)uVar2 < 0) {
              fVar18 = -65504.0;
            }
          }
          else {
            bVar5 = (byte)(uVar2 >> 8);
            if ((bVar5 & 0x7c) == 0x7c) {
              if ((uVar2 & 0x3ff) == 0) goto LAB_00b86f00;
            }
            else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
              fVar18 = 1.0;
              if ((short)uVar2 < 0) {
                fVar18 = -1.0;
              }
              fVar18 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar18;
            }
            else {
LAB_00b86f00:
              fVar18 = (float)((uVar10 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
                              ((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
                              0x800000);
            }
          }
        }
        else {
          uVar2 = *(ushort *)(pmVar7 + 4);
          uVar10 = (uint)uVar2;
          if ((uVar2 & 0x7fff) == 0x7c00) {
            fVar17 = 65504.0;
            if ((short)uVar2 < 0) {
              fVar17 = -65504.0;
            }
          }
          else {
            bVar5 = (byte)(uVar2 >> 8);
            if ((bVar5 & 0x7c) == 0x7c) {
              fVar17 = fVar16;
              if ((uVar2 & 0x3ff) == 0) goto LAB_00b86f55;
            }
            else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
              fVar17 = 1.0;
              if ((short)uVar2 < 0) {
                fVar17 = -1.0;
              }
              fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
            }
            else {
LAB_00b86f55:
              fVar17 = (float)((uVar10 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
                              ((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
                              0x800000);
            }
          }
          if (0.5 < fVar17 - fVar18) {
            fVar19 = -1.0;
          }
          else if (fVar17 - fVar18 < -0.5) {
            fVar19 = 1.0;
          }
        }
        bVar5 = (byte)(uVar10 >> 8);
        if (((ushort)uVar10 & 0x7fff) == 0x7c00) {
          fVar17 = 65504.0;
          if ((char)bVar5 < '\0') {
            fVar17 = -65504.0;
          }
        }
        else if ((bVar5 & 0x7c) == 0x7c) {
          fVar17 = fVar16;
          if ((uVar10 & 0x3ff) == 0) goto LAB_00b870f5;
        }
        else if (((uVar10 & 0x7c00) == 0) && ((uVar10 & 0x3ff) != 0)) {
          fVar17 = 1.0;
          if ((char)bVar5 < '\0') {
            fVar17 = -1.0;
          }
          fVar17 = ((float)((ushort)uVar10 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
        }
        else {
LAB_00b870f5:
          uVar11 = uVar10 >> 10 & 0x1f;
          fVar17 = (float)((uVar10 & 0x3ff) << 0xd | (uVar10 >> 0xf) << 0x1f |
                          (uVar11 + 0x70) * (uint)(uVar11 != 0) * 0x800000);
        }
        *(float *)(param_9 + 0x3c) = (fVar17 + fVar19) * *pfVar14 + *(float *)(param_9 + 0x3c);
        uVar2 = *(ushort *)(pmVar7 + 6);
        if ((uVar2 & 0x7fff) == 0x7c00) {
          fVar17 = 65504.0;
          if ((short)uVar2 < 0) {
            fVar17 = -65504.0;
          }
        }
        else {
          bVar5 = (byte)(uVar2 >> 8);
          if ((bVar5 & 0x7c) == 0x7c) {
            fVar17 = fVar16;
            if ((uVar2 & 0x3ff) == 0) goto LAB_00b87045;
          }
          else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
            fVar17 = 1.0;
            if ((short)uVar2 < 0) {
              fVar17 = -1.0;
            }
            fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
          }
          else {
LAB_00b87045:
            fVar17 = (float)((uVar2 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
                            ((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
                            0x800000);
          }
        }
        *(float *)(param_9 + 0x40) = (fVar17 + fVar19) * *pfVar14 + *(float *)(param_9 + 0x40);
        uVar2 = *(ushort *)(pmVar7 + 8);
        if ((uVar2 & 0x7fff) == 0x7c00) {
          fVar17 = 65504.0;
          if ((short)uVar2 < 0) {
            fVar17 = -65504.0;
          }
        }
        else {
          bVar5 = (byte)(uVar2 >> 8);
          if ((bVar5 & 0x7c) == 0x7c) {
            fVar17 = fVar16;
            if ((uVar2 & 0x3ff) == 0) goto LAB_00b86fed;
          }
          else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
            fVar17 = 1.0;
            if ((short)uVar2 < 0) {
              fVar17 = -1.0;
            }
            fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
          }
          else {
LAB_00b86fed:
            fVar17 = (float)((uVar2 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
                            ((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
                            0x800000);
          }
        }
        *(float *)(param_9 + 0x44) = (fVar17 + fVar19) * *pfVar14 + *(float *)(param_9 + 0x44);
        uVar2 = *(ushort *)(pmVar7 + 10);
        if ((uVar2 & 0x7fff) == 0x7c00) {
          fVar17 = 65504.0;
          if ((short)uVar2 < 0) {
            fVar17 = -65504.0;
          }
        }
        else {
          bVar5 = (byte)(uVar2 >> 8);
          if ((bVar5 & 0x7c) == 0x7c) {
            fVar17 = fVar16;
            if ((uVar2 & 0x3ff) == 0) goto LAB_00b8709d;
          }
          else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
            fVar17 = 1.0;
            if ((short)uVar2 < 0) {
              fVar17 = -1.0;
            }
            fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
          }
          else {
LAB_00b8709d:
            fVar17 = (float)((uVar2 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
                            ((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
                            0x800000);
          }
        }
        *(float *)(param_9 + 0x48) = (fVar19 + fVar17) * *pfVar14 + *(float *)(param_9 + 0x48);
      }
      else {
        if (fVar18 == 0.0) {
          fVar19 = *(float *)(iVar9 + 0x4c);
          fVar17 = fVar16;
          fVar18 = fVar19;
        }
        else {
          fVar19 = *(float *)(iVar9 + 0x4c);
          fVar17 = -1.0;
          if (fVar19 - fVar18 <= 0.5) {
            fVar17 = (float)(-(uint)(fVar19 - fVar18 < -0.5) & 0x3f800000);
          }
        }
        *(float *)(param_9 + 0x3c) = (fVar19 + fVar17) * *pfVar14 + *(float *)(param_9 + 0x3c);
        *(float *)(param_9 + 0x40) =
             (*(float *)(iVar9 + 0x50) + fVar17) * *pfVar14 + *(float *)(param_9 + 0x40);
        *(float *)(param_9 + 0x44) =
             (*(float *)(iVar9 + 0x54) + fVar17) * *pfVar14 + *(float *)(param_9 + 0x44);
        *(float *)(param_9 + 0x48) =
             (fVar17 + *(float *)(iVar9 + 0x58)) * *pfVar14 + *(float *)(param_9 + 0x48);
      }
    }
    ppmVar12 = ppmVar12 + 1;
    pfVar14 = pfVar14 + 1;
    if (ppmVar12 == param_7 + 4) {
      fVar18 = *(float *)(param_9 + 0x3c);
      if (fVar18 <= 1.0) {
        if (fVar18 < 0.0) {
          *(float *)(param_9 + 0x3c) = fVar18 + 1.0;
          *(float *)(param_9 + 0x40) = *(float *)(param_9 + 0x40) + 1.0;
          *(float *)(param_9 + 0x44) = *(float *)(param_9 + 0x44) + 1.0;
          *(float *)(param_9 + 0x48) = *(float *)(param_9 + 0x48) + 1.0;
        }
      }
      else {
        *(float *)(param_9 + 0x3c) = fVar18 - 1.0;
        *(float *)(param_9 + 0x40) = *(float *)(param_9 + 0x40) - 1.0;
        *(float *)(param_9 + 0x44) = *(float *)(param_9 + 0x44) - 1.0;
        *(float *)(param_9 + 0x48) = *(float *)(param_9 + 0x48) - 1.0;
      }
      lVar15 = (longdouble)Studio_IKRuleWeight(param_9,param_4);
      *(float *)(param_9 + 0x5c) = (float)lVar15;
      if ((float)lVar15 <= 0.001) {
        iVar9 = mstudioanimdesc_t::pIKRule(*param_7,param_5);
        if (iVar9 == 0) {
          return 0;
        }
        if (((byte)(*param_7)[0xc] & 1) == 0) {
          return 0;
        }
        iVar9 = mstudioanimdesc_t::pIKRule(*param_7,param_5);
        if (*(int *)(iVar9 + 4) != 3) {
          return 0;
        }
        if (*(float *)(param_9 + 0x48) - *(float *)(param_9 + 0x3c) <= 0.75) {
          return 0;
        }
        param_4 = *(float *)(param_9 + 0x48) - 0.001;
        *(undefined4 *)(param_9 + 0x5c) = 0x3a83126f;
      }
      *(undefined4 *)(param_9 + 0x20) = 0;
      *(undefined4 *)(param_9 + 0x24) = 0;
      *(undefined4 *)(param_9 + 0x28) = 0;
      iVar9 = 0;
      *(undefined4 *)(param_9 + 0x2c) = 0;
      *(undefined4 *)(param_9 + 0x30) = 0;
      *(undefined4 *)(param_9 + 0x34) = 0;
      *(undefined4 *)(param_9 + 0x38) = 0;
      fVar18 = fVar16;
      do {
        if (*param_8 != 0.0) {
          pmVar6 = (mstudioikrule_t *)mstudioanimdesc_t::pIKRule(param_7[iVar9],param_5);
          if (pmVar6 == (mstudioikrule_t *)0x0) {
            iVar8 = *(int *)(param_7[iVar9] + 0x1c);
            if (iVar8 == 0) {
              return 0;
            }
            pmVar7 = param_7[iVar9] + iVar8 + param_5 * 0xc;
            if (pmVar7 == (mstudioanimdesc_t *)0x0) {
              return 0;
            }
            *(undefined4 *)(param_9 + 4) = 4;
            *(int *)(param_9 + 8) = (int)*(short *)pmVar7;
            uVar10 = 3;
            sVar3 = *(short *)(pmVar7 + 2);
            *(undefined4 *)(param_9 + 0xc) = 0xffffffff;
            *(int *)(param_9 + 0x10) = (int)sVar3;
            iVar8 = 4;
          }
          else {
            *(undefined4 *)(param_9 + 8) = *(undefined4 *)(pmVar6 + 8);
            *(undefined4 *)(param_9 + 0xc) = *(undefined4 *)(pmVar6 + 0xc);
            iVar8 = *(int *)(pmVar6 + 4);
            *(int *)(param_9 + 4) = iVar8;
            *(undefined4 *)(param_9 + 0x10) = *(undefined4 *)(pmVar6 + 0x10);
            uVar10 = iVar8 - 1;
            *(float *)(param_9 + 0x14) =
                 *param_8 * *(float *)(pmVar6 + 0x14) + *(float *)(param_9 + 0x14);
            *(float *)(param_9 + 0x1c) =
                 *param_8 * *(float *)(pmVar6 + 0x1c) + *(float *)(param_9 + 0x1c);
            *(float *)(param_9 + 0x18) =
                 *param_8 * *(float *)(pmVar6 + 0x18) + *(float *)(param_9 + 0x18);
            *(float *)(param_9 + 0x50) =
                 *param_8 * *(float *)(pmVar6 + 100) + *(float *)(param_9 + 0x50);
            *(float *)(param_9 + 0x4c) =
                 *param_8 * *(float *)(pmVar6 + 0x68) + *(float *)(param_9 + 0x4c);
          }
          fVar19 = *(float *)(param_9 + 0x48);
          fVar17 = param_4;
          if (1.0 < fVar19) {
            fVar17 = (float)(~-(uint)(param_4 < *(float *)(param_9 + 0x3c)) & (uint)param_4 |
                            (uint)(param_4 + 1.0) & -(uint)(param_4 < *(float *)(param_9 + 0x3c)));
          }
          fVar1 = *(float *)(param_9 + 0x44);
          fVar20 = fVar16;
          if ((fVar1 < fVar17) && (fVar17 < fVar19)) {
            fVar20 = (fVar17 - fVar1) / (fVar19 - fVar1);
          }
          *(float *)(param_9 + 0x58) = *(float *)(param_9 + 0x58) + fVar20 * *param_8;
          if ((uVar10 < 5) && ((1 << ((byte)uVar10 & 0x1f) & 0x17U) != 0)) {
            cVar4 = Studio_IKAnimationError
                              (param_1,pmVar6,param_7[iVar9],param_4,(Vector *)&local_38,local_2c,
                               &local_3c);
            if (cVar4 == '\0') {
              iVar8 = *(int *)(param_9 + 4);
              fVar19 = *(float *)(param_9 + 0x48);
            }
            else {
              fVar19 = *param_8;
              *(float *)(param_9 + 0x24) = local_34 * fVar19 + *(float *)(param_9 + 0x24);
              *(float *)(param_9 + 0x28) = local_30 * fVar19 + *(float *)(param_9 + 0x28);
              *(float *)(param_9 + 0x20) = fVar19 * local_38 + *(float *)(param_9 + 0x20);
              QuaternionAccumulate
                        ((Quaternion *)(param_9 + 0x2c),*param_8,local_2c,
                         (Quaternion *)(param_9 + 0x2c));
              iVar8 = *(int *)(param_9 + 4);
              fVar18 = fVar18 + *param_8;
              fVar19 = *(float *)(param_9 + 0x48);
            }
          }
          else {
            fVar18 = fVar18 + *param_8;
          }
          fVar17 = param_4;
          if (1.0 < fVar19) {
            fVar17 = (float)(~-(uint)(param_4 < *(float *)(param_9 + 0x3c)) & (uint)param_4 |
                            (uint)(param_4 + 1.0) & -(uint)(param_4 < *(float *)(param_9 + 0x3c)));
          }
          if (*(float *)(param_9 + 0x40) <= fVar17) {
            *(float *)(param_9 + 100) = (float)(fVar17 < fVar19) * *(float *)(param_9 + 0x5c);
          }
          else {
            *(float *)(param_9 + 100) = *(float *)(param_9 + 0x5c) * 0.0;
          }
          if (iVar8 == 5) {
            *(mstudioikrule_t **)(param_9 + 0x68) = pmVar6 + *(int *)(pmVar6 + 0x78);
          }
        }
        iVar9 = iVar9 + 1;
        param_8 = param_8 + 1;
        if (iVar9 == 4) {
          if (fVar18 <= 0.0001) {
            return 0;
          }
          if (fVar18 < 0.999) {
            fVar18 = 1.0 / fVar18;
            *(float *)(param_9 + 0x20) = *(float *)(param_9 + 0x20) * fVar18;
            *(float *)(param_9 + 0x24) = *(float *)(param_9 + 0x24) * fVar18;
            *(float *)(param_9 + 0x28) = *(float *)(param_9 + 0x28) * fVar18;
            QuaternionScale((Quaternion *)(param_9 + 0x2c),fVar18,(Quaternion *)(param_9 + 0x2c));
          }
          if ((*(int *)(param_9 + 4) == 1) && (*(int *)(param_9 + 0xc) != -1)) {
            iVar9 = CStudioHdr::RemapSeqBone(param_1,param_3,*(int *)(param_9 + 0xc));
            *(int *)(param_9 + 0xc) = iVar9;
            if (iVar9 == -1) {
              return 0;
            }
          }
          QuaternionNormalize((Quaternion *)(param_9 + 0x2c));
          return 1;
        }
      } while( true );
    }
  } while( true );
}

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)