L L4D2node

CGameMovement::LadderMove

0x004557f0 · 4013 bytes · __thiscall

_ZN13CGameMovement10LadderMoveEv.part.66

Decompiled

undefined (1 param)

/* CGameMovement::LadderMove() [clone .part.66] */

bool __thiscall CGameMovement::LadderMove(CGameMovement *this)

{
  code *pcVar1;
  CBaseEdict *pCVar2;
  uint uVar3;
  char cVar4;
  bool bVar5;
  int *in_EAX;
  int iVar6;
  undefined4 uVar7;
  int iVar8;
  float *pfVar9;
  float *pfVar10;
  bool bVar11;
  byte bVar12;
  longdouble lVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  float fVar21;
  float fVar22;
  float fVar23;
  float fVar24;
  undefined4 uVar25;
  undefined1 *puVar26;
  undefined1 *puVar27;
  float local_c8;
  float local_c0;
  undefined4 local_b8;
  undefined4 local_b4;
  float local_b0;
  float local_ac [3];
  float local_a0;
  float local_9c;
  float local_98;
  float local_94;
  float local_90;
  float local_8c;
  float local_88;
  float local_84;
  float local_80;
  float local_7c;
  float local_78;
  float local_74;
  undefined1 local_70 [24];
  float local_58;
  float local_54;
  float local_50;
  float local_44;
  short local_30;
  CBaseEntity *local_24;
  
  iVar6 = in_EAX[1];
  if (*(char *)(iVar6 + 0x186) == '\t') {
    local_ac[2] = -*(float *)(iVar6 + 0x2008);
    local_ac[1] = -*(float *)(iVar6 + 0x2004);
    local_ac[0] = -*(float *)(iVar6 + 0x2000);
  }
  else {
    fVar15 = *(float *)(in_EAX[2] + 0x2c);
    fVar14 = *(float *)(in_EAX[2] + 0x30);
    if ((fVar15 == 0.0) && (fVar14 == 0.0)) {
      return false;
    }
    iVar6 = 0;
    do {
      *(float *)((Vector *)local_ac + iVar6 * 4) =
           (float)in_EAX[iVar6 + 9] * fVar14 + (float)in_EAX[iVar6 + 6] * fVar15;
      iVar6 = iVar6 + 1;
    } while (iVar6 != 3);
    VectorNormalize((Vector *)local_ac);
  }
  puVar27 = local_70;
  lVar13 = (longdouble)(**(code **)(*in_EAX + 0xb0))();
  fVar15 = (float)lVar13;
  iVar6 = in_EAX[2];
  local_a0 = local_ac[0] * fVar15 + *(float *)(iVar6 + 0x9c);
  local_9c = local_ac[1] * fVar15 + *(float *)(iVar6 + 0xa0);
  local_98 = fVar15 * local_ac[2] + *(float *)(iVar6 + 0xa4);
  pcVar1 = *(code **)(*in_EAX + 0x3c);
  uVar7 = (**(code **)(*in_EAX + 0xb4))();
  uVar25 = 8;
  puVar26 = puVar27;
  (*pcVar1)();
  if (local_44 == 1.0) {
    return false;
  }
  cVar4 = (**(code **)(*in_EAX + 0xac))();
  if (cVar4 == '\0') {
    if (*(char *)(in_EAX[1] + 0x186) == '\t') {
      return false;
    }
    cVar4 = CheckInterval();
    if (cVar4 == '\0') {
      return false;
    }
    VectorVectors((Vector *)&local_58,(Vector *)&local_88,(Vector *)&local_7c);
    if (local_ac[1] * local_84 + local_ac[0] * local_88 + local_ac[2] * local_80 < 0.0) {
      local_88 = -local_88;
      local_84 = -local_84;
      local_80 = -local_80;
    }
    lVar13 = (longdouble)(**(code **)(*in_EAX + 0xb0))();
    fVar15 = (float)lVar13;
    iVar6 = in_EAX[2];
    local_a0 = local_88 * fVar15 + *(float *)(iVar6 + 0x9c);
    local_9c = local_84 * fVar15 + *(float *)(iVar6 + 0xa0);
    local_98 = fVar15 * local_80 + *(float *)(iVar6 + 0xa4);
    pcVar1 = *(code **)(*in_EAX + 0x3c);
    uVar7 = (**(code **)(*in_EAX + 0xb4))();
    uVar25 = 8;
    (*pcVar1)();
    if (local_44 == 1.0) {
      return false;
    }
    cVar4 = (**(code **)(*in_EAX + 0xac))();
    puVar26 = puVar27;
    if (cVar4 == '\0') {
      return false;
    }
  }
  local_c0 = 0.0;
  CBaseEntity::SetMoveType((CBaseEntity *)in_EAX[1],9,0,uVar7,uVar25,puVar26);
  iVar6 = in_EAX[1];
  if (*(char *)(iVar6 + 0x187) != '\0') {
    if (*(char *)(iVar6 + 0x6c) == '\0') {
      pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
      if (pCVar2 != (CBaseEdict *)0x0) {
        *(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
        iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
        *(undefined2 *)(iVar8 + 2) = 0;
      }
    }
    else {
      *(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
    }
    *(undefined1 *)(iVar6 + 0x187) = 0;
    iVar6 = in_EAX[1];
  }
  if (((local_58 != *(float *)(iVar6 + 0x2000)) || (local_54 != *(float *)(iVar6 + 0x2004))) ||
     (local_50 != *(float *)(iVar6 + 0x2008))) {
    if (*(char *)(iVar6 + 0x6c) == '\0') {
      pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
      if (pCVar2 != (CBaseEdict *)0x0) {
        *(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
        iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
        *(undefined2 *)(iVar8 + 2) = 0;
      }
    }
    else {
      *(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
    }
    *(float *)(iVar6 + 0x2000) = local_58;
    *(float *)(iVar6 + 0x2004) = local_54;
    *(float *)(iVar6 + 0x2008) = local_50;
    iVar6 = in_EAX[1];
  }
  if ((int)local_30 != *(int *)(iVar6 + 0x1ffc)) {
    if (*(char *)(iVar6 + 0x6c) == '\0') {
      pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
      if (pCVar2 != (CBaseEdict *)0x0) {
        *(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
        iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
        *(undefined2 *)(iVar8 + 2) = 0;
      }
    }
    else {
      *(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
    }
    *(int *)(iVar6 + 0x1ffc) = (int)local_30;
  }
  iVar6 = in_EAX[2];
  local_b8 = *(undefined4 *)(iVar6 + 0x9c);
  local_b4 = *(undefined4 *)(iVar6 + 0xa0);
  local_b0 = *(float *)(iVar6 + 0xa4);
  iVar6 = (**(code **)(*in_EAX + 0x7c))();
  local_b0 = local_b0 + -1.0 + *(float *)(iVar6 + 8);
  iVar6 = (**(code **)*enginetrace)(enginetrace,&local_b8,0xffffffff,0);
  if ((iVar6 == 1) || (iVar6 = CBaseEntity::GetGroundEntity((CBaseEntity *)in_EAX[1]), iVar6 != 0))
  {
    bVar12 = 1;
  }
  else {
    bVar12 = 0;
  }
  *(undefined4 *)(in_EAX[1] + 0x2c0) = 0;
  lVar13 = (longdouble)(**(code **)(*in_EAX + 0xb8))();
  iVar6 = in_EAX[2];
  fVar14 = 0.0;
  fVar15 = (float)lVar13;
  uVar3 = *(uint *)(iVar6 + 0x24);
  if ((uVar3 & 0x10) != 0) {
    fVar14 = -fVar15;
  }
  if ((uVar3 & 8) != 0) {
    fVar14 = fVar14 + fVar15;
  }
  fVar17 = 0.0;
  if ((uVar3 & 0x200) != 0) {
    fVar17 = -fVar15;
  }
  if ((uVar3 & 0x400) != 0) {
    fVar17 = fVar17 + fVar15;
  }
  if (((*(byte *)(iVar6 + 0x28) & 2) == 0) && ((uVar3 & 2) != 0)) {
    CBaseEntity::SetMoveType((CBaseEntity *)in_EAX[1],2,0);
    iVar6 = in_EAX[1];
    if (*(char *)(iVar6 + 0x187) != '\0') {
      if (*(char *)(iVar6 + 0x6c) == '\0') {
        pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
        if (pCVar2 != (CBaseEdict *)0x0) {
          *(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
          iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
          *(undefined2 *)(iVar8 + 2) = 0;
        }
      }
      else {
        *(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
      }
      *(undefined1 *)(iVar6 + 0x187) = 0;
    }
    iVar6 = in_EAX[2];
    *(float *)(iVar6 + 0x40) = local_58 * 270.0;
    *(float *)(iVar6 + 0x44) = local_54 * 270.0;
    *(float *)(iVar6 + 0x48) = local_50 * 270.0;
    return true;
  }
  bVar11 = fVar17 != 0.0;
  bVar5 = fVar14 != 0.0 || bVar11;
  if (fVar14 == 0.0 && !bVar11) {
    *(undefined4 *)(iVar6 + 0x40) = 0;
    *(undefined4 *)(iVar6 + 0x44) = 0;
    *(undefined4 *)(iVar6 + 0x48) = 0;
    if (local_24 == (CBaseEntity *)0x0) {
      return true;
    }
    if (((byte)local_24[0x14d] & 0x10) != 0) {
      CBaseEntity::CalcAbsoluteVelocity(local_24);
    }
    iVar6 = in_EAX[2];
    *(float *)(iVar6 + 0x40) = *(float *)(iVar6 + 0x40) + *(float *)(local_24 + 0x274);
    *(float *)(iVar6 + 0x44) = *(float *)(iVar6 + 0x44) + *(float *)(local_24 + 0x278);
    *(float *)(iVar6 + 0x48) = *(float *)(iVar6 + 0x48) + *(float *)(local_24 + 0x27c);
    return true;
  }
  if ((*(int *)(ladder_autocenter._28_4_ + 0x30) != 0) &&
     (cVar4 = (**(code **)(*(int *)in_EAX[1] + 0x5ec))((int *)in_EAX[1]), cVar4 != '\0')) {
    AngleVectors((QAngle *)(in_EAX[2] + 0x4c),(Vector *)&local_94);
    if (ABS(local_8c) == 1.0) {
LAB_004561e1:
      iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)in_EAX[1]);
      cVar4 = IsASurvivorTeam(iVar6);
      if (((cVar4 == '\0') && (local_24 != (CBaseEntity *)0x0)) &&
         (iVar6 = __dynamic_cast(local_24,&CBaseEntity::typeinfo,&CFuncSimpleLadder::typeinfo,0),
         iVar6 != 0)) {
        (**(code **)(*(int *)(iVar6 + 0x194) + 0x3c))(iVar6 + 0x194,&local_88,&local_7c);
        iVar8 = (**(code **)(*in_EAX + 0x80))();
        if (*(float *)(iVar6 + 0x440) == 0.0) {
          local_78 = local_7c - local_88;
        }
        else {
          local_78 = local_78 - local_84;
        }
        if (*(float *)(iVar8 + 4) * 3.0 <= local_78) goto LAB_00455d3b;
      }
      fVar15 = (float)in_EAX[6];
      fVar17 = (float)in_EAX[7];
      local_7c = -local_54;
      fVar20 = (float)in_EAX[8];
      local_78 = local_58;
      local_74 = 0.0;
      VectorNormalize((Vector *)&local_7c);
      fVar24 = local_54 * local_74 - local_78 * local_50;
      fVar22 = local_50 * local_7c - local_74 * local_58;
      fVar21 = local_78 * local_58 - local_7c * local_54;
      if (fVar14 <= 0.0) {
        fVar19 = -(float)in_EAX[8];
        fVar16 = -(float)in_EAX[7];
        fVar23 = -(float)in_EAX[6];
      }
      else {
        fVar23 = (float)in_EAX[6];
        fVar16 = (float)in_EAX[7];
        fVar19 = (float)in_EAX[8];
      }
      fVar18 = *(float *)(ladder_horizon._28_4_ + 0x2c);
      if (fVar14 < 0.0) {
        fVar18 = -fVar18;
      }
      if (fVar16 * fVar22 + fVar23 * fVar24 + fVar19 * fVar21 <= fVar18) {
        fVar21 = -fVar21;
        fVar22 = -fVar22;
        fVar24 = -fVar24;
      }
      iVar6 = in_EAX[2];
      if (*(int *)(ladder_console_controls._28_4_ + 0x30) != 0) {
        if ((*(uint *)(iVar6 + 0x24) & 8) == 0) {
          if ((*(uint *)(iVar6 + 0x24) & 0x10) != 0) {
            fVar21 = -1.0;
          }
        }
        else {
          fVar21 = 1.0;
        }
      }
      fVar23 = ABS(fVar14);
      *(float *)(iVar6 + 0x44) = fVar22 * fVar23;
      *(float *)(iVar6 + 0x40) = fVar24 * fVar23;
      *(float *)(iVar6 + 0x48) = fVar21 * fVar23;
      pfVar9 = (float *)(**(code **)(*(int *)local_24 + 0x288))(local_24);
      if (((vec3_origin != *pfVar9) || (DAT_01053d4c != pfVar9[1])) || (DAT_01053d50 != pfVar9[2]))
      {
        pfVar9 = (float *)(**(code **)(*(int *)in_EAX[1] + 0x288))((int *)in_EAX[1]);
        pfVar10 = (float *)(**(code **)(*(int *)local_24 + 0x288))(local_24);
        iVar6 = in_EAX[2];
        fVar22 = (pfVar10[1] - pfVar9[1]) * local_78 + (*pfVar10 - *pfVar9) * local_7c +
                 (pfVar10[2] - pfVar9[2]) * local_74;
        *(float *)(iVar6 + 0x40) = local_7c * fVar22 + *(float *)(iVar6 + 0x40);
        *(float *)(iVar6 + 0x44) = *(float *)(iVar6 + 0x44) + local_78 * fVar22;
        *(float *)(iVar6 + 0x48) = fVar22 * local_74 + *(float *)(iVar6 + 0x48);
      }
      fVar14 = (fVar17 * local_54 + fVar15 * local_58 + fVar20 * local_50) * fVar14;
      goto LAB_00455ee8;
    }
    fVar15 = SQRT(local_90 * local_90 + local_94 * local_94);
    if (fVar15 == 0.0) {
      local_c8 = 0.0;
    }
    else {
      fVar15 = 1.0 / fVar15;
      local_c8 = local_94 * fVar15;
      local_c0 = local_90 * fVar15;
    }
    fVar20 = -local_54;
    fVar15 = -local_58;
    fVar22 = SQRT(fVar20 * fVar20 + fVar15 * fVar15);
    if (fVar22 == 0.0) {
      fVar22 = 0.0;
    }
    else {
      fVar22 = (fVar20 * local_c0 + fVar15 * local_c8) / fVar22;
    }
    if ((*(float *)(ZombieMinLadderMountDot._28_4_ + 0x2c) <= fVar22) ||
       (fVar22 <= -*(float *)(ZombieMinLadderMountDot._28_4_ + 0x2c))) {
      if (fVar14 != 0.0) {
        bVar11 = 2.0 < ABS(fVar17 / fVar14);
      }
      if (!bVar11) goto LAB_004561e1;
    }
  }
LAB_00455d3b:
  fVar20 = (float)in_EAX[6] * fVar14 + (float)in_EAX[9] * fVar17;
  fVar15 = fVar14 * (float)in_EAX[8] + fVar17 * (float)in_EAX[0xb];
  fVar22 = (float)in_EAX[7] * fVar14 + (float)in_EAX[10] * fVar17;
  local_7c = local_50 * DAT_01053d4c - local_54;
  local_78 = local_58 - local_50 * vec3_origin;
  local_74 = local_54 * vec3_origin - local_58 * DAT_01053d4c;
  VectorNormalize((Vector *)&local_7c);
  iVar6 = in_EAX[2];
  fVar14 = fVar22 * local_54 + fVar20 * local_58 + fVar15 * local_50;
  fVar17 = -fVar14;
  *(float *)(iVar6 + 0x40) =
       ((local_74 * local_54 - local_78 * local_50) * fVar17 - fVar14 * local_58) + fVar20;
  *(float *)(iVar6 + 0x44) =
       ((local_7c * local_50 - local_74 * local_58) * fVar17 - fVar14 * local_54) + fVar22;
  *(float *)(iVar6 + 0x48) =
       ((local_78 * local_58 - local_7c * local_54) * fVar17 - fVar14 * local_50) + fVar15;
LAB_00455ee8:
  bVar11 = (bool)(0.0 < fVar14 & bVar12);
  if (bVar11 != false) {
    iVar6 = in_EAX[2];
    *(float *)(iVar6 + 0x40) = local_58 * 200.0 + *(float *)(iVar6 + 0x40);
    *(float *)(iVar6 + 0x44) = local_54 * 200.0 + *(float *)(iVar6 + 0x44);
    *(float *)(iVar6 + 0x48) = local_50 * 200.0 + *(float *)(iVar6 + 0x48);
    return bVar11;
  }
  if (local_24 == (CBaseEntity *)0x0) {
    return true;
  }
  if (((byte)local_24[0x14d] & 0x10) != 0) {
    CBaseEntity::CalcAbsoluteVelocity(local_24);
  }
  iVar6 = in_EAX[2];
  *(float *)(iVar6 + 0x40) = *(float *)(iVar6 + 0x40) + *(float *)(local_24 + 0x274);
  *(float *)(iVar6 + 0x44) = *(float *)(iVar6 + 0x44) + *(float *)(local_24 + 0x278);
  *(float *)(iVar6 + 0x48) = *(float *)(iVar6 + 0x48) + *(float *)(local_24 + 0x27c);
  return bVar5;
}

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)