PathFollower::Avoid
0x007648f0 · 4876 bytes · __cdecl
_ZN12PathFollower5AvoidEP8INextBotRK6VectorS4_S4_
Decompiled
undefined (4 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* PathFollower::Avoid(INextBot*, Vector const&, Vector const&, Vector const&) */
INextBot * PathFollower::Avoid(INextBot *param_1,Vector *param_2,Vector *param_3,Vector *param_4)
{
float fVar1;
uint uVar2;
char cVar3;
int iVar4;
int *piVar5;
int *piVar6;
undefined4 uVar7;
IHandleEntity *pIVar8;
int *piVar9;
uint *puVar10;
int iVar11;
undefined4 *puVar12;
float *pfVar13;
undefined *puVar14;
Vector VVar15;
longdouble lVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float fVar21;
float *in_stack_00000014;
float *in_stack_00000018;
float local_1a0;
float local_19c;
float local_194;
CBaseEntity *local_190;
float local_188;
float local_184;
float local_180;
undefined4 local_174;
undefined4 local_170;
undefined4 local_168;
undefined4 local_164;
int local_160;
Vector local_15c [12];
float local_150;
float local_14c;
float local_148;
undefined **local_144 [4];
undefined **local_134 [4];
Vector *local_124;
undefined4 local_120;
float local_11c;
float local_118;
float local_114;
float local_10c;
float local_108;
float local_104;
float local_fc;
float local_f8;
float local_f4;
float local_ec;
float local_e8;
float local_e4;
undefined4 local_dc;
undefined1 local_d8;
undefined1 local_d7;
float local_cc;
float local_c8;
float local_c4;
float local_bc;
float local_b8;
float local_b4;
float local_ac;
float local_a8;
float local_a4;
float local_9c;
float local_98;
float local_94;
undefined4 local_8c;
undefined1 local_88;
undefined1 local_87;
CGameTrace local_70 [44];
float local_44;
char local_39;
int local_24;
local_174 = 0;
local_170 = 0;
if (_towlower == 0) {
local_160 = 0;
}
else {
(**(code **)(_towlower + 0x50))
(_towlower,&local_174,0,0,0,0,
"/data/src/game/server/nextbot/path/nextbotpathfollow.cpp",0x35e,
&Avoid(INextBot*,Vector_const&,Vector_const&,Vector_const&)::tm_fmt,"(%s)%s",
"NextBotExpensive","PathFollower::Avoid");
local_160 = _towlower;
}
iVar11 = _DAT_0105db00;
local_168 = local_174;
local_164 = local_170;
/* try { // try from 00764a86 to 00764ae6 has its CatchHandler @ 00765c0f */
if (((_DAT_0105d154 == 0) && (DAT_0105d158 != '\0')) ||
(iVar4 = ThreadGetCurrentId(), iVar11 != iVar4)) {
iVar11 = *(int *)(NextBotAllowAvoiding._28_4_ + 0x30);
}
else {
if ((char *)*_DAT_0105d15c != "PathFollower::Avoid") {
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xcaa5fa,(char *)0x0,0xca957e);
}
puVar10 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar10 = *puVar10 | 4;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
iVar11 = *(int *)(NextBotAllowAvoiding._28_4_ + 0x30);
}
if (iVar11 != 0) {
/* try { // try from 00764b0a to 00765c09 has its CatchHandler @ 00765c27 */
lVar16 = (longdouble)CountdownTimer::Now();
if (*(float *)(param_2 + 0x476c) <= (float)lVar16) {
lVar16 = (longdouble)CountdownTimer::Now();
if ((float)lVar16 + 0.5 != *(float *)(param_2 + 0x476c)) {
(**(code **)(*(int *)(param_2 + 0x4764) + 4))(param_2 + 0x4764,param_2 + 0x476c);
*(float *)(param_2 + 0x476c) = (float)lVar16 + 0.5;
}
if (*(float *)(param_2 + 0x4768) != 0.5) {
(**(code **)(*(int *)(param_2 + 0x4764) + 4))(param_2 + 0x4764,param_2 + 0x4768);
*(undefined4 *)(param_2 + 0x4768) = 0x3f000000;
}
piVar5 = (int *)(**(code **)(*(int *)param_3 + 0xc0))(param_3);
piVar6 = (int *)(**(code **)(*(int *)param_3 + 0xc4))(param_3);
uVar7 = (**(code **)(*piVar6 + 0x130))(piVar6);
local_184 = *(float *)param_4;
local_180 = *(float *)(param_4 + 4);
local_188 = *(float *)(param_4 + 8);
cVar3 = (**(code **)(*piVar5 + 200))(piVar5);
if ((cVar3 != '\0') || (cVar3 = (**(code **)(*piVar5 + 0xf8))(piVar5), cVar3 == '\0')) {
*(float *)param_1 = local_184;
*(float *)(param_1 + 4) = local_180;
*(float *)(param_1 + 8) = local_188;
goto LAB_007649e1;
}
pIVar8 = (IHandleEntity *)(**(code **)(*(int *)param_3 + 0xb4))(param_3);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_144,pIVar8,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
local_144[0] = &PTR_ShouldHitEntity_00caa988;
piVar9 = (int *)FindBlocker((PathFollower *)param_2,(INextBot *)param_3);
if (piVar9 == (int *)0x0) {
*(undefined4 *)(param_2 + 0x477c) = 0xffffffff;
}
else {
puVar10 = (uint *)(**(code **)(*piVar9 + 0xc))(piVar9);
puVar14 = g_pEntityList;
uVar2 = *puVar10;
*(uint *)(param_2 + 0x477c) = uVar2;
if (((uVar2 != 0xffffffff) &&
(puVar14 = puVar14 + (uVar2 & 0xfff) * 0x10, puVar14 != (undefined *)0xfffffffc)) &&
((*(uint *)(puVar14 + 8) == uVar2 >> 0xc && (*(int *)(puVar14 + 4) != 0)))) {
lVar16 = (longdouble)RandomFloat(0x3f800000,0x40000000);
fVar20 = (float)lVar16 * 0.5;
lVar16 = (longdouble)CountdownTimer::Now();
if ((float)lVar16 + fVar20 != *(float *)(param_2 + 0x4778)) {
(**(code **)(*(int *)(param_2 + 0x4770) + 4))(param_2 + 0x4770,param_2 + 0x4778);
*(float *)(param_2 + 0x4778) = (float)lVar16 + fVar20;
}
if (fVar20 != *(float *)(param_2 + 0x4774)) {
(**(code **)(*(int *)(param_2 + 0x4770) + 4))(param_2 + 0x4770,param_2 + 0x4774);
*(float *)(param_2 + 0x4774) = fVar20;
}
puVar12 = (undefined4 *)(**(code **)(*piVar5 + 300))(piVar5);
*(undefined4 *)param_1 = *puVar12;
uVar7 = puVar12[2];
*(undefined4 *)(param_1 + 4) = puVar12[1];
*(undefined4 *)(param_1 + 8) = uVar7;
goto LAB_007649e1;
}
}
piVar9 = (int *)(**(code **)(*(int *)param_3 + 0xb4))(param_3);
iVar11 = (**(code **)(*piVar9 + 0x52c))(piVar9);
if ((iVar11 != 0) && ((*(byte *)(iVar11 + 0x54) & 4) != 0)) {
*(float *)param_1 = local_184;
*(float *)(param_1 + 4) = local_180;
*(float *)(param_1 + 8) = local_188;
goto LAB_007649e1;
}
param_2[0x478c] = (Vector)0x1;
lVar16 = (longdouble)(**(code **)(*piVar6 + 0x118))(piVar6);
fVar20 = (float)lVar16 * 0.25 + 2.0;
cVar3 = (**(code **)(*piVar5 + 0xe4))(piVar5);
local_1a0 = 30.0;
if (cVar3 != '\0') {
local_1a0 = 50.0;
}
lVar16 = (longdouble)(**(code **)(*piVar6 + 0x118))(piVar6);
fVar21 = (float)lVar16 * 0.25;
lVar16 = (longdouble)(**(code **)(*piVar5 + 0x130))(piVar5);
*(float *)(param_2 + 0x47d0) = (float)lVar16 + 0.1;
*(float *)(param_2 + 0x47c8) = -fVar21;
*(float *)(param_2 + 0x47cc) = -fVar21;
lVar16 = (longdouble)(**(code **)(*piVar6 + 0x124))(piVar6);
*(float *)(param_2 + 0x47d4) = fVar21;
*(float *)(param_2 + 0x47d8) = fVar21;
*(float *)(param_2 + 0x47dc) = (float)lVar16;
(**(code **)(*piVar5 + 0x130))(piVar5);
fVar21 = *in_stack_00000018;
fVar1 = in_stack_00000018[1];
fVar18 = in_stack_00000018[2];
pfVar13 = (float *)(**(code **)(*piVar5 + 300))(piVar5);
fVar17 = fVar1 * fVar20 + pfVar13[1];
fVar18 = fVar20 * fVar18 + pfVar13[2];
fVar19 = fVar21 * fVar20 + *pfVar13;
*(float *)(param_2 + 0x4794) = fVar17;
*(float *)(param_2 + 0x4798) = fVar18;
*(float *)(param_2 + 0x4790) = fVar19;
fVar21 = in_stack_00000014[2];
fVar1 = *in_stack_00000014;
*(float *)(param_2 + 0x47a0) = in_stack_00000014[1] * local_1a0 + fVar17;
*(float *)(param_2 + 0x47a4) = fVar21 * local_1a0 + fVar18;
param_2[0x47a8] = (Vector)0x1;
*(float *)(param_2 + 0x479c) = fVar1 * local_1a0 + fVar19;
pIVar8 = (IHandleEntity *)(**(code **)(*(int *)param_3 + 0xb4))(param_3);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_134,pIVar8,0,IgnoreActorsTraceFilterFunction);
local_134[0] = &PTR_ShouldHitEntity_00ca96c8;
local_120 = 1;
local_dc = 0;
local_124 = param_3;
local_10c = *(float *)(param_2 + 0x479c) - *(float *)(param_2 + 0x4790);
local_108 = *(float *)(param_2 + 0x47a0) - *(float *)(param_2 + 0x4794);
local_104 = *(float *)(param_2 + 0x47a4) - *(float *)(param_2 + 0x4798);
local_d7 = local_108 * local_108 + local_10c * local_10c + local_104 * local_104 != 0.0;
local_ec = (*(float *)(param_2 + 0x47d4) - *(float *)(param_2 + 0x47c8)) * 0.5;
local_e8 = (*(float *)(param_2 + 0x47d8) - *(float *)(param_2 + 0x47cc)) * 0.5;
local_e4 = (*(float *)(param_2 + 0x47dc) - *(float *)(param_2 + 0x47d0)) * 0.5;
local_d8 = local_e8 * local_e8 + local_ec * local_ec + local_e4 * local_e4 < 1e-06;
local_fc = (*(float *)(param_2 + 0x47d4) + *(float *)(param_2 + 0x47c8)) * 0.5;
local_f8 = (*(float *)(param_2 + 0x47d8) + *(float *)(param_2 + 0x47cc)) * 0.5;
local_f4 = (*(float *)(param_2 + 0x47dc) + *(float *)(param_2 + 0x47d0)) * 0.5;
local_11c = *(float *)(param_2 + 0x4790) + local_fc;
local_fc = -local_fc;
local_118 = *(float *)(param_2 + 0x4794) + local_f8;
local_f8 = -local_f8;
local_114 = *(float *)(param_2 + 0x4798) + local_f4;
local_f4 = -local_f4;
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_11c,uVar7,local_134,local_70);
if (local_44 < 1.0) {
if (0.0 <= local_44) {
LAB_00765ba3:
local_19c = 1.0 - local_44;
}
else {
LAB_00765b64:
local_19c = 1.0;
}
LAB_00765917:
param_2[0x47a8] = (Vector)0x0;
cVar3 = CGameTrace::DidHitNonWorldEntity(local_70);
local_190 = (CBaseEntity *)0x0;
if ((cVar3 != '\0') && (local_24 != 0)) {
local_190 = (CBaseEntity *)
__dynamic_cast(local_24,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0);
}
}
else {
if (local_39 != '\0') {
if (local_44 < 0.0) goto LAB_00765b64;
if (local_44 <= 1.0) goto LAB_00765ba3;
local_19c = 0.0;
goto LAB_00765917;
}
local_19c = 0.0;
local_190 = (CBaseEntity *)0x0;
}
fVar21 = *in_stack_00000018;
fVar1 = in_stack_00000018[1];
fVar18 = in_stack_00000018[2];
pfVar13 = (float *)(**(code **)(*piVar5 + 300))(piVar5);
local_8c = 0;
local_c8 = pfVar13[1] - fVar1 * fVar20;
local_cc = *pfVar13 - fVar21 * fVar20;
local_c4 = pfVar13[2] - fVar20 * fVar18;
*(float *)(param_2 + 0x47b0) = local_c8;
*(float *)(param_2 + 0x47ac) = local_cc;
*(float *)(param_2 + 0x47b4) = local_c4;
local_bc = *in_stack_00000014 * local_1a0 + local_cc;
local_b8 = in_stack_00000014[1] * local_1a0 + local_c8;
local_b4 = local_1a0 * in_stack_00000014[2] + local_c4;
*(float *)(param_2 + 0x47b8) = local_bc;
local_bc = local_bc - local_cc;
*(float *)(param_2 + 0x47bc) = local_b8;
local_b8 = local_b8 - local_c8;
*(float *)(param_2 + 0x47c0) = local_b4;
local_b4 = local_b4 - local_c4;
param_2[0x47c4] = (Vector)0x1;
local_87 = local_b4 * local_b4 + local_b8 * local_b8 + local_bc * local_bc != 0.0;
local_9c = (*(float *)(param_2 + 0x47d4) - *(float *)(param_2 + 0x47c8)) * 0.5;
local_98 = (*(float *)(param_2 + 0x47d8) - *(float *)(param_2 + 0x47cc)) * 0.5;
local_94 = (*(float *)(param_2 + 0x47dc) - *(float *)(param_2 + 0x47d0)) * 0.5;
local_ac = (*(float *)(param_2 + 0x47d4) + *(float *)(param_2 + 0x47c8)) * 0.5;
local_a8 = (*(float *)(param_2 + 0x47d8) + *(float *)(param_2 + 0x47cc)) * 0.5;
local_cc = local_cc + local_ac;
local_ac = -local_ac;
local_c8 = local_c8 + local_a8;
local_a8 = -local_a8;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
local_a4 = (*(float *)(param_2 + 0x47d0) + *(float *)(param_2 + 0x47dc)) * 0.5;
local_c4 = local_c4 + local_a4;
local_a4 = -local_a4;
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_cc,uVar7,local_134,local_70);
if (local_44 < 1.0) {
if (0.0 <= local_44) {
LAB_00765b8a:
local_194 = 1.0 - local_44;
}
else {
LAB_00765b7b:
local_194 = 1.0;
}
LAB_0076588d:
param_2[0x47c4] = (Vector)0x0;
VVar15 = (Vector)0x0;
if (local_190 != (CBaseEntity *)0x0) goto LAB_0076563c;
cVar3 = CGameTrace::DidHitNonWorldEntity(local_70);
if ((cVar3 != '\0') && (local_24 != 0)) {
local_190 = (CBaseEntity *)
__dynamic_cast(local_24,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0);
VVar15 = param_2[0x47c4];
goto LAB_0076562e;
}
LAB_00765974:
if (param_2[0x47a8] == (Vector)0x0) {
LAB_00765ae8:
if (param_2[0x47c4] == (Vector)0x0) {
if (ABS(local_194 - local_19c) < 0.01) {
*(float *)param_1 = local_184;
*(float *)(param_1 + 4) = local_180;
*(float *)(param_1 + 8) = local_188;
goto LAB_007649e1;
}
local_19c = (float)(~-(uint)(local_194 <= local_19c) & (uint)-local_194 |
(uint)local_19c & -(uint)(local_194 <= local_19c));
}
LAB_007659aa:
local_c8 = in_stack_00000014[1] * 0.5 - in_stack_00000018[1] * local_19c;
local_c4 = in_stack_00000014[2] * 0.5 - in_stack_00000018[2] * local_19c;
local_cc = *in_stack_00000014 * 0.5 - *in_stack_00000018 * local_19c;
VectorNormalize((Vector *)&local_cc);
local_184 = local_cc * 100.0;
local_180 = local_c8 * 100.0;
local_188 = local_c4 * 100.0;
pfVar13 = (float *)(**(code **)(*piVar5 + 300))(piVar5);
local_188 = local_188 + pfVar13[2];
local_184 = local_184 + *pfVar13;
local_180 = local_180 + pfVar13[1];
if (*(float *)(param_2 + 0x476c) != -1.0) goto LAB_00765ac8;
}
else {
VVar15 = param_2[0x47c4];
LAB_0076598b:
if (VVar15 == (Vector)0x0) {
local_19c = -local_194;
goto LAB_007659aa;
}
}
}
else {
if (local_39 != '\0') {
if (local_44 < 0.0) goto LAB_00765b7b;
if (local_44 <= 1.0) goto LAB_00765b8a;
local_194 = 0.0;
goto LAB_0076588d;
}
local_194 = 0.0;
VVar15 = param_2[0x47c4];
LAB_0076562e:
if (local_190 == (CBaseEntity *)0x0) goto LAB_00765974;
LAB_0076563c:
if (param_2[0x47a8] != (Vector)0x0) goto LAB_0076598b;
if (VVar15 != (Vector)0x0) goto LAB_00765ae8;
if (((byte)local_190[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(local_190);
}
AngleVectors((QAngle *)(local_190 + 0x37c),local_15c,(Vector *)&local_150,
(Vector *)&local_11c);
if (((byte)local_190[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(local_190);
}
local_cc = *(float *)(local_190 + 0x2e0) - local_150 * 100.0;
local_c8 = *(float *)(local_190 + 0x2e4) - local_14c * 100.0;
local_c4 = *(float *)(local_190 + 0x2e8) - local_148 * 100.0;
cVar3 = INextBot::IsDebugging((INextBot *)param_3,4);
if (cVar3 != '\0') {
if ((((byte)local_190[0x14d] & 8) != 0) &&
(CBaseEntity::CalcAbsolutePosition(local_190), ((byte)local_190[0x14d] & 8) != 0)) {
CBaseEntity::CalcAbsolutePosition(local_190);
}
NDebugOverlay::Axis((Vector *)(local_190 + 0x2e0),(QAngle *)(local_190 + 0x37c),20.0,true,
10.0);
if (((byte)local_190[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(local_190);
}
NDebugOverlay::Line((Vector *)(local_190 + 0x2e0),(Vector *)&local_cc,0xff,0xff,0,true,
10.0);
}
local_184 = local_cc;
local_180 = local_c8;
if (*(float *)(param_2 + 0x476c) == -1.0) goto LAB_0076583b;
LAB_00765ac8:
CountdownTimer::NetworkVar_m_timestamp::NetworkStateChanged(param_2 + 0x476c);
*(undefined4 *)(param_2 + 0x476c) = 0xbf800000;
}
LAB_0076583b:
*(float *)param_1 = local_184;
*(float *)(param_1 + 4) = local_180;
*(float *)(param_1 + 8) = local_188;
goto LAB_007649e1;
}
}
*(undefined4 *)param_1 = *(undefined4 *)param_4;
*(undefined4 *)(param_1 + 4) = *(undefined4 *)(param_4 + 4);
*(undefined4 *)(param_1 + 8) = *(undefined4 *)(param_4 + 8);
LAB_007649e1:
iVar11 = _DAT_0105db00;
if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
(iVar4 = ThreadGetCurrentId(), iVar11 == iVar4)) {
cVar3 = CVProfNode::ExitScope();
if (cVar3 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
if (local_160 != 0) {
(**(code **)(local_160 + 0x54))(local_160,local_168,local_164,0,0,0);
}
return param_1;
}
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.