L L4D2node

InfectedAttack::IsUnderground

0x00a29a80 · 1535 bytes · __thiscall

_ZNK14InfectedAttack13IsUndergroundEP8Infected

Decompiled

undefined (2 params)

/* InfectedAttack::IsUnderground(Infected*) const */

undefined4 __thiscall InfectedAttack::IsUnderground(InfectedAttack *this,Infected *param_1)

{
  float fVar1;
  float fVar2;
  float fVar3;
  float fVar4;
  bool bVar5;
  int *piVar6;
  int *piVar7;
  float *pfVar8;
  int iVar9;
  undefined4 uVar10;
  longdouble lVar11;
  float fVar12;
  float fVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  undefined **local_dc [4];
  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;
  Vector local_70 [12];
  float local_64;
  float local_60;
  float local_5c;
  float local_44;
  byte local_3c;
  
  if (*(int *)(ZombiePreventBurrowing._28_4_ + 0x30) != 0) {
    piVar6 = (int *)(**(code **)(*(int *)param_1 + 0x594))(param_1);
    piVar7 = (int *)(**(code **)(*(int *)param_1 + 0x590))(param_1);
    if ((piVar7 != (int *)0x0) && (piVar6 != (int *)0x0)) {
      if (((byte)param_1[0x14d] & 8) != 0) {
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
      }
      fVar1 = *(float *)(param_1 + 0x2e0);
      fVar2 = *(float *)(param_1 + 0x2e4);
      fVar3 = *(float *)(param_1 + 0x2e8);
      CTraceFilterSimple::CTraceFilterSimple
                ((CTraceFilterSimple *)local_dc,(IHandleEntity *)0x0,8,
                 (_func_bool_IHandleEntity_ptr_int *)0x0);
      local_dc[0] = &PTR_ShouldHitEntity_00c54558;
      pfVar8 = (float *)(**(code **)(*piVar6 + 0x128))(piVar6);
      fVar19 = *pfVar8;
      fVar13 = pfVar8[1];
      fVar12 = pfVar8[2];
      pfVar8 = (float *)(**(code **)(*piVar6 + 300))(piVar6);
      fVar4 = *pfVar8;
      fVar15 = pfVar8[1];
      fVar17 = pfVar8[2];
      lVar11 = (longdouble)(**(code **)(*piVar7 + 0x130))(piVar7);
      local_bc = 0.0;
      local_b8 = 0.0;
      local_b4 = 500.0;
      local_87 = 1;
      local_8c = 0;
      fVar12 = (float)lVar11 + 0.1 + fVar12;
      fVar16 = (fVar4 - fVar19) * 0.5;
      fVar14 = (fVar15 - fVar13) * 0.5;
      if (fVar17 <= fVar12) {
        fVar17 = fVar12;
      }
      fVar18 = (fVar15 + fVar13) * 0.5;
      fVar15 = (fVar17 - fVar12) * 0.5;
      fVar13 = (fVar12 + fVar17) * 0.5;
      bVar5 = fVar14 * fVar14 + fVar16 * fVar16 + fVar15 * fVar15 < 1e-06;
      fVar19 = (fVar19 + fVar4) * 0.5;
      local_cc = fVar1 + fVar19;
      local_c8 = fVar2 + fVar18;
      local_c4 = fVar3 + fVar13;
      local_ac = -fVar19;
      local_a8 = -fVar18;
      local_a4 = -fVar13;
      local_9c = fVar16;
      local_98 = fVar14;
      local_94 = fVar15;
      local_88 = bVar5;
      (**(code **)(*enginetrace + 0x14))
                (enginetrace,&local_cc,0x2420b,(CTraceFilterSimple *)local_dc,local_70);
      if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
        DebugDrawLine(local_70,(Vector *)&local_64,0xff,0xff,0,true,-1.0);
      }
      if (0.0 < local_44) {
        local_8c = 0;
        local_c8 = fVar18 + local_60;
        local_c4 = fVar13 + local_5c;
        local_bc = fVar1 - local_64;
        local_b8 = fVar2 - local_60;
        local_b4 = fVar3 - local_5c;
        local_cc = fVar19 + local_64;
        local_87 = local_b4 * local_b4 + local_b8 * local_b8 + local_bc * local_bc != 0.0;
        local_ac = -fVar19;
        local_a8 = -fVar18;
        local_a4 = -fVar13;
        local_9c = fVar16;
        local_98 = fVar14;
        local_94 = fVar15;
        local_88 = bVar5;
        (**(code **)(*enginetrace + 0x14))
                  (enginetrace,&local_cc,0x2420b,(CTraceFilterSimple *)local_dc,local_70);
        if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
          DebugDrawLine(local_70,(Vector *)&local_64,0xff,0xff,0,true,-1.0);
        }
        if ((local_44 < 1.0) && ((local_3c & 1) != 0)) {
          iVar9 = (**(code **)(*(int *)param_1 + 0x52c))(param_1);
          if (iVar9 == 0) {
            uVar10 = 0xffffffff;
          }
          else {
            uVar10 = *(undefined4 *)(iVar9 + 0x8c);
          }
          Warning("Zombie tried to attack from under displacement in nav area %d, setpos %.1f %.1f %.1f\n"
                  ,uVar10,(double)local_64,(double)local_60,(double)local_5c);
          return 1;
        }
      }
    }
  }
  return 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)