L L4D2node

CChoreoEvent::GetOriginalPercentageFromPlaybackPercentage

0x00ba5770 · 915 bytes · __thiscall

_ZN12CChoreoEvent43GetOriginalPercentageFromPlaybackPercentageEf

Decompiled

undefined (2 params)

/* CChoreoEvent::GetOriginalPercentageFromPlaybackPercentage(float) */

longdouble __thiscall
CChoreoEvent::GetOriginalPercentageFromPlaybackPercentage(CChoreoEvent *this,float param_1)

{
  int iVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  longdouble lVar7;
  float in_XMM0_Da;
  float fVar8;
  float fVar9;
  float fVar10;
  float fVar11;
  float fVar12;
  float local_68;
  float local_60;
  float local_58;
  float local_54;
  undefined4 local_50;
  float local_4c;
  float local_48;
  undefined4 local_44;
  float local_40;
  float local_3c;
  undefined4 local_38;
  float local_34;
  float local_30;
  undefined4 local_2c;
  Vector local_28 [4];
  float local_24;
  
  lVar7 = (longdouble)param_1;
  if (((this[4] == (CChoreoEvent)0x6) &&
      (iVar5 = *(int *)(this + 0xf0), iVar5 == *(int *)(this + 0x104))) && (0 < iVar5)) {
    if (param_1 <= 0.0) {
      lVar7 = (longdouble)0;
    }
    else {
      local_60 = 0.0;
      iVar6 = -1;
      while( true ) {
        iVar1 = iVar6 + 1;
        GetBoundedAbsoluteTagPercentage();
        if ((param_1 <= in_XMM0_Da) && (local_60 <= param_1)) goto LAB_00ba5802;
        if (iVar1 == iVar5) break;
        iVar6 = iVar1;
        local_60 = in_XMM0_Da;
        if (iVar1 == -1) {
          in_XMM0_Da = 0.0;
          local_60 = in_XMM0_Da;
        }
      }
      iVar1 = iVar5 + 1;
      iVar6 = iVar5;
LAB_00ba5802:
      iVar3 = iVar6 + -1;
      if (iVar3 < -2) {
        iVar3 = -2;
      }
      iVar4 = -1;
      if (-1 < iVar6) {
        iVar4 = iVar6;
      }
      if (iVar5 < iVar1) {
        iVar1 = iVar5;
      }
      if ((iVar4 < iVar5) && (-1 < iVar4)) {
        iVar6 = iVar4 * 0x1c + *(int *)(this + 0xe4);
      }
      else {
        iVar6 = 0;
      }
      if (iVar1 < iVar5) {
        iVar5 = *(int *)(this + 0xe4) + iVar1 * 0x1c;
        if ((((iVar6 != 0) && (iVar5 != 0)) && ((*(byte *)(iVar6 + 0x14) & 2) != 0)) &&
           ((*(byte *)(iVar5 + 0x14) & 2) != 0)) {
          iVar2 = iVar4 * 0x1c + *(int *)(this + 0xf8);
          iVar1 = iVar1 * 0x1c + *(int *)(this + 0xf8);
          if ((iVar1 != 0) && (iVar2 != 0)) {
            fVar11 = (param_1 - *(float *)(iVar6 + 0x10)) /
                     (*(float *)(iVar5 + 0x10) - *(float *)(iVar6 + 0x10));
            return (longdouble)
                   (*(float *)(iVar2 + 0x10) * (1.0 - fVar11) + fVar11 * *(float *)(iVar1 + 0x10));
          }
        }
      }
      else {
        iVar5 = 0;
      }
      in_XMM0_Da = in_XMM0_Da - local_60;
      if (iVar3 < 0) {
        fVar11 = 0.0;
        local_54 = fVar11;
      }
      else {
        fVar12 = in_XMM0_Da;
        GetBoundedAbsoluteTagPercentage();
        fVar11 = fVar12;
        GetBoundedAbsoluteTagPercentage();
        local_54 = fVar12;
      }
      local_50 = 0;
      local_58 = fVar11;
      if (iVar4 == -1) {
        local_68 = 0.0;
        fVar12 = 0.0;
        fVar8 = fVar11;
      }
      else {
        GetBoundedAbsoluteTagPercentage();
        fVar12 = fVar11;
        GetBoundedAbsoluteTagPercentage();
        fVar8 = fVar12;
        local_68 = fVar11;
      }
      local_44 = 0;
      local_48 = local_68;
      local_4c = fVar12;
      GetBoundedAbsoluteTagPercentage();
      fVar11 = fVar8;
      GetBoundedAbsoluteTagPercentage();
      local_38 = 0;
      fVar9 = fVar11;
      local_40 = fVar11;
      local_3c = fVar8;
      GetBoundedAbsoluteTagPercentage();
      fVar10 = fVar9;
      GetBoundedAbsoluteTagPercentage();
      local_2c = 0;
      if ((iVar6 != 0) && ((*(byte *)(iVar6 + 0x14) & 2) != 0)) {
        local_58 = (fVar12 + fVar12) - fVar11;
        local_54 = (local_68 + local_68) - fVar8;
      }
      local_34 = fVar10;
      local_30 = fVar9;
      if ((iVar5 != 0) && ((*(byte *)(iVar5 + 0x14) & 2) != 0)) {
        local_34 = (fVar11 + fVar11) - fVar12;
        local_30 = (fVar8 + fVar8) - local_68;
      }
      fVar11 = 0.0;
      if (0.0 < in_XMM0_Da) {
        fVar11 = (param_1 - local_60) / in_XMM0_Da;
        if (fVar11 <= 0.0) {
          fVar11 = 0.0;
        }
        if (1.0 <= fVar11) {
          fVar11 = 1.0;
        }
      }
      Catmull_Rom_Spline_NormalizeX
                ((Vector *)&local_58,(Vector *)&local_4c,(Vector *)&local_40,(Vector *)&local_34,
                 fVar11,local_28);
      lVar7 = (longdouble)local_24;
    }
  }
  return lVar7;
}

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)