TankAttack::Update
0x00ae1fc0 · 5712 bytes · __thiscall
_ZN10TankAttack6UpdateEP4Tankf
Decompiled
undefined (3 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* TankAttack::Update(Tank*, float) */
TankAttack * __thiscall TankAttack::Update(TankAttack *this,Tank *param_1,float param_2)
{
Tank *pTVar1;
float fVar2;
code *pcVar3;
bool bVar4;
char cVar5;
Tank TVar6;
int *piVar7;
int *piVar8;
uint *puVar9;
CBaseEntity *pCVar10;
int iVar11;
int iVar12;
float *pfVar13;
undefined **ppuVar14;
uint uVar15;
Vector *pVVar16;
uint uVar17;
undefined *puVar18;
float *pfVar19;
CTerrorPlayer *pCVar20;
longdouble lVar21;
float fVar22;
float fVar23;
float *local_a8;
float local_a4;
float local_9c;
float local_98;
float local_94;
float local_90;
float local_8c;
float local_88;
float local_84;
float local_80;
undefined **local_7c;
float local_78;
CBaseEntity *local_74;
undefined4 local_70;
undefined4 local_6c;
undefined4 local_68;
piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9b4))();
if (*(int *)(TankStuckFailsafe._28_4_ + 0x30) != 0) {
CMultiPlayerAnimState::GetMainActivity(*(CMultiPlayerAnimState **)((int)param_2 + 0x2910));
cVar5 = CTerrorPlayer::IsMotionControlledXY();
if (cVar5 == '\0') {
CMultiPlayerAnimState::GetMainActivity(*(CMultiPlayerAnimState **)((int)param_2 + 0x2910));
cVar5 = CTerrorPlayer::IsMotionControlledZ();
if (cVar5 != '\0') goto LAB_00ae2015;
}
else {
LAB_00ae2015:
piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
(**(code **)(*piVar8 + 0x170))();
if (*(float *)(param_1 + 0x486c) != -1.0) {
(**(code **)(*(int *)(param_1 + 0x4868) + 4))();
*(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
}
}
cVar5 = (**(code **)(*(int *)param_2 + 0xa0))();
if (cVar5 == '\0') {
LAB_00ae2066:
bVar4 = false;
}
else {
piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
(**(code **)(*piVar8 + 0x170))();
if (*(float *)(param_1 + 0x486c) != -1.0) {
(**(code **)(*(int *)(param_1 + 0x4868) + 4))();
*(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
}
if (*(float *)(param_1 + 0x4874) <= 0.0) {
lVar21 = (longdouble)IntervalTimer::Now();
if ((float)lVar21 != *(float *)(param_1 + 0x4874)) {
(**(code **)(*(int *)(param_1 + 0x4870) + 4))();
*(float *)(param_1 + 0x4874) = (float)lVar21;
}
goto LAB_00ae2066;
}
lVar21 = (longdouble)IntervalTimer::Now();
fVar23 = (float)lVar21 - *(float *)(param_1 + 0x4874);
if (fVar23 < *(float *)(TankStasisTimeSuicide._28_4_ + 0x2c) ||
fVar23 == *(float *)(TankStasisTimeSuicide._28_4_ + 0x2c)) goto LAB_00ae2066;
if (*(float *)(param_1 + 0x4874) == -1.0) {
bVar4 = true;
}
else {
bVar4 = true;
(**(code **)(*(int *)(param_1 + 0x4870) + 4))();
*(undefined4 *)(param_1 + 0x4874) = 0xbf800000;
}
}
piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9bc))();
lVar21 = (longdouble)(**(code **)(*piVar8 + 0xb8))();
fVar23 = (float)lVar21;
if (*(float *)(param_1 + 0x486c) <= 0.0) {
LAB_00ae2186:
if (fVar23 != 3.4028235e+38) goto LAB_00ae219b;
}
else {
lVar21 = (longdouble)IntervalTimer::Now();
fVar2 = *(float *)(param_1 + 0x486c);
if ((*(float *)(TankStuckTimeChooseNewTarget._28_4_ + 0x2c) <= (float)lVar21 - fVar2 &&
(float)lVar21 - fVar2 != *(float *)(TankStuckTimeChooseNewTarget._28_4_ + 0x2c)) &&
(fVar23 < *(float *)(TankStuckVisibilityToleranceChooseNewTarget._28_4_ + 0x2c))) {
if (fVar2 != -1.0) {
(**(code **)(*(int *)(param_1 + 0x4868) + 4))();
*(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
}
if (*(float *)(param_1 + 0x482c) != -1.0) {
(**(code **)(*(int *)(param_1 + 0x4824) + 4))();
*(undefined4 *)(param_1 + 0x482c) = 0xbf800000;
}
if (*(float *)(param_1 + 0x4838) != -1.0) {
(**(code **)(*(int *)(param_1 + 0x4830) + 4))();
*(undefined4 *)(param_1 + 0x4838) = 0xbf800000;
}
PathFollower::Invalidate((PathFollower *)(param_1 + 0x38));
*(undefined4 *)(param_1 + 0x34) = 0xffffffff;
goto LAB_00ae2186;
}
fVar22 = 99999.9;
if (0.0 < fVar2) {
lVar21 = (longdouble)IntervalTimer::Now();
fVar22 = (float)lVar21 - *(float *)(param_1 + 0x486c);
}
if (fVar22 < *(float *)(TankStuckTimeTimeSuicide._28_4_ + 0x2c) ||
fVar22 == *(float *)(TankStuckTimeTimeSuicide._28_4_ + 0x2c)) goto LAB_00ae2186;
if (fVar23 == 3.4028235e+38) goto LAB_00ae21b2;
if (*(float *)(TankStuckVisibilityToleranceSuicide._28_4_ + 0x2c) <= fVar23 &&
fVar23 != *(float *)(TankStuckVisibilityToleranceSuicide._28_4_ + 0x2c)) {
bVar4 = true;
}
LAB_00ae219b:
if (*(float *)(TankVisibilityToleranceSuicide._28_4_ + 0x2c) <= fVar23 &&
fVar23 != *(float *)(TankVisibilityToleranceSuicide._28_4_ + 0x2c)) goto LAB_00ae21b2;
}
if (bVar4) {
LAB_00ae21b2:
Tank::LeaveStasis((Tank *)param_2);
if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
}
Msg();
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)&local_7c,(CBaseEntity *)param_2,(CBaseEntity *)param_2,
(float)*(int *)((int)param_2 + 0x100),2,0);
CBaseEntity::TakeDamage((CBaseEntity *)param_2,(CTakeDamageInfo *)&local_7c);
if (*(float *)(param_1 + 0x486c) != -1.0) {
(**(code **)(*(int *)(param_1 + 0x4868) + 4))();
*(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
}
*(undefined4 *)this = 3;
*(undefined4 *)(this + 4) = 0;
*(char **)(this + 8) = "Killing self";
return this;
}
}
cVar5 = (**(code **)(*(int *)param_2 + 0xa0))();
if (cVar5 != '\0') goto LAB_00ae22c9;
piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
cVar5 = (**(code **)(*piVar8 + 0x114))();
uVar15 = *(uint *)(param_1 + 0x34);
if (cVar5 == '\0') {
if ((uVar15 != 0xffffffff) &&
(piVar8 = (int *)(g_pEntityList + (uVar15 & 0xfff) * 0x10 + 4), piVar8 != (int *)0x0)) {
LAB_00ae2343:
if ((piVar8[1] == uVar15 >> 0xc) && (*piVar8 != 0)) {
iVar11 = (**(code **)(*(int *)param_2 + 0x9a0))();
iVar11 = CMultiPlayerAnimState::GetMainActivity
(*(CMultiPlayerAnimState **)(iVar11 + 0x2910));
if (iVar11 != 0x31a) {
iVar11 = (**(code **)(*(int *)param_2 + 0x9a0))();
iVar11 = CMultiPlayerAnimState::GetMainActivity
(*(CMultiPlayerAnimState **)(iVar11 + 0x2910));
if (iVar11 != 0x31b) goto LAB_00ae2351;
}
pCVar10 = (CBaseEntity *)0x0;
pfVar13 = (float *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xd4))();
uVar15 = *(uint *)(param_1 + 0x34);
if (((uVar15 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
pCVar10 = *(CBaseEntity **)(puVar18 + 4);
}
if (((byte)pCVar10[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar10);
}
local_88 = *(float *)(pCVar10 + 0x2e0) - *pfVar13;
local_84 = *(float *)(pCVar10 + 0x2e4) - pfVar13[1];
local_80 = *(float *)(pCVar10 + 0x2e8) - pfVar13[2];
VectorAngles((Vector *)&local_88,(QAngle *)&local_7c);
pCVar10 = (CBaseEntity *)(**(code **)(*(int *)param_2 + 0x9a0))();
CBaseEntity::SetAbsAngles(pCVar10,(QAngle *)&local_7c);
}
}
}
else if (uVar15 != 0xffffffff) {
uVar17 = uVar15 & 0xfff;
piVar8 = (int *)(g_pEntityList + uVar17 * 0x10 + 4);
if (piVar8 != (int *)0x0) {
if (((*(uint *)(g_pEntityList + uVar17 * 0x10 + 8) != uVar15 >> 0xc) ||
(*(int *)(g_pEntityList + uVar17 * 0x10 + 4) == 0)) || (*(int *)(param_1 + 0x443c) < 1))
goto LAB_00ae2343;
fVar23 = (float)((int)param_2 + 0x4028);
local_7c = &PTR_operator___00d20e60;
local_78 = fVar23;
local_70 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
pCVar10 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
iVar11 = (**(code **)(*(int *)pCVar10 + 0x14c))();
local_6c = 0x3f800000;
if (iVar11 != 0) {
local_6c = *(undefined4 *)(iVar11 + 0x1cec);
}
cVar5 = (**(code **)(*(int *)pCVar10 + 0x16c))();
local_74 = (CBaseEntity *)0x0;
if (cVar5 != '\0') {
local_74 = pCVar10;
}
iVar11 = CBaseEntity::GetTeamNumber(pCVar10);
local_68 = 9;
if (iVar11 == 3) {
local_68 = (**(code **)(*(int *)pCVar10 + 0x544))();
}
uVar15 = *(uint *)(param_1 + 0x34);
local_a4 = 0.0;
if (((uVar15 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
local_a4 = *(float *)(puVar18 + 4);
}
pTVar1 = param_1 + 0x38;
piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
if (((cVar5 == '\0') && (cVar5 = (**(code **)(*piVar7 + 0xd4))(), cVar5 == '\0')) &&
((cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0' &&
(cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0')))) {
(**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
pfVar19 = (float *)&stack0xffffff10;
local_94 = local_88;
local_90 = local_84;
local_8c = local_80;
pcVar3 = *(code **)(*piVar7 + 0x158);
(**(code **)(*piVar7 + 300))();
cVar5 = (*pcVar3)();
if (cVar5 == '\0') {
LAB_00ae3537:
pfVar13 = &local_94;
pfVar19 = (float *)&stack0xffffff10;
goto LAB_00ae2cf1;
}
if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
pVVar16 = (Vector *)(**(code **)(*piVar7 + 300))();
cVar5 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar16,(Vector *)&local_88);
if (cVar5 == '\0') goto LAB_00ae3537;
}
(**(code **)(*piVar7 + 0x120))();
(**(code **)(*piVar7 + 0xb4))();
piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
(**(code **)(*piVar7 + 0xc4))();
(**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
param_1[0x4844] = (Tank)0x1;
}
else {
pfVar13 = (float *)0x0;
pfVar19 = (float *)&stack0xffffff14;
LAB_00ae2cf1:
local_9c = 0.0;
local_98 = 0.0;
if (_towlower == 0.0) {
local_80 = 0.0;
}
else {
*pfVar19 = _towlower;
pfVar19[1] = (float)&local_9c;
pfVar19[0xb] = (float)"ChasePath::Update";
pfVar19[10] = (float)"NextBot";
pfVar19[9] = (float)"(%s)%s";
pfVar19[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
tm_fmt;
pfVar19[7] = 1.45735e-43;
pfVar19[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
pfVar19[5] = 0.0;
pfVar19[3] = 0.0;
pfVar19[4] = 0.0;
pfVar19[2] = 0.0;
pcVar3 = *(code **)((int)_towlower + 0x50);
pfVar19[-1] = 1.5995679e-38;
(*pcVar3)();
local_80 = _towlower;
}
iVar11 = _DAT_0105db00;
local_88 = local_9c;
local_84 = local_98;
if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
/* try { // try from 00ae2dad to 00ae2db1 has its CatchHandler @ 00ae36d0 */
pfVar19[-1] = 1.5995769e-38;
iVar12 = ThreadGetCurrentId();
if (iVar11 == iVar12) {
if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
pfVar19[4] = 5.60519e-45;
pfVar19[3] = (float)"NextBot";
pfVar19[2] = 0.0;
pfVar19[1] = (float)"ChasePath::Update";
*pfVar19 = (float)_DAT_0105d15c;
/* try { // try from 00ae31a0 to 00ae31c3 has its CatchHandler @ 00ae36d0 */
pfVar19[-1] = 1.5997185e-38;
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode
((char *)*pfVar19,(int)pfVar19[1],(char *)pfVar19[2],
(int)pfVar19[3]);
}
puVar9 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar9 = *puVar9 | 4;
*pfVar19 = (float)_DAT_0105d15c;
pfVar19[-1] = 1.5997229e-38;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
}
pfVar19[4] = (float)pfVar13;
pfVar19[3] = (float)&local_7c;
pfVar19[1] = fVar23;
*pfVar19 = (float)pTVar1;
pfVar19[2] = local_a4;
/* try { // try from 00ae2de0 to 00ae2df0 has its CatchHandler @ 00ae36c0 */
pfVar19[-1] = 1.599584e-38;
ChasePath::RefreshPath
((ChasePath *)*pfVar19,(INextBot *)pfVar19[1],(CBaseEntity *)pfVar19[2],
(IPathCost *)pfVar19[3],(Vector *)pfVar19[4]);
pfVar19[1] = fVar23;
*pfVar19 = (float)pTVar1;
pfVar19[-1] = 1.5995857e-38;
PathFollower::Update((PathFollower *)*pfVar19,(INextBot *)pfVar19[1]);
iVar11 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
pfVar19[-1] = 1.5995898e-38;
iVar12 = ThreadGetCurrentId();
if (iVar11 == iVar12) {
*pfVar19 = (float)_DAT_0105d15c;
pfVar19[-1] = 1.5997051e-38;
cVar5 = CVProfNode::ExitScope();
if (cVar5 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_80 != 0.0) {
pfVar19[5] = 0.0;
pfVar19[4] = 0.0;
pfVar19[3] = 0.0;
*pfVar19 = local_80;
pfVar19[1] = local_88;
pfVar19[2] = local_84;
pcVar3 = *(code **)((int)local_80 + 0x54);
pfVar19[-1] = 1.5995985e-38;
(*pcVar3)();
}
iVar11 = *(int *)(param_1 + 0x38);
*pfVar19 = (float)pTVar1;
pcVar3 = *(code **)(iVar11 + 0x44);
pfVar19[-1] = 1.5996006e-38;
TVar6 = (Tank)(*pcVar3)();
param_1[0x4844] = TVar6;
}
pfVar19[1] = fVar23;
pfVar19[2] = local_a4;
*pfVar19 = (float)pTVar1;
pfVar19[-1] = 1.5996053e-38;
DirectChasePath::NotifyVictim
((DirectChasePath *)*pfVar19,(INextBot *)pfVar19[1],(CBaseEntity *)pfVar19[2]);
goto LAB_00ae22c9;
}
}
LAB_00ae2351:
uVar15 = *(uint *)((int)param_2 + 0x30bc);
if ((((uVar15 == 0xffffffff) ||
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar18 + 8) != uVar15 >> 0xc)) ||
((*(int **)(puVar18 + 4) == (int *)0x0 ||
(cVar5 = (**(code **)(**(int **)(puVar18 + 4) + 0x354))(), cVar5 == '\0')))) {
local_7c = (undefined **)0x0;
ForEachSurvivor<MinigunnerScan>((MinigunnerScan *)&local_7c);
ppuVar14 = local_7c;
if (local_7c == (undefined **)0x0) {
uVar15 = *(uint *)(param_1 + 0x34);
pCVar20 = (CTerrorPlayer *)0x0;
if (((uVar15 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
pCVar20 = *(CTerrorPlayer **)(puVar18 + 4);
}
ppuVar14 = (undefined **)
BossZombiePlayerBot::ChooseVictim
((BossZombiePlayerBot *)param_2,pCVar20,4,(CBaseCombatCharacter *)0x0);
if (ppuVar14 == (undefined **)0x0) {
*(undefined4 *)(param_1 + 0x34) = 0xffffffff;
uVar15 = 0xffffffff;
goto LAB_00ae23a6;
}
}
puVar9 = (uint *)(**(code **)(*ppuVar14 + 0xc))();
uVar15 = *puVar9;
*(uint *)(param_1 + 0x34) = uVar15;
}
else {
uVar15 = *(uint *)(param_1 + 0x34);
}
LAB_00ae23a6:
if ((((uVar15 == 0xffffffff) ||
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar18 + 8) != uVar15 >> 0xc)) ||
((*(int **)(puVar18 + 4) == (int *)0x0 ||
(cVar5 = (**(code **)(**(int **)(puVar18 + 4) + 300))(), cVar5 == '\0')))) goto LAB_00ae22c9;
TryToThrowRock((TankAttack *)param_1,(Tank *)param_2);
(**(code **)(*piVar7 + 0xc4))();
fVar23 = (float)((int)param_2 + 0x4028);
cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x11c))();
if (cVar5 == '\0') {
pCVar10 = (CBaseEntity *)0x0;
piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
pcVar3 = *(code **)(*piVar7 + 0x158);
uVar15 = *(uint *)(param_1 + 0x34);
if (((uVar15 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
pCVar10 = *(CBaseEntity **)(puVar18 + 4);
}
if (((byte)pCVar10[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar10);
}
if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
}
cVar5 = (*pcVar3)();
if (cVar5 != '\0') goto LAB_00ae22c9;
}
local_7c = &PTR_operator___00d20e60;
local_78 = fVar23;
local_70 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
pCVar10 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
iVar11 = (**(code **)(*(int *)pCVar10 + 0x14c))();
local_6c = 0x3f800000;
if (iVar11 != 0) {
local_6c = *(undefined4 *)(iVar11 + 0x1cec);
}
cVar5 = (**(code **)(*(int *)pCVar10 + 0x16c))();
local_74 = (CBaseEntity *)0x0;
if (cVar5 != '\0') {
local_74 = pCVar10;
}
iVar11 = CBaseEntity::GetTeamNumber(pCVar10);
local_68 = 9;
if (iVar11 == 3) {
local_68 = (**(code **)(*(int *)pCVar10 + 0x544))();
}
uVar15 = *(uint *)(param_1 + 0x34);
local_a4 = 0.0;
if (((uVar15 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
local_a4 = *(float *)(puVar18 + 4);
}
pTVar1 = param_1 + 0x38;
piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
if (((cVar5 == '\0') && (cVar5 = (**(code **)(*piVar7 + 0xd4))(), cVar5 == '\0')) &&
((cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0' &&
(cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0')))) {
(**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
pfVar13 = (float *)&stack0xffffff10;
local_94 = local_88;
local_90 = local_84;
local_8c = local_80;
pcVar3 = *(code **)(*piVar7 + 0x158);
(**(code **)(*piVar7 + 300))();
cVar5 = (*pcVar3)();
if (cVar5 == '\0') {
LAB_00ae367f:
local_a8 = &local_94;
pfVar13 = (float *)&stack0xffffff10;
goto LAB_00ae25fb;
}
if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
pVVar16 = (Vector *)(**(code **)(*piVar7 + 300))();
cVar5 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar16,(Vector *)&local_88);
if (cVar5 == '\0') goto LAB_00ae367f;
}
(**(code **)(*piVar7 + 0x120))();
(**(code **)(*piVar7 + 0xb4))();
piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
(**(code **)(*piVar7 + 0xc4))();
(**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
param_1[0x4844] = (Tank)0x1;
}
else {
local_a8 = (float *)0x0;
pfVar13 = (float *)&stack0xffffff14;
LAB_00ae25fb:
local_9c = 0.0;
local_98 = 0.0;
if (_towlower == 0.0) {
local_80 = 0.0;
}
else {
*pfVar13 = _towlower;
pfVar13[1] = (float)&local_9c;
pfVar13[0xb] = (float)"ChasePath::Update";
pfVar13[10] = (float)"NextBot";
pfVar13[9] = (float)"(%s)%s";
pfVar13[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
tm_fmt;
pfVar13[7] = 1.45735e-43;
pfVar13[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
pfVar13[5] = 0.0;
pfVar13[3] = 0.0;
pfVar13[4] = 0.0;
pfVar13[2] = 0.0;
pcVar3 = *(code **)((int)_towlower + 0x50);
pfVar13[-1] = 1.5993182e-38;
(*pcVar3)();
local_80 = _towlower;
}
iVar11 = _DAT_0105db00;
local_88 = local_9c;
local_84 = local_98;
if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
/* try { // try from 00ae26b7 to 00ae26bb has its CatchHandler @ 00ae3698 */
pfVar13[-1] = 1.5993272e-38;
iVar12 = ThreadGetCurrentId();
if (iVar11 == iVar12) {
if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
pfVar13[4] = 5.60519e-45;
pfVar13[3] = (float)"NextBot";
pfVar13[2] = 0.0;
pfVar13[1] = (float)"ChasePath::Update";
*pfVar13 = (float)_DAT_0105d15c;
/* try { // try from 00ae35ec to 00ae360f has its CatchHandler @ 00ae3698 */
pfVar13[-1] = 1.5998727e-38;
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode
((char *)*pfVar13,(int)pfVar13[1],(char *)pfVar13[2],(int)pfVar13[3]
);
}
puVar9 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar9 = *puVar9 | 4;
*pfVar13 = (float)_DAT_0105d15c;
pfVar13[-1] = 1.599877e-38;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
}
*pfVar13 = (float)pTVar1;
pfVar13[4] = (float)local_a8;
pfVar13[3] = (float)&local_7c;
pfVar13[2] = local_a4;
pfVar13[1] = fVar23;
/* try { // try from 00ae26f0 to 00ae2706 has its CatchHandler @ 00ae36b0 */
pfVar13[-1] = 1.5993351e-38;
ChasePath::RefreshPath
((ChasePath *)*pfVar13,(INextBot *)pfVar13[1],(CBaseEntity *)pfVar13[2],
(IPathCost *)pfVar13[3],(Vector *)pfVar13[4]);
*pfVar13 = (float)pTVar1;
pfVar13[1] = fVar23;
pfVar13[-1] = 1.5993377e-38;
PathFollower::Update((PathFollower *)*pfVar13,(INextBot *)pfVar13[1]);
iVar11 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
pfVar13[-1] = 1.5993424e-38;
iVar12 = ThreadGetCurrentId();
if (iVar11 == iVar12) {
*pfVar13 = (float)_DAT_0105d15c;
pfVar13[-1] = 1.5998605e-38;
cVar5 = CVProfNode::ExitScope();
if (cVar5 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_80 != 0.0) {
pfVar13[5] = 0.0;
pfVar13[4] = 0.0;
pfVar13[3] = 0.0;
*pfVar13 = local_80;
pfVar13[1] = local_88;
pfVar13[2] = local_84;
pcVar3 = *(code **)((int)local_80 + 0x54);
pfVar13[-1] = 1.5993517e-38;
(*pcVar3)();
}
iVar11 = *(int *)(param_1 + 0x38);
*pfVar13 = (float)pTVar1;
pcVar3 = *(code **)(iVar11 + 0x44);
pfVar13[-1] = 1.599353e-38;
TVar6 = (Tank)(*pcVar3)();
param_1[0x4844] = TVar6;
}
*pfVar13 = (float)pTVar1;
pfVar13[2] = local_a4;
pfVar13[1] = fVar23;
pfVar13[-1] = 1.5993577e-38;
DirectChasePath::NotifyVictim
((DirectChasePath *)*pfVar13,(INextBot *)pfVar13[1],(CBaseEntity *)pfVar13[2]);
if (*(int *)(param_1 + 0x443c) < 1) {
iVar11 = *(int *)param_2;
*pfVar13 = param_2;
iVar12 = 0;
pcVar3 = *(code **)(iVar11 + 0x9b0);
pfVar13[-1] = 1.5993615e-38;
piVar7 = (int *)(*pcVar3)();
pcVar3 = *(code **)(*piVar7 + 0xb4);
uVar15 = *(uint *)(param_1 + 0x34);
if (((uVar15 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
iVar12 = *(int *)(puVar18 + 4);
}
if ((*(byte *)(iVar12 + 0x14d) & 8) != 0) {
*pfVar13 = (float)iVar12;
pfVar13[-1] = 1.5998838e-38;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*pfVar13);
}
*pfVar13 = (float)piVar7;
pfVar13[2] = 1.0;
pfVar13[1] = (float)(iVar12 + 0x2e0);
pfVar13[-1] = 1.5993758e-38;
(*pcVar3)();
}
LAB_00ae22c9:
*(undefined4 *)this = 0;
*(undefined4 *)(this + 4) = 0;
*(undefined4 *)(this + 8) = 0;
return this;
}
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.