L L4D2node

CTankRock::BounceTouch

0x004e0170 · 3986 bytes · __thiscall

_ZN9CTankRock11BounceTouchEP11CBaseEntity

Decompiled

undefined (2 params)

/* CTankRock::BounceTouch(CBaseEntity*) */

void __thiscall CTankRock::BounceTouch(CTankRock *this,CBaseEntity *param_1)

{
  code *pcVar1;
  CBaseEdict *this_00;
  char cVar2;
  undefined1 uVar3;
  CBaseEntity *pCVar4;
  undefined4 *puVar5;
  int *piVar6;
  int iVar7;
  Vector *pVVar8;
  int iVar9;
  Vector *pVVar10;
  uint uVar11;
  undefined *puVar12;
  CTakeDamageInfo *pCVar13;
  bool bVar14;
  longdouble lVar15;
  float fVar16;
  CTakeDamageInfo *pCVar17;
  char local_100;
  undefined4 *local_fc;
  Vector *local_f8;
  QAngle *local_f4;
  float local_ec;
  Vector *local_e8;
  CTakeDamageInfo *local_e4;
  Vector *local_e0;
  Vector local_dc [12];
  undefined4 local_d0;
  undefined4 local_cc;
  undefined4 local_c8;
  undefined4 local_c4;
  undefined4 local_c0;
  undefined4 local_bc;
  undefined4 local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  undefined4 local_ac;
  undefined1 local_a8;
  undefined1 local_a7;
  undefined2 local_a6;
  undefined4 local_a4;
  undefined4 local_a0;
  undefined2 local_9c;
  undefined1 local_9a;
  undefined1 local_99;
  undefined4 local_98;
  undefined4 local_94;
  undefined4 local_90;
  undefined4 local_8c;
  undefined2 local_88;
  undefined2 local_86;
  undefined4 local_84;
  undefined4 local_80;
  undefined4 local_7c;
  undefined4 local_78;
  undefined4 local_74;
  undefined4 local_70;
  int local_6c [23];
  
  if (((*(ushort *)(param_1 + 0x1b4) & 0x28) != 0) && ((*(ushort *)(param_1 + 0x1b4) & 4) != 0)) {
    return;
  }
  local_e4 = (CTakeDamageInfo *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
  if ((local_e4 == (CTakeDamageInfo *)0x0) ||
     (cVar2 = (**(code **)(*(int *)local_e4 + 0x16c))(local_e4), cVar2 == '\0')) {
    local_e4 = (CTakeDamageInfo *)0x0;
  }
  pCVar4 = (CBaseEntity *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
  if (param_1 == pCVar4) {
    return;
  }
  if (*(int *)(ZombieTankRockDebug._28_4_ + 0x30) != 0) {
    pVVar10 = (Vector *)(**(code **)(*(int *)(this + 0x194) + 8))(this + 0x194);
    pVVar8 = (Vector *)(**(code **)(*(int *)(this + 0x194) + 4))(this + 0x194);
    if (((byte)this[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
    }
    NDebugOverlay::Box((Vector *)(this + 0x2e0),pVVar8,pVVar10,0xff,0,0,0,10.0);
  }
  pCVar13 = (CTakeDamageInfo *)param_1;
  if ((*(char **)(param_1 + 0x7c) == "prop_minigun*") ||
     (cVar2 = CBaseEntity::ClassMatchesComplex(param_1,"prop_minigun*"), cVar2 != '\0')) {
    local_6c[0] = 0;
    local_6c[1] = 0;
    local_6c[2] = 0;
    local_6c[3] = 0;
    local_6c[4] = 0;
    local_7c = 2;
    local_78 = 2;
    local_74 = 3;
    local_70 = 9;
                    /* try { // try from 004e06e5 to 004e06e9 has its CatchHandler @ 004e114b */
    ForEachTerrorPlayer<PlayerCollector>((PlayerCollector *)&local_7c);
    if (0 < local_6c[3]) {
      iVar7 = 0;
      do {
        pCVar13 = *(CTakeDamageInfo **)(local_6c[0] + iVar7 * 4);
        uVar11 = *(uint *)(pCVar13 + 0x1d14);
        if ((((uVar11 != 0xffffffff) &&
             (puVar12 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc)
             ) && (*(uint *)(puVar12 + 8) == uVar11 >> 0xc)) &&
           (param_1 == *(CBaseEntity **)(puVar12 + 4))) break;
        iVar7 = iVar7 + 1;
        pCVar13 = (CTakeDamageInfo *)param_1;
      } while (iVar7 != local_6c[3]);
    }
    local_6c[3] = 0;
    CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)local_6c);
    local_6c[4] = local_6c[0];
    CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)local_6c);
  }
  if (pCVar13[0x105] == (CTakeDamageInfo)0x0) goto LAB_004e05dc;
  if (local_e4 == (CTakeDamageInfo *)0x0) {
    iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)this);
    if (iVar7 != 0) goto LAB_004e05dc;
    if (*(int *)(this + 0x1a8c) < 1) {
      lVar15 = (longdouble)CDirector::GetTankDamage(TheDirector,(CBaseEntity *)pCVar13);
      fVar16 = (float)lVar15;
    }
    else {
      fVar16 = (float)*(int *)(this + 0x1a8c);
    }
    cVar2 = (**(code **)(*(int *)pCVar13 + 0x16c))(pCVar13);
    if (cVar2 == '\0') {
LAB_004e0a99:
      bVar14 = false;
    }
    else {
      cVar2 = (**(code **)(*(int *)pCVar13 + 0x7e8))(pCVar13);
      if (cVar2 != '\0') goto LAB_004e05dc;
      iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
      if (iVar7 == 3) {
        fVar16 = 250.0;
        bVar14 = false;
        local_e4 = pCVar13;
      }
      else {
        iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
        local_e4 = pCVar13;
        if (iVar7 != 2) goto LAB_004e0a99;
        bVar14 = true;
      }
    }
    puVar5 = (undefined4 *)CBaseEntity::GetTouchTrace();
    local_d0 = *puVar5;
    local_cc = puVar5[1];
    local_c8 = puVar5[2];
    local_c4 = puVar5[3];
    local_c0 = puVar5[4];
    local_bc = puVar5[5];
    local_b8 = puVar5[6];
    local_b4 = puVar5[7];
    local_b0 = puVar5[8];
    local_ac = puVar5[9];
    local_a8 = *(undefined1 *)(puVar5 + 10);
    local_a7 = *(undefined1 *)((int)puVar5 + 0x29);
    local_a6 = *(undefined2 *)((int)puVar5 + 0x2a);
    local_a4 = puVar5[0xb];
    local_a0 = puVar5[0xc];
    local_9c = *(undefined2 *)(puVar5 + 0xd);
    local_9a = *(undefined1 *)((int)puVar5 + 0x36);
    local_99 = *(undefined1 *)((int)puVar5 + 0x37);
    local_98 = puVar5[0xe];
    local_90 = puVar5[0x10];
    local_94 = puVar5[0xf];
    local_8c = puVar5[0x11];
    local_88 = *(undefined2 *)(puVar5 + 0x12);
    local_86 = *(undefined2 *)((int)puVar5 + 0x4a);
    local_84 = puVar5[0x13];
    local_80 = puVar5[0x14];
    ClearMultiDamage();
    pVVar10 = local_dc;
    AngleVectors((QAngle *)(this + 0x3a8),pVVar10,(Vector *)0x0,(Vector *)0x0);
    pCVar4 = (CBaseEntity *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
    pCVar17 = (CTakeDamageInfo *)&local_7c;
    CTakeDamageInfo::CTakeDamageInfo(pCVar17,(CBaseEntity *)this,pCVar4,fVar16,0x40,0);
    uVar11 = *(uint *)(this + 0x14c);
    if ((uVar11 & 0x800) != 0) {
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
      uVar11 = *(uint *)(this + 0x14c);
    }
    if ((uVar11 & 0x1000) != 0) {
      CBaseEntity::CalcAbsoluteVelocity((CBaseEntity *)this);
    }
    local_e0 = (Vector *)(this + 0x2e0);
    CalculateMeleeDamageForce(pCVar17,(Vector *)(this + 0x274),local_e0,1.0);
    puVar5 = &local_d0;
    CBaseEntity::DispatchTraceAttack(pCVar13,(Vector *)pCVar17,(CGameTrace *)pVVar10);
    ApplyMultiDamage();
    if ((bVar14) &&
       (cVar2 = (**(code **)(*(int *)local_e4 + 0x7e8))(local_e4,pCVar17,pVVar10,puVar5),
       cVar2 == '\0')) {
      CTerrorPlayer::OnKnockedDown((CTerrorPlayer *)local_e4,2);
    }
    goto LAB_004e05dc;
  }
  lVar15 = (longdouble)CDirector::GetTankDamage(TheDirector,(CBaseEntity *)pCVar13);
  local_ec = (float)lVar15;
  cVar2 = (**(code **)(*(int *)pCVar13 + 0x16c))(pCVar13);
  if (cVar2 == '\0') {
    local_e4 = (CTakeDamageInfo *)0x0;
    bVar14 = false;
LAB_004e025b:
    local_100 = '\0';
  }
  else {
    iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
    cVar2 = IsASurvivorTeam(iVar7);
    if (cVar2 != '\0') {
      iVar7 = (**(code **)(*(int *)pCVar13 + 0x52c))(pCVar13);
      piVar6 = (int *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
      iVar9 = (**(code **)(*piVar6 + 0x52c))(piVar6);
      if (((iVar9 != 0) && (iVar7 != 0)) &&
         (((byte)(*(uint *)(iVar7 + 300) >> 0xb) & 1) != ((byte)(*(uint *)(iVar9 + 300) >> 0xb) & 1)
         )) {
        pVVar10 = (Vector *)(**(code **)(*(int *)this + 0x288))(this);
        iVar7 = CGlobalEntityList::FindEntityByClassnameWithin
                          ((CGlobalEntityList *)gEntList,(CBaseEntity *)0x0,"prop_door*",pVVar10,
                           40.0);
        if ((((iVar7 != 0) &&
             (piVar6 = (int *)__dynamic_cast(iVar7,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0
                                            ), piVar6 != (int *)0x0)) &&
            (cVar2 = (**(code **)(*piVar6 + 0x478))(piVar6), cVar2 != '\0')) && (piVar6[0x57d] == 0)
           ) {
          return;
        }
      }
      CTerrorPlayer::OnHitSurvivorWithTankRock
                ((CTerrorPlayer *)local_e4,*(undefined4 *)(pCVar13 + 0x2ba0));
    }
    cVar2 = (**(code **)(*(int *)pCVar13 + 0x7e8))(pCVar13);
    if (cVar2 != '\0') goto LAB_004e05dc;
    iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
    if (iVar7 == 3) {
      bVar14 = false;
      local_ec = 250.0;
    }
    else {
      iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
      cVar2 = IsASurvivorTeam(iVar7);
      bVar14 = cVar2 != '\0';
    }
    iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
    cVar2 = IsASurvivorTeam(iVar7);
    local_e4 = pCVar13;
    if (cVar2 == '\0') goto LAB_004e025b;
    uVar11 = *(uint *)(pCVar13 + 0x3e68);
    if (((uVar11 != 0xffffffff) &&
        (puVar12 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc)) &&
       ((*(uint *)(puVar12 + 8) == uVar11 >> 0xc &&
        (pCVar17 = *(CTakeDamageInfo **)(puVar12 + 4), pCVar17 != (CTakeDamageInfo *)0x0)))) {
      puVar5 = (undefined4 *)CBaseEntity::GetTouchTrace();
      local_d0 = *puVar5;
      local_cc = puVar5[1];
      local_c8 = puVar5[2];
      local_c4 = puVar5[3];
      local_c0 = puVar5[4];
      local_bc = puVar5[5];
      local_b8 = puVar5[6];
      local_b4 = puVar5[7];
      local_b0 = puVar5[8];
      local_ac = puVar5[9];
      local_a8 = *(undefined1 *)(puVar5 + 10);
      local_a7 = *(undefined1 *)((int)puVar5 + 0x29);
      local_a6 = *(undefined2 *)((int)puVar5 + 0x2a);
      local_a4 = puVar5[0xb];
      local_a0 = puVar5[0xc];
      local_9c = *(undefined2 *)(puVar5 + 0xd);
      local_9a = *(undefined1 *)((int)puVar5 + 0x36);
      local_99 = *(undefined1 *)((int)puVar5 + 0x37);
      local_98 = puVar5[0xe];
      local_94 = puVar5[0xf];
      local_90 = puVar5[0x10];
      local_8c = puVar5[0x11];
      local_88 = *(undefined2 *)(puVar5 + 0x12);
      local_86 = *(undefined2 *)((int)puVar5 + 0x4a);
      local_84 = puVar5[0x13];
      local_80 = puVar5[0x14];
      ClearMultiDamage();
      AngleVectors((QAngle *)(this + 0x3a8),local_dc,(Vector *)0x0,(Vector *)0x0);
      pCVar4 = (CBaseEntity *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
      CTakeDamageInfo::CTakeDamageInfo
                ((CTakeDamageInfo *)&local_7c,(CBaseEntity *)this,pCVar4,250.0,0x80,0);
      uVar11 = *(uint *)(this + 0x14c);
      if ((uVar11 & 0x800) != 0) {
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
        uVar11 = *(uint *)(this + 0x14c);
      }
      local_e8 = local_dc;
      if ((uVar11 & 0x1000) != 0) {
        CBaseEntity::CalcAbsoluteVelocity((CBaseEntity *)this);
      }
      CalculateMeleeDamageForce
                ((CTakeDamageInfo *)&local_7c,(Vector *)(this + 0x274),(Vector *)(this + 0x2e0),1.0)
      ;
      CBaseEntity::DispatchTraceAttack(pCVar17,(Vector *)&local_7c,(CGameTrace *)local_e8);
      ApplyMultiDamage();
    }
    uVar11 = *(uint *)(pCVar13 + 0x33c4);
    if (((uVar11 != 0xffffffff) &&
        (puVar12 = g_pEntityList + (uVar11 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc)) &&
       ((*(uint *)(puVar12 + 8) == uVar11 >> 0xc &&
        (*(CTerrorPlayer **)(puVar12 + 4) != (CTerrorPlayer *)0x0)))) {
      CTerrorPlayer::ReleaseTongueVictim(*(CTerrorPlayer **)(puVar12 + 4),false);
    }
    local_100 = (**(code **)(*(int *)pCVar13 + 0x7e8))(pCVar13);
  }
  local_f4 = (QAngle *)(this + 0x3a8);
  local_e0 = (Vector *)(this + 0x2e0);
  local_e8 = local_dc;
  local_f8 = (Vector *)(this + 0x274);
  local_fc = &local_d0;
  pCVar17 = (CTakeDamageInfo *)&local_7c;
  puVar5 = (undefined4 *)CBaseEntity::GetTouchTrace();
  local_d0 = *puVar5;
  local_cc = puVar5[1];
  local_c8 = puVar5[2];
  local_c4 = puVar5[3];
  local_c0 = puVar5[4];
  local_bc = puVar5[5];
  local_b8 = puVar5[6];
  local_b4 = puVar5[7];
  local_b0 = puVar5[8];
  local_ac = puVar5[9];
  local_a8 = *(undefined1 *)(puVar5 + 10);
  local_a7 = *(undefined1 *)((int)puVar5 + 0x29);
  local_a6 = *(undefined2 *)((int)puVar5 + 0x2a);
  local_a4 = puVar5[0xb];
  local_a0 = puVar5[0xc];
  local_9c = *(undefined2 *)(puVar5 + 0xd);
  local_9a = *(undefined1 *)((int)puVar5 + 0x36);
  local_99 = *(undefined1 *)((int)puVar5 + 0x37);
  local_98 = puVar5[0xe];
  local_90 = puVar5[0x10];
  local_94 = puVar5[0xf];
  local_8c = puVar5[0x11];
  local_88 = *(undefined2 *)(puVar5 + 0x12);
  local_86 = *(undefined2 *)((int)puVar5 + 0x4a);
  local_84 = puVar5[0x13];
  local_80 = puVar5[0x14];
  ClearMultiDamage();
  AngleVectors(local_f4,local_e8,(Vector *)0x0,(Vector *)0x0);
  pCVar4 = (CBaseEntity *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
  CTakeDamageInfo::CTakeDamageInfo(pCVar17,(CBaseEntity *)this,pCVar4,local_ec,0x80,0);
  uVar11 = *(uint *)(this + 0x14c);
  if ((uVar11 & 0x800) != 0) {
    CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
    uVar11 = *(uint *)(this + 0x14c);
  }
  if ((uVar11 & 0x1000) != 0) {
    CBaseEntity::CalcAbsoluteVelocity((CBaseEntity *)this);
  }
  CalculateMeleeDamageForce(pCVar17,local_f8,local_e0,1.0);
  CBaseEntity::DispatchTraceAttack(pCVar13,(Vector *)pCVar17,(CGameTrace *)local_e8);
  ApplyMultiDamage();
  if ((bVar14) &&
     (cVar2 = (**(code **)(*(int *)local_e4 + 0x7e8))(local_e4,pCVar17,local_e8,local_fc),
     cVar2 == '\0')) {
    CTerrorPlayer::OnKnockedDown((CTerrorPlayer *)local_e4,2);
  }
  piVar6 = (int *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
  if (((piVar6 != (int *)0x0) && (cVar2 = (**(code **)(*piVar6 + 0x16c))(piVar6), cVar2 != '\0')) &&
     (local_e4 != (CTakeDamageInfo *)0x0)) {
    cVar2 = (**(code **)(*piVar6 + 0x778))(piVar6);
    if (cVar2 != '\0') {
      pcVar1 = *(code **)(*piVar6 + 0x8fc);
      uVar3 = 0;
      if (local_100 == '\0') {
        uVar3 = (**(code **)(*(int *)local_e4 + 0x7e8))(local_e4);
      }
      (*pcVar1)(piVar6,local_e4,uVar3);
    }
    iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)local_e4);
    cVar2 = IsASurvivorTeam(iVar7);
    if (cVar2 != '\0') {
      if (piVar6[0xe9e] != 0) {
        if ((char)piVar6[0x1b] == '\0') {
          this_00 = (CBaseEdict *)piVar6[0xc];
          if (this_00 != (CBaseEdict *)0x0) {
            *(uint *)this_00 = *(uint *)this_00 | 0x101;
            iVar7 = CBaseEdict::GetChangeAccessor(this_00);
            *(undefined2 *)(iVar7 + 2) = 0;
          }
        }
        else {
          *(byte *)(piVar6 + 0x1c) = *(byte *)(piVar6 + 0x1c) | 1;
        }
        piVar6[0xe9e] = 0;
      }
      lVar15 = (longdouble)CountdownTimer::Now();
      if ((float)lVar15 + 2.0 != (float)piVar6[0xea1]) {
        (**(code **)(piVar6[0xe9f] + 4))(piVar6 + 0xe9f,piVar6 + 0xea1);
        piVar6[0xea1] = (int)((float)lVar15 + 2.0);
      }
      if ((float)piVar6[0xea0] != 2.0) {
        (**(code **)(piVar6[0xe9f] + 4))(piVar6 + 0xe9f,piVar6 + 0xea0);
        piVar6[0xea0] = 0x40000000;
      }
    }
  }
LAB_004e05dc:
  local_e0 = (Vector *)(this + 0x2e0);
  cVar2 = (**(code **)(*(int *)pCVar13 + 300))(pCVar13);
  iVar7 = CBaseEntity::GetTeamNumber((CBaseEntity *)pCVar13);
  if (((iVar7 != 3) ||
      (iVar7 = __dynamic_cast(pCVar13,&CBaseEntity::typeinfo,&INextBot::typeinfo,0xfffffffe),
      iVar7 == 0)) && (cVar2 != '\0')) {
    (**(code **)(*(int *)this + 0x56c))(this);
  }
  CBaseEntity::EmitSound((CBaseEntity *)this,"HulkZombie.ThrownProjectileHit",0.0,(float *)0x0);
  if (((byte)this[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
  }
  UTIL_ScreenShake(local_e0,0x42480000,0x43160000,0x3f800000,0x443b8000,0,0,0);
  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)