CTerrorPlayer::UpdatePounce
0x009f88d0 · 4453 bytes · __thiscall
_ZN13CTerrorPlayer12UpdatePounceEv
Decompiled
undefined (1 param)
/* CTerrorPlayer::UpdatePounce() */
void __thiscall CTerrorPlayer::UpdatePounce(CTerrorPlayer *this)
{
CTerrorPlayer *pCVar1;
float fVar2;
float fVar3;
int *piVar4;
code *pcVar5;
char cVar6;
char cVar7;
int iVar8;
uint uVar9;
QAngle *pQVar10;
int iVar11;
undefined4 uVar12;
undefined *puVar13;
undefined *puVar14;
float *pfVar15;
float *pfVar16;
CBaseEntity *pCVar17;
longdouble lVar18;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float local_180;
float local_17c;
float local_178;
float local_174;
float local_170;
float local_16c;
float local_168;
float local_164;
float local_160;
float local_15c;
float local_158;
float local_154;
float local_150;
float local_14c;
float local_148;
float local_144;
float local_140;
float local_13c;
float local_138;
Vector local_130 [12];
float local_124;
float local_120;
float local_11c;
CBaseEntity *local_e4;
float local_dc;
float local_d8;
float local_d4;
float local_7c;
float local_78;
float local_74;
undefined4 local_70;
float local_6c;
float local_68;
float local_64;
float local_60;
float local_5c;
undefined4 local_58;
undefined4 local_54;
undefined4 local_50;
undefined4 local_4c;
int local_48;
undefined4 local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
undefined2 local_34;
undefined4 local_30;
undefined4 local_2c;
undefined4 local_28;
undefined1 local_24;
undefined1 local_23;
iVar8 = CBaseEntity::GetTeamNumber((CBaseEntity *)this);
cVar6 = IsASurvivorTeam(iVar8);
if (((cVar6 == '\0') || (*(float *)(this + 0x3ed8) <= 0.0)) ||
(*(float *)(gpGlobals + 0xc) <= *(float *)(this + 0x3ed8))) {
uVar9 = *(uint *)(this + 0x3e64);
pCVar17 = (CBaseEntity *)0x0;
puVar13 = g_pEntityList;
if (uVar9 != 0xffffffff) goto LAB_009f8af7;
}
else {
uVar9 = *(uint *)(this + 0x3ed4);
if (((((((uVar9 != 0xffffffff) &&
(puVar13 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar13 != (undefined *)0xfffffffc))
&& ((*(uint *)(puVar13 + 8) == uVar9 >> 0xc &&
((pCVar17 = *(CBaseEntity **)(puVar13 + 4), pCVar17 != (CBaseEntity *)0x0 &&
(iVar8 = CBaseEntity::GetTeamNumber(pCVar17), iVar8 == 3)))))) &&
(iVar8 = (**(code **)(*(int *)pCVar17 + 0x544))(), iVar8 == 3)) &&
(((cVar6 = (**(code **)(*(int *)pCVar17 + 300))(), cVar6 != '\0' &&
(cVar6 = (**(code **)(*(int *)pCVar17 + 0x558))(), cVar6 == '\0')) &&
(this[0x39f1] == (CTerrorPlayer)0x0)))) &&
(((uVar9 = *(uint *)(pCVar17 + 0x3e64), uVar9 == 0xffffffff ||
(puVar13 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar13 == (undefined *)0xfffffffc)) ||
((*(uint *)(puVar13 + 8) != uVar9 >> 0xc || (*(int *)(puVar13 + 4) == 0)))))) &&
(cVar6 = IsStaggering((CTerrorPlayer *)pCVar17), cVar6 == '\0')) {
OnShovedByLunge(this,(CTerrorPlayer *)pCVar17,false);
cVar6 = (**(code **)(*(int *)pCVar17 + 300))();
if ((cVar6 != '\0') && (cVar6 = IsStaggering((CTerrorPlayer *)pCVar17), cVar6 == '\0')) {
OnPouncedOnSurvivor((CTerrorPlayer *)pCVar17,this);
}
}
puVar13 = g_pEntityList;
uVar9 = *(uint *)(this + 0x3e64);
*(undefined4 *)(this + 0x3ed4) = 0xffffffff;
*(undefined4 *)(this + 0x3ed8) = 0;
if (uVar9 == 0xffffffff) {
pCVar17 = (CBaseEntity *)0x0;
}
else {
LAB_009f8af7:
pCVar17 = (CBaseEntity *)0x0;
puVar14 = puVar13 + (uVar9 & 0xfff) * 0x10;
if ((puVar14 != (undefined *)0xfffffffc) && (*(uint *)(puVar14 + 8) == uVar9 >> 0xc)) {
pCVar17 = *(CBaseEntity **)(puVar14 + 4);
}
}
}
uVar9 = *(uint *)(this + 0x3e68);
if ((((uVar9 != 0xffffffff) &&
(puVar13 = puVar13 + (uVar9 & 0xfff) * 0x10, puVar13 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar13 + 8) == uVar9 >> 0xc)) && (*(int *)(puVar13 + 4) != 0)) {
CBaseEntity::SetMoveType();
}
cVar6 = (**(code **)(*(int *)this + 300))();
if (((cVar6 == '\0') || (iVar8 = CBaseEntity::GetTeamNumber((CBaseEntity *)this), iVar8 != 3)) ||
(iVar8 = (**(code **)(*(int *)this + 0x544))(), iVar8 != 3)) {
pfVar15 = (float *)&stack0xfffffe44;
if (pCVar17 == (CBaseEntity *)0x0) goto LAB_009f9199;
}
else {
if (pCVar17 == (CBaseEntity *)0x0) {
pfVar15 = (float *)&stack0xfffffe44;
if (((((byte)this[0x1cb0] & 4) != 0) &&
(cVar6 = (**(code **)(*(int *)this + 0x558))(), pfVar15 = (float *)&stack0xfffffe44,
cVar6 == '\0')) &&
((uVar9 = *(uint *)(this + 0x3e64), uVar9 == 0xffffffff ||
(((puVar13 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar13 == (undefined *)0xfffffffc ||
(*(uint *)(puVar13 + 8) != uVar9 >> 0xc)) ||
(pfVar15 = (float *)&stack0xfffffe44, *(int *)(puVar13 + 4) == 0)))))) {
pfVar15 = (float *)&stack0xfffffe44;
if ((0.0 < *(float *)(this + 0x3120)) &&
(lVar18 = (longdouble)IntervalTimer::Now(), pfVar15 = (float *)&stack0xfffffe44,
(float)lVar18 - *(float *)(this + 0x3120) < 1.0)) {
fVar19 = *(float *)(ZombiePounceSilenceRange._28_4_ + 0x2c);
pQVar10 = (QAngle *)(**(code **)(*(int *)this + 0x238))();
AngleVectors(pQVar10,(Vector *)&local_164);
pfVar15 = (float *)&stack0xfffffe44;
if (0 < *(int *)(this + 0x3140)) {
iVar8 = 0;
pfVar16 = (float *)&stack0xfffffe44;
do {
uVar9 = *(uint *)(*(int *)(this + 0x3134) + iVar8 * 4);
pfVar15 = pfVar16;
if (((uVar9 != 0xffffffff) &&
(puVar13 = g_pEntityList + (uVar9 & 0xfff) * 0x10,
puVar13 != (undefined *)0xfffffffc)) &&
((*(uint *)(puVar13 + 8) == uVar9 >> 0xc &&
(piVar4 = *(int **)(puVar13 + 4), piVar4 != (int *)0x0)))) {
*pfVar16 = (float)piVar4;
pfVar16[-1] = 1.4654597e-38;
iVar11 = CBaseEntity::GetTeamNumber((CBaseEntity *)*pfVar16);
if (iVar11 == 2) {
iVar11 = *piVar4;
*pfVar16 = (float)piVar4;
pcVar5 = *(code **)(iVar11 + 300);
pfVar16[-1] = 1.465462e-38;
cVar6 = (*pcVar5)();
if (cVar6 != '\0') {
iVar11 = *(int *)this;
pfVar16[1] = (float)this;
*pfVar16 = (float)&local_14c;
pcVar5 = *(code **)(iVar11 + 0x234);
pfVar16[-1] = 1.4654655e-38;
(*pcVar5)();
local_13c = local_160 * 100.0 + local_148;
local_138 = local_15c * 100.0 + local_144;
local_140 = local_164 * 100.0 + local_14c;
iVar11 = *piVar4;
pfVar16[-1] = (float)piVar4;
pcVar5 = *(code **)(iVar11 + 0x288);
pfVar16[-2] = 1.4654809e-38;
uVar12 = (*pcVar5)();
pfVar16[3] = 0.0;
pfVar16[2] = (float)local_130;
pfVar16[1] = (float)&local_140;
*pfVar16 = (float)&local_14c;
pfVar16[-1] = (float)uVar12;
pfVar16[-2] = 1.4654882e-38;
CalcClosestPointOnLineSegment
((Vector *)pfVar16[-1],(Vector *)*pfVar16,(Vector *)pfVar16[1],
(Vector *)pfVar16[2],(float *)pfVar16[3]);
if ((*(byte *)((int)piVar4 + 0x14d) & 8) != 0) {
pfVar16[-1] = (float)piVar4;
pfVar16[-2] = 1.4654905e-38;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)pfVar16[-1]);
}
local_14c = (float)piVar4[0xb8];
local_148 = (float)piVar4[0xb9];
local_144 = (float)piVar4[0xba];
iVar11 = piVar4[0x65];
pfVar16[-1] = (float)(piVar4 + 0x65);
pcVar5 = *(code **)(iVar11 + 8);
pfVar16[-2] = 1.4655032e-38;
local_140 = local_14c;
local_13c = local_148;
local_138 = local_144;
iVar11 = (*pcVar5)();
fVar2 = *(float *)(iVar11 + 8);
pfVar16[3] = 0.0;
pfVar16[2] = (float)&local_158;
pfVar16[1] = (float)&local_140;
*pfVar16 = (float)&local_14c;
local_138 = local_138 + fVar2;
pfVar16[-1] = (float)local_130;
pfVar16[-2] = 1.4655134e-38;
CalcClosestPointOnLineSegment
((Vector *)pfVar16[-1],(Vector *)*pfVar16,(Vector *)pfVar16[1],
(Vector *)pfVar16[2],(float *)pfVar16[3]);
iVar11 = *(int *)this;
pfVar16[-1] = (float)&local_7c;
*pfVar16 = (float)this;
pcVar5 = *(code **)(iVar11 + 0x234);
pfVar16[-2] = 1.4655159e-38;
(*pcVar5)();
pfVar16[-2] = (float)&local_dc;
local_dc = local_158 - local_7c;
local_d8 = local_154 - local_78;
local_d4 = local_150 - local_74;
pfVar16[-3] = 1.4655271e-38;
lVar18 = (longdouble)VectorNormalize((Vector *)pfVar16[-2]);
pfVar15 = pfVar16 + -2;
if (((float)lVar18 <= fVar19) &&
(pfVar15 = pfVar16 + -2,
0.8 <= local_160 * local_d8 + local_164 * local_dc + local_15c * local_d4)) {
pfVar16[-2] = (float)(this + 0x3098);
pCVar1 = this + 0x3e90;
pfVar16[-3] = 1.4655442e-38;
lVar18 = (longdouble)CountdownTimer::Now();
if ((float)lVar18 < *(float *)(this + 0x30a0)) {
pfVar16[-2] = (float)pCVar1;
pfVar16[-3] = 1.465721e-38;
lVar18 = (longdouble)CountdownTimer::Now();
pfVar15 = pfVar16 + -2;
if ((float)lVar18 < *(float *)(this + 0x3e98)) break;
}
pfVar16[-1] = 4.5;
pfVar16[-2] = 3.0;
pfVar16[-3] = 1.4655508e-38;
lVar18 = (longdouble)RandomFloat();
pfVar16[-1] = (float)"HunterZombie.Warn";
pfVar16[-2] = (float)this;
pfVar16[1] = (float)lVar18;
*pfVar16 = (float)lVar18;
pfVar16[-3] = 1.4655567e-38;
Vocalize((CTerrorPlayer *)pfVar16[-2],(char *)pfVar16[-1],*pfVar16,pfVar16[1])
;
fVar19 = *(float *)(this + 0x30a0);
pfVar16[-2] = (float)(this + 0x3098);
pfVar16[-3] = 1.46556e-38;
lVar18 = (longdouble)CountdownTimer::Now();
pfVar16[-2] = (float)pCVar1;
fVar19 = fVar19 - (float)lVar18;
pfVar16[-3] = 1.465566e-38;
lVar18 = (longdouble)CountdownTimer::Now();
if ((float)lVar18 + fVar19 != *(float *)(this + 0x3e98)) {
iVar8 = *(int *)(this + 0x3e90);
pfVar16[-1] = (float)(this + 0x3e98);
pfVar16[-2] = (float)pCVar1;
pcVar5 = *(code **)(iVar8 + 4);
pfVar16[-3] = 1.4655762e-38;
(*pcVar5)();
*(float *)(this + 0x3e98) = (float)lVar18 + fVar19;
}
pfVar15 = pfVar16 + -2;
if (fVar19 != *(float *)(this + 0x3e94)) {
iVar8 = *(int *)(this + 0x3e90);
pfVar16[-2] = (float)pCVar1;
pfVar16[-1] = (float)(this + 0x3e94);
pcVar5 = *(code **)(iVar8 + 4);
pfVar16[-3] = 1.4655856e-38;
(*pcVar5)();
*(float *)(this + 0x3e94) = fVar19;
pfVar15 = pfVar16 + -2;
}
goto LAB_009f9199;
}
}
}
}
iVar8 = iVar8 + 1;
pfVar16 = pfVar15;
} while (iVar8 < *(int *)(this + 0x3140));
}
}
*pfVar15 = (float)(this + 0x3098);
pfVar15[-1] = 1.4655912e-38;
lVar18 = (longdouble)CountdownTimer::Now();
if (*(float *)(this + 0x30a0) <= (float)lVar18) {
pfVar15[1] = 3.5;
*pfVar15 = 2.0;
pfVar15[-1] = 1.4655977e-38;
lVar18 = (longdouble)RandomFloat();
pfVar15[1] = (float)"HunterZombie.Growl";
*pfVar15 = (float)this;
pfVar15[3] = (float)lVar18;
pfVar15[2] = (float)lVar18;
pfVar15[-1] = 1.4656036e-38;
Vocalize((CTerrorPlayer *)*pfVar15,(char *)pfVar15[1],pfVar15[2],pfVar15[3]);
}
}
LAB_009f9199:
if (this[0x3e79] == (CTerrorPlayer)0x0) {
return;
}
goto LAB_009f9072;
}
lVar18 = (longdouble)CountdownTimer::Now();
if (*(float *)(this + 0x30a0) <= (float)lVar18) {
if (this[0x3e79] == (CTerrorPlayer)0x0) {
lVar18 = (longdouble)RandomFloat();
Vocalize(this,"HunterZombie.Warn",(float)lVar18,0.0);
}
else {
Vocalize(this,"HunterZombie.Pounce.shred",0.0,0.0);
}
}
}
pfVar15 = (float *)&stack0xfffffe44;
if (this[0x186] != (CTerrorPlayer)0x8) {
if (((byte)pCVar17[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar17);
}
fVar19 = *(float *)(pCVar17 + 0x2e0);
fVar2 = *(float *)(pCVar17 + 0x2e4);
fVar3 = *(float *)(pCVar17 + 0x2e8);
if (((byte)this[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
}
local_178 = (*(float *)(this + 0x2e4) - fVar2) * 0.8 + fVar2;
local_174 = (*(float *)(this + 0x2e8) - fVar3) * 0.8 + fVar3;
local_17c = (*(float *)(this + 0x2e0) - fVar19) * 0.8 + fVar19;
CBaseEntity::SetAbsOrigin((CBaseEntity *)this,(Vector *)&local_17c);
CBaseEntity::SetAbsVelocity((CBaseEntity *)this,(Vector *)&vec3_origin);
OnKnockedDown();
lVar18 = (longdouble)CountdownTimer::Now();
if ((float)lVar18 < *(float *)(this + 0x3e74)) {
return;
}
(**(code **)(*(int *)pCVar17 + 0x234))();
(**(code **)(*(int *)this + 0x478))();
pfVar15 = (float *)&stack0xfffffe3c;
local_170 = local_dc - local_7c;
local_16c = local_d8 - local_78;
local_168 = local_d4 - local_74;
if (local_16c * local_16c + local_170 * local_170 <= 10000.0) {
fVar19 = *(float *)(ZombiePounceDamageInterval._28_4_ + 0x2c);
lVar18 = (longdouble)CountdownTimer::Now();
if ((float)lVar18 + fVar19 != *(float *)(this + 0x3e74)) {
(**(code **)(*(int *)(this + 0x3e6c) + 4))();
*(float *)(this + 0x3e74) = (float)lVar18 + fVar19;
}
if (fVar19 != *(float *)(this + 0x3e70)) {
(**(code **)(*(int *)(this + 0x3e6c) + 4))();
*(float *)(this + 0x3e70) = fVar19;
}
cVar6 = (**(code **)(*(int *)pCVar17 + 0x7e8))();
local_180 = *(float *)(ZombiePounceDamage._28_4_ + 0x2c);
iVar8 = GetDifficulty();
if (iVar8 == 2) {
local_180 = local_180 + local_180;
}
else if (iVar8 == 3) {
local_180 = local_180 * 3.0;
}
cVar7 = (**(code **)(*(int *)pCVar17 + 0x7e8))();
if (cVar7 != '\0') {
fVar19 = *(float *)(SurvivorIncapacitatedHealth._28_4_ + 0x2c);
iVar8 = (**(code **)(*(int *)pCVar17 + 0x1fc))();
local_180 = (fVar19 / (float)iVar8) * local_180;
}
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)&local_dc,(CBaseEntity *)this,(CBaseEntity *)this,local_180,0x80
,0);
(**(code **)(*(int *)this + 0x478))();
CalculateMeleeDamageForce
((CTakeDamageInfo *)&local_dc,(Vector *)&local_170,(Vector *)&local_7c,1.0);
CBaseEntity::TakeDamage(pCVar17,(CTakeDamageInfo *)&local_dc);
cVar7 = (**(code **)(*(int *)pCVar17 + 0x7e8))();
if (cVar6 != cVar7) {
lVar18 = (longdouble)CountdownTimer::Now();
if ((float)lVar18 + 2.0 != *(float *)(pCVar17 + 0x30a0)) {
(**(code **)(*(int *)(pCVar17 + 0x3098) + 4))();
*(float *)(pCVar17 + 0x30a0) = (float)lVar18 + 2.0;
}
if (*(float *)(pCVar17 + 0x309c) != 2.0) {
(**(code **)(*(int *)(pCVar17 + 0x3098) + 4))();
*(undefined4 *)(pCVar17 + 0x309c) = 0x40000000;
}
}
CBasePlayer::EyeVectors((CBasePlayer *)this,(Vector *)&local_164,(Vector *)0x0,(Vector *)0x0);
VectorNormalize((Vector *)&local_164);
fVar21 = local_164 * 80.0;
fVar20 = local_160 * 80.0;
fVar22 = local_15c - 0.2;
local_15c = fVar22;
(**(code **)(*(int *)this + 0x234))();
fVar3 = local_144;
fVar2 = local_148;
fVar19 = local_14c;
(**(code **)(*(int *)this + 0x234))();
pfVar15 = (float *)&stack0xfffffe30;
local_7c = local_158;
local_78 = local_154;
local_6c = (fVar21 - local_158) + fVar19;
local_74 = local_150;
local_68 = (fVar20 - local_154) + fVar2;
local_3c = 0;
local_64 = (fVar3 - local_150) + fVar22 * 80.0;
local_44 = 0;
local_48 = 0;
local_4c = 0;
local_54 = 0;
local_58 = 0;
local_5c = 0.0;
local_38._0_2_ =
CONCAT11(local_68 * local_68 + local_6c * local_6c + local_64 * local_64 != 0.0,1);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_140,(IHandleEntity *)this,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_130,(Vector *)&local_124,0xff,0,0,true,-1.0);
}
iVar8 = IPredictionSystem::g_pPredictionSystems;
if (local_e4 == pCVar17) {
for (; iVar8 != 0; iVar8 = *(int *)(iVar8 + 4)) {
*(int *)(iVar8 + 0x10) = *(int *)(iVar8 + 0x10) + 1;
}
/* try { // try from 009f9760 to 009f9889 has its CatchHandler @ 009f9a87 */
iVar8 = (**(code **)(*(int *)local_e4 + 0x138))();
UTIL_BloodDecalTrace((CGameTrace *)local_130,iVar8);
local_24 = 0;
local_34 = 0;
local_7c = local_124;
local_70 = 0;
local_78 = local_120;
local_23 = 0;
local_74 = local_11c;
local_60 = -local_160;
local_5c = -local_15c;
local_6c = 0.0;
local_64 = -local_164;
local_68 = 0.0;
local_58 = 0;
local_54 = 0;
local_50 = 0;
local_4c = 0;
local_44 = 0x3f800000;
local_38 = 0;
local_3c = 0;
local_30 = 0;
local_2c = 0;
local_28 = 0;
if ((local_e4 == (CBaseEntity *)0x0) || (*(int *)(local_e4 + 0x30) == 0)) {
local_48 = 0;
}
else {
local_48 = *(int *)(local_e4 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
}
local_40 = 0x41a00000;
DispatchEffect("csblood",(CEffectData *)&local_7c);
for (iVar8 = IPredictionSystem::g_pPredictionSystems; iVar8 != 0;
iVar8 = *(int *)(iVar8 + 4)) {
*(int *)(iVar8 + 0x10) = *(int *)(iVar8 + 0x10) + -1;
}
}
BloodyHands_Increment(this);
(**(code **)(*(int *)this + 0x8f0))();
(**(code **)(*(int *)pCVar17 + 0x8f0))();
cVar6 = (**(code **)(*(int *)pCVar17 + 300))();
if ((cVar6 != '\0') && (pCVar17[0x39f1] == (CBaseEntity)0x0)) {
return;
}
BloodyHands_SetToMax(this);
}
}
LAB_009f9072:
*pfVar15 = (float)this;
pfVar15[-1] = 1.4653672e-38;
OnPounceEnded((CTerrorPlayer *)*pfVar15);
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.