ZombieBotLocomotion::ResolveCollision
0x00a53190 · 4212 bytes · __cdecl
_ZN19ZombieBotLocomotion16ResolveCollisionERK6VectorS2_i
Decompiled
undefined (3 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* ZombieBotLocomotion::ResolveCollision(Vector const&, Vector const&, int) */
Vector * ZombieBotLocomotion::ResolveCollision(Vector *param_1,Vector *param_2,int param_3)
{
uint *puVar1;
bool bVar2;
char cVar3;
char cVar4;
int *piVar5;
float *pfVar6;
INextBot *this;
int iVar7;
undefined4 *puVar8;
int iVar9;
int *piVar10;
IHandleEntity *pIVar11;
undefined4 uVar12;
longdouble lVar13;
longdouble lVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
float *in_stack_00000010;
int in_stack_00000014;
uint local_1cc;
float local_1c8;
float local_1c0;
float local_1b8;
float local_1b4;
undefined4 local_1a4;
undefined4 local_1a0;
undefined4 local_19c;
undefined4 local_198;
int local_194;
float local_190;
float local_18c;
float local_188;
float local_184;
float local_180;
float local_17c;
float local_178;
float local_174;
float local_170;
undefined **local_16c;
float local_168;
float local_164;
int *local_15c;
float local_158;
float local_154;
float local_14c;
float local_148;
float local_144;
float local_13c;
float local_138;
float local_134;
undefined4 local_12c;
undefined1 local_128;
undefined1 local_127;
undefined **local_11c;
float local_118;
float local_114;
int *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;
CGameTrace local_c4 [12];
float local_b8;
float local_b4;
float local_b0;
float local_ac;
float local_a8;
float local_a4;
float local_98;
char local_8d;
int *local_78;
float local_70;
float local_6c;
float local_68;
float local_44;
byte local_39;
local_1a4 = 0;
local_1a0 = 0;
if (_towlower == 0) {
local_194 = 0;
}
else {
(**(code **)(_towlower + 0x50))
(_towlower,&local_1a4,0,0,0,0,
"/data/src/game/server/terror/zombiebot/zombiebotlocomotion.cpp",0x299,
&ResolveCollision(Vector_const&,Vector_const&,int)::tm_fmt,"(%s)%s",
"NextBotExpensive","ZombieBotLocomotion::ResolveCollision");
local_194 = _towlower;
}
iVar7 = _DAT_0105db00;
local_19c = local_1a4;
local_198 = local_1a0;
/* try { // try from 00a53346 to 00a533a6 has its CatchHandler @ 00a54281 */
if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
(iVar9 = ThreadGetCurrentId(), iVar7 == iVar9)) {
if ((char *)*_DAT_0105d15c != "ZombieBotLocomotion::ResolveCollision") {
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd28814,(char *)0x0,0xca957e);
}
puVar1 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar1 = *puVar1 | 4;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
/* try { // try from 00a53267 to 00a532ef has its CatchHandler @ 00a5427f */
piVar5 = (int *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
piVar5 = (int *)(**(code **)(*piVar5 + 0xc4))(piVar5);
if ((piVar5 == (int *)0x0) || (in_stack_00000014 < 0)) {
*(float *)param_1 = *in_stack_00000010;
*(float *)(param_1 + 4) = in_stack_00000010[1];
*(float *)(param_1 + 8) = in_stack_00000010[2];
goto LAB_00a53954;
}
/* try { // try from 00a53bbd to 00a53c1a has its CatchHandler @ 00a5427f */
if (((param_2[0x13c] != (Vector)0x0) &&
(cVar3 = (**(code **)(*piVar5 + 0x100))(piVar5,0), cVar3 == '\0')) &&
(cVar3 = (**(code **)(*piVar5 + 0x100))(piVar5,1), cVar3 == '\0')) {
param_2[0x13c] = (Vector)0x0;
}
if ((param_2[0xe4] == (Vector)0x0) &&
(((*(int *)(param_2 + 0xe8) == 0 || (param_2[0xf0] != (Vector)0x0)) ||
(cVar3 = (**(code **)(*piVar5 + 0xe8))(piVar5,2), cVar3 == '\0')))) {
/* try { // try from 00a533d4 to 00a53459 has its CatchHandler @ 00a5427f */
lVar14 = (longdouble)(**(code **)(*(int *)param_2 + 0x130))(param_2);
pfVar6 = (float *)(**(code **)(*piVar5 + 0x128))(piVar5);
local_188 = (float)lVar14 + pfVar6[2];
local_190 = *pfVar6;
local_18c = pfVar6[1];
iVar7 = *piVar5;
if (param_2[0x13c] == (Vector)0x0) goto LAB_00a532ea;
LAB_00a5342b:
lVar14 = (longdouble)(**(code **)(iVar7 + 0x118))(piVar5);
lVar13 = (longdouble)(**(code **)(*piVar5 + 0x120))(piVar5);
local_17c = (float)lVar13;
bVar2 = true;
local_184 = (float)lVar14 * 0.5;
local_180 = (float)lVar14 * 0.5;
}
else {
pfVar6 = (float *)(**(code **)(*piVar5 + 0x128))(piVar5);
local_190 = *pfVar6;
local_18c = pfVar6[1];
local_188 = pfVar6[2];
iVar7 = *piVar5;
if (param_2[0x13c] != (Vector)0x0) goto LAB_00a5342b;
LAB_00a532ea:
pfVar6 = (float *)(**(code **)(iVar7 + 300))();
local_17c = pfVar6[2];
local_184 = *pfVar6;
local_180 = pfVar6[1];
if (local_188 < local_17c) {
bVar2 = false;
}
else {
local_188 = local_17c - 2.0;
bVar2 = false;
}
}
local_1cc = 0;
local_178 = *in_stack_00000010;
local_174 = in_stack_00000010[1];
local_170 = in_stack_00000010[2];
while (cVar3 = DetectCollision((ZombieBotLocomotion *)param_2,local_c4,&stack0x00000014,
(Vector *)param_3,(Vector *)&local_178,(Vector *)&local_190,
(Vector *)&local_184), cVar3 != '\0') {
if (local_8d == '\0') {
local_1b8 = local_b4;
local_1b4 = local_b8;
local_1c0 = local_b0;
if ((local_174 - local_b4) * (local_174 - local_b4) +
(local_178 - local_b8) * (local_178 - local_b8) +
(local_170 - local_b0) * (local_170 - local_b0) < 1.0) goto LAB_00a53b30;
}
if (bVar2) {
local_1cc = (**(code **)(*piVar5 + 0xf0))(piVar5);
iVar7 = (**(code **)(*local_78 + 0x148))(local_78);
if ((iVar7 == 0) && (cVar3 = (**(code **)(*local_78 + 0x16c))(local_78), cVar3 == '\0')) {
if (local_1cc != 1) {
piVar10 = (int *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
pIVar11 = (IHandleEntity *)(**(code **)(*piVar10 + 0xb4))(piVar10);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_11c,pIVar11,0,IgnoreActorsTraceFilterFunction);
local_11c = &PTR_ShouldHitEntity_00ca96c8;
local_108 = 0.0;
local_10c = piVar10;
lVar14 = (longdouble)(**(code **)(*piVar5 + 0x124))(piVar5);
fVar19 = local_180;
fVar16 = local_184;
uVar12 = (**(code **)(*piVar5 + 0x130))(piVar5);
local_12c = 0;
local_15c = (int *)(local_178 - *(float *)param_3);
local_158 = local_174 - *(float *)(param_3 + 4);
local_154 = local_170 - *(float *)(param_3 + 8);
local_127 = local_158 * local_158 + (float)local_15c * (float)local_15c +
local_154 * local_154 != 0.0;
local_13c = (fVar16 - local_190) * 0.5;
local_138 = (fVar19 - local_18c) * 0.5;
local_134 = ((float)lVar14 - local_188) * 0.5;
local_14c = (local_190 + fVar16) * 0.5;
local_148 = (local_18c + fVar19) * 0.5;
local_144 = (local_188 + (float)lVar14) * 0.5;
local_16c = (undefined **)(*(float *)param_3 + local_14c);
local_14c = -local_14c;
local_164 = *(float *)(param_3 + 8) + local_144;
local_168 = *(float *)(param_3 + 4) + local_148;
local_128 = local_138 * local_138 + local_13c * local_13c + local_134 * local_134 < 1e-06;
local_148 = -local_148;
local_144 = -local_144;
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_16c,uVar12,&local_11c,&local_70);
if ((local_44 < 1.0) || (local_39 != 0)) goto LAB_00a53f1b;
}
}
else {
if (local_1cc != 1) {
LAB_00a537dc:
if (local_8d == '\0') goto LAB_00a534d0;
goto LAB_00a537eb;
}
/* try { // try from 00a53ced to 00a54236 has its CatchHandler @ 00a5425b */
piVar10 = (int *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
pIVar11 = (IHandleEntity *)(**(code **)(*piVar10 + 0xb4))(piVar10);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_16c,pIVar11,0,IgnoreActorsTraceFilterFunction);
local_16c = &PTR_ShouldHitEntity_00ca96c8;
local_158 = 0.0;
local_15c = piVar10;
uVar12 = (**(code **)(*piVar5 + 0x130))(piVar5);
local_dc = 0;
local_108 = local_174 - *(float *)(param_3 + 4);
local_104 = local_170 - *(float *)(param_3 + 8);
local_10c = (int *)(local_178 - *(float *)param_3);
local_d7 = local_104 * local_104 + local_108 * local_108 +
(float)local_10c * (float)local_10c != 0.0;
local_ec = (local_184 - local_190) * 0.5;
local_e8 = (local_180 - local_18c) * 0.5;
local_e4 = (local_17c - local_188) * 0.5;
local_fc = (local_184 + local_190) * 0.5;
local_f8 = (local_180 + local_18c) * 0.5;
local_f4 = (local_17c + local_188) * 0.5;
local_11c = (undefined **)(*(float *)param_3 + local_fc);
local_fc = -local_fc;
local_114 = *(float *)(param_3 + 8) + local_f4;
local_118 = *(float *)(param_3 + 4) + local_f8;
local_d8 = local_e8 * local_e8 + local_ec * local_ec + local_e4 * local_e4 < 1e-06;
local_f8 = -local_f8;
local_f4 = -local_f4;
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_11c,uVar12,&local_16c,&local_70);
if (1.0 <= local_44) {
local_1cc = (uint)local_39;
LAB_00a53f1b:
if (local_1cc != 1) goto LAB_00a537dc;
}
}
lVar14 = (longdouble)(**(code **)(*piVar5 + 0x124))(piVar5);
local_17c = (float)lVar14;
local_1cc = 1;
fVar16 = local_178;
fVar15 = local_174;
local_1c8 = local_170;
}
else {
if (local_8d != '\0') {
LAB_00a537eb:
piVar10 = local_78;
cVar3 = local_8d;
if ((((local_78 != (int *)0x0) && (local_78 != g_WorldEntity)) &&
((iVar7 = __dynamic_cast(local_78,&CBaseEntity::typeinfo,&CPhysicsProp::typeinfo,0),
iVar7 != 0 &&
((iVar7 = __dynamic_cast(piVar10,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0),
iVar7 == 0 && (piVar10 = (int *)piVar10[0x8e], piVar10 != (int *)0x0)))))) &&
(cVar4 = (**(code **)(*piVar10 + 0x2c))(piVar10), cVar3 = local_8d, cVar4 != '\0')) {
if (local_78 == (int *)0x0) {
*(undefined4 *)(param_2 + 0x14c) = 0xffffffff;
}
else {
puVar8 = (undefined4 *)(**(code **)(*local_78 + 0xc))(local_78);
*(undefined4 *)(param_2 + 0x14c) = *puVar8;
}
lVar14 = (longdouble)CountdownTimer::Now();
if ((float)lVar14 + 1.0 != *(float *)(param_2 + 0x148)) {
(**(code **)(*(int *)(param_2 + 0x140) + 4))(param_2 + 0x140,param_2 + 0x148);
*(float *)(param_2 + 0x148) = (float)lVar14 + 1.0;
}
cVar3 = local_8d;
if (*(float *)(param_2 + 0x144) != 1.0) {
(**(code **)(*(int *)(param_2 + 0x140) + 4))(param_2 + 0x140,param_2 + 0x144);
*(undefined4 *)(param_2 + 0x144) = 0x3f800000;
cVar3 = local_8d;
}
}
local_8d = cVar3;
local_1b4 = *(float *)(param_2 + 0x88);
local_1b8 = *(float *)(param_2 + 0x8c);
local_1c0 = *(float *)(param_2 + 0x90);
goto LAB_00a53cd7;
}
LAB_00a534d0:
in_stack_00000014 = in_stack_00000014 + -1;
if (in_stack_00000014 < 1) {
local_1b4 = local_b8;
local_1b8 = local_b4;
local_1c0 = local_b0;
goto LAB_00a53b30;
}
if (local_a4 < 0.0) {
local_a4 = 0.0;
VectorNormalize((Vector *)&local_ac);
}
fVar18 = local_178 - *(float *)param_3;
fVar17 = local_174 - *(float *)(param_3 + 4);
fVar15 = local_170 - *(float *)(param_3 + 8);
fVar19 = 1.0 - local_98;
/* try { // try from 00a5355c to 00a538a6 has its CatchHandler @ 00a5425b */
cVar3 = (**(code **)(*piVar5 + 0xe8))(piVar5,2);
fVar16 = local_a4;
local_1c8 = fVar15;
if (((cVar3 == '\0') &&
(lVar14 = (longdouble)(**(code **)(*(int *)param_2 + 0x154))(param_2),
fVar16 < (float)lVar14)) && (0.0 < fVar15)) {
local_a4 = 0.0;
VectorNormalize((Vector *)&local_ac);
local_1c8 = 0.0;
}
fVar19 = (fVar17 * local_a8 + fVar18 * local_ac + fVar15 * local_a4) * fVar19;
fVar16 = local_ac * fVar19;
fVar15 = local_a8 * fVar19;
fVar19 = fVar19 * local_a4;
this = (INextBot *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
cVar3 = INextBot::IsDebugging(this,0x10);
if (cVar3 != '\0') {
local_6c = local_a8 * 20.0 + local_b4;
local_68 = local_a4 * 20.0 + local_b0;
local_70 = local_ac * 20.0 + local_b8;
/* try { // try from 00a53a4f to 00a53aef has its CatchHandler @ 00a5425b */
NDebugOverlay::Line((Vector *)&local_b8,(Vector *)&local_70,0xff,0,0x96,true,15.0);
}
fVar16 = (fVar18 + *(float *)param_3) - fVar16;
fVar15 = (fVar17 + *(float *)(param_3 + 4)) - fVar15;
local_1c8 = (*(float *)(param_3 + 8) - fVar19) + local_1c8;
local_1b4 = local_b8;
fVar18 = fVar16 - local_b8;
local_1b8 = local_b4;
fVar19 = fVar15 - local_b4;
local_1c0 = local_b0;
fVar17 = local_1c8 - local_b0;
if (fVar19 * fVar19 + fVar18 * fVar18 + fVar17 * fVar17 < 1.0) goto LAB_00a53cd7;
}
local_170 = local_1c8;
local_174 = fVar15;
local_178 = fVar16;
bVar2 = false;
}
local_1b4 = local_178;
local_1b8 = local_174;
local_1c0 = local_170;
LAB_00a53cd7:
if (local_8d == '\0') {
LAB_00a53b30:
*(float *)(param_2 + 0x88) = local_1b4;
*(float *)(param_2 + 0x90) = local_1c0;
*(float *)(param_2 + 0x8c) = local_1b8;
}
if (param_2[0x13c] != (Vector)0x0) {
param_2[0x13c] = (Vector)0x0;
/* try { // try from 00a53c76 to 00a53c98 has its CatchHandler @ 00a5427f */
cVar3 = (**(code **)(*piVar5 + 0x100))(piVar5,local_1cc);
if (cVar3 == '\0') {
(**(code **)(*piVar5 + 0xec))(piVar5,local_1cc);
}
}
*(float *)param_1 = local_1b4;
*(float *)(param_1 + 4) = local_1b8;
*(float *)(param_1 + 8) = local_1c0;
LAB_00a53954:
iVar7 = _DAT_0105db00;
if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
(iVar9 = ThreadGetCurrentId(), iVar7 == iVar9)) {
cVar3 = CVProfNode::ExitScope();
if (cVar3 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
if (local_194 != 0) {
(**(code **)(local_194 + 0x54))(local_194,local_19c,local_198,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.