L L4D2node

CIKContext::SolveDependencies

0x00b87ab0 · 2163 bytes · __thiscall

_ZN10CIKContext17SolveDependenciesEP6VectorP10QuaternionP11matrix3x4_tR12CBoneBitList

Decompiled

undefined (5 params)

/* CIKContext::SolveDependencies(Vector*, Quaternion*, matrix3x4_t*, CBoneBitList&) */

void __thiscall
CIKContext::SolveDependencies
          (CIKContext *this,Vector *param_1,Quaternion *param_2,matrix3x4_t *param_3,
          CBoneBitList *param_4)

{
  mstudioikchain_t *pmVar1;
  int iVar2;
  float fVar3;
  float fVar4;
  int iVar5;
  char cVar6;
  CStudioHdr *pCVar7;
  int *piVar8;
  int iVar9;
  Vector *pVVar10;
  CIKContext *pCVar11;
  int iVar12;
  Vector *pVVar13;
  Quaternion *pQVar14;
  int iVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  int local_55c;
  int local_554;
  float local_548;
  float local_544;
  float local_540;
  float local_53c;
  float local_538;
  float local_534;
  matrix3x4_t local_52c [48];
  float local_4fc;
  float local_4f8;
  float local_4f4;
  Quaternion local_4cc [48];
  float local_49c [3];
  Quaternion aQStack_490 [4];
  Quaternion local_48c [16];
  float local_47c [283];
  
  iVar15 = 0;
  pCVar7 = *(CStudioHdr **)(this + 0xff8);
  iVar9 = *(int *)pCVar7;
  pQVar14 = local_48c;
  if (0 < *(int *)(iVar9 + 0x11c)) {
    do {
      while( true ) {
        iVar9 = iVar9 + iVar15 * 0x10 + *(int *)(iVar9 + 0x120);
        iVar9 = *(int *)(iVar9 + 0x38 + *(int *)(iVar9 + 0xc));
        *(undefined4 *)(pQVar14 + -0x10) = 0xffffffff;
        *(undefined4 *)(pQVar14 + 0x10) = 0;
        if ((*(uint *)(this + 0x105c) & *(uint *)(*(int *)(pCVar7 + 0x2c) + iVar9 * 4)) == 0) break;
        iVar15 = iVar15 + 1;
        ::BuildBoneChain(pCVar7,(matrix3x4_t *)(this + 0x1024),param_1,param_2,iVar9,param_3,param_4
                        );
        MatrixAngles(param_3 + iVar9 * 0x30,pQVar14,(Vector *)(pQVar14 + -0xc));
        pCVar7 = *(CStudioHdr **)(this + 0xff8);
        iVar9 = *(int *)pCVar7;
        pQVar14 = pQVar14 + 0x24;
        if (*(int *)(iVar9 + 0x11c) <= iVar15) goto LAB_00b87ba8;
      }
      iVar9 = *(int *)pCVar7;
      iVar15 = iVar15 + 1;
      pQVar14 = pQVar14 + 0x24;
    } while (iVar15 < *(int *)(iVar9 + 0x11c));
  }
LAB_00b87ba8:
  if (0 < *(int *)(this + 0x1008)) {
    iVar9 = *(int *)(this + 0xffc);
    local_55c = 0;
    do {
      piVar8 = (int *)(iVar9 + local_55c * 0x14);
      if (0 < piVar8[3]) {
        iVar15 = 0;
        do {
          iVar12 = iVar15 * 0x84 + *piVar8;
          iVar5 = *(int *)(iVar12 + 8);
          iVar2 = iVar5 * 0x24;
          local_49c[iVar5 * 9] = -NAN;
          if (*(int *)(iVar12 + 4) == 1) {
            QuaternionMatrix((Quaternion *)(iVar12 + 0x2c),(Vector *)(iVar12 + 0x20),
                             (matrix3x4_t *)local_4cc);
            if (*(int *)(iVar12 + 0xc) == -1) {
              ConcatTransforms((matrix3x4_t *)(this + 0x1024),(matrix3x4_t *)local_4cc,local_52c);
            }
            else {
              ::BuildBoneChain(*(CStudioHdr **)(this + 0xff8),(matrix3x4_t *)(this + 0x1024),param_1
                               ,param_2,*(int *)(iVar12 + 0xc),param_3,param_4);
              ConcatTransforms_Aligned
                        (param_3 + *(int *)(iVar12 + 0xc) * 0x30,(matrix3x4_t *)local_4cc,local_52c)
              ;
            }
            fVar16 = *(float *)(iVar12 + 0x60) * *(float *)(iVar12 + 0x5c);
            fVar17 = 1.0 - fVar16;
            local_47c[iVar5 * 9] = fVar17 * local_47c[iVar5 * 9] + fVar16;
            MatrixAngles(local_52c,(Quaternion *)&local_4fc,(Vector *)&local_53c);
            fVar3 = *(float *)(local_48c + iVar2 + -4);
            fVar4 = local_49c[iVar5 * 9 + 1];
            local_49c[iVar5 * 9 + 2] = local_49c[iVar5 * 9 + 2] * fVar17 + local_538 * fVar16;
            *(float *)(local_48c + iVar2 + -4) = fVar3 * fVar17 + local_534 * fVar16;
            local_49c[iVar5 * 9 + 1] = fVar17 * fVar4 + local_53c * fVar16;
            QuaternionSlerp(local_48c + iVar2,(Quaternion *)&local_4fc,fVar16,local_48c + iVar2);
            iVar9 = *(int *)(this + 0xffc);
          }
          else if (*(int *)(iVar12 + 4) == 4) {
            fVar16 = *(float *)(iVar12 + 0x60) * *(float *)(iVar12 + 0x5c);
            iVar9 = *(int *)*(CStudioHdr **)(this + 0xff8);
            iVar9 = iVar9 + *(int *)(iVar12 + 8) * 0x10 + *(int *)(iVar9 + 0x120);
            iVar9 = *(int *)(iVar9 + 0x38 + *(int *)(iVar9 + 0xc));
            ::BuildBoneChain(*(CStudioHdr **)(this + 0xff8),(matrix3x4_t *)(this + 0x1024),param_1,
                             param_2,iVar9,param_3,param_4);
            MatrixAngles(param_3 + iVar9 * 0x30,local_4cc,(Vector *)&local_4fc);
            fVar17 = 1.0 - fVar16;
            fVar3 = *(float *)(local_48c + iVar2 + -4);
            fVar4 = local_49c[iVar5 * 9 + 1];
            local_49c[iVar5 * 9 + 2] = local_49c[iVar5 * 9 + 2] * fVar17 + local_4f8 * fVar16;
            *(float *)(local_48c + iVar2 + -4) = fVar3 * fVar17 + local_4f4 * fVar16;
            local_49c[iVar5 * 9 + 1] = fVar17 * fVar4 + local_4fc * fVar16;
            QuaternionSlerp(local_48c + iVar2,local_4cc,fVar16,local_48c + iVar2);
            iVar9 = *(int *)(this + 0xffc);
          }
          iVar15 = iVar15 + 1;
          piVar8 = (int *)(iVar9 + local_55c * 0x14);
        } while (iVar15 < piVar8[3]);
      }
      local_55c = local_55c + 1;
    } while (local_55c < *(int *)(this + 0x1008));
  }
  if (0 < *(int *)(this + 0xff0)) {
    pVVar10 = (Vector *)(this + 0x60);
    pCVar11 = this + 0xf0;
    local_554 = 0;
    pVVar13 = pVVar10;
    do {
      if (0.0 < *(float *)(pVVar13 + -4)) {
        iVar15 = *(int *)(pVVar13 + -0x60);
        iVar9 = iVar15 * 0x24;
        QuaternionAngles((Quaternion *)(pVVar13 + -0x48),(RadianEuler *)&local_4fc);
        AngleMatrix((RadianEuler *)&local_4fc,pVVar13 + -0x54,(matrix3x4_t *)local_4cc);
        QuaternionAngles((Quaternion *)(pVVar13 + 0xc),(RadianEuler *)&local_53c);
        AngleMatrix((RadianEuler *)&local_53c,pVVar13,(matrix3x4_t *)&local_4fc);
        ConcatTransforms((matrix3x4_t *)&local_4fc,(matrix3x4_t *)local_4cc,local_52c);
        MatrixAngles(local_52c,(Quaternion *)&local_53c,(Vector *)&local_548);
        fVar3 = *(float *)(pVVar13 + -4);
        fVar4 = local_49c[iVar15 * 9 + 2];
        local_47c[iVar15 * 9] = fVar3;
        fVar18 = 1.0 - fVar3;
        fVar16 = *(float *)(local_48c + iVar9 + -4);
        fVar17 = local_49c[iVar15 * 9 + 1];
        local_49c[iVar15 * 9 + 2] = fVar4 * fVar18 + local_544 * fVar3;
        *(float *)(local_48c + iVar9 + -4) = fVar16 * fVar18 + local_540 * fVar3;
        local_49c[iVar15 * 9 + 1] = fVar18 * fVar17 + local_548 * fVar3;
        QuaternionSlerp(local_48c + iVar9,(Quaternion *)&local_53c,fVar3,local_48c + iVar9);
      }
      if (pVVar13[0x68] != (Vector)0x0) {
        pVVar13[0x69] = (Vector)0x1;
        *(undefined4 *)(pVVar13 + 0x9c) = *(undefined4 *)(pVVar13 + 0xc);
        *(undefined4 *)(pVVar13 + 0xa0) = *(undefined4 *)(pVVar13 + 0x10);
        *(undefined4 *)(pVVar13 + 0xa4) = *(undefined4 *)(pVVar13 + 0x14);
        *(undefined4 *)(pVVar13 + 0xa8) = *(undefined4 *)(pVVar13 + 0x18);
        *(undefined4 *)pCVar11 = *(undefined4 *)pVVar10;
        *(undefined4 *)(pCVar11 + 4) = *(undefined4 *)(pVVar10 + 4);
        *(undefined4 *)(pCVar11 + 8) = *(undefined4 *)(pVVar10 + 8);
      }
      pVVar10 = pVVar10 + 0x154;
      pCVar11 = pCVar11 + 0x154;
      local_554 = local_554 + 1;
      pVVar13 = pVVar13 + 0x154;
    } while (local_554 < *(int *)(this + 0xff0));
  }
  piVar8 = *(int **)(this + 0xff8);
  iVar15 = 0;
  pQVar14 = local_48c;
  iVar9 = *piVar8;
  if (*(int *)(iVar9 + 0x11c) < 1) {
    return;
  }
  do {
    while (*(float *)(pQVar14 + 0x10) <= 0.0) {
LAB_00b881aa:
      iVar9 = *piVar8;
      iVar15 = iVar15 + 1;
      pQVar14 = pQVar14 + 0x24;
      if (*(int *)(iVar9 + 0x11c) <= iVar15) {
        return;
      }
    }
    pmVar1 = (mstudioikchain_t *)(iVar9 + iVar15 * 0x10 + *(int *)(iVar9 + 0x120));
    cVar6 = Studio_SolveIK(pmVar1,(Vector *)(pQVar14 + -0xc),param_3);
    if (cVar6 == '\0') {
      iVar9 = *(int *)(pQVar14 + -0x10);
      if (iVar9 != -1) {
        *(float *)(this + iVar9 * 0x154 + 0x10c) = *(float *)(this + iVar9 * 0x154 + 0x10c) * 0.8;
        *(float *)(this + iVar9 * 0x154 + 0x110) = *(float *)(this + iVar9 * 0x154 + 0x110) * 0.8;
        *(float *)(this + iVar9 * 0x154 + 0x114) = *(float *)(this + iVar9 * 0x154 + 0x114) * 0.8;
        QuaternionScale((Quaternion *)(this + iVar9 * 0x154 + 0x118),0.8,
                        (Quaternion *)(this + iVar9 * 0x154 + 0x118));
      }
      piVar8 = *(int **)(this + 0xff8);
      goto LAB_00b881aa;
    }
    iVar15 = iVar15 + 1;
    MatrixGetColumn(param_3 + *(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x38) * 0x30,3,
                    (Vector *)local_4cc);
    QuaternionMatrix(pQVar14,(Vector *)local_4cc,
                     param_3 + *(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x38) * 0x30);
    SolveBone(*(CStudioHdr **)(this + 0xff8),*(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x38),
              param_3,param_1,param_2);
    SolveBone(*(CStudioHdr **)(this + 0xff8),*(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x1c),
              param_3,param_1,param_2);
    SolveBone(*(CStudioHdr **)(this + 0xff8),*(int *)(pmVar1 + *(int *)(pmVar1 + 0xc)),param_3,
              param_1,param_2);
    piVar8 = *(int **)(this + 0xff8);
    iVar9 = *piVar8;
    pQVar14 = pQVar14 + 0x24;
    if (*(int *)(iVar9 + 0x11c) <= iVar15) {
      return;
    }
  } 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)