L L4D2node

CNavMesh::FindNavAreaOrLadderAlongRay

0x00707ca0 · 1953 bytes · __thiscall

_ZN8CNavMesh27FindNavAreaOrLadderAlongRayERK6VectorS2_PP8CNavAreaPP10CNavLadderS4_.part.86

Decompiled

undefined (6 params)

/* CNavMesh::FindNavAreaOrLadderAlongRay(Vector const&, Vector const&, CNavArea**, CNavLadder**,
   CNavArea*) [clone .part.86] */

bool __thiscall
CNavMesh::FindNavAreaOrLadderAlongRay
          (CNavMesh *this,Vector *param_1,Vector *param_2,CNavArea **param_3,CNavLadder **param_4,
          CNavArea *param_5)

{
  int *piVar1;
  int iVar2;
  Vector *pVVar3;
  int in_EAX;
  float *in_ECX;
  float *in_EDX;
  int iVar4;
  longdouble lVar5;
  float fVar6;
  int local_f4;
  int local_f0;
  int local_e8;
  int local_e4;
  int local_e0;
  float local_d0;
  float local_c0;
  float local_bc;
  float local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  undefined4 local_ac;
  float local_a8;
  float local_a4;
  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;
  float local_70;
  float local_6c;
  float local_68;
  float local_64;
  float local_5c;
  float local_58;
  float local_54;
  float local_4c;
  float local_48;
  float local_44;
  undefined4 local_3c;
  undefined4 local_38;
  undefined4 local_34;
  undefined4 local_2c;
  undefined1 local_28;
  undefined1 local_27;
  
  local_2c = 0;
  local_5c = *in_ECX - *in_EDX;
  local_3c = 0;
  local_38 = 0;
  local_58 = in_ECX[1] - in_EDX[1];
  local_34 = 0;
  local_54 = in_ECX[2] - in_EDX[2];
  local_28 = 1;
  local_6c = *in_EDX + vec3_origin;
  local_68 = in_EDX[1] + DAT_01053d4c;
  local_27 = local_58 * local_58 + local_5c * local_5c + local_54 * local_54 != 0.0;
  local_4c = -vec3_origin;
  local_48 = -DAT_01053d4c;
  local_64 = in_EDX[2] + DAT_01053d50;
  local_44 = -DAT_01053d50;
  *(undefined4 *)this = 0;
  *(undefined4 *)param_1 = 0;
  if (*(int *)(in_EAX + 0x51c) < 1) {
    local_d0 = 1.0;
  }
  else {
    iVar4 = 0;
    local_d0 = 1.0;
    do {
      iVar2 = *(int *)(*(int *)(in_EAX + 0x510) + iVar4 * 4);
      local_c0 = 0.0;
      local_bc = 0.0;
      local_b8 = 0.0;
      local_b4 = 0;
      local_b0 = 0;
      local_ac = 0;
      VectorVectors((Vector *)(iVar2 + 0x40),(Vector *)&local_c0,(Vector *)&local_b4);
      fVar6 = *(float *)(iVar2 + 0x20) * 0.5;
      local_c0 = local_c0 * fVar6;
      local_bc = local_bc * fVar6;
      local_b8 = fVar6 * local_b8;
      local_a8 = *(float *)(iVar2 + 4) + local_c0;
      local_a4 = *(float *)(iVar2 + 8) + local_bc;
      local_a0 = local_b8 + *(float *)(iVar2 + 0xc);
      local_94 = *(float *)(iVar2 + 0xc) - local_b8;
      local_9c = *(float *)(iVar2 + 4) - local_c0;
      local_98 = *(float *)(iVar2 + 8) - local_bc;
      local_90 = local_c0 + *(float *)(iVar2 + 0x10);
      local_84 = *(float *)(iVar2 + 0x10) - local_c0;
      local_8c = local_bc + *(float *)(iVar2 + 0x14);
      local_80 = *(float *)(iVar2 + 0x14) - local_bc;
      local_88 = local_b8 + *(float *)(iVar2 + 0x18);
      local_7c = *(float *)(iVar2 + 0x18) - local_b8;
      lVar5 = (longdouble)
              IntersectRayWithTriangle
                        ((Ray_t *)&local_6c,(Vector *)&local_a8,(Vector *)&local_9c,
                         (Vector *)&local_84,false);
      fVar6 = (float)lVar5;
      if ((fVar6 < local_d0) && (0.0 < fVar6)) {
        *(int *)param_1 = iVar2;
        local_d0 = fVar6;
      }
      lVar5 = (longdouble)
              IntersectRayWithTriangle
                        ((Ray_t *)&local_6c,(Vector *)&local_a8,(Vector *)&local_84,
                         (Vector *)&local_90,false);
      fVar6 = (float)lVar5;
      if ((fVar6 < local_d0) && (0.0 < fVar6)) {
        *(int *)param_1 = iVar2;
        local_d0 = fVar6;
      }
      iVar4 = iVar4 + 1;
    } while (iVar4 < *(int *)(in_EAX + 0x51c));
  }
  local_78 = *in_EDX;
  local_70 = in_EDX[2];
  local_74 = in_EDX[1];
  fVar6 = *in_ECX;
  local_84 = fVar6;
  if ((local_78 <= fVar6) && (local_84 = local_78, local_78 < fVar6)) {
    local_78 = fVar6;
  }
  fVar6 = in_ECX[1];
  local_80 = fVar6;
  if ((local_74 <= fVar6) && (local_80 = local_74, local_74 < fVar6)) {
    local_74 = fVar6;
  }
  fVar6 = in_ECX[2];
  local_7c = fVar6;
  if ((local_70 <= fVar6) && (local_7c = local_70, local_70 < fVar6)) {
    local_70 = fVar6;
  }
  fVar6 = 1.0 / *(float *)(in_EAX + 0x20);
  iVar4 = (int)((local_84 - *(float *)(in_EAX + 0x2c)) * fVar6);
  if (iVar4 < 0) {
    local_f4 = 0;
  }
  else {
    local_f4 = *(int *)(in_EAX + 0x24) + -1;
    if (iVar4 < *(int *)(in_EAX + 0x24)) {
      local_f4 = iVar4;
    }
  }
  iVar4 = (int)((local_80 - *(float *)(in_EAX + 0x30)) * fVar6);
  if (iVar4 < 0) {
    local_e4 = 0;
  }
  else {
    local_e4 = *(int *)(in_EAX + 0x28) + -1;
    if (iVar4 < *(int *)(in_EAX + 0x28)) {
      local_e4 = iVar4;
    }
  }
  iVar4 = (int)((local_78 - *(float *)(in_EAX + 0x2c)) * fVar6);
  if (iVar4 < 0) {
    local_e8 = 0;
  }
  else {
    local_e8 = *(int *)(in_EAX + 0x24) + -1;
    if (iVar4 < *(int *)(in_EAX + 0x24)) {
      local_e8 = iVar4;
    }
  }
  iVar4 = (int)((local_74 - *(float *)(in_EAX + 0x30)) * fVar6);
  if (iVar4 < 0) {
    local_f0 = 0;
  }
  else {
    local_f0 = *(int *)(in_EAX + 0x28) + -1;
    if (iVar4 < *(int *)(in_EAX + 0x28)) {
      local_f0 = iVar4;
    }
  }
  for (; local_e4 <= local_f0; local_e4 = local_e4 + 1) {
    if (local_f4 <= local_e8) {
      local_e0 = local_f4;
      do {
        piVar1 = (int *)(*(int *)(in_EAX + 0xc) +
                        (local_e4 * *(int *)(in_EAX + 0x24) + local_e0) * 0x14);
        if (0 < piVar1[3]) {
          iVar4 = 0;
          do {
            pVVar3 = *(Vector **)(*piVar1 + iVar4 * 4);
            if (pVVar3 != param_2) {
              local_b4 = *(undefined4 *)(pVVar3 + 4);
              local_b0 = *(undefined4 *)(pVVar3 + 8);
              local_ac = *(undefined4 *)(pVVar3 + 0xc);
              local_a8 = *(float *)(pVVar3 + 0x10);
              local_a4 = *(float *)(pVVar3 + 0x14);
              local_a0 = *(float *)(pVVar3 + 0x18);
              local_94 = *(float *)(pVVar3 + 0x24);
              local_88 = *(float *)(pVVar3 + 0x28);
              local_9c = local_a8;
              local_98 = (float)local_b0;
              local_90 = (float)local_b4;
              local_8c = local_a4;
              lVar5 = (longdouble)
                      IntersectRayWithTriangle
                                ((Ray_t *)&local_6c,(Vector *)&local_b4,(Vector *)&local_9c,
                                 (Vector *)&local_a8,false);
              fVar6 = (float)lVar5;
              if ((fVar6 < local_d0) && (0.0 < fVar6)) {
                *(Vector **)this = pVVar3;
                local_d0 = fVar6;
              }
              lVar5 = (longdouble)
                      IntersectRayWithTriangle
                                ((Ray_t *)&local_6c,(Vector *)&local_a8,(Vector *)&local_90,
                                 (Vector *)&local_b4,false);
              fVar6 = (float)lVar5;
              if ((fVar6 < local_d0) && (0.0 < fVar6)) {
                *(Vector **)this = pVVar3;
                local_d0 = fVar6;
              }
            }
            iVar4 = iVar4 + 1;
          } while (iVar4 < piVar1[3]);
        }
        local_e0 = local_e0 + 1;
      } while (local_e0 <= local_e8);
    }
  }
  if (*(int *)this != 0) {
    *(undefined4 *)param_1 = 0;
  }
  return local_d0 < 1.0;
}

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)