L L4D2node

AvoidNeighbors

0x00a11ab0 · 1685 bytes · __cdecl

_Z14AvoidNeighborsP8InfectedP11CBaseEntityP12PathFollower

Decompiled

undefined (3 params)

/* AvoidNeighbors(Infected*, CBaseEntity*, PathFollower*) */

void AvoidNeighbors(Infected *param_1,CBaseEntity *param_2,PathFollower *param_3)

{
  code *pcVar1;
  uint uVar2;
  CBaseEntity *this;
  char cVar3;
  int *piVar4;
  undefined4 uVar5;
  int iVar6;
  undefined4 *puVar7;
  Vector *pVVar8;
  CBaseEntity *pCVar9;
  float *pfVar10;
  undefined *puVar11;
  TerrorNavArea *pTVar12;
  longdouble lVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  float fVar21;
  undefined4 uVar22;
  float local_40;
  float local_34;
  float local_30;
  float local_2c;
  float local_28;
  float local_24;
  float local_20;
  
  piVar4 = (int *)(**(code **)(*(int *)param_1 + 0x590))(param_1);
  cVar3 = (**(code **)(*piVar4 + 200))(piVar4);
  if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar4 + 0xf8))(piVar4), cVar3 != '\0')) &&
     ((param_2 == (CBaseEntity *)0x0 ||
      (cVar3 = (**(code **)(*(int *)(param_1 + 0x1a3c) + 0x114))
                         (param_1 + 0x1a3c,param_2,0x437a0000), cVar3 == '\0')))) {
    pcVar1 = *(code **)(*(int *)param_3 + 0x2c);
    uVar5 = (**(code **)(*piVar4 + 300))(piVar4);
    (*pcVar1)(param_3,uVar5,0,0);
    iVar6 = (**(code **)(*(int *)param_3 + 0x40))(param_3);
    puVar7 = *(undefined4 **)(iVar6 + 0x1c);
    if (puVar7 != (undefined4 *)0x0) {
      if (puVar7[5] == 0) {
        local_40 = 0.0;
        do {
          pTVar12 = (TerrorNavArea *)*puVar7;
          if ((pTVar12 != (TerrorNavArea *)0x0) &&
             (cVar3 = TerrorNavArea::IsBottleneck(pTVar12), cVar3 != '\0')) {
            pVVar8 = (Vector *)(**(code **)(*piVar4 + 300))(piVar4);
            lVar13 = (longdouble)CNavArea::GetDistanceSquaredToPoint((CNavArea *)pTVar12,pVVar8);
            fVar14 = SQRT((float)lVar13);
            if (*(int *)(ZombieDebugAvoid._28_4_ + 0x30) == 0) goto LAB_00a11c7f;
            pTVar12 = pTVar12 + 0x2c;
            goto LAB_00a11c1e;
          }
          local_40 = local_40 + (float)puVar7[10];
          puVar7 = (undefined4 *)(**(code **)(*(int *)param_3 + 0x58))(param_3,puVar7);
          if ((puVar7 == (undefined4 *)0x0) || (750.0 <= local_40)) goto LAB_00a11c98;
        } while (puVar7[5] == 0);
      }
      pTVar12 = (TerrorNavArea *)&local_28;
      iVar6 = (**(code **)(*piVar4 + 300))(piVar4);
      uVar5 = *(undefined4 *)(iVar6 + 8);
      uVar22 = puVar7[5];
      CNavLadder::GetPosAtHeight((float)pTVar12);
      pfVar10 = (float *)(**(code **)(*piVar4 + 300))(piVar4,uVar22,uVar5);
      fVar14 = SQRT((local_28 - *pfVar10) * (local_28 - *pfVar10) +
                    (local_24 - pfVar10[1]) * (local_24 - pfVar10[1]) +
                    (local_20 - pfVar10[2]) * (local_20 - pfVar10[2]));
      if (*(int *)(ZombieDebugAvoid._28_4_ + 0x30) != 0) {
LAB_00a11c1e:
        if (((byte)param_1[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
        }
        NDebugOverlay::HorzArrow
                  ((Vector *)(param_1 + 0x2e0),(Vector *)pTVar12,10.0,0xff,0,0xff,0xff,true,0.1);
      }
LAB_00a11c7f:
      if ((fVar14 < 300.0) && (0.0 < fVar14)) {
        return;
      }
    }
LAB_00a11c98:
    if (*(int *)(param_1 + 0x1d34) != 0) {
      iVar6 = 0;
      local_34 = vec3_origin;
      local_30 = DAT_01053d4c;
      local_2c = DAT_01053d50;
      fVar14 = *(float *)(ZombieAvoidMinRange._28_4_ + 0x2c);
      fVar18 = *(float *)(ZombieAvoidMaxRange._28_4_ + 0x2c);
      if (0 < *(int *)(param_1 + 0x1d34)) {
        do {
          uVar2 = *(uint *)(*(int *)(param_1 + 0x1d28) + iVar6 * 4);
          if ((((uVar2 != 0xffffffff) &&
               (puVar11 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc
               )) && (*(uint *)(puVar11 + 8) == uVar2 >> 0xc)) &&
             (this = *(CBaseEntity **)(puVar11 + 4), this != (CBaseEntity *)0x0)) {
            pCVar9 = (CBaseEntity *)(**(code **)(*(int *)param_1 + 0x570))(param_1);
            if (((byte)pCVar9[0x14d] & 8) != 0) {
              CBaseEntity::CalcAbsolutePosition(pCVar9);
            }
            if (((byte)this[0x14d] & 8) != 0) {
              CBaseEntity::CalcAbsolutePosition(this);
            }
            fVar19 = *(float *)(this + 0x2e4) - *(float *)(pCVar9 + 0x2e4);
            fVar16 = *(float *)(this + 0x2e8) - *(float *)(pCVar9 + 0x2e8);
            fVar20 = *(float *)(this + 0x2e0) - *(float *)(pCVar9 + 0x2e0);
            fVar15 = fVar19 * fVar19 + fVar16 * fVar16 + fVar20 * fVar20;
            if (fVar15 < fVar18 * fVar18) {
              fVar15 = SQRT(fVar15) + 0.001;
              fVar21 = 1.0 / fVar15;
              if (fVar15 <= fVar14) {
                fVar15 = -1.0;
                fVar17 = 1.0;
              }
              else {
                fVar17 = (fVar18 - fVar15) * (1.0 / (fVar18 - fVar14));
                fVar15 = -fVar17;
              }
              if (*(int *)(ZombieDebugAvoid._28_4_ + 0x30) != 0) {
                if (((byte)this[0x14d] & 8) != 0) {
                  CBaseEntity::CalcAbsolutePosition(this);
                }
                pCVar9 = (CBaseEntity *)(**(code **)(*(int *)param_1 + 0x570))(param_1);
                if (((byte)pCVar9[0x14d] & 8) != 0) {
                  CBaseEntity::CalcAbsolutePosition(pCVar9);
                }
                NDebugOverlay::HorzArrow
                          ((Vector *)(pCVar9 + 0x2e0),(Vector *)(this + 0x2e0),fVar17 * 15.0,0xff,0,
                           0,0xff,true,0.1);
              }
              local_34 = fVar20 * fVar21 * fVar15 + local_34;
              local_30 = fVar19 * fVar21 * fVar15 + local_30;
              local_2c = fVar15 * fVar21 * fVar16 + local_2c;
            }
          }
          iVar6 = iVar6 + 1;
        } while (iVar6 < *(int *)(param_1 + 0x1d34));
      }
      if (1.0 < local_30 * local_30 + local_34 * local_34 + local_2c * local_2c) {
        VectorNormalize((Vector *)&local_34);
      }
      if (((local_34 != vec3_origin) || (local_30 != DAT_01053d4c)) || (local_2c != DAT_01053d50)) {
        fVar14 = *(float *)(ZombieAvoidPower._28_4_ + 0x2c);
        fVar18 = local_34 * fVar14;
        fVar15 = local_30 * fVar14;
        fVar14 = local_2c * fVar14;
        pcVar1 = *(code **)(*piVar4 + 0xb4);
        pfVar10 = (float *)(**(code **)(*piVar4 + 300))(piVar4);
        local_28 = fVar18 + *pfVar10;
        local_24 = fVar15 + pfVar10[1];
        local_20 = fVar14 + pfVar10[2];
        (*pcVar1)(piVar4,&local_28,0x3f800000);
      }
    }
  }
  return;
}

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)