L L4D2node

PathFollower::Avoid

0x007648f0 · 4876 bytes · __cdecl

_ZN12PathFollower5AvoidEP8INextBotRK6VectorS4_S4_

Decompiled

undefined (4 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* PathFollower::Avoid(INextBot*, Vector const&, Vector const&, Vector const&) */

INextBot * PathFollower::Avoid(INextBot *param_1,Vector *param_2,Vector *param_3,Vector *param_4)

{
  float fVar1;
  uint uVar2;
  char cVar3;
  int iVar4;
  int *piVar5;
  int *piVar6;
  undefined4 uVar7;
  IHandleEntity *pIVar8;
  int *piVar9;
  uint *puVar10;
  int iVar11;
  undefined4 *puVar12;
  float *pfVar13;
  undefined *puVar14;
  Vector VVar15;
  longdouble lVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  float fVar21;
  float *in_stack_00000014;
  float *in_stack_00000018;
  float local_1a0;
  float local_19c;
  float local_194;
  CBaseEntity *local_190;
  float local_188;
  float local_184;
  float local_180;
  undefined4 local_174;
  undefined4 local_170;
  undefined4 local_168;
  undefined4 local_164;
  int local_160;
  Vector local_15c [12];
  float local_150;
  float local_14c;
  float local_148;
  undefined **local_144 [4];
  undefined **local_134 [4];
  Vector *local_124;
  undefined4 local_120;
  float local_11c;
  float local_118;
  float local_114;
  float local_10c;
  float local_108;
  float local_104;
  float local_fc;
  float local_f8;
  float local_f4;
  float local_ec;
  float local_e8;
  float local_e4;
  undefined4 local_dc;
  undefined1 local_d8;
  undefined1 local_d7;
  float local_cc;
  float local_c8;
  float local_c4;
  float local_bc;
  float local_b8;
  float local_b4;
  float local_ac;
  float local_a8;
  float local_a4;
  float local_9c;
  float local_98;
  float local_94;
  undefined4 local_8c;
  undefined1 local_88;
  undefined1 local_87;
  CGameTrace local_70 [44];
  float local_44;
  char local_39;
  int local_24;
  
  local_174 = 0;
  local_170 = 0;
  if (_towlower == 0) {
    local_160 = 0;
  }
  else {
    (**(code **)(_towlower + 0x50))
              (_towlower,&local_174,0,0,0,0,
               "/data/src/game/server/nextbot/path/nextbotpathfollow.cpp",0x35e,
               &Avoid(INextBot*,Vector_const&,Vector_const&,Vector_const&)::tm_fmt,"(%s)%s",
               "NextBotExpensive","PathFollower::Avoid");
    local_160 = _towlower;
  }
  iVar11 = _DAT_0105db00;
  local_168 = local_174;
  local_164 = local_170;
                    /* try { // try from 00764a86 to 00764ae6 has its CatchHandler @ 00765c0f */
  if (((_DAT_0105d154 == 0) && (DAT_0105d158 != '\0')) ||
     (iVar4 = ThreadGetCurrentId(), iVar11 != iVar4)) {
    iVar11 = *(int *)(NextBotAllowAvoiding._28_4_ + 0x30);
  }
  else {
    if ((char *)*_DAT_0105d15c != "PathFollower::Avoid") {
      _DAT_0105d15c =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xcaa5fa,(char *)0x0,0xca957e);
    }
    puVar10 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
    *puVar10 = *puVar10 | 4;
    CVProfNode::EnterScope();
    DAT_0105d158 = '\0';
    iVar11 = *(int *)(NextBotAllowAvoiding._28_4_ + 0x30);
  }
  if (iVar11 != 0) {
                    /* try { // try from 00764b0a to 00765c09 has its CatchHandler @ 00765c27 */
    lVar16 = (longdouble)CountdownTimer::Now();
    if (*(float *)(param_2 + 0x476c) <= (float)lVar16) {
      lVar16 = (longdouble)CountdownTimer::Now();
      if ((float)lVar16 + 0.5 != *(float *)(param_2 + 0x476c)) {
        (**(code **)(*(int *)(param_2 + 0x4764) + 4))(param_2 + 0x4764,param_2 + 0x476c);
        *(float *)(param_2 + 0x476c) = (float)lVar16 + 0.5;
      }
      if (*(float *)(param_2 + 0x4768) != 0.5) {
        (**(code **)(*(int *)(param_2 + 0x4764) + 4))(param_2 + 0x4764,param_2 + 0x4768);
        *(undefined4 *)(param_2 + 0x4768) = 0x3f000000;
      }
      piVar5 = (int *)(**(code **)(*(int *)param_3 + 0xc0))(param_3);
      piVar6 = (int *)(**(code **)(*(int *)param_3 + 0xc4))(param_3);
      uVar7 = (**(code **)(*piVar6 + 0x130))(piVar6);
      local_184 = *(float *)param_4;
      local_180 = *(float *)(param_4 + 4);
      local_188 = *(float *)(param_4 + 8);
      cVar3 = (**(code **)(*piVar5 + 200))(piVar5);
      if ((cVar3 != '\0') || (cVar3 = (**(code **)(*piVar5 + 0xf8))(piVar5), cVar3 == '\0')) {
        *(float *)param_1 = local_184;
        *(float *)(param_1 + 4) = local_180;
        *(float *)(param_1 + 8) = local_188;
        goto LAB_007649e1;
      }
      pIVar8 = (IHandleEntity *)(**(code **)(*(int *)param_3 + 0xb4))(param_3);
      CTraceFilterSimple::CTraceFilterSimple
                ((CTraceFilterSimple *)local_144,pIVar8,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
      local_144[0] = &PTR_ShouldHitEntity_00caa988;
      piVar9 = (int *)FindBlocker((PathFollower *)param_2,(INextBot *)param_3);
      if (piVar9 == (int *)0x0) {
        *(undefined4 *)(param_2 + 0x477c) = 0xffffffff;
      }
      else {
        puVar10 = (uint *)(**(code **)(*piVar9 + 0xc))(piVar9);
        puVar14 = g_pEntityList;
        uVar2 = *puVar10;
        *(uint *)(param_2 + 0x477c) = uVar2;
        if (((uVar2 != 0xffffffff) &&
            (puVar14 = puVar14 + (uVar2 & 0xfff) * 0x10, puVar14 != (undefined *)0xfffffffc)) &&
           ((*(uint *)(puVar14 + 8) == uVar2 >> 0xc && (*(int *)(puVar14 + 4) != 0)))) {
          lVar16 = (longdouble)RandomFloat(0x3f800000,0x40000000);
          fVar20 = (float)lVar16 * 0.5;
          lVar16 = (longdouble)CountdownTimer::Now();
          if ((float)lVar16 + fVar20 != *(float *)(param_2 + 0x4778)) {
            (**(code **)(*(int *)(param_2 + 0x4770) + 4))(param_2 + 0x4770,param_2 + 0x4778);
            *(float *)(param_2 + 0x4778) = (float)lVar16 + fVar20;
          }
          if (fVar20 != *(float *)(param_2 + 0x4774)) {
            (**(code **)(*(int *)(param_2 + 0x4770) + 4))(param_2 + 0x4770,param_2 + 0x4774);
            *(float *)(param_2 + 0x4774) = fVar20;
          }
          puVar12 = (undefined4 *)(**(code **)(*piVar5 + 300))(piVar5);
          *(undefined4 *)param_1 = *puVar12;
          uVar7 = puVar12[2];
          *(undefined4 *)(param_1 + 4) = puVar12[1];
          *(undefined4 *)(param_1 + 8) = uVar7;
          goto LAB_007649e1;
        }
      }
      piVar9 = (int *)(**(code **)(*(int *)param_3 + 0xb4))(param_3);
      iVar11 = (**(code **)(*piVar9 + 0x52c))(piVar9);
      if ((iVar11 != 0) && ((*(byte *)(iVar11 + 0x54) & 4) != 0)) {
        *(float *)param_1 = local_184;
        *(float *)(param_1 + 4) = local_180;
        *(float *)(param_1 + 8) = local_188;
        goto LAB_007649e1;
      }
      param_2[0x478c] = (Vector)0x1;
      lVar16 = (longdouble)(**(code **)(*piVar6 + 0x118))(piVar6);
      fVar20 = (float)lVar16 * 0.25 + 2.0;
      cVar3 = (**(code **)(*piVar5 + 0xe4))(piVar5);
      local_1a0 = 30.0;
      if (cVar3 != '\0') {
        local_1a0 = 50.0;
      }
      lVar16 = (longdouble)(**(code **)(*piVar6 + 0x118))(piVar6);
      fVar21 = (float)lVar16 * 0.25;
      lVar16 = (longdouble)(**(code **)(*piVar5 + 0x130))(piVar5);
      *(float *)(param_2 + 0x47d0) = (float)lVar16 + 0.1;
      *(float *)(param_2 + 0x47c8) = -fVar21;
      *(float *)(param_2 + 0x47cc) = -fVar21;
      lVar16 = (longdouble)(**(code **)(*piVar6 + 0x124))(piVar6);
      *(float *)(param_2 + 0x47d4) = fVar21;
      *(float *)(param_2 + 0x47d8) = fVar21;
      *(float *)(param_2 + 0x47dc) = (float)lVar16;
      (**(code **)(*piVar5 + 0x130))(piVar5);
      fVar21 = *in_stack_00000018;
      fVar1 = in_stack_00000018[1];
      fVar18 = in_stack_00000018[2];
      pfVar13 = (float *)(**(code **)(*piVar5 + 300))(piVar5);
      fVar17 = fVar1 * fVar20 + pfVar13[1];
      fVar18 = fVar20 * fVar18 + pfVar13[2];
      fVar19 = fVar21 * fVar20 + *pfVar13;
      *(float *)(param_2 + 0x4794) = fVar17;
      *(float *)(param_2 + 0x4798) = fVar18;
      *(float *)(param_2 + 0x4790) = fVar19;
      fVar21 = in_stack_00000014[2];
      fVar1 = *in_stack_00000014;
      *(float *)(param_2 + 0x47a0) = in_stack_00000014[1] * local_1a0 + fVar17;
      *(float *)(param_2 + 0x47a4) = fVar21 * local_1a0 + fVar18;
      param_2[0x47a8] = (Vector)0x1;
      *(float *)(param_2 + 0x479c) = fVar1 * local_1a0 + fVar19;
      pIVar8 = (IHandleEntity *)(**(code **)(*(int *)param_3 + 0xb4))(param_3);
      CTraceFilterSimple::CTraceFilterSimple
                ((CTraceFilterSimple *)local_134,pIVar8,0,IgnoreActorsTraceFilterFunction);
      local_134[0] = &PTR_ShouldHitEntity_00ca96c8;
      local_120 = 1;
      local_dc = 0;
      local_124 = param_3;
      local_10c = *(float *)(param_2 + 0x479c) - *(float *)(param_2 + 0x4790);
      local_108 = *(float *)(param_2 + 0x47a0) - *(float *)(param_2 + 0x4794);
      local_104 = *(float *)(param_2 + 0x47a4) - *(float *)(param_2 + 0x4798);
      local_d7 = local_108 * local_108 + local_10c * local_10c + local_104 * local_104 != 0.0;
      local_ec = (*(float *)(param_2 + 0x47d4) - *(float *)(param_2 + 0x47c8)) * 0.5;
      local_e8 = (*(float *)(param_2 + 0x47d8) - *(float *)(param_2 + 0x47cc)) * 0.5;
      local_e4 = (*(float *)(param_2 + 0x47dc) - *(float *)(param_2 + 0x47d0)) * 0.5;
      local_d8 = local_e8 * local_e8 + local_ec * local_ec + local_e4 * local_e4 < 1e-06;
      local_fc = (*(float *)(param_2 + 0x47d4) + *(float *)(param_2 + 0x47c8)) * 0.5;
      local_f8 = (*(float *)(param_2 + 0x47d8) + *(float *)(param_2 + 0x47cc)) * 0.5;
      local_f4 = (*(float *)(param_2 + 0x47dc) + *(float *)(param_2 + 0x47d0)) * 0.5;
      local_11c = *(float *)(param_2 + 0x4790) + local_fc;
      local_fc = -local_fc;
      local_118 = *(float *)(param_2 + 0x4794) + local_f8;
      local_f8 = -local_f8;
      local_114 = *(float *)(param_2 + 0x4798) + local_f4;
      local_f4 = -local_f4;
      (**(code **)(*enginetrace + 0x14))(enginetrace,&local_11c,uVar7,local_134,local_70);
      if (local_44 < 1.0) {
        if (0.0 <= local_44) {
LAB_00765ba3:
          local_19c = 1.0 - local_44;
        }
        else {
LAB_00765b64:
          local_19c = 1.0;
        }
LAB_00765917:
        param_2[0x47a8] = (Vector)0x0;
        cVar3 = CGameTrace::DidHitNonWorldEntity(local_70);
        local_190 = (CBaseEntity *)0x0;
        if ((cVar3 != '\0') && (local_24 != 0)) {
          local_190 = (CBaseEntity *)
                      __dynamic_cast(local_24,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0);
        }
      }
      else {
        if (local_39 != '\0') {
          if (local_44 < 0.0) goto LAB_00765b64;
          if (local_44 <= 1.0) goto LAB_00765ba3;
          local_19c = 0.0;
          goto LAB_00765917;
        }
        local_19c = 0.0;
        local_190 = (CBaseEntity *)0x0;
      }
      fVar21 = *in_stack_00000018;
      fVar1 = in_stack_00000018[1];
      fVar18 = in_stack_00000018[2];
      pfVar13 = (float *)(**(code **)(*piVar5 + 300))(piVar5);
      local_8c = 0;
      local_c8 = pfVar13[1] - fVar1 * fVar20;
      local_cc = *pfVar13 - fVar21 * fVar20;
      local_c4 = pfVar13[2] - fVar20 * fVar18;
      *(float *)(param_2 + 0x47b0) = local_c8;
      *(float *)(param_2 + 0x47ac) = local_cc;
      *(float *)(param_2 + 0x47b4) = local_c4;
      local_bc = *in_stack_00000014 * local_1a0 + local_cc;
      local_b8 = in_stack_00000014[1] * local_1a0 + local_c8;
      local_b4 = local_1a0 * in_stack_00000014[2] + local_c4;
      *(float *)(param_2 + 0x47b8) = local_bc;
      local_bc = local_bc - local_cc;
      *(float *)(param_2 + 0x47bc) = local_b8;
      local_b8 = local_b8 - local_c8;
      *(float *)(param_2 + 0x47c0) = local_b4;
      local_b4 = local_b4 - local_c4;
      param_2[0x47c4] = (Vector)0x1;
      local_87 = local_b4 * local_b4 + local_b8 * local_b8 + local_bc * local_bc != 0.0;
      local_9c = (*(float *)(param_2 + 0x47d4) - *(float *)(param_2 + 0x47c8)) * 0.5;
      local_98 = (*(float *)(param_2 + 0x47d8) - *(float *)(param_2 + 0x47cc)) * 0.5;
      local_94 = (*(float *)(param_2 + 0x47dc) - *(float *)(param_2 + 0x47d0)) * 0.5;
      local_ac = (*(float *)(param_2 + 0x47d4) + *(float *)(param_2 + 0x47c8)) * 0.5;
      local_a8 = (*(float *)(param_2 + 0x47d8) + *(float *)(param_2 + 0x47cc)) * 0.5;
      local_cc = local_cc + local_ac;
      local_ac = -local_ac;
      local_c8 = local_c8 + local_a8;
      local_a8 = -local_a8;
      local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
      local_a4 = (*(float *)(param_2 + 0x47d0) + *(float *)(param_2 + 0x47dc)) * 0.5;
      local_c4 = local_c4 + local_a4;
      local_a4 = -local_a4;
      (**(code **)(*enginetrace + 0x14))(enginetrace,&local_cc,uVar7,local_134,local_70);
      if (local_44 < 1.0) {
        if (0.0 <= local_44) {
LAB_00765b8a:
          local_194 = 1.0 - local_44;
        }
        else {
LAB_00765b7b:
          local_194 = 1.0;
        }
LAB_0076588d:
        param_2[0x47c4] = (Vector)0x0;
        VVar15 = (Vector)0x0;
        if (local_190 != (CBaseEntity *)0x0) goto LAB_0076563c;
        cVar3 = CGameTrace::DidHitNonWorldEntity(local_70);
        if ((cVar3 != '\0') && (local_24 != 0)) {
          local_190 = (CBaseEntity *)
                      __dynamic_cast(local_24,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0);
          VVar15 = param_2[0x47c4];
          goto LAB_0076562e;
        }
LAB_00765974:
        if (param_2[0x47a8] == (Vector)0x0) {
LAB_00765ae8:
          if (param_2[0x47c4] == (Vector)0x0) {
            if (ABS(local_194 - local_19c) < 0.01) {
              *(float *)param_1 = local_184;
              *(float *)(param_1 + 4) = local_180;
              *(float *)(param_1 + 8) = local_188;
              goto LAB_007649e1;
            }
            local_19c = (float)(~-(uint)(local_194 <= local_19c) & (uint)-local_194 |
                               (uint)local_19c & -(uint)(local_194 <= local_19c));
          }
LAB_007659aa:
          local_c8 = in_stack_00000014[1] * 0.5 - in_stack_00000018[1] * local_19c;
          local_c4 = in_stack_00000014[2] * 0.5 - in_stack_00000018[2] * local_19c;
          local_cc = *in_stack_00000014 * 0.5 - *in_stack_00000018 * local_19c;
          VectorNormalize((Vector *)&local_cc);
          local_184 = local_cc * 100.0;
          local_180 = local_c8 * 100.0;
          local_188 = local_c4 * 100.0;
          pfVar13 = (float *)(**(code **)(*piVar5 + 300))(piVar5);
          local_188 = local_188 + pfVar13[2];
          local_184 = local_184 + *pfVar13;
          local_180 = local_180 + pfVar13[1];
          if (*(float *)(param_2 + 0x476c) != -1.0) goto LAB_00765ac8;
        }
        else {
          VVar15 = param_2[0x47c4];
LAB_0076598b:
          if (VVar15 == (Vector)0x0) {
            local_19c = -local_194;
            goto LAB_007659aa;
          }
        }
      }
      else {
        if (local_39 != '\0') {
          if (local_44 < 0.0) goto LAB_00765b7b;
          if (local_44 <= 1.0) goto LAB_00765b8a;
          local_194 = 0.0;
          goto LAB_0076588d;
        }
        local_194 = 0.0;
        VVar15 = param_2[0x47c4];
LAB_0076562e:
        if (local_190 == (CBaseEntity *)0x0) goto LAB_00765974;
LAB_0076563c:
        if (param_2[0x47a8] != (Vector)0x0) goto LAB_0076598b;
        if (VVar15 != (Vector)0x0) goto LAB_00765ae8;
        if (((byte)local_190[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition(local_190);
        }
        AngleVectors((QAngle *)(local_190 + 0x37c),local_15c,(Vector *)&local_150,
                     (Vector *)&local_11c);
        if (((byte)local_190[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition(local_190);
        }
        local_cc = *(float *)(local_190 + 0x2e0) - local_150 * 100.0;
        local_c8 = *(float *)(local_190 + 0x2e4) - local_14c * 100.0;
        local_c4 = *(float *)(local_190 + 0x2e8) - local_148 * 100.0;
        cVar3 = INextBot::IsDebugging((INextBot *)param_3,4);
        if (cVar3 != '\0') {
          if ((((byte)local_190[0x14d] & 8) != 0) &&
             (CBaseEntity::CalcAbsolutePosition(local_190), ((byte)local_190[0x14d] & 8) != 0)) {
            CBaseEntity::CalcAbsolutePosition(local_190);
          }
          NDebugOverlay::Axis((Vector *)(local_190 + 0x2e0),(QAngle *)(local_190 + 0x37c),20.0,true,
                              10.0);
          if (((byte)local_190[0x14d] & 8) != 0) {
            CBaseEntity::CalcAbsolutePosition(local_190);
          }
          NDebugOverlay::Line((Vector *)(local_190 + 0x2e0),(Vector *)&local_cc,0xff,0xff,0,true,
                              10.0);
        }
        local_184 = local_cc;
        local_180 = local_c8;
        if (*(float *)(param_2 + 0x476c) == -1.0) goto LAB_0076583b;
LAB_00765ac8:
        CountdownTimer::NetworkVar_m_timestamp::NetworkStateChanged(param_2 + 0x476c);
        *(undefined4 *)(param_2 + 0x476c) = 0xbf800000;
      }
LAB_0076583b:
      *(float *)param_1 = local_184;
      *(float *)(param_1 + 4) = local_180;
      *(float *)(param_1 + 8) = local_188;
      goto LAB_007649e1;
    }
  }
  *(undefined4 *)param_1 = *(undefined4 *)param_4;
  *(undefined4 *)(param_1 + 4) = *(undefined4 *)(param_4 + 4);
  *(undefined4 *)(param_1 + 8) = *(undefined4 *)(param_4 + 8);
LAB_007649e1:
  iVar11 = _DAT_0105db00;
  if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
     (iVar4 = ThreadGetCurrentId(), iVar11 == iVar4)) {
    cVar3 = CVProfNode::ExitScope();
    if (cVar3 != '\0') {
      _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
    }
    DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
  }
  if (local_160 != 0) {
    (**(code **)(local_160 + 0x54))(local_160,local_168,local_164,0,0,0);
  }
  return param_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)