L L4D2node

CVomit::FindVomitTarget

0x004e4560 · 1202 bytes · __thiscall

_ZNK6CVomit15FindVomitTargetEv

Decompiled

undefined (1 param)

/* CVomit::FindVomitTarget() const */

CBaseEntity * __thiscall CVomit::FindVomitTarget(CVomit *this)

{
  float fVar1;
  uint uVar2;
  CBasePlayer *this_00;
  code *pcVar3;
  int *piVar4;
  char cVar5;
  int iVar6;
  undefined *puVar7;
  CBaseEntity *pCVar8;
  undefined4 *puVar9;
  float fVar10;
  float local_174;
  float local_170;
  float local_16c;
  float local_168;
  float local_164;
  float local_160;
  CTraceFilterSimple local_15c [16];
  float local_14c;
  float local_148;
  float local_144;
  CTraceFilterSimple local_13c [16];
  float local_12c;
  float local_128;
  float local_124;
  float local_11c;
  float local_118;
  float local_114;
  undefined4 local_10c;
  undefined4 local_108;
  undefined4 local_104;
  undefined4 local_fc;
  undefined4 local_f8;
  undefined4 local_f4;
  undefined4 local_ec;
  undefined1 local_e8;
  undefined1 local_e7;
  Vector local_d0 [12];
  Vector local_c4 [64];
  CBaseEntity *local_84;
  float local_7c;
  float local_78;
  float local_74;
  Vector local_70 [4];
  float local_6c;
  float local_68;
  float local_64;
  undefined4 local_5c;
  undefined4 local_58;
  undefined4 local_54;
  float local_50;
  undefined4 local_4c;
  undefined4 local_48;
  undefined4 local_44;
  undefined4 local_3c;
  undefined1 local_38;
  undefined1 local_37;
  CBaseEntity *local_30;
  
  uVar2 = *(uint *)(this + 0x44c);
  if ((((uVar2 == 0xffffffff) ||
       (puVar7 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar7 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar7 + 8) != uVar2 >> 0xc)) ||
     (this_00 = *(CBasePlayer **)(puVar7 + 4), this_00 == (CBasePlayer *)0x0)) {
    return (CBaseEntity *)0x0;
  }
  fVar1 = *(float *)(ZombieVomitRange._28_4_ + 0x2c);
  fVar10 = fVar1 + 40.0;
  (**(code **)(*(int *)this_00 + 0x234))();
  CBasePlayer::EyeVectors(this_00,(Vector *)&local_168,(Vector *)0x0,(Vector *)0x0);
  piVar4 = mdlcache;
  (**(code **)(*mdlcache + 0x68))();
  local_6c = local_168 * fVar1;
  local_68 = local_164 * fVar1;
  local_64 = fVar1 * local_160;
  local_44 = 0;
  local_48 = 0;
  local_4c = 0;
  local_3c = 0;
  local_38 = 1;
  local_54 = 0;
  local_58 = 0;
  local_5c = 0;
  local_37 = local_68 * local_68 + local_6c * local_6c + local_64 * local_64 != 0.0;
  local_7c = local_174;
  local_78 = local_170;
  local_74 = local_16c;
                    /* try { // try from 004e46f2 to 004e49e0 has its CatchHandler @ 004e4a24 */
  CTraceFilterSimple::CTraceFilterSimple
            ((CTraceFilterSimple *)&local_14c,(IHandleEntity *)this_00,0,
             (_func_bool_IHandleEntity_ptr_int *)0x0);
  (**(code **)(*enginetrace + 0x14))();
  if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
    DebugDrawLine(local_d0,local_c4,0xff,0,0,true,-1.0);
  }
  CTraceFilterSimple::CTraceFilterSimple
            (local_15c,(IHandleEntity *)this_00,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
  local_78 = local_164 * fVar10 + local_170;
  local_74 = local_160 * fVar10 + local_16c;
  local_7c = fVar10 * local_168 + local_174;
  UTIL_ClipTraceToPlayers
            ((Vector *)&local_174,(Vector *)&local_7c,0x46004003,(ITraceFilter *)local_15c,
             (CGameTrace *)local_d0);
  if (((local_84 != (CBaseEntity *)0x0) &&
      (cVar5 = (**(code **)(*(int *)local_84 + 0x16c))(), cVar5 != '\0')) &&
     ((local_84 != (CBaseEntity *)0x0 &&
      (cVar5 = (**(code **)(*(int *)local_84 + 0x16c))(), cVar5 != '\0')))) {
    iVar6 = CBaseEntity::GetTeamNumber(local_84);
    cVar5 = IsASurvivorTeam(iVar6);
    if (cVar5 != '\0') {
      (**(code **)(*(int *)local_84 + 0x234))();
      local_11c = local_14c - local_174;
      local_114 = local_144 - local_16c;
      local_f4 = 0;
      local_f8 = 0;
      local_118 = local_148 - local_170;
      local_fc = 0;
      local_ec = 0;
      local_e8 = 1;
      local_104 = 0;
      local_108 = 0;
      local_12c = local_174;
      local_10c = 0;
      local_128 = local_170;
      local_e7 = local_11c * local_11c + local_114 * local_114 + local_118 * local_118 != 0.0;
      local_124 = local_16c;
      CTraceFilterSimple::CTraceFilterSimple
                (local_13c,(IHandleEntity *)this_00,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
      (**(code **)(*enginetrace + 0x14))();
      if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
        DebugDrawLine((Vector *)&local_7c,local_70,0xff,0,0,true,-1.0);
      }
      pCVar8 = local_84;
      puVar9 = (undefined4 *)&stack0xfffffe4c;
      if ((local_50 != 1.0) && (puVar9 = (undefined4 *)&stack0xfffffe4c, local_84 != local_30)) {
        pCVar8 = (CBaseEntity *)0x0;
        puVar9 = (undefined4 *)&stack0xfffffe4c;
      }
      goto LAB_004e4a00;
    }
  }
  pCVar8 = (CBaseEntity *)0x0;
  puVar9 = (undefined4 *)&stack0xfffffe50;
LAB_004e4a00:
  iVar6 = *piVar4;
  *puVar9 = piVar4;
  pcVar3 = *(code **)(iVar6 + 0x6c);
  puVar9[-1] = 0x4e4a08;
  (*pcVar3)();
  return pCVar8;
}

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)