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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.