L L4D2node

UTIL_FindClosestPassableSpace

0x00582330 · 2413 bytes · __cdecl

_Z29UTIL_FindClosestPassableSpaceRK6VectorS1_S1_P12ITraceFilterjjRS_

Decompiled

undefined (7 params)

/* UTIL_FindClosestPassableSpace(Vector const&, Vector const&, Vector const&, ITraceFilter*,
   unsigned int, unsigned int, Vector&) */

undefined4
UTIL_FindClosestPassableSpace
          (Vector *param_1,Vector *param_2,Vector *param_3,ITraceFilter *param_4,uint param_5,
          uint param_6,Vector *param_7)

{
  float fVar1;
  byte bVar2;
  int iVar3;
  float *pfVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  int iVar8;
  byte bVar9;
  undefined1 *puVar10;
  float fVar11;
  float fVar12;
  float fVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  float local_294;
  float local_290;
  uint local_28c;
  float local_288;
  float local_284;
  float local_280;
  float local_27c;
  uint local_260;
  uint local_25c;
  byte abStack_258 [8];
  float local_250 [4];
  float local_240;
  float local_23c;
  float local_238;
  float local_234;
  float local_230;
  float local_22c;
  float local_228 [7];
  float afStack_20c [8];
  float afStack_1ec [8];
  float local_1cc;
  float local_1c8;
  float local_1c4;
  float local_1bc;
  float local_1b8;
  float local_1b4;
  undefined4 local_1ac;
  undefined4 local_1a8;
  undefined4 local_1a4;
  float local_19c;
  float local_198;
  float local_194;
  undefined1 local_188;
  undefined1 local_187;
  float local_17c;
  float local_178;
  float local_174;
  float local_16c;
  float local_168;
  float local_164;
  undefined4 local_15c;
  undefined4 local_158;
  undefined4 local_154;
  float local_14c;
  float local_148;
  float local_144;
  undefined1 local_138;
  undefined1 local_137;
  float local_124 [24];
  undefined1 local_c4 [12];
  undefined4 local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  float local_98 [2];
  char local_8d [73];
  float local_44;
  char local_39;
  
  local_188 = 0;
  local_187 = 1;
  local_1ac = vec3_origin;
  local_1a8 = DAT_01053d4c;
  local_27c = *(float *)param_1;
  local_1a4 = DAT_01053d50;
  local_250[0] = *(float *)param_2;
  local_250[1] = *(float *)(param_2 + 4);
  local_284 = *(float *)(param_1 + 4);
  local_290 = *(float *)param_2;
  local_288 = *(float *)(param_2 + 4);
  local_19c = local_290;
  local_294 = *(float *)(param_2 + 8);
  local_198 = local_288;
  local_250[2] = *(float *)(param_2 + 8);
  local_194 = local_294;
  fVar16 = 1.0 / ((float)(param_6 + 1 >> 0x10) * 65536.0 + (float)(param_6 + 1 & 0xffff));
  fVar15 = fVar16 * local_290;
  fVar17 = fVar16 * local_288;
  fVar16 = fVar16 * local_294;
  fVar11 = local_250[1];
  if (local_290 >= local_250[1]) {
    fVar11 = local_290;
  }
  iVar3 = (uint)(local_290 < local_250[1]) << 2;
  local_138 = 0;
  if (fVar11 < *(float *)(param_2 + 8)) {
    iVar3 = 8;
  }
  local_14c = fVar15;
  local_137 = 1;
  local_228[3] = 1.0 / *(float *)((int)local_250 + iVar3);
  local_228[1] = (local_288 + local_288) * local_228[3];
  local_228[0] = (local_290 + local_290) * local_228[3];
  local_228[3] = (local_294 + local_294) * local_228[3];
  local_22c = 0.0;
  local_158 = DAT_01053d4c;
  local_15c = vec3_origin;
  fVar14 = local_228[3] * local_228[3];
  local_154 = DAT_01053d50;
  fVar11 = local_228[1] * local_228[1] + local_228[0] * local_228[0];
  local_228[2] = SQRT(fVar11);
  local_228[5] = SQRT(local_228[1] * local_228[1] + fVar14);
  local_280 = *(float *)(param_1 + 8) + 0.001;
  local_228[4] = SQRT(local_228[0] * local_228[0] + fVar14);
  local_228[6] = SQRT(fVar11 + fVar14);
  if (param_6 == 0) {
LAB_00582c6f:
    *(float *)param_7 = local_27c;
    *(undefined4 *)(param_7 + 4) = *(undefined4 *)(param_1 + 4);
    *(undefined4 *)(param_7 + 8) = *(undefined4 *)(param_1 + 8);
    return 0;
  }
  local_28c = 0;
  local_148 = fVar17;
  local_144 = fVar16;
  do {
    local_288 = local_288 - fVar17;
    local_290 = local_290 - fVar15;
    local_294 = local_294 - fVar16;
    bVar9 = 0;
    fVar13 = local_280 - local_294;
    local_234 = local_294 + local_280;
    local_23c = local_27c + local_290;
    fVar14 = local_27c - local_290;
    fVar12 = local_284 - local_288;
    local_230 = local_288 + local_284;
    uVar5 = 0;
    pfVar4 = local_124;
    fVar11 = local_22c;
    local_250[3] = fVar13;
    local_240 = fVar14;
    local_238 = fVar12;
    while( true ) {
      *pfVar4 = fVar14;
      pfVar4[1] = fVar12;
      pfVar4[2] = fVar13;
      iVar7 = *enginetrace;
      afStack_20c[uVar5] = 0.0;
      bVar2 = (**(code **)(iVar7 + 0x44))(enginetrace,pfVar4);
      abStack_258[uVar5] = bVar2;
      bVar9 = bVar9 | bVar2;
      afStack_1ec[uVar5] = fVar11 * *(float *)(param_2 + iVar3);
      uVar6 = uVar5 + 1;
      if (uVar6 == 8) break;
      fVar11 = local_250[uVar5 + 10];
      fVar14 = local_250[(uVar6 & 1) + 4];
      fVar12 = local_250[(uVar6 & 2) + 6];
      fVar13 = local_250[(uVar6 & 4) + 3];
      uVar5 = uVar6;
      pfVar4 = pfVar4 + 3;
    }
    local_260 = 0;
LAB_00582718:
    while (local_25c = local_260 + 1, local_260 + 1 == 8) {
      local_260 = 8;
    }
LAB_00582730:
    puVar10 = local_c4;
    iVar7 = 0;
    uVar5 = local_260;
    if (abStack_258[local_260] == 0) goto LAB_00582995;
LAB_00582746:
    puVar10[0x37] = 1;
    *(undefined4 *)(puVar10 + 0x2c) = 0;
    iVar8 = iVar7;
    while( true ) {
      iVar7 = iVar8 + 4;
      puVar10 = puVar10 + 0x54;
      if (iVar7 == 8) break;
      uVar5 = *(uint *)(abStack_258 + iVar8 + -4);
      if (abStack_258[uVar5] != 0) goto LAB_00582746;
LAB_00582995:
      iVar8 = *(int *)(abStack_258 + (-4 - iVar7));
      local_174 = local_124[uVar5 * 3 + 2];
      local_178 = local_124[uVar5 * 3 + 1];
      local_17c = local_124[uVar5 * 3];
      local_168 = local_124[iVar8 * 3 + 1] - local_124[uVar5 * 3 + 1];
      local_164 = local_124[iVar8 * 3 + 2] - local_124[uVar5 * 3 + 2];
      local_16c = local_124[iVar8 * 3] - local_124[uVar5 * 3];
      (**(code **)(*enginetrace + 0x14))(enginetrace,&local_17c,param_5,param_4,puVar10);
      iVar8 = iVar7;
    }
    fVar11 = afStack_1ec[local_25c ^ local_260];
    if (local_98[0] == 1.0) {
      iVar7 = 0;
      if (local_44 != 1.0) goto LAB_00582a94;
    }
    else if (local_44 == 1.0) {
      iVar7 = 1;
LAB_00582a94:
      local_8d[iVar7 * 0x54] = '\x01';
      local_98[iVar7 * 0x15] = 0.0;
    }
    if (local_8d[0] == '\0') {
      afStack_20c[local_260] = local_98[0] * fVar11 + afStack_20c[local_260];
    }
    else {
      abStack_258[local_260] = 1;
      bVar9 = 1;
    }
    if (local_39 == '\0') {
      afStack_20c[local_25c] = fVar11 * local_44 + afStack_20c[local_25c];
    }
    else {
      abStack_258[local_25c] = 1;
      bVar9 = 1;
    }
    local_25c = local_25c + 1;
    if (local_25c != 8) goto LAB_00582730;
    local_260 = local_260 + 1;
    if (local_260 != 7) goto LAB_00582718;
    if (bVar9 == 0) {
      local_1cc = local_27c;
      local_1c8 = local_284;
      local_1c4 = local_280;
      local_1b8 = *(float *)(param_1 + 4) - local_284;
      local_1b4 = *(float *)(param_1 + 8) - local_280;
      local_1bc = *(float *)param_1 - local_27c;
      (**(code **)(*enginetrace + 0x14))(enginetrace,&local_1cc,param_5,param_4,local_c4);
      if (local_8d[0] == '\0') {
        *(undefined4 *)param_7 = local_b8;
        *(undefined4 *)(param_7 + 4) = local_b4;
        *(undefined4 *)(param_7 + 8) = local_b0;
        return 1;
      }
    }
    fVar11 = 0.0;
    pfVar4 = local_124;
    fVar12 = 0.0;
    fVar13 = 0.0;
    iVar7 = 0;
    fVar14 = 0.0;
    do {
      if (abStack_258[iVar7] == 0) {
        fVar1 = afStack_20c[iVar7];
        fVar14 = fVar14 + fVar1;
        fVar11 = fVar11 + (*pfVar4 - local_27c) * fVar1;
        fVar12 = fVar12 + (pfVar4[1] - local_284) * fVar1;
        fVar13 = fVar13 + (pfVar4[2] - local_280) * fVar1;
      }
      iVar7 = iVar7 + 1;
      pfVar4 = pfVar4 + 3;
    } while (iVar7 != 8);
    if (fVar14 == 0.0) {
      fVar11 = *(float *)param_3;
      fVar14 = *(float *)(param_3 + 8);
      fVar12 = *(float *)(param_3 + 4);
      local_14c = fVar15;
      local_148 = fVar17;
      local_144 = fVar16;
      local_294 = local_250[2];
      local_290 = local_250[0];
      local_288 = local_250[1];
    }
    else {
      fVar14 = 1.0 / fVar14;
      fVar11 = fVar11 * fVar14;
      fVar12 = fVar12 * fVar14;
      fVar14 = fVar14 * fVar13;
      local_14c = local_14c + fVar15;
      local_148 = local_148 + fVar17;
      local_144 = local_144 + fVar16;
    }
    local_27c = fVar11 + local_27c;
    local_280 = fVar14 + local_280;
    local_284 = fVar12 + local_284;
    local_28c = local_28c + 1;
    if (local_28c == param_6) {
      local_27c = *(float *)param_1;
      goto LAB_00582c6f;
    }
  } while( true );
}

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)