L L4D2node

ZombieBotLocomotion::ClimbUpToLedge

0x00a51700 · 4666 bytes · __cdecl

_ZN19ZombieBotLocomotion14ClimbUpToLedgeERK6VectorS2_PK11CBaseEntity

Decompiled

undefined (3 params)

/* ZombieBotLocomotion::ClimbUpToLedge(Vector const&, Vector const&, CBaseEntity const*) */

char ZombieBotLocomotion::ClimbUpToLedge(Vector *param_1,Vector *param_2,CBaseEntity *param_3)

{
  float fVar1;
  float fVar2;
  code *pcVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  char cVar6;
  int *piVar7;
  int iVar8;
  int *piVar9;
  IHandleEntity *pIVar10;
  undefined4 uVar11;
  float *pfVar12;
  float *pfVar13;
  Vector *pVVar14;
  Vector *pVVar15;
  uint uVar16;
  bool bVar17;
  longdouble lVar18;
  float fVar19;
  float fVar20;
  float fVar21;
  float fVar22;
  float local_1d0;
  undefined4 local_1cc;
  float local_1a0;
  float local_198;
  float local_194;
  float local_190;
  float local_18c;
  float local_188;
  float local_184;
  float local_180;
  float local_17c;
  float local_178;
  float local_174;
  float local_170;
  float local_16c;
  QAngle local_168 [12];
  float local_15c;
  float local_158;
  float local_154;
  float local_150;
  float local_14c;
  float local_148;
  undefined **local_144 [4];
  int *local_134;
  undefined4 local_130;
  float local_12c;
  float local_128;
  float local_124;
  undefined4 local_11c;
  undefined4 local_118;
  float local_114;
  float local_10c;
  float local_108;
  float local_104;
  float local_fc;
  float local_f8;
  float local_f4;
  undefined4 local_ec;
  undefined1 local_e8;
  undefined1 local_e7;
  undefined1 local_d0 [24];
  float local_b8;
  float local_b4;
  float local_b0;
  float local_a4;
  char local_9a;
  char local_99;
  float local_7c;
  float local_78;
  float local_74;
  float local_6c;
  float local_68;
  float local_64;
  float local_5c;
  float local_58;
  float local_54;
  float local_50;
  float local_4c;
  undefined4 local_48;
  float local_44;
  undefined4 local_3c;
  undefined1 local_38;
  undefined1 local_37;
  
  if (*(int *)(ZombieDebugClimb._28_4_ + 0x30) != 0) {
    pVVar14 = (Vector *)(**(code **)(*(int *)param_1 + 300))(param_1);
    NDebugOverlay::Cross3D(pVVar14,5.0,0,0xff,0,true,10.0);
    NDebugOverlay::Cross3D(param_2,5.0,0,0xff,0,true,10.0);
    pVVar14 = (Vector *)(**(code **)(*(int *)param_1 + 300))(param_1);
    NDebugOverlay::Line(pVVar14,param_2,0,0xff,0,true,10.0);
    local_78 = *(float *)(param_3 + 4) * 10.0 + *(float *)(param_2 + 4);
    local_74 = *(float *)(param_3 + 8) * 10.0 + *(float *)(param_2 + 8);
    local_7c = *(float *)param_3 * 10.0 + *(float *)param_2;
    NDebugOverlay::HorzArrow(param_2,(Vector *)&local_7c,2.0,0,0xff,0,0xff,true,10.0);
  }
  cVar6 = (**(code **)(*(int *)param_1 + 0xf8))(param_1);
  if (cVar6 == '\0') {
    return '\0';
  }
  if (param_1[0xd4] != (Vector)0x0) {
    return '\0';
  }
  piVar7 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
  piVar7 = (int *)(**(code **)(*piVar7 + 0xc4))(piVar7);
  local_1d0 = *(float *)(param_2 + 8);
  iVar8 = (**(code **)(*(int *)param_1 + 300))(param_1);
  local_1d0 = local_1d0 - *(float *)(iVar8 + 8);
  if (local_1d0 < 30.0) {
    local_1d0 = local_1d0 - 24.0;
    local_1cc = 0x2ce;
  }
  else if (42.0 <= local_1d0) {
    if (local_1d0 < 54.0) {
      local_1d0 = local_1d0 - 48.0;
      local_1cc = 0x2d1;
    }
    else if (66.0 <= local_1d0) {
      if (78.0 <= local_1d0) {
        if (90.0 <= local_1d0) {
          if (102.0 <= local_1d0) {
            if (114.0 <= local_1d0) {
              if (126.0 <= local_1d0) {
                if (138.0 <= local_1d0) {
                  if (150.0 <= local_1d0) {
                    if (162.0 <= local_1d0) {
                      local_1d0 = local_1d0 - 168.0;
                      local_1cc = 0x2e1;
                    }
                    else {
                      local_1d0 = local_1d0 - 156.0;
                      local_1cc = 0x2df;
                    }
                  }
                  else {
                    local_1d0 = local_1d0 - 144.0;
                    local_1cc = 0x2dd;
                  }
                }
                else {
                  local_1d0 = local_1d0 - 132.0;
                  local_1cc = 0x2dc;
                }
              }
              else {
                local_1d0 = local_1d0 - 120.0;
                local_1cc = 0x2da;
              }
            }
            else {
              local_1d0 = local_1d0 - 108.0;
              local_1cc = 0x2d8;
            }
          }
          else {
            local_1d0 = local_1d0 - 96.0;
            local_1cc = 0x2d7;
          }
        }
        else {
          local_1d0 = local_1d0 - 84.0;
          local_1cc = 0x2d6;
        }
      }
      else {
        local_1d0 = local_1d0 - 72.0;
        local_1cc = 0x2d5;
      }
    }
    else {
      local_1d0 = local_1d0 - 60.0;
      local_1cc = 0x2d3;
    }
  }
  else {
    local_1d0 = local_1d0 - 36.0;
    local_1cc = 0x2cf;
  }
  lVar18 = (longdouble)(**(code **)(*piVar7 + 0x118))(piVar7);
  fVar2 = (float)lVar18;
  lVar18 = (longdouble)(**(code **)(*(int *)param_1 + 0x130))(param_1);
  local_198 = -1.0;
  local_194 = -1.0;
  local_190 = (float)lVar18 + 0.1;
  fVar19 = *(float *)(param_2 + 8);
  iVar8 = (**(code **)(*(int *)param_1 + 300))(param_1);
  local_18c = 1.0;
  local_188 = 1.0;
  fVar19 = fVar19 - *(float *)(iVar8 + 8);
  local_184 = fVar19;
  if (fVar19 < local_190) {
    local_184 = local_190;
    local_190 = fVar19;
  }
  piVar9 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
  pIVar10 = (IHandleEntity *)(**(code **)(*piVar9 + 0xb4))(piVar9);
  CTraceFilterSimple::CTraceFilterSimple
            ((CTraceFilterSimple *)local_144,pIVar10,0,IgnoreActorsTraceFilterFunction);
  local_99 = '\x01';
  local_144[0] = &PTR_ShouldHitEntity_00ca96c8;
  fVar19 = fVar2 * 3.0;
  local_130 = 0;
  local_134 = piVar9;
  iVar8 = (**(code **)(*(int *)param_1 + 300))(param_1);
  local_178 = *(float *)(iVar8 + 8);
  local_17c = *(float *)(param_2 + 4);
  local_180 = *(float *)param_2;
  if (0.0 <= fVar19) {
    local_1a0 = 0.0;
    fVar21 = fVar2 * 10.0;
    do {
      if (local_99 == '\0') {
        if (local_a4 < 1.0) {
          if (fVar19 < local_1a0) break;
        }
        else {
          if (local_9a == '\0') goto LAB_00a519a0;
          if ((fVar19 < local_1a0) || (local_9a == '\0')) break;
        }
        local_16c = 0.0;
        VectorNormalize((Vector *)&local_174);
        local_1a0 = 0.0;
        goto LAB_00a51e59;
      }
LAB_00a519a0:
      uVar11 = (**(code **)(*piVar7 + 0x130))(piVar7);
      fVar20 = *(float *)param_3;
      fVar22 = *(float *)(param_3 + 4);
      fVar1 = *(float *)(param_3 + 8);
      pfVar12 = (float *)(**(code **)(*(int *)param_1 + 300))(param_1);
      local_7c = local_180 - *(float *)param_3 * local_1a0;
      local_3c = 0;
      local_78 = local_17c - *(float *)(param_3 + 4) * local_1a0;
      local_6c = (fVar20 * fVar21 + *pfVar12) - local_7c;
      local_68 = (fVar22 * fVar21 + pfVar12[1]) - local_78;
      local_74 = local_178 - *(float *)(param_3 + 8) * local_1a0;
      local_64 = (fVar21 * fVar1 + pfVar12[2]) - local_74;
      local_37 = local_68 * local_68 + local_64 * local_64 + local_6c * local_6c != 0.0;
      local_58 = (local_188 + local_194) * 0.5;
      local_48 = (local_188 - local_194) * 0.5;
      local_4c = (local_18c - local_198) * 0.5;
      local_78 = local_78 + local_58;
      local_44 = (local_184 - local_190) * 0.5;
      local_5c = (local_18c + local_198) * 0.5;
      local_54 = (local_184 + local_190) * 0.5;
      local_74 = local_74 + local_54;
      local_38 = local_48 * local_48 + local_4c * local_4c + local_44 * local_44 < 1e-06;
      local_7c = local_7c + local_5c;
      local_5c = -local_5c;
      local_58 = -local_58;
      local_54 = -local_54;
      (**(code **)(*enginetrace + 0x14))(enginetrace,(Vector *)&local_7c,uVar11,local_144,local_d0);
      local_174 = local_b8;
      local_170 = local_b4;
      local_16c = local_b0;
      if (*(int *)(ZombieDebugClimb._28_4_ + 0x30) != 0) {
        bVar17 = local_99 == '\0';
        fVar20 = *(float *)param_3;
        fVar22 = *(float *)(param_3 + 4);
        fVar1 = *(float *)(param_3 + 8);
        pfVar12 = (float *)(**(code **)(*(int *)param_1 + 300))(param_1);
        local_7c = fVar20 * fVar21 + *pfVar12;
        local_78 = fVar22 * fVar21 + pfVar12[1];
        local_74 = fVar21 * fVar1 + pfVar12[2];
        local_12c = local_180 - local_1a0 * *(float *)param_3;
        local_128 = local_17c - *(float *)(param_3 + 4) * local_1a0;
        local_124 = local_178 - *(float *)(param_3 + 8) * local_1a0;
        NDebugOverlay::SweptBox
                  ((Vector *)&local_12c,(Vector *)&local_7c,(Vector *)&local_198,
                   (Vector *)&local_18c,(QAngle *)&vec3_angle,~-(uint)bVar17 & 0xff,0xff,0,0xff,15.0
                  );
      }
      local_1a0 = local_1a0 + fVar2 * 0.5;
    } while (local_1a0 <= fVar19);
  }
  cVar6 = INextBot::IsDebugging((INextBot *)(*(int *)(param_1 + 0x78) + 0x1a3c),4);
  if (cVar6 != '\0') {
    DevMsg("%3.2f: Can\'t find climb surface normal\n",(double)*(float *)(gpGlobals + 0xc));
  }
  uVar5 = DAT_01053d50;
  uVar4 = DAT_01053d4c;
  uVar11 = vec3_origin;
  *(undefined4 *)(param_1 + 0x6c) = vec3_origin;
  *(undefined4 *)(param_1 + 0x70) = uVar4;
  *(undefined4 *)(param_1 + 0x74) = uVar5;
  *(undefined4 *)(param_1 + 0x94) = uVar11;
  *(undefined4 *)(param_1 + 0x98) = uVar4;
  *(undefined4 *)(param_1 + 0x9c) = uVar5;
  return '\0';
LAB_00a51e59:
  uVar11 = (**(code **)(*piVar7 + 0x130))(piVar7);
  pfVar12 = (float *)(**(code **)(*piVar7 + 300))(piVar7);
  lVar18 = (longdouble)(**(code **)(*(int *)param_1 + 0x130))(param_1);
  pfVar13 = (float *)(**(code **)(*piVar7 + 0x128))(piVar7);
  local_11c = 0;
  local_118 = 0;
  local_ec = 0;
  fVar21 = (float)lVar18 + pfVar13[2] + 0.1;
  local_124 = local_16c * local_1a0 + local_178;
  local_114 = *(float *)(param_2 + 8) - local_124;
  local_e7 = local_114 * local_114 != 0.0;
  local_fc = (*pfVar12 - *pfVar13) * 0.5;
  local_f8 = (pfVar12[1] - pfVar13[1]) * 0.5;
  local_f4 = (pfVar12[2] - fVar21) * 0.5;
  local_e8 = local_f8 * local_f8 + local_fc * local_fc + local_f4 * local_f4 < 1e-06;
  fVar22 = (*pfVar13 + *pfVar12) * 0.5;
  fVar20 = (pfVar13[1] + pfVar12[1]) * 0.5;
  local_10c = -fVar22;
  local_12c = local_180 + fVar22 + local_174 * local_1a0;
  local_104 = (fVar21 + pfVar12[2]) * 0.5;
  local_108 = -fVar20;
  local_128 = local_17c + fVar20 + local_170 * local_1a0;
  local_124 = local_124 + local_104;
  local_104 = -local_104;
  (**(code **)(*enginetrace + 0x14))(enginetrace,(Vector *)&local_12c,uVar11,local_144,&local_7c);
  if (*(int *)(ZombieDebugClimb._28_4_ + 0x30) != 0) {
    uVar16 = 0xff;
    if ((1.0 <= local_50) && (local_48._2_1_ == '\0')) {
      uVar16 = ~-(uint)(local_48._3_1_ == '\0') & 0xff;
    }
    pVVar14 = (Vector *)(**(code **)(*piVar7 + 300))(piVar7);
    pVVar15 = (Vector *)(**(code **)(*piVar7 + 0x128))(piVar7);
    local_128 = local_170 * local_1a0 + local_17c;
    local_124 = *(float *)(param_2 + 8);
    local_12c = local_174 * local_1a0 + local_180;
    local_148 = local_b0 * local_1a0 + local_178;
    local_14c = local_b4 * local_1a0 + local_17c;
    local_150 = local_1a0 * local_b8 + local_180;
    NDebugOverlay::SweptBox
              ((Vector *)&local_150,(Vector *)&local_12c,pVVar15,pVVar14,(QAngle *)&vec3_angle,
               uVar16,0,0xff,0xff,15.0);
  }
  if (((1.0 <= local_50) && (local_48._2_1_ == '\0')) && (local_48._3_1_ == '\0')) {
    local_180 = local_1a0 * local_174 + local_180;
    local_17c = local_1a0 * local_170 + local_17c;
    local_178 = local_1a0 * local_16c + local_178;
    goto LAB_00a52282;
  }
  local_1a0 = local_1a0 + fVar2 * 0.25;
  if (fVar19 < local_1a0) {
LAB_00a52282:
    local_12c = -local_174;
    local_128 = -local_170;
    local_124 = -local_16c;
    VectorAngles((Vector *)&local_12c,local_168);
    CBaseEntity::SetAbsAngles(*(CBaseEntity **)(param_1 + 0x78),local_168);
    local_15c = local_180;
    local_158 = local_17c;
    local_154 = local_1d0 + local_178;
    (**(code **)(*(int *)param_1 + 0xb8))(param_1,&local_15c);
    cVar6 = INextBot::IsDebugging((INextBot *)(*(int *)(param_1 + 0x78) + 0x1a3c),4);
    if (cVar6 != '\0') {
      local_128 = local_170 * 25.0 + local_17c;
      local_124 = local_16c * 25.0 + local_178;
      local_12c = local_174 * 25.0 + local_180;
      NDebugOverlay::HorzArrow
                ((Vector *)&local_180,(Vector *)&local_12c,2.0,0xff,0xff,0,0xff,true,15.0);
      local_12c = 0.0;
      local_128 = -1.0;
      local_124 = 0.0;
      local_150 = 1.0;
      local_14c = 0.0;
      local_148 = 0.0;
      NDebugOverlay::Circle
                ((Vector *)&local_180,(Vector *)&local_150,(Vector *)&local_12c,3.0,0xff,0,0,0xff,
                 true,15.0);
    }
    cVar6 = (**(code **)(*piVar7 + 0xd8))(piVar7,local_1cc,0xb);
    if (cVar6 == '\0') {
      return '\0';
    }
    param_1[0xc0] = (Vector)0x1;
    param_1[0xd4] = (Vector)0x1;
    *(undefined4 *)(param_1 + 0xd8) = *(undefined4 *)param_2;
    *(undefined4 *)(param_1 + 0xdc) = *(undefined4 *)(param_2 + 4);
    *(undefined4 *)(param_1 + 0xe0) = *(undefined4 *)(param_2 + 8);
    (**(code **)(*piVar7 + 0xec))(piVar7,1);
    piVar7 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
    pcVar3 = *(code **)(*piVar7 + 0x14);
    uVar11 = CBaseEntity::GetGroundEntity(*(CBaseEntity **)(param_1 + 0x78));
    (*pcVar3)(piVar7,uVar11);
    return cVar6;
  }
  goto LAB_00a51e59;
}

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)