L L4D2node

CChoreoEvent::RestoreFlexAnimationsFromBuffer

0x00baa710 · 3057 bytes · __thiscall

_ZN12CChoreoEvent31RestoreFlexAnimationsFromBufferER10CUtlBufferP17IChoreoStringPool

Decompiled

undefined (3 params)

/* CChoreoEvent::RestoreFlexAnimationsFromBuffer(CUtlBuffer&, IChoreoStringPool*) */

undefined4 __thiscall
CChoreoEvent::RestoreFlexAnimationsFromBuffer
          (CChoreoEvent *this,CUtlBuffer *param_1,IChoreoStringPool *param_2)

{
  byte bVar1;
  short sVar2;
  code *pcVar3;
  byte bVar4;
  char cVar5;
  CFlexAnimationTrack *this_00;
  int iVar6;
  int iVar7;
  undefined4 *puVar8;
  byte bVar9;
  ushort uVar10;
  ushort uVar11;
  uint uVar12;
  int iVar13;
  int in_GS_OFFSET;
  float fVar14;
  int local_140;
  float local_134;
  undefined4 local_128;
  undefined2 local_124;
  undefined1 local_122;
  undefined1 local_121;
  char local_120 [256];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (((byte)param_1[0x15] & 1) == 0) {
    cVar5 = CUtlBuffer::CheckGet(param_1,1);
    if (cVar5 == '\0') goto LAB_00baabd9;
    bVar1 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
    *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
  }
  else {
    local_124 = local_124 & 0xff00;
    CUtlBuffer::Scanf(param_1,"%u",&local_124);
    bVar1 = (byte)local_124;
  }
  if (bVar1 != 0) {
    local_140 = 1;
    do {
      pcVar3 = *(code **)(*(int *)param_2 + 4);
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar5 = CUtlBuffer::CheckGet(param_1,2);
        iVar13 = 0;
        if (cVar5 != '\0') {
          if (((byte)param_1[0x34] & 1) == 0) {
            iVar6 = *(int *)(param_1 + 0xc);
            sVar2 = *(short *)(*(int *)param_1 + (iVar6 - *(int *)(param_1 + 0x20)));
          }
          else {
            puVar8 = (undefined4 *)
                     ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
            if (puVar8 == (undefined4 *)0x0) {
              puVar8 = &local_128;
            }
            local_124 = (ushort)local_128;
            local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
            local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
            local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
            _V_memcpy(&local_128,&local_124,2);
            iVar6 = *(int *)(param_1 + 0xc);
            sVar2 = (ushort)local_128;
          }
          iVar13 = (int)sVar2;
          *(int *)(param_1 + 0xc) = iVar6 + 2;
        }
      }
      else {
        local_128 = (float)((uint)local_128 & 0xffff0000);
        CUtlBuffer::Scanf(param_1,"%d",&local_128);
        iVar13 = (int)(short)(ushort)local_128;
      }
      (*pcVar3)(param_2,iVar13,local_120,0x100);
      this_00 = (CFlexAnimationTrack *)AddTrack(this,local_120);
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar5 = CUtlBuffer::CheckGet(param_1,1);
        bVar9 = 0;
        bVar4 = 0;
        if (cVar5 != '\0') {
          bVar9 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
          bVar4 = bVar9 & 1;
          bVar9 = bVar9 >> 1 & 1;
        }
      }
      else {
        local_124 = local_124 & 0xff00;
        CUtlBuffer::Scanf(param_1,"%u",&local_124);
        bVar4 = (byte)local_124 & 1;
        bVar9 = (byte)local_124 >> 1 & 1;
      }
      this_00[0x5c] = (CFlexAnimationTrack)((byte)this_00[0x5c] & 0xfc | bVar4 | bVar9 * '\x02');
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar5 = CUtlBuffer::CheckGet(param_1,4);
        fVar14 = 0.0;
        if (cVar5 != '\0') {
          iVar13 = *(int *)(param_1 + 0xc);
          fVar14 = *(float *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
          local_128 = fVar14;
          if (((byte)param_1[0x34] & 1) != 0) {
            local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
            local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
            local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
            local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
            local_122 = local_128._1_1_;
            local_128._0_1_ = SUB41(fVar14,0);
            local_121 = (undefined1)local_128;
            _V_memcpy(&local_128,&local_124,4);
            iVar13 = *(int *)(param_1 + 0xc);
          }
          *(int *)(param_1 + 0xc) = iVar13 + 4;
          fVar14 = local_128;
        }
      }
      else {
        local_128 = 0.0;
        CUtlBuffer::Scanf(param_1,"%f",&local_128);
        fVar14 = local_128;
      }
      *(float *)(this_00 + 8) = fVar14;
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar5 = CUtlBuffer::CheckGet(param_1,4);
        fVar14 = 0.0;
        if (cVar5 != '\0') {
          iVar13 = *(int *)(param_1 + 0xc);
          fVar14 = *(float *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
          local_128 = fVar14;
          if (((byte)param_1[0x34] & 1) != 0) {
            local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
            local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
            local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
            local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
            local_122 = local_128._1_1_;
            local_128._0_1_ = SUB41(fVar14,0);
            local_121 = (undefined1)local_128;
            _V_memcpy(&local_128,&local_124,4);
            iVar13 = *(int *)(param_1 + 0xc);
          }
          *(int *)(param_1 + 0xc) = iVar13 + 4;
          fVar14 = local_128;
        }
      }
      else {
        local_128 = 0.0;
        CUtlBuffer::Scanf(param_1,"%f",&local_128);
        fVar14 = local_128;
      }
      *(float *)(this_00 + 0xc) = fVar14;
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar5 = CUtlBuffer::CheckGet(param_1,2);
        if (cVar5 != '\0') {
          if (((byte)param_1[0x34] & 1) == 0) {
            iVar13 = *(int *)(param_1 + 0xc);
            sVar2 = *(short *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
          }
          else {
            puVar8 = (undefined4 *)
                     ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
            if (puVar8 == (undefined4 *)0x0) {
              puVar8 = &local_128;
            }
            local_124 = (ushort)local_128;
            local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
            local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
            local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
            _V_memcpy(&local_128,&local_124,2);
            iVar13 = *(int *)(param_1 + 0xc);
            sVar2 = (ushort)local_128;
          }
          *(int *)(param_1 + 0xc) = iVar13 + 2;
          goto LAB_00baa919;
        }
      }
      else {
        local_128 = (float)((uint)local_128 & 0xffff0000);
        CUtlBuffer::Scanf(param_1,"%d",&local_128);
        sVar2 = (ushort)local_128;
LAB_00baa919:
        if (0 < sVar2) {
          iVar13 = 0;
          do {
            if (((byte)param_1[0x15] & 1) == 0) {
              cVar5 = CUtlBuffer::CheckGet(param_1,4);
              local_134 = 0.0;
              if (cVar5 == '\0') goto LAB_00baa964;
              iVar6 = *(int *)(param_1 + 0xc);
              fVar14 = *(float *)(*(int *)param_1 + (iVar6 - *(int *)(param_1 + 0x20)));
              local_128 = fVar14;
              if (((byte)param_1[0x34] & 1) != 0) {
                local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
                local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
                local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
                local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
                local_122 = local_128._1_1_;
                local_128._0_1_ = SUB41(fVar14,0);
                local_121 = (undefined1)local_128;
                _V_memcpy(&local_128,&local_124,4);
                iVar6 = *(int *)(param_1 + 0xc);
              }
              *(int *)(param_1 + 0xc) = iVar6 + 4;
              local_134 = local_128;
              if (((byte)param_1[0x15] & 1) != 0) goto LAB_00baa976;
LAB_00baab08:
              cVar5 = CUtlBuffer::CheckGet(param_1,1);
              fVar14 = 0.0;
              if (cVar5 != '\0') {
                bVar4 = *(byte *)(*(int *)param_1 +
                                 (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
                *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
                fVar14 = ((float)bVar4 + 0.0) * 0.003921569;
              }
            }
            else {
              local_128 = 0.0;
              CUtlBuffer::Scanf(param_1,"%f",&local_128);
              local_134 = local_128;
LAB_00baa964:
              if (((byte)param_1[0x15] & 1) == 0) goto LAB_00baab08;
LAB_00baa976:
              local_124 = local_124 & 0xff00;
              CUtlBuffer::Scanf(param_1,"%u",&local_124);
              fVar14 = ((float)(byte)local_124 + 0.0) * 0.003921569;
            }
            iVar6 = CFlexAnimationTrack::AddSample(this_00,local_134,fVar14,0);
            if (((byte)param_1[0x15] & 1) == 0) {
              cVar5 = CUtlBuffer::CheckGet(param_1,2);
              uVar12 = 0;
              if (cVar5 != '\0') {
                if (((byte)param_1[0x34] & 1) == 0) {
                  iVar7 = *(int *)(param_1 + 0xc);
                  uVar10 = *(ushort *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
                }
                else {
                  puVar8 = (undefined4 *)
                           ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                  if (puVar8 == (undefined4 *)0x0) {
                    puVar8 = &local_128;
                  }
                  local_124 = (ushort)local_128;
                  local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
                  local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
                  local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
                  _V_memcpy(&local_128,&local_124,2);
                  iVar7 = *(int *)(param_1 + 0xc);
                  uVar10 = (ushort)local_128;
                }
                uVar12 = (uint)(uVar10 & 0x7fff);
                *(int *)(param_1 + 0xc) = iVar7 + 2;
              }
            }
            else {
              local_128 = (float)((uint)local_128 & 0xffff0000);
              CUtlBuffer::Scanf(param_1,"%u",&local_128);
              uVar12 = (uint)((ushort)local_128 & 0x7fff);
            }
            iVar13 = iVar13 + 1;
            *(char *)(iVar6 + 9) = (char)(uVar12 >> 7);
            *(byte *)(iVar6 + 8) = *(byte *)(iVar6 + 8) & 1 | (char)uVar12 * '\x02';
          } while (iVar13 < sVar2);
        }
      }
      if (((byte)this_00[0x5c] & 2) != 0) {
        if (((byte)param_1[0x15] & 1) == 0) {
          cVar5 = CUtlBuffer::CheckGet(param_1,2);
          if (cVar5 == '\0') goto LAB_00baabc0;
          if (((byte)param_1[0x34] & 1) == 0) {
            iVar13 = *(int *)(param_1 + 0xc);
            uVar10 = *(ushort *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
          }
          else {
            puVar8 = (undefined4 *)
                     ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
            if (puVar8 == (undefined4 *)0x0) {
              puVar8 = &local_128;
            }
            local_124 = (ushort)local_128;
            local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
            local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
            local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
            _V_memcpy(&local_128,&local_124,2);
            iVar13 = *(int *)(param_1 + 0xc);
            uVar10 = (ushort)local_128;
          }
          *(int *)(param_1 + 0xc) = iVar13 + 2;
        }
        else {
          local_128 = (float)((uint)local_128 & 0xffff0000);
          CUtlBuffer::Scanf(param_1,"%u",&local_128);
          uVar10 = (ushort)local_128;
        }
        if (uVar10 != 0) {
          iVar13 = 0;
          do {
            if (((byte)param_1[0x15] & 1) == 0) {
              cVar5 = CUtlBuffer::CheckGet(param_1,4);
              local_134 = 0.0;
              if (cVar5 == '\0') goto LAB_00baaeec;
              iVar6 = *(int *)(param_1 + 0xc);
              fVar14 = *(float *)(*(int *)param_1 + (iVar6 - *(int *)(param_1 + 0x20)));
              local_128 = fVar14;
              if (((byte)param_1[0x34] & 1) != 0) {
                local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
                local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
                local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
                local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
                local_122 = local_128._1_1_;
                local_128._0_1_ = SUB41(fVar14,0);
                local_121 = (undefined1)local_128;
                _V_memcpy(&local_128,&local_124,4);
                iVar6 = *(int *)(param_1 + 0xc);
              }
              *(int *)(param_1 + 0xc) = iVar6 + 4;
              local_134 = local_128;
              if (((byte)param_1[0x15] & 1) != 0) goto LAB_00baaefe;
LAB_00bab090:
              cVar5 = CUtlBuffer::CheckGet(param_1,1);
              fVar14 = 0.0;
              if (cVar5 != '\0') {
                bVar4 = *(byte *)(*(int *)param_1 +
                                 (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
                *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
                fVar14 = ((float)bVar4 + 0.0) * 0.003921569;
              }
            }
            else {
              local_128 = 0.0;
              CUtlBuffer::Scanf(param_1,"%f",&local_128);
              local_134 = local_128;
LAB_00baaeec:
              if (((byte)param_1[0x15] & 1) == 0) goto LAB_00bab090;
LAB_00baaefe:
              local_124 = local_124 & 0xff00;
              CUtlBuffer::Scanf(param_1,"%u",&local_124);
              fVar14 = ((float)(byte)local_124 + 0.0) * 0.003921569;
            }
            iVar6 = CFlexAnimationTrack::AddSample(this_00,local_134,fVar14,1);
            if (((byte)param_1[0x15] & 1) == 0) {
              cVar5 = CUtlBuffer::CheckGet(param_1,2);
              uVar12 = 0;
              if (cVar5 != '\0') {
                if (((byte)param_1[0x34] & 1) == 0) {
                  iVar7 = *(int *)(param_1 + 0xc);
                  uVar11 = *(ushort *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
                }
                else {
                  puVar8 = (undefined4 *)
                           ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                  if (puVar8 == (undefined4 *)0x0) {
                    puVar8 = &local_128;
                  }
                  local_124 = (ushort)local_128;
                  local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
                  local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
                  local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
                  _V_memcpy(&local_128,&local_124,2);
                  iVar7 = *(int *)(param_1 + 0xc);
                  uVar11 = (ushort)local_128;
                }
                uVar12 = (uint)(uVar11 & 0x7fff);
                *(int *)(param_1 + 0xc) = iVar7 + 2;
              }
            }
            else {
              local_128 = (float)((uint)local_128 & 0xffff0000);
              CUtlBuffer::Scanf(param_1,"%u",&local_128);
              uVar12 = (uint)((ushort)local_128 & 0x7fff);
            }
            iVar13 = iVar13 + 1;
            *(char *)(iVar6 + 9) = (char)(uVar12 >> 7);
            *(byte *)(iVar6 + 8) = *(byte *)(iVar6 + 8) & 1 | (char)uVar12 * '\x02';
          } while (iVar13 < (int)(uint)uVar10);
        }
      }
LAB_00baabc0:
      local_140 = local_140 + 1;
    } while (local_140 != bVar1 + 1);
  }
LAB_00baabd9:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return 1;
}

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)