SpitterAssault::Update
0x00acdd60 · 3165 bytes · __thiscall
_ZN14SpitterAssault6UpdateEP7Spitterf
Decompiled
undefined (3 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* SpitterAssault::Update(Spitter*, float) */
void __thiscall SpitterAssault::Update(SpitterAssault *this,Spitter *param_1,float param_2)
{
Spitter *pSVar1;
code *pcVar2;
char cVar3;
Spitter SVar4;
int *piVar5;
int *piVar6;
int *piVar7;
undefined *puVar8;
int *piVar9;
uint *puVar10;
undefined4 *puVar11;
CBaseEntity *pCVar12;
int iVar13;
int iVar14;
Vector *pVVar15;
uint uVar16;
float fVar17;
float *pfVar18;
CTerrorPlayer *pCVar19;
longdouble lVar20;
int *local_74;
float local_70;
int local_64;
int local_54;
int local_50;
int local_4c;
int local_48;
int local_44;
int local_40;
int local_3c;
int local_38;
undefined **local_34;
float local_30;
CBaseEntity *local_2c;
undefined4 local_28;
undefined4 local_24;
undefined4 local_20;
piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9b4))();
piVar6 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9bc))();
puVar8 = g_pEntityList;
if (param_1[0x4848] == (Spitter)0x0) {
LAB_00acddaa:
uVar16 = *(uint *)(param_1 + 0x34);
pCVar19 = (CTerrorPlayer *)0x0;
if (((uVar16 != 0xffffffff) &&
(puVar8 = puVar8 + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
pCVar19 = *(CTerrorPlayer **)(puVar8 + 4);
}
piVar9 = (int *)BossZombiePlayerBot::ChooseVictim
((BossZombiePlayerBot *)param_2,pCVar19,0,(CBaseCombatCharacter *)0x0)
;
if (piVar9 == (int *)0x0) {
*(undefined4 *)(param_1 + 0x34) = 0xffffffff;
goto LAB_00acde49;
}
puVar10 = (uint *)(**(code **)(*piVar9 + 0xc))();
puVar8 = g_pEntityList;
uVar16 = *puVar10;
*(uint *)(param_1 + 0x34) = uVar16;
}
else if (*(float *)(param_1 + 0x4854) <= 0.0) {
uVar16 = *(uint *)((int)param_2 + 0x4324);
if ((((uVar16 == 0xffffffff) ||
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar8 + 8) != uVar16 >> 0xc)) ||
((*(int **)(puVar8 + 4) == (int *)0x0 ||
(cVar3 = (**(code **)(**(int **)(puVar8 + 4) + 300))(), puVar8 = g_pEntityList,
cVar3 == '\0')))) {
puVar8 = g_pEntityList;
param_1[0x4848] = (Spitter)0x0;
*(undefined4 *)((int)param_2 + 0x4324) = 0xffffffff;
}
if (param_1[0x4848] == (Spitter)0x0) goto LAB_00acddaa;
uVar16 = *(uint *)(param_1 + 0x34);
}
else {
uVar16 = *(uint *)(param_1 + 0x34);
}
if ((((uVar16 == 0xffffffff) ||
(puVar8 = puVar8 + (uVar16 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar8 + 8) != uVar16 >> 0xc)) || (*(int **)(puVar8 + 4) == (int *)0x0))
goto LAB_00acde49;
puVar11 = (undefined4 *)(**(code **)(**(int **)(puVar8 + 4) + 0xc))();
*(undefined4 *)((int)param_2 + 0x4324) = *puVar11;
(**(code **)(*piVar5 + 0xc4))();
if (param_1[0x4848] == (Spitter)0x0) {
fVar17 = (float)((int)param_2 + 0x4028);
local_34 = &PTR_operator___00d20e60;
local_30 = fVar17;
local_28 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
pCVar12 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
iVar13 = (**(code **)(*(int *)pCVar12 + 0x14c))();
if (iVar13 == 0) {
local_24 = 0x3f800000;
}
else {
local_24 = *(undefined4 *)(iVar13 + 0x1cec);
}
cVar3 = (**(code **)(*(int *)pCVar12 + 0x16c))();
local_2c = (CBaseEntity *)0x0;
if (cVar3 != '\0') {
local_2c = pCVar12;
}
iVar13 = CBaseEntity::GetTeamNumber(pCVar12);
local_20 = 9;
if (iVar13 == 3) {
local_20 = (**(code **)(*(int *)pCVar12 + 0x544))();
}
uVar16 = *(uint *)(param_1 + 0x34);
local_70 = 0.0;
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
local_70 = *(float *)(puVar8 + 4);
}
pSVar1 = param_1 + 0x38;
piVar9 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar9 + 0xd4))(), cVar3 == '\0')) &&
((cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0' &&
(cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0')))) {
(**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
pfVar18 = (float *)&stack0xffffff50;
local_4c = local_40;
local_48 = local_3c;
local_44 = local_38;
pcVar2 = *(code **)(*piVar9 + 0x158);
(**(code **)(*piVar9 + 300))();
cVar3 = (*pcVar2)();
if (cVar3 == '\0') {
LAB_00ace9fe:
local_74 = &local_4c;
pfVar18 = (float *)&stack0xffffff50;
goto LAB_00ace0a8;
}
if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
pVVar15 = (Vector *)(**(code **)(*piVar9 + 300))();
cVar3 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar15,(Vector *)&local_40);
if (cVar3 == '\0') goto LAB_00ace9fe;
}
(**(code **)(*piVar9 + 0x120))();
(**(code **)(*piVar9 + 0xb4))();
piVar9 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
(**(code **)(*piVar9 + 0xc4))();
(**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
param_1[0x4844] = (Spitter)0x1;
}
else {
local_74 = (int *)0x0;
pfVar18 = (float *)&stack0xffffff54;
LAB_00ace0a8:
local_54 = 0;
local_50 = 0;
if (_towlower == 0) {
local_38 = 0;
}
else {
*pfVar18 = (float)_towlower;
pfVar18[1] = (float)&local_54;
pfVar18[0xb] = (float)"ChasePath::Update";
pfVar18[10] = (float)"NextBot";
pfVar18[9] = (float)"(%s)%s";
pfVar18[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
tm_fmt;
pfVar18[7] = 1.45735e-43;
pfVar18[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
pfVar18[5] = 0.0;
pfVar18[3] = 0.0;
pfVar18[4] = 0.0;
pfVar18[2] = 0.0;
pcVar2 = *(code **)(_towlower + 0x50);
pfVar18[-1] = 1.5876465e-38;
(*pcVar2)();
local_38 = _towlower;
}
iVar13 = _DAT_0105db00;
local_40 = local_54;
local_3c = local_50;
if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
/* try { // try from 00ace150 to 00ace154 has its CatchHandler @ 00acea40 */
pfVar18[-1] = 1.5876539e-38;
iVar14 = ThreadGetCurrentId();
if (iVar13 == iVar14) {
if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
pfVar18[4] = 5.60519e-45;
pfVar18[3] = (float)"NextBot";
pfVar18[2] = 0.0;
pfVar18[1] = (float)"ChasePath::Update";
*pfVar18 = (float)_DAT_0105d15c;
/* try { // try from 00ace910 to 00ace933 has its CatchHandler @ 00acea40 */
pfVar18[-1] = 1.587932e-38;
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode
((char *)*pfVar18,(int)pfVar18[1],(char *)pfVar18[2],
(int)pfVar18[3]);
}
puVar10 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar10 = *puVar10 | 4;
*pfVar18 = (float)_DAT_0105d15c;
pfVar18[-1] = 1.5879363e-38;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
}
*pfVar18 = (float)pSVar1;
pfVar18[4] = (float)local_74;
pfVar18[3] = (float)&local_34;
pfVar18[2] = local_70;
pfVar18[1] = fVar17;
/* try { // try from 00ace17d to 00ace190 has its CatchHandler @ 00acea55 */
pfVar18[-1] = 1.5876602e-38;
ChasePath::RefreshPath
((ChasePath *)*pfVar18,(INextBot *)pfVar18[1],(CBaseEntity *)pfVar18[2],
(IPathCost *)pfVar18[3],(Vector *)pfVar18[4]);
*pfVar18 = (float)pSVar1;
pfVar18[1] = fVar17;
pfVar18[-1] = 1.5876623e-38;
PathFollower::Update((PathFollower *)*pfVar18,(INextBot *)pfVar18[1]);
iVar13 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
pfVar18[-1] = 1.5876668e-38;
iVar14 = ThreadGetCurrentId();
if (iVar13 == iVar14) {
*pfVar18 = (float)_DAT_0105d15c;
pfVar18[-1] = 1.5879398e-38;
cVar3 = CVProfNode::ExitScope();
if (cVar3 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_38 != 0) {
pfVar18[5] = 0.0;
pfVar18[4] = 0.0;
pfVar18[3] = 0.0;
*pfVar18 = (float)local_38;
pfVar18[1] = (float)local_40;
pfVar18[2] = (float)local_3c;
pcVar2 = *(code **)(local_38 + 0x54);
pfVar18[-1] = 1.5876752e-38;
(*pcVar2)();
}
iVar13 = *(int *)(param_1 + 0x38);
*pfVar18 = (float)pSVar1;
pcVar2 = *(code **)(iVar13 + 0x44);
pfVar18[-1] = 1.5876765e-38;
SVar4 = (Spitter)(*pcVar2)();
param_1[0x4844] = SVar4;
}
*pfVar18 = (float)pSVar1;
pfVar18[2] = local_70;
pfVar18[1] = fVar17;
pfVar18[-1] = 1.5876804e-38;
DirectChasePath::NotifyVictim
((DirectChasePath *)*pfVar18,(INextBot *)pfVar18[1],(CBaseEntity *)pfVar18[2]);
if (*(int *)(param_1 + 0x443c) < 1) {
iVar13 = *(int *)param_2;
*pfVar18 = param_2;
pcVar2 = *(code **)(iVar13 + 0x9b0);
pfVar18[-1] = 1.5878812e-38;
piVar5 = (int *)(*pcVar2)();
local_64 = 0;
pcVar2 = *(code **)(*piVar5 + 0xb4);
uVar16 = *(uint *)(param_1 + 0x34);
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
local_64 = *(int *)(puVar8 + 4);
}
if ((*(byte *)(local_64 + 0x14d) & 8) != 0) {
*pfVar18 = (float)local_64;
pfVar18[-1] = 1.5879485e-38;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*pfVar18);
}
pfVar18[2] = 1.0;
*pfVar18 = (float)piVar5;
pfVar18[1] = (float)(local_64 + 0x2e0);
pfVar18[-1] = 1.5878969e-38;
(*pcVar2)();
}
else {
iVar13 = *piVar6;
*pfVar18 = (float)piVar6;
pcVar2 = *(code **)(iVar13 + 200);
pfVar18[-1] = 1.5876843e-38;
cVar3 = (*pcVar2)();
if (cVar3 == '\0') {
iVar13 = *piVar6;
*pfVar18 = (float)piVar6;
pcVar2 = *(code **)(iVar13 + 0x114);
pfVar18[-1] = 1.5876874e-38;
cVar3 = (*pcVar2)();
if (cVar3 == '\0') {
iVar13 = *piVar6;
*pfVar18 = (float)piVar6;
pcVar2 = *(code **)(iVar13 + 0xf8);
pfVar18[-1] = 1.5876905e-38;
cVar3 = (*pcVar2)();
if (cVar3 != '\0') {
iVar13 = *piVar5;
pfVar18[1] = 1.4013e-44;
*pfVar18 = (float)piVar5;
pcVar2 = *(code **)(iVar13 + 0xe4);
pfVar18[-1] = 1.5876947e-38;
cVar3 = (*pcVar2)();
if (cVar3 == '\0') {
iVar13 = *piVar5;
pfVar18[2] = 0.0;
pfVar18[1] = 1.4013e-44;
*pfVar18 = (float)piVar5;
pcVar2 = *(code **)(iVar13 + 0xd8);
pfVar18[-1] = 1.5876995e-38;
(*pcVar2)();
}
}
}
}
}
}
else if (*(float *)(param_1 + 0x4854) <= 0.0) {
uVar16 = *(uint *)((int)param_2 + 0x4324);
pCVar12 = (CBaseEntity *)0x0;
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
pCVar12 = *(CBaseEntity **)(puVar8 + 4);
}
if (((byte)pCVar12[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar12);
}
local_34 = *(undefined ***)(pCVar12 + 0x2e0);
local_30 = *(float *)(pCVar12 + 0x2e4);
local_2c = *(CBaseEntity **)(pCVar12 + 0x2e8);
if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
}
local_2c = *(CBaseEntity **)((int)param_2 + 0x2e8);
cVar3 = UTIL_IsFacingWithinTolerance
((CBaseEntity *)param_2,(Vector *)&local_34,0.98,(float *)0x0);
pfVar18 = (float *)&stack0xffffff54;
if (((cVar3 != '\0') &&
(cVar3 = CTerrorPlayer::IsCustomAbilityReadyToFire((CTerrorPlayer *)param_2),
pfVar18 = (float *)&stack0xffffff54, cVar3 != '\0')) &&
((**(code **)(*(int *)param_2 + 0x938))(), pfVar18 = (float *)&stack0xffffff54,
*(float *)(param_1 + 0x4854) <= 0.0)) {
lVar20 = (longdouble)CountdownTimer::Now();
if ((float)lVar20 + 1.0 != *(float *)(param_1 + 0x4854)) {
(**(code **)(*(int *)(param_1 + 0x484c) + 4))();
*(float *)(param_1 + 0x4854) = (float)lVar20 + 1.0;
}
pfVar18 = (float *)&stack0xffffff54;
if (*(float *)(param_1 + 0x4850) != 1.0) {
(**(code **)(*(int *)(param_1 + 0x484c) + 4))();
*(undefined4 *)(param_1 + 0x4850) = 0x3f800000;
pfVar18 = (float *)&stack0xffffff54;
}
}
}
else {
lVar20 = (longdouble)CountdownTimer::Now();
pfVar18 = (float *)&stack0xffffff54;
if (*(float *)(param_1 + 0x4854) <= (float)lVar20) {
if (*(float *)(param_1 + 0x4854) != -1.0) {
(**(code **)(*(int *)(param_1 + 0x484c) + 4))();
*(undefined4 *)(param_1 + 0x4854) = 0xbf800000;
}
param_1[0x4848] = (Spitter)0x0;
pfVar18 = (float *)&stack0xffffff54;
}
}
fVar17 = 0.0;
pcVar2 = *(code **)(*piVar7 + 0xf8);
uVar16 = *(uint *)(param_1 + 0x34);
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
fVar17 = *(float *)(puVar8 + 4);
}
pfVar18[2] = 0.0;
pfVar18[1] = fVar17;
*pfVar18 = (float)piVar7;
pfVar18[-1] = 1.5877236e-38;
cVar3 = (*pcVar2)();
if (cVar3 != '\0') {
uVar16 = *(uint *)(param_1 + 0x34);
fVar17 = 0.0;
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
fVar17 = *(float *)(puVar8 + 4);
}
pfVar18[3] = 0.0;
pfVar18[2] = 0.8;
pfVar18[1] = fVar17;
*pfVar18 = param_2;
pfVar18[-1] = 1.5877353e-38;
cVar3 = UTIL_IsFacingWithinTolerance
((CBaseEntity *)*pfVar18,(CBaseEntity *)pfVar18[1],pfVar18[2],
(float *)pfVar18[3]);
if ((cVar3 != '\0') && ((*(byte *)((int)param_2 + 0x150) & 1) != 0)) {
*pfVar18 = param_2;
pfVar18[-1] = 1.5877394e-38;
cVar3 = CTerrorPlayer::IsCustomAbilityReadyToFire((CTerrorPlayer *)*pfVar18);
if (cVar3 != '\0') {
fVar17 = 0.0;
pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 300);
uVar16 = *(uint *)(param_1 + 0x34);
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
fVar17 = *(float *)(puVar8 + 4);
}
pfVar18[1] = fVar17;
*pfVar18 = (float)((int)param_2 + 0x4028);
pfVar18[-1] = 1.5877524e-38;
lVar20 = (longdouble)(*pcVar2)();
if ((float)lVar20 <
*(float *)(z_spitter_range._28_4_ + 0x2c) * *(float *)(z_spitter_range._28_4_ + 0x2c)) {
iVar13 = *piVar6;
*pfVar18 = (float)piVar6;
pcVar2 = *(code **)(iVar13 + 0xe0);
pfVar18[-1] = 1.5879085e-38;
(*pcVar2)();
param_1[0x4848] = (Spitter)0x1;
goto LAB_00acde49;
}
}
uVar16 = *(uint *)(param_1 + 0x34);
fVar17 = 0.0;
pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 300);
if (((uVar16 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
fVar17 = *(float *)(puVar8 + 4);
}
pfVar18[1] = fVar17;
*pfVar18 = (float)((int)param_2 + 0x4028);
pfVar18[-1] = 1.5877667e-38;
lVar20 = (longdouble)(*pcVar2)();
if ((float)lVar20 < 1764.0) {
iVar13 = *(int *)param_2;
pfVar18[1] = -1.0;
*pfVar18 = param_2;
pcVar2 = *(code **)(iVar13 + 0x940);
pfVar18[-1] = 1.5877729e-38;
(*pcVar2)();
}
}
}
LAB_00acde49:
*(undefined4 *)this = 0;
*(undefined4 *)(this + 4) = 0;
*(undefined4 *)(this + 8) = 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.