L L4D2node

CTerrorWeapon::OnHit

0x0056e6e0 · 7971 bytes · __regparm3

_ZN13CTerrorWeapon5OnHitER10CGameTraceRK6Vectorb.part.111

Decompiled

undefined (3 params)

/* CTerrorWeapon::OnHit(CGameTrace&, Vector const&, bool) [clone .part.111] */

undefined4 __regparm3 CTerrorWeapon::OnHit(CGameTrace *param_1,Vector *param_2,bool param_3)

{
  float fVar1;
  code *pcVar2;
  uint uVar3;
  bool bVar4;
  char cVar5;
  CBaseEntity *this;
  int iVar6;
  int *piVar7;
  int *piVar8;
  CBaseEntity *pCVar9;
  undefined *puVar10;
  uint uVar11;
  int iVar12;
  CBaseEntity *pCVar13;
  undefined3 in_register_00000005;
  Vector *pVVar14;
  undefined *puVar15;
  bool bVar16;
  longdouble lVar17;
  longdouble lVar18;
  int local_d4;
  int local_cc;
  Vector *local_c8;
  CTerrorPlayer *local_c0;
  float local_b8;
  float local_b4;
  float local_b0;
  float local_ac;
  float local_a8;
  float local_a4;
  undefined4 local_a0;
  undefined4 local_9c;
  undefined4 local_98;
  float local_94;
  float local_90;
  float local_8c;
  float local_88;
  float local_84;
  float local_80;
  undefined4 local_7c;
  undefined4 local_78;
  undefined4 local_74;
  float local_40;
  uint local_34;
  
  pVVar14 = (Vector *)CONCAT31(in_register_00000005,param_3);
  pCVar13 = *(CBaseEntity **)(param_2 + 0x4c);
  if (pCVar13 == (CBaseEntity *)0x0) {
    return 0;
  }
  this = (CBaseEntity *)GetPlayerOwner((CTerrorWeapon *)param_1);
  if (this == (CBaseEntity *)0x0) {
    return 0;
  }
  cVar5 = (**(code **)(*(int *)pCVar13 + 0x16c))();
  if (cVar5 == '\0') {
    local_d4 = CDirectorChallengeMode::ScriptAllowBash
                         (*(CDirectorChallengeMode **)(TheDirector + 0x648),this,pCVar13);
    if (local_d4 == 2) {
      return 0;
    }
    local_c0 = (CTerrorPlayer *)0x0;
  }
  else {
    local_d4 = CDirectorChallengeMode::ScriptAllowBash
                         (*(CDirectorChallengeMode **)(TheDirector + 0x648),this,pCVar13);
    if (local_d4 == 2) {
      return 0;
    }
    iVar6 = CBaseEntity::GetTeamNumber(this);
    cVar5 = IsASurvivorTeam(iVar6);
    local_c0 = (CTerrorPlayer *)pCVar13;
    if (cVar5 != '\0') {
      iVar6 = CBaseEntity::GetTeamNumber(this);
      iVar12 = CBaseEntity::GetTeamNumber(pCVar13);
      if (iVar6 == iVar12) {
        uVar11 = *(uint *)(pCVar13 + 0x33c4);
        if ((((uVar11 == 0xffffffff) ||
             (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar15 == (undefined *)0xfffffffc)
             ) || (*(uint *)(puVar15 + 8) != uVar11 >> 0xc)) || (*(int *)(puVar15 + 4) == 0)) {
          uVar11 = *(uint *)(pCVar13 + 0x3e68);
          if ((((uVar11 != 0xffffffff) &&
               (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10,
               puVar15 != (undefined *)0xfffffffc)) &&
              ((*(uint *)(puVar15 + 8) == uVar11 >> 0xc &&
               (pCVar9 = *(CBaseEntity **)(puVar15 + 4), pCVar9 != (CBaseEntity *)0x0)))) ||
             (((uVar11 = *(uint *)(pCVar13 + 0x3e48), uVar11 != 0xffffffff &&
               (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10,
               puVar15 != (undefined *)0xfffffffc)) &&
              ((*(uint *)(puVar15 + 8) == uVar11 >> 0xc &&
               (pCVar9 = *(CBaseEntity **)(puVar15 + 4), pCVar9 != (CBaseEntity *)0x0)))))) {
            MarkAsHit((CTerrorWeapon *)param_1,pCVar9);
            *(CBaseEntity **)(param_2 + 0x4c) = pCVar9;
            (**(code **)(*(int *)param_1 + 0x6d8))();
            *(CBaseEntity **)(param_2 + 0x4c) = pCVar13;
          }
        }
        else {
          cVar5 = CTerrorGameRules::HasPlayerControlledZombies();
          if ((cVar5 == '\0') && (cVar5 = CTerrorGameRules::IsSurvivalMode(), cVar5 == '\0')) {
LAB_0056f28d:
            if (pCVar13[0x33dc] == (CBaseEntity)0x0) {
              piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
              if (piVar7 != (int *)0x0) {
                pcVar2 = *(code **)(*piVar7 + 0x30);
                (**(code **)(*engine + 0x40))();
                (*pcVar2)();
                pcVar2 = *(code **)(*piVar7 + 0x30);
                (**(code **)(*engine + 0x40))();
                (*pcVar2)();
                pcVar2 = *(code **)(*piVar7 + 0x30);
                (**(code **)(*engine + 0x40))();
                (*pcVar2)();
                iVar6 = *piVar7;
LAB_0056f160:
                (**(code **)(iVar6 + 0x30))();
                (**(code **)(*gameeventmanager + 0x20))();
              }
            }
            else {
LAB_0056f010:
              piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
              if (piVar7 != (int *)0x0) {
                pcVar2 = *(code **)(*piVar7 + 0x30);
                (**(code **)(*engine + 0x40))();
                (*pcVar2)();
                pcVar2 = *(code **)(*piVar7 + 0x30);
                (**(code **)(*engine + 0x40))();
                (*pcVar2)();
                pcVar2 = *(code **)(*piVar7 + 0x30);
                (**(code **)(*engine + 0x40))();
                (*pcVar2)();
                iVar6 = *piVar7;
                goto LAB_0056f160;
              }
            }
            puVar15 = g_pEntityList;
            local_cc = 0;
            uVar11 = *(uint *)(pCVar13 + 0x33c4);
            if (((uVar11 != 0xffffffff) &&
                (puVar10 = g_pEntityList + (uVar11 & 0xfff) * 0x10,
                puVar10 != (undefined *)0xfffffffc)) && (*(uint *)(puVar10 + 8) == uVar11 >> 0xc)) {
              local_cc = *(int *)(puVar10 + 4);
            }
            uVar3 = *(uint *)(local_cc + 0x30bc);
            if (((uVar3 != 0xffffffff) &&
                (puVar10 = g_pEntityList + (uVar3 & 0xfff) * 0x10,
                puVar10 != (undefined *)0xfffffffc)) &&
               ((*(uint *)(puVar10 + 8) == uVar3 >> 0xc &&
                ((*(int *)(puVar10 + 4) != 0 &&
                 (piVar7 = (int *)__dynamic_cast(), piVar7 != (int *)0x0)))))) {
              (**(code **)(*piVar7 + 0x394))();
              uVar11 = *(uint *)(pCVar13 + 0x33c4);
              puVar15 = g_pEntityList;
            }
            local_c0 = (CTerrorPlayer *)0x0;
            if (((uVar11 != 0xffffffff) &&
                (puVar15 = puVar15 + (uVar11 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc))
               && (*(uint *)(puVar15 + 8) == uVar11 >> 0xc)) {
              local_c0 = *(CTerrorPlayer **)(puVar15 + 4);
            }
            CTerrorPlayer::ReleaseTongueVictim(local_c0,false);
            local_c0 = (CTerrorPlayer *)pCVar13;
          }
          else {
            uVar11 = *(uint *)(pCVar13 + 0x33c4);
            if ((uVar11 != 0xffffffff) &&
               (((puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10,
                 puVar15 != (undefined *)0xfffffffc && (*(uint *)(puVar15 + 8) == uVar11 >> 0xc)) &&
                (*(int *)(puVar15 + 4) != 0)))) {
              if (pCVar13[0x33dc] != (CBaseEntity)0x0) goto LAB_0056f010;
              lVar17 = (longdouble)IntervalTimer::Now();
              if (1.0 < (float)lVar17 - *(float *)(pCVar13 + 0x33cc)) goto LAB_0056f28d;
            }
            if (pCVar13[0x33dc] != (CBaseEntity)0x0) goto LAB_0056f010;
          }
        }
      }
    }
  }
  if ((*(int *)(ZombieGunSurvivorFriendPush._28_4_ + 0x30) == 0) &&
     (iVar6 = CBaseEntity::GetTeamNumber(this), iVar6 == 2)) {
    iVar6 = CBaseEntity::GetTeamNumber(this);
    iVar12 = CBaseEntity::GetTeamNumber(pCVar13);
    if (iVar6 == iVar12) {
      return 0;
    }
  }
  if (local_c0 != (CTerrorPlayer *)0x0) {
    cVar5 = CTerrorPlayer::IsInvulnerable(local_c0);
    if (cVar5 != '\0') {
      return 0;
    }
    cVar5 = CTerrorPlayer::IsPerformingAction();
    if (cVar5 != '\0') {
      return 0;
    }
    uVar11 = *(uint *)(local_c0 + 0x2e28);
    if (((uVar11 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       ((*(uint *)(puVar15 + 8) == uVar11 >> 0xc && (*(int *)(puVar15 + 4) != 0)))) {
      return 0;
    }
  }
  cVar5 = CTerrorGameRules::HasPlayerControlledZombies();
  if (cVar5 != '\0') {
    iVar6 = CBaseEntity::GetTeamNumber(this);
    cVar5 = IsASurvivorTeam(iVar6);
    if ((((cVar5 != '\0') && (local_c0 != (CTerrorPlayer *)0x0)) &&
        (iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_c0), iVar6 == 3)) &&
       (iVar6 = (**(code **)(*(int *)local_c0 + 0x544))(), iVar6 == 3)) {
      if (local_c0[0x3e78] == (CTerrorPlayer)0x0) {
        pcVar2 = *(code **)(*(int *)this + 0x420);
        cosf(*(float *)(versus_shove_hunter_fov._28_4_ + 0x2c) * 0.008726646);
        (**(code **)(*(int *)local_c0 + 0x288))();
        cVar5 = (*pcVar2)();
      }
      else {
        cosf(*(float *)(versus_shove_hunter_fov_pouncing._28_4_ + 0x2c) * 0.008726646);
        cVar5 = (**(code **)(*(int *)this + 0x41c))();
      }
      if (cVar5 == '\0') {
        return 0;
      }
    }
  }
  bVar16 = local_d4 == 1;
  local_b0 = 0.1;
  if (0.1 <= *(float *)(pVVar14 + 8)) {
    local_b0 = *(float *)(pVVar14 + 8);
  }
  local_b4 = *(float *)(pVVar14 + 4);
  local_b8 = *(float *)pVVar14;
  VectorNormalize((Vector *)&local_b8);
  local_a4 = *(float *)(ZombieGunForce._28_4_ + 0x2c);
  local_ac = local_b8 * local_a4;
  local_a8 = local_b4 * local_a4;
  local_a4 = local_a4 * local_b0;
  if (local_c0 == (CTerrorPlayer *)0x0) {
    piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
    if (piVar7 != (int *)0x0) {
      (**(code **)(*piVar7 + 0x30))();
      pcVar2 = *(code **)(*piVar7 + 0x30);
      (**(code **)(*engine + 0x40))();
      (*pcVar2)();
      (**(code **)(*gameeventmanager + 0x20))();
    }
    local_a0 = *(undefined4 *)(param_2 + 0xc);
    local_9c = *(undefined4 *)(param_2 + 0x10);
    local_98 = *(undefined4 *)(param_2 + 0x14);
    piVar7 = (int *)__dynamic_cast();
    if (piVar7 != (int *)0x0) {
      iVar6 = (**(code **)(*(int *)pCVar13 + 0x14c))();
      if (iVar6 == 0) {
        (**(code **)(*piVar7 + 0x74))();
      }
      else {
        *(bool *)(iVar6 + 0x1d90) = bVar16;
        (**(code **)(*piVar7 + 0x74))();
        *(undefined1 *)(iVar6 + 0x1d90) = 0;
      }
      lVar17 = (longdouble)CountdownTimer::Now();
      if ((float)lVar17 < *(float *)(param_1 + 0x17d8)) {
        return 0;
      }
      pCVar13 = (CBaseEntity *)(**(code **)(*piVar7 + 0xb4))();
      iVar6 = CBaseEntity::GetGender(pCVar13);
      if (iVar6 == 0x10) {
        CBaseEntity::EmitSound(this,"Weapon.HitClown",0.0,(float *)0x0);
        piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
        if (piVar7 != (int *)0x0) {
          pcVar2 = *(code **)(*piVar7 + 0x30);
          (**(code **)(*engine + 0x40))();
          (*pcVar2)();
          (**(code **)(*gameeventmanager + 0x20))();
        }
      }
      else {
        CBaseEntity::EmitSound(this,"Weapon.HitInfected",0.0,(float *)0x0);
      }
      fVar1 = *(float *)(SurvivorMeleeHitSoundIntervalTimer._28_4_ + 0x2c);
      lVar17 = (longdouble)CountdownTimer::Now();
      if ((float)lVar17 + fVar1 != *(float *)(param_1 + 0x17d8)) {
        (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
        *(float *)(param_1 + 0x17d8) = (float)lVar17 + fVar1;
      }
      if (fVar1 == *(float *)(param_1 + 0x17d4)) {
        return 0;
      }
      (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
      *(float *)(param_1 + 0x17d4) = fVar1;
      return 0;
    }
    local_88 = local_ac * 3.0;
    local_84 = local_a8 * 3.0;
    local_80 = local_a4 * 3.0;
    CTakeDamageInfo::CTakeDamageInfo
              ((CTakeDamageInfo *)&local_7c,this,this,(Vector *)&local_88,(Vector *)&local_a0,
               *(float *)(ZombieGunDamage._28_4_ + 0x2c),0x80,0,(Vector *)0x0);
    (**(code **)(*(int *)this + 0x478))();
    CalculateMeleeDamageForce((CTakeDamageInfo *)&local_7c,pVVar14,(Vector *)&local_88,1.0);
    if (pCVar13 == g_WorldEntity) {
      lVar17 = (longdouble)CountdownTimer::Now();
      if ((float)lVar17 < *(float *)(param_1 + 0x17d8)) {
        return 0;
      }
      CBaseEntity::EmitSound(this,"Weapon.HitWorld",0.0,(float *)0x0);
      CountdownTimer::Start
                ((CountdownTimer *)(param_1 + 0x17d0),
                 *(float *)(SurvivorMeleeHitSoundIntervalTimer._28_4_ + 0x2c));
      return 0;
    }
    if ((400.0 < *(float *)(pCVar13 + 0x23c)) ||
       ((cVar5 = CTerrorGameRules::IsCurrentRoundActive(g_pGameRules), cVar5 == '\0' &&
        (cVar5 = CTerrorGameRules::IsSurvivalMode(), cVar5 != '\0')))) {
      local_34 = local_34 | 0x800;
      local_7c = 0;
      local_78 = 0;
      local_74 = 0;
      local_b8 = 0.0;
      local_b4 = 0.0;
      local_b0 = 0.0;
    }
    if (!bVar16) {
      ClearMultiDamage();
      CBaseEntity::DispatchTraceAttack
                ((CTakeDamageInfo *)pCVar13,(Vector *)&local_7c,(CGameTrace *)pVVar14);
      ApplyMultiDamage();
    }
    if (pCVar13[0x186] == (CBaseEntity)0x7) {
      return 0;
    }
    if (pCVar13[0x186] == (CBaseEntity)0x0) {
      return 0;
    }
    if (*(char **)(pCVar13 + 0x7c) == "func_*") {
      return 0;
    }
    cVar5 = CBaseEntity::ClassMatchesComplex(pCVar13,"func_*");
    if (cVar5 != '\0') {
      return 0;
    }
    if (*(char **)(pCVar13 + 0x7c) == "prop_door*") {
      return 0;
    }
    cVar5 = CBaseEntity::ClassMatchesComplex(pCVar13,"prop_door*");
    if (cVar5 != '\0') {
      return 0;
    }
    local_ac = *(float *)(ZombieGunPhysicsForce._28_4_ + 0x2c);
    local_a8 = local_b4 * local_ac;
    local_a4 = local_b0 * local_ac;
    local_ac = local_ac * local_b8;
    CBaseEntity::ApplyAbsVelocityImpulse(pCVar13,(Vector *)&local_ac);
    return 0;
  }
  iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_c0);
  if ((iVar6 == 3) &&
     (((iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_c0), iVar6 == 3 &&
       (iVar6 = (**(code **)(*(int *)local_c0 + 0x544))(), iVar6 == 8)) ||
      (((iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_c0), iVar6 == 3 &&
        (iVar6 = (**(code **)(*(int *)local_c0 + 0x544))(), iVar6 == 7)) ||
       (cVar5 = (**(code **)(*(int *)local_c0 + 0x900))(), cVar5 == '\0')))))) {
    local_ac = vec3_origin;
    bVar4 = false;
    local_a8 = DAT_01053d4c;
    local_a4 = DAT_01053d50;
  }
  else {
    bVar4 = true;
  }
  piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
  if (piVar7 != (int *)0x0) {
    pcVar2 = *(code **)(*piVar7 + 0x30);
    (**(code **)(*engine + 0x40))();
    (*pcVar2)();
    pcVar2 = *(code **)(*piVar7 + 0x30);
    (**(code **)(*engine + 0x40))();
    (*pcVar2)();
    (**(code **)(*gameeventmanager + 0x20))();
  }
  local_a0 = *(undefined4 *)(param_2 + 0xc);
  local_9c = *(undefined4 *)(param_2 + 0x10);
  local_98 = *(undefined4 *)(param_2 + 0x14);
  iVar6 = CTerrorPlayer::GetStaggerDir(local_c0);
  if (iVar6 == 0) {
    CBaseEntity::SetAbsVelocity(pCVar13,(Vector *)&vec3_origin);
  }
  local_94 = *(float *)pVVar14;
  local_90 = *(float *)(pVVar14 + 4);
  local_8c = *(float *)(pVVar14 + 8);
  iVar6 = CBaseEntity::GetTeamNumber(this);
  cVar5 = IsASurvivorTeam(iVar6);
  if (cVar5 != '\0') {
    iVar6 = CBaseEntity::GetTeamNumber(pCVar13);
    cVar5 = IsASurvivorTeam(iVar6);
    if (cVar5 != '\0') {
      CBasePlayer::EyeVectors((CBasePlayer *)this,(Vector *)&local_94,(Vector *)0x0,(Vector *)0x0);
      VectorNormalize((Vector *)&local_94);
      local_a4 = 0.1;
      if (0.1 <= local_8c) {
        local_a4 = local_8c;
      }
      local_ac = *(float *)(ZombieGunSurvivorForce._28_4_ + 0x2c);
      local_a4 = local_a4 * local_ac;
      local_a8 = local_90 * local_ac;
      local_ac = local_ac * local_94;
      lVar17 = (longdouble)CountdownTimer::Now();
      if (*(float *)(param_1 + 0x17d8) <= (float)lVar17) {
        CBaseEntity::EmitSound(this,"Weapon.HitSurvivor",0.0,(float *)0x0);
        fVar1 = *(float *)(SurvivorMeleeHitSoundIntervalTimer._28_4_ + 0x2c);
        lVar17 = (longdouble)CountdownTimer::Now();
        if ((float)lVar17 + fVar1 != *(float *)(param_1 + 0x17d8)) {
          (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
          *(float *)(param_1 + 0x17d8) = (float)lVar17 + fVar1;
        }
        if (fVar1 != *(float *)(param_1 + 0x17d4)) {
          (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
          *(float *)(param_1 + 0x17d4) = fVar1;
        }
      }
      goto LAB_0056ea64;
    }
  }
  iVar6 = CBaseEntity::GetTeamNumber(this);
  cVar5 = IsASurvivorTeam(iVar6);
  if (((cVar5 == '\0') || (iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_c0), iVar6 != 3))
     || (iVar6 = (**(code **)(*(int *)local_c0 + 0x544))(), iVar6 != 2)) {
    lVar17 = (longdouble)CountdownTimer::Now();
    if (*(float *)(param_1 + 0x17d8) <= (float)lVar17) {
      CBaseEntity::EmitSound(this,"Weapon.HitInfected",0.0,(float *)0x0);
      fVar1 = *(float *)(SurvivorMeleeHitSoundIntervalTimer._28_4_ + 0x2c);
      lVar17 = (longdouble)CountdownTimer::Now();
      if ((float)lVar17 + fVar1 != *(float *)(param_1 + 0x17d8)) {
        (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
        *(float *)(param_1 + 0x17d8) = (float)lVar17 + fVar1;
      }
      if (fVar1 != *(float *)(param_1 + 0x17d4)) {
        (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
        *(float *)(param_1 + 0x17d4) = fVar1;
      }
    }
  }
  else {
    CBasePlayer::EyeVectors((CBasePlayer *)this,(Vector *)&local_94,(Vector *)0x0,(Vector *)0x0);
    VectorNormalize((Vector *)&local_94);
    local_a4 = 0.1;
    if (0.1 <= local_8c) {
      local_a4 = local_8c;
    }
    local_ac = *(float *)(ZombieGunForce._28_4_ + 0x2c);
    local_a4 = local_a4 * local_ac;
    local_a8 = local_90 * local_ac;
    local_ac = local_ac * local_94;
    lVar17 = (longdouble)CountdownTimer::Now();
    if (*(float *)(param_1 + 0x17d8) <= (float)lVar17) {
      CBaseEntity::EmitSound(this,"Weapon.HitBoomer",0.0,(float *)0x0);
      fVar1 = *(float *)(SurvivorMeleeHitSoundIntervalTimer._28_4_ + 0x2c);
      lVar17 = (longdouble)CountdownTimer::Now();
      if ((float)lVar17 + fVar1 != *(float *)(param_1 + 0x17d8)) {
        (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
        *(float *)(param_1 + 0x17d8) = (float)lVar17 + fVar1;
      }
      if (fVar1 != *(float *)(param_1 + 0x17d4)) {
        (**(code **)(*(int *)(param_1 + 0x17d0) + 4))();
        *(float *)(param_1 + 0x17d4) = fVar1;
      }
    }
  }
LAB_0056ea64:
  local_c8 = (Vector *)&local_94;
  local_88 = local_ac * 3.0;
  local_84 = local_a8 * 3.0;
  local_80 = local_a4 * 3.0;
  CTakeDamageInfo::CTakeDamageInfo
            ((CTakeDamageInfo *)&local_7c,this,this,(Vector *)&local_88,(Vector *)&local_a0,0.0,0x80
             ,0,(Vector *)0x0);
  (**(code **)(*(int *)this + 0x478))();
  CalculateMeleeDamageForce((CTakeDamageInfo *)&local_7c,local_c8,(Vector *)&local_88,1.0);
  piVar7 = (int *)&stack0xfffffef0;
  if (bVar4) {
    iVar6 = CBaseEntity::GetTeamNumber(this);
    iVar12 = CBaseEntity::GetTeamNumber(pCVar13);
    piVar7 = (int *)&stack0xfffffef0;
    if (iVar6 != iVar12) {
      iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_c0);
      if ((((iVar6 == 3) && (iVar6 = (**(code **)(*(int *)local_c0 + 0x544))(), iVar6 == 3)) &&
          ((uVar11 = *(uint *)(local_c0 + 0x3e64), uVar11 != 0xffffffff &&
           ((puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc
            && (*(uint *)(puVar15 + 8) == uVar11 >> 0xc)))))) && (*(int *)(puVar15 + 4) != 0)) {
        piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
        if (piVar7 != (int *)0x0) {
          pcVar2 = *(code **)(*piVar7 + 0x30);
          (**(code **)(*engine + 0x40))();
          (*pcVar2)();
          pcVar2 = *(code **)(*piVar7 + 0x30);
          (**(code **)(*engine + 0x40))();
          (*pcVar2)();
          (**(code **)(*gameeventmanager + 0x20))();
        }
        piVar7 = (int *)&stack0xfffffef0;
        if (*(int *)(ZombieKnockOffDeath._28_4_ + 0x30) != 0) {
          local_40 = 500.0;
          (**(code **)(*(int *)this + 0x478))();
          piVar7 = (int *)&stack0xfffffeec;
          CalculateMeleeDamageForce((CTakeDamageInfo *)&local_7c,local_c8,(Vector *)&local_88,1.0);
        }
      }
      else {
        uVar11 = *(uint *)(local_c0 + 0x33c0);
        if ((((uVar11 != 0xffffffff) &&
             (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)
             ) && (*(uint *)(puVar15 + 8) == uVar11 >> 0xc)) &&
           ((*(int *)(puVar15 + 4) != 0 &&
            (piVar7 = (int *)(**(code **)(*gameeventmanager + 0x1c))(), piVar7 != (int *)0x0)))) {
          pcVar2 = *(code **)(*piVar7 + 0x30);
          (**(code **)(*engine + 0x40))();
          (*pcVar2)();
          pcVar2 = *(code **)(*piVar7 + 0x30);
          (**(code **)(*engine + 0x40))();
          (*pcVar2)();
          pcVar2 = *(code **)(*piVar7 + 0x30);
          (**(code **)(*engine + 0x40))();
          (*pcVar2)();
          (**(code **)(*piVar7 + 0x30))();
          (**(code **)(*gameeventmanager + 0x20))();
        }
        CTerrorPlayer::OnStunned(local_c0,*(float *)(ZombieGunStunDuration._28_4_ + 0x2c));
        piVar7 = (int *)&stack0xfffffef0;
      }
    }
  }
  if ((1.0 <= local_40) && (!bVar16)) {
    piVar7[-1] = 0x56eb56;
    ClearMultiDamage();
    piVar7[3] = (int)param_2;
    *piVar7 = (int)pCVar13;
    piVar7[2] = (int)local_c8;
    piVar7[1] = (int)&local_7c;
    piVar7[-1] = 0x56eb76;
    CBaseEntity::DispatchTraceAttack
              ((CTakeDamageInfo *)*piVar7,(Vector *)piVar7[1],(CGameTrace *)piVar7[2]);
    piVar7[-1] = 0x56eb7b;
    ApplyMultiDamage();
  }
  if (((((local_ac <= -0.01) || (0.01 <= local_ac)) || (local_a8 <= -0.01)) ||
      ((0.01 <= local_a8 || (local_a4 <= -0.01)))) || (0.01 <= local_a4)) {
    *piVar7 = (int)local_c0;
    piVar7[-1] = 0x56ecc6;
    iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)*piVar7);
    if (iVar6 == 3) {
      piVar7[1] = (int)this;
      piVar7[2] = (int)&local_ac;
      *piVar7 = (int)local_c0;
      piVar7[-1] = 0x5702f6;
      CTerrorPlayer::OnShovedBySurvivor
                ((CTerrorPlayer *)*piVar7,(CTerrorPlayer *)piVar7[1],(Vector *)piVar7[2]);
    }
    else {
      uVar11 = *(uint *)(local_c0 + 0x3e68);
      if ((((uVar11 == 0xffffffff) ||
           (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar15 == (undefined *)0xfffffffc))
          || ((*(uint *)(puVar15 + 8) != uVar11 >> 0xc || (*(int *)(puVar15 + 4) == 0)))) &&
         ((((uVar11 = *(uint *)(local_c0 + 0x3e48), uVar11 == 0xffffffff ||
            (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar15 == (undefined *)0xfffffffc))
           || (*(uint *)(puVar15 + 8) != uVar11 >> 0xc)) || (*(int *)(puVar15 + 4) == 0)))) {
        *piVar7 = (int)local_c0;
        piVar7[-1] = 0x56ed45;
        cVar5 = CTerrorPlayer::IsInvulnerable((CTerrorPlayer *)*piVar7);
        if (cVar5 == '\0') {
          *piVar7 = (int)local_c0;
          piVar7[-1] = 0x56ed5b;
          cVar5 = CTerrorPlayer::IsIncapacitatedRevivable((CTerrorPlayer *)*piVar7);
          if (cVar5 == '\0') {
            *piVar7 = (int)local_c0;
            piVar7[-1] = 0x56ed71;
            cVar5 = CTerrorPlayer::IsGettingUp((CTerrorPlayer *)*piVar7);
            if (cVar5 == '\0') {
              uVar11 = *(uint *)(local_c0 + 0x3ee0);
              if (((uVar11 == 0xffffffff) ||
                  (puVar15 = g_pEntityList + (uVar11 & 0xfff) * 0x10,
                  puVar15 == (undefined *)0xfffffffc)) ||
                 ((*(uint *)(puVar15 + 8) != uVar11 >> 0xc ||
                  (iVar6 = *(int *)(puVar15 + 4), iVar6 == 0)))) {
                piVar7[1] = *(int *)(SurvivorTeamHitPitchMax._28_4_ + 0x2c);
                *piVar7 = *(undefined4 *)(SurvivorTeamHitPitchMin._28_4_ + 0x2c);
                piVar7[-1] = 0x56edd3;
                lVar17 = (longdouble)RandomFloat();
                piVar7[1] = *(int *)(SurvivorTeamHitYawMax._28_4_ + 0x2c);
                *piVar7 = *(undefined4 *)(SurvivorTeamHitYawMin._28_4_ + 0x2c);
                piVar7[-1] = 0x56ee03;
                lVar18 = (longdouble)RandomFloat();
                local_84 = (float)lVar18;
                piVar7[1] = (int)&local_88;
                local_80 = 0.0;
                *piVar7 = (int)local_c0;
                piVar7[-1] = 0x56ee3b;
                local_88 = (float)lVar17;
                CBasePlayer::SetPunchAngle((CBasePlayer *)*piVar7,(QAngle *)piVar7[1]);
                pcVar2 = *(code **)(*(int *)local_c0 + 0x7fc);
                *piVar7 = (int)local_c0;
                piVar7[1] = (int)&local_7c;
                piVar7[-1] = 0x56ee5d;
                iVar6 = CTerrorPlayer::GetFlinchEvent
                                  ((CTerrorPlayer *)*piVar7,(CTakeDamageInfo *)piVar7[1]);
                piVar7[2] = 0;
                piVar7[1] = iVar6;
                *piVar7 = (int)local_c0;
                piVar7[-1] = 0x56ee74;
                (*pcVar2)();
                if (*(int *)(SurvivorShoveTeammates._28_4_ + 0x30) != 0) {
                  piVar7[1] = (int)&local_ac;
                  *piVar7 = (int)local_c0;
                  piVar7[-1] = 0x56ee9c;
                  CTerrorPlayer::SetShoveForce((CTerrorPlayer *)*piVar7,(Vector *)piVar7[1]);
                  piVar7[1] = (int)this;
                  *piVar7 = (int)local_c0;
                  piVar7[-1] = 0x56eea8;
                  CTerrorPlayer::SetResponsibleForAirMovement
                            ((CTerrorPlayer *)*piVar7,(CBaseCombatCharacter *)piVar7[1]);
                }
              }
              else {
                piVar7[1] = (int)this;
                piVar7[2] = (int)&local_ac;
                *piVar7 = iVar6;
                piVar7[-1] = 0x5704e1;
                CTerrorPlayer::OnShovedBySurvivor
                          ((CTerrorPlayer *)*piVar7,(CTerrorPlayer *)piVar7[1],(Vector *)piVar7[2]);
              }
            }
          }
        }
      }
    }
  }
  piVar7[3] = -2;
  piVar7[2] = (int)&INextBot::typeinfo;
  piVar7[1] = (int)&CBaseEntity::typeinfo;
  *piVar7 = (int)pCVar13;
  piVar7[-1] = 0x56ec00;
  piVar8 = (int *)__dynamic_cast();
  if (piVar8 != (int *)0x0) {
    iVar6 = *piVar8;
    piVar7[1] = (int)this;
    *piVar7 = (int)piVar8;
    pcVar2 = *(code **)(iVar6 + 0x74);
    piVar7[-1] = 0x56ec10;
    (*pcVar2)();
  }
  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)