L L4D2node

CChoreoScene::ParseFlexAnimations

0x00bb4af0 · 2439 bytes · __cdecl

_ZN12CChoreoScene19ParseFlexAnimationsEP20ISceneTokenProcessorP12CChoreoEventb

Decompiled

undefined (3 params)

/* CChoreoScene::ParseFlexAnimations(ISceneTokenProcessor*, CChoreoEvent*, bool) */

void CChoreoScene::ParseFlexAnimations
               (ISceneTokenProcessor *param_1,CChoreoEvent *param_2,bool param_3)

{
  float *pfVar1;
  byte bVar2;
  int *piVar3;
  char cVar4;
  char *pcVar5;
  int iVar6;
  int iVar7;
  uint uVar8;
  CFlexAnimationTrack *this;
  int iVar9;
  char *pcVar10;
  int iVar11;
  CUtlVector<CExpressionSample,CUtlMemory<CExpressionSample,int>> *this_00;
  int in_GS_OFFSET;
  bool bVar12;
  longdouble lVar13;
  longdouble lVar14;
  double dVar15;
  double dVar16;
  float local_10c;
  float local_108;
  uint local_100;
  int local_f4;
  bool local_ef;
  EdgeInfo_t local_d6;
  ushort local_d5;
  float local_d3;
  EdgeInfo_t local_cf;
  ushort local_ce;
  float local_cc;
  int local_c8 [5];
  undefined4 local_b4;
  undefined4 local_b0;
  undefined4 local_ac;
  undefined4 local_a8;
  undefined4 local_a4;
  char local_a0 [128];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (param_3) {
    CChoreoEvent::RemoveAllTracks(param_2);
    CChoreoEvent::SetTrackLookupSet(param_2,false);
  }
  (**(code **)(*(int *)param_1 + 4))(param_1,1);
  lVar13 = (longdouble)CChoreoEvent::GetEndTime(param_2);
  lVar14 = (longdouble)CChoreoEvent::GetStartTime(param_2);
  pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
  iVar6 = _V_stricmp(pcVar5,"samples_use_time");
  if (iVar6 == 0) {
    (**(code **)(*(int *)param_1 + 4))(param_1,1);
  }
  pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
  iVar7 = V_strnicmp(pcVar5,"defaultcurvetype",0x10);
  local_f4 = 0;
  if (iVar7 == 0) {
    iVar7 = (*(code *)**(undefined4 **)param_1)(param_1);
    pcVar5 = (char *)(iVar7 + 0x10);
    cVar4 = *(char *)(iVar7 + 0x10);
    if (cVar4 == '\0') {
      (**(code **)(*(int *)param_1 + 4))(param_1,1);
      pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
      cVar4 = *pcVar5;
    }
    if (cVar4 != '=') {
      (**(code **)(*(int *)param_1 + 0xc))(param_1,"expecting =\n");
    }
    pcVar10 = pcVar5 + 1;
    if (pcVar5[1] == '\0') {
      (**(code **)(*(int *)param_1 + 4))(param_1,1);
      pcVar10 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    }
    local_f4 = Interpolator_CurveTypeForName(pcVar10);
    (**(code **)(*(int *)param_1 + 4))(param_1,1);
    CChoreoEvent::SetDefaultCurveType(param_2,local_f4);
  }
  pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
  iVar7 = _V_stricmp(pcVar5,"{");
  if (iVar7 != 0) {
    (**(code **)(*(int *)param_1 + 0xc))(param_1,"expecting {\n");
  }
  while( true ) {
    (**(code **)(*(int *)param_1 + 4))(param_1,1);
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    if (*pcVar5 == '\0') break;
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    iVar7 = _V_stricmp(pcVar5,"}");
    if (iVar7 == 0) goto LAB_00bb54e8;
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    V_strncpy(local_a0,pcVar5,0x80);
    (**(code **)(*(int *)param_1 + 4))(param_1,1);
    local_d5 = 0;
    local_d6 = (EdgeInfo_t)0x0;
    local_d3 = 0.0;
    local_cf = (EdgeInfo_t)0x0;
    local_ce = 0;
    local_cc = 0.0;
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    iVar7 = _V_stricmp(pcVar5,"disabled");
    if (iVar7 == 0) {
      (**(code **)(*(int *)param_1 + 4))(param_1,1);
    }
    local_ef = iVar7 != 0;
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    iVar7 = _V_stricmp(pcVar5,"combo");
    bVar12 = iVar7 == 0;
    if (bVar12) {
      (**(code **)(*(int *)param_1 + 4))(param_1,1);
    }
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    iVar7 = _V_stricmp(pcVar5,"range");
    local_10c = 1.0;
    local_108 = 0.0;
    if (iVar7 == 0) {
      (**(code **)(*(int *)param_1 + 4))(param_1,0);
      pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
      dVar15 = strtod(pcVar5,(char **)0x0);
      local_108 = (float)dVar15;
      (**(code **)(*(int *)param_1 + 4))(param_1,0);
      pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
      dVar15 = strtod(pcVar5,(char **)0x0);
      local_10c = (float)dVar15;
      (**(code **)(*(int *)param_1 + 4))(param_1,1);
    }
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    iVar7 = _V_stricmp(pcVar5,"leftedge");
    if (iVar7 == 0) {
      ParseEdgeInfo(param_1,&local_d6);
    }
    pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
    iVar7 = _V_stricmp(pcVar5,"rightedge");
    if (iVar7 == 0) {
      ParseEdgeInfo(param_1,&local_cf);
    }
    local_c8[0] = 0;
    this_00 = (CUtlVector<CExpressionSample,CUtlMemory<CExpressionSample,int>> *)local_c8;
    local_c8[1] = 0;
    local_c8[2] = 0;
    local_c8[3] = 0;
    local_c8[4] = 0;
    local_b4 = 0;
    local_b0 = 0;
    local_ac = 0;
    local_a8 = 0;
    local_a4 = 0;
    local_100 = 0;
LAB_00bb4e08:
    if ((int)local_100 < (int)(2 - (uint)!bVar12)) {
                    /* try { // try from 00bb4e25 to 00bb51d8 has its CatchHandler @ 00bb53d9 */
      pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
      iVar7 = _V_stricmp(pcVar5,"{");
      if (iVar7 != 0) {
        (**(code **)(*(int *)param_1 + 0xc))(param_1,"expecting {\n");
      }
LAB_00bb4e40:
      (**(code **)(*(int *)param_1 + 4))(param_1,1);
      do {
        pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
        if (*pcVar5 == '\0') {
          (*(code *)(*(undefined4 **)param_1)[3])(param_1,"expecting flex animation data\n");
LAB_00bb4fee:
          if (((local_100 & 1) == 0) && (bVar12)) {
            (**(code **)(*(int *)param_1 + 4))(param_1,1);
          }
          local_100 = local_100 + 1;
          this_00 = this_00 + 0x14;
          goto LAB_00bb4e08;
        }
        pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
        iVar7 = _V_stricmp(pcVar5,"}");
        if (iVar7 == 0) goto LAB_00bb4fee;
        pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
        dVar15 = strtod(pcVar5,(char **)0x0);
        (**(code **)(*(int *)param_1 + 4))(param_1,0);
        pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
        dVar16 = strtod(pcVar5,(char **)0x0);
        iVar7 = CUtlVector<CExpressionSample,CUtlMemory<CExpressionSample,int>>::InsertBefore
                          (this_00,*(int *)(this_00 + 0xc));
        pfVar1 = (float *)(*(int *)this_00 + iVar7 * 10);
        if (iVar6 == 0) {
          pfVar1[1] = (float)dVar15;
        }
        else {
          pfVar1[1] = (float)dVar15 * ((float)lVar13 - (float)lVar14);
        }
        *pfVar1 = (float)dVar16;
        cVar4 = (**(code **)(*(int *)param_1 + 8))(param_1);
        if (cVar4 != '\0') goto LAB_00bb4fa0;
        *(byte *)(pfVar1 + 2) = *(byte *)(pfVar1 + 2) & 1 | (char)local_f4 * '\x02';
        *(char *)((int)pfVar1 + 9) = (char)((ushort)local_f4 >> 7);
        (**(code **)(*(int *)param_1 + 4))(param_1,1);
      } while( true );
    }
    if ((local_ef) || (0 < local_c8[3])) {
      this = (CFlexAnimationTrack *)CChoreoEvent::AddTrack(param_2,local_a0);
      CFlexAnimationTrack::SetTrackActive(this,local_ef);
      CFlexAnimationTrack::SetComboType(this,bVar12);
      CFlexAnimationTrack::SetMin(this,local_108);
      CFlexAnimationTrack::SetMax(this,local_10c);
      piVar3 = local_c8;
      for (iVar7 = 0; iVar7 < (int)(2 - (uint)!bVar12); iVar7 = iVar7 + 1) {
        if (0 < piVar3[3]) {
          iVar11 = 0;
          do {
            pfVar1 = (float *)(*piVar3 + iVar11 * 10);
            iVar9 = CFlexAnimationTrack::AddSample(this,pfVar1[1],*pfVar1,iVar7);
            bVar2 = *(byte *)(pfVar1 + 2);
            iVar11 = iVar11 + 1;
            *(undefined1 *)(iVar9 + 9) = *(undefined1 *)((int)pfVar1 + 9);
            *(byte *)(iVar9 + 8) = *(byte *)(iVar9 + 8) & 1 | bVar2 & 0xfe;
          } while (iVar11 < piVar3[3]);
        }
        piVar3 = piVar3 + 5;
      }
      if (local_d6 != (EdgeInfo_t)0x0) {
        CFlexAnimationTrack::SetEdgeActive(this,true,true);
        CFlexAnimationTrack::SetEdgeInfo(this,true,(uint)local_d5,local_d3);
      }
      if (local_cf != (EdgeInfo_t)0x0) {
                    /* try { // try from 00bb535a to 00bb53d3 has its CatchHandler @ 00bb53d9 */
        CFlexAnimationTrack::SetEdgeActive(this,false,true);
        CFlexAnimationTrack::SetEdgeInfo(this,false,(uint)local_ce,local_cc);
      }
      CFlexAnimationTrack::Resort(this,0);
      CFlexAnimationTrack::Resort(this,1);
    }
    local_a8 = 0;
    CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)&local_b4);
    local_a4 = local_b4;
    CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)&local_b4);
    local_c8[3] = 0;
    CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)local_c8);
    local_c8[4] = local_c8[0];
    CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)local_c8);
  }
  (*(code *)(*(undefined4 **)param_1)[3])(param_1,"expecting flex animation data\n");
LAB_00bb54e8:
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
LAB_00bb4fa0:
  (**(code **)(*(int *)param_1 + 4))(param_1,0);
  pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
  uVar8 = Interpolator_CurveTypeForName(pcVar5);
  *(char *)((int)pfVar1 + 9) = (char)(uVar8 >> 7);
  *(byte *)(pfVar1 + 2) = *(byte *)(pfVar1 + 2) & 1 | (char)uVar8 * '\x02';
  goto LAB_00bb4e40;
}

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)