ZombieBotLocomotion::ClimbUpToLedge
0x00a51700 · 4666 bytes · __cdecl
_ZN19ZombieBotLocomotion14ClimbUpToLedgeERK6VectorS2_PK11CBaseEntity
Decompiled
undefined (3 params)
/* ZombieBotLocomotion::ClimbUpToLedge(Vector const&, Vector const&, CBaseEntity const*) */
char ZombieBotLocomotion::ClimbUpToLedge(Vector *param_1,Vector *param_2,CBaseEntity *param_3)
{
float fVar1;
float fVar2;
code *pcVar3;
undefined4 uVar4;
undefined4 uVar5;
char cVar6;
int *piVar7;
int iVar8;
int *piVar9;
IHandleEntity *pIVar10;
undefined4 uVar11;
float *pfVar12;
float *pfVar13;
Vector *pVVar14;
Vector *pVVar15;
uint uVar16;
bool bVar17;
longdouble lVar18;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float local_1d0;
undefined4 local_1cc;
float local_1a0;
float local_198;
float 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;
float local_16c;
QAngle local_168 [12];
float local_15c;
float local_158;
float local_154;
float local_150;
float local_14c;
float local_148;
undefined **local_144 [4];
int *local_134;
undefined4 local_130;
float local_12c;
float local_128;
float local_124;
undefined4 local_11c;
undefined4 local_118;
float local_114;
float local_10c;
float local_108;
float local_104;
float local_fc;
float local_f8;
float local_f4;
undefined4 local_ec;
undefined1 local_e8;
undefined1 local_e7;
undefined1 local_d0 [24];
float local_b8;
float local_b4;
float local_b0;
float local_a4;
char local_9a;
char local_99;
float local_7c;
float local_78;
float local_74;
float local_6c;
float local_68;
float local_64;
float local_5c;
float local_58;
float local_54;
float local_50;
float local_4c;
undefined4 local_48;
float local_44;
undefined4 local_3c;
undefined1 local_38;
undefined1 local_37;
if (*(int *)(ZombieDebugClimb._28_4_ + 0x30) != 0) {
pVVar14 = (Vector *)(**(code **)(*(int *)param_1 + 300))(param_1);
NDebugOverlay::Cross3D(pVVar14,5.0,0,0xff,0,true,10.0);
NDebugOverlay::Cross3D(param_2,5.0,0,0xff,0,true,10.0);
pVVar14 = (Vector *)(**(code **)(*(int *)param_1 + 300))(param_1);
NDebugOverlay::Line(pVVar14,param_2,0,0xff,0,true,10.0);
local_78 = *(float *)(param_3 + 4) * 10.0 + *(float *)(param_2 + 4);
local_74 = *(float *)(param_3 + 8) * 10.0 + *(float *)(param_2 + 8);
local_7c = *(float *)param_3 * 10.0 + *(float *)param_2;
NDebugOverlay::HorzArrow(param_2,(Vector *)&local_7c,2.0,0,0xff,0,0xff,true,10.0);
}
cVar6 = (**(code **)(*(int *)param_1 + 0xf8))(param_1);
if (cVar6 == '\0') {
return '\0';
}
if (param_1[0xd4] != (Vector)0x0) {
return '\0';
}
piVar7 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
piVar7 = (int *)(**(code **)(*piVar7 + 0xc4))(piVar7);
local_1d0 = *(float *)(param_2 + 8);
iVar8 = (**(code **)(*(int *)param_1 + 300))(param_1);
local_1d0 = local_1d0 - *(float *)(iVar8 + 8);
if (local_1d0 < 30.0) {
local_1d0 = local_1d0 - 24.0;
local_1cc = 0x2ce;
}
else if (42.0 <= local_1d0) {
if (local_1d0 < 54.0) {
local_1d0 = local_1d0 - 48.0;
local_1cc = 0x2d1;
}
else if (66.0 <= local_1d0) {
if (78.0 <= local_1d0) {
if (90.0 <= local_1d0) {
if (102.0 <= local_1d0) {
if (114.0 <= local_1d0) {
if (126.0 <= local_1d0) {
if (138.0 <= local_1d0) {
if (150.0 <= local_1d0) {
if (162.0 <= local_1d0) {
local_1d0 = local_1d0 - 168.0;
local_1cc = 0x2e1;
}
else {
local_1d0 = local_1d0 - 156.0;
local_1cc = 0x2df;
}
}
else {
local_1d0 = local_1d0 - 144.0;
local_1cc = 0x2dd;
}
}
else {
local_1d0 = local_1d0 - 132.0;
local_1cc = 0x2dc;
}
}
else {
local_1d0 = local_1d0 - 120.0;
local_1cc = 0x2da;
}
}
else {
local_1d0 = local_1d0 - 108.0;
local_1cc = 0x2d8;
}
}
else {
local_1d0 = local_1d0 - 96.0;
local_1cc = 0x2d7;
}
}
else {
local_1d0 = local_1d0 - 84.0;
local_1cc = 0x2d6;
}
}
else {
local_1d0 = local_1d0 - 72.0;
local_1cc = 0x2d5;
}
}
else {
local_1d0 = local_1d0 - 60.0;
local_1cc = 0x2d3;
}
}
else {
local_1d0 = local_1d0 - 36.0;
local_1cc = 0x2cf;
}
lVar18 = (longdouble)(**(code **)(*piVar7 + 0x118))(piVar7);
fVar2 = (float)lVar18;
lVar18 = (longdouble)(**(code **)(*(int *)param_1 + 0x130))(param_1);
local_198 = -1.0;
local_194 = -1.0;
local_190 = (float)lVar18 + 0.1;
fVar19 = *(float *)(param_2 + 8);
iVar8 = (**(code **)(*(int *)param_1 + 300))(param_1);
local_18c = 1.0;
local_188 = 1.0;
fVar19 = fVar19 - *(float *)(iVar8 + 8);
local_184 = fVar19;
if (fVar19 < local_190) {
local_184 = local_190;
local_190 = fVar19;
}
piVar9 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
pIVar10 = (IHandleEntity *)(**(code **)(*piVar9 + 0xb4))(piVar9);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_144,pIVar10,0,IgnoreActorsTraceFilterFunction);
local_99 = '\x01';
local_144[0] = &PTR_ShouldHitEntity_00ca96c8;
fVar19 = fVar2 * 3.0;
local_130 = 0;
local_134 = piVar9;
iVar8 = (**(code **)(*(int *)param_1 + 300))(param_1);
local_178 = *(float *)(iVar8 + 8);
local_17c = *(float *)(param_2 + 4);
local_180 = *(float *)param_2;
if (0.0 <= fVar19) {
local_1a0 = 0.0;
fVar21 = fVar2 * 10.0;
do {
if (local_99 == '\0') {
if (local_a4 < 1.0) {
if (fVar19 < local_1a0) break;
}
else {
if (local_9a == '\0') goto LAB_00a519a0;
if ((fVar19 < local_1a0) || (local_9a == '\0')) break;
}
local_16c = 0.0;
VectorNormalize((Vector *)&local_174);
local_1a0 = 0.0;
goto LAB_00a51e59;
}
LAB_00a519a0:
uVar11 = (**(code **)(*piVar7 + 0x130))(piVar7);
fVar20 = *(float *)param_3;
fVar22 = *(float *)(param_3 + 4);
fVar1 = *(float *)(param_3 + 8);
pfVar12 = (float *)(**(code **)(*(int *)param_1 + 300))(param_1);
local_7c = local_180 - *(float *)param_3 * local_1a0;
local_3c = 0;
local_78 = local_17c - *(float *)(param_3 + 4) * local_1a0;
local_6c = (fVar20 * fVar21 + *pfVar12) - local_7c;
local_68 = (fVar22 * fVar21 + pfVar12[1]) - local_78;
local_74 = local_178 - *(float *)(param_3 + 8) * local_1a0;
local_64 = (fVar21 * fVar1 + pfVar12[2]) - local_74;
local_37 = local_68 * local_68 + local_64 * local_64 + local_6c * local_6c != 0.0;
local_58 = (local_188 + local_194) * 0.5;
local_48 = (local_188 - local_194) * 0.5;
local_4c = (local_18c - local_198) * 0.5;
local_78 = local_78 + local_58;
local_44 = (local_184 - local_190) * 0.5;
local_5c = (local_18c + local_198) * 0.5;
local_54 = (local_184 + local_190) * 0.5;
local_74 = local_74 + local_54;
local_38 = local_48 * local_48 + local_4c * local_4c + local_44 * local_44 < 1e-06;
local_7c = local_7c + local_5c;
local_5c = -local_5c;
local_58 = -local_58;
local_54 = -local_54;
(**(code **)(*enginetrace + 0x14))(enginetrace,(Vector *)&local_7c,uVar11,local_144,local_d0);
local_174 = local_b8;
local_170 = local_b4;
local_16c = local_b0;
if (*(int *)(ZombieDebugClimb._28_4_ + 0x30) != 0) {
bVar17 = local_99 == '\0';
fVar20 = *(float *)param_3;
fVar22 = *(float *)(param_3 + 4);
fVar1 = *(float *)(param_3 + 8);
pfVar12 = (float *)(**(code **)(*(int *)param_1 + 300))(param_1);
local_7c = fVar20 * fVar21 + *pfVar12;
local_78 = fVar22 * fVar21 + pfVar12[1];
local_74 = fVar21 * fVar1 + pfVar12[2];
local_12c = local_180 - local_1a0 * *(float *)param_3;
local_128 = local_17c - *(float *)(param_3 + 4) * local_1a0;
local_124 = local_178 - *(float *)(param_3 + 8) * local_1a0;
NDebugOverlay::SweptBox
((Vector *)&local_12c,(Vector *)&local_7c,(Vector *)&local_198,
(Vector *)&local_18c,(QAngle *)&vec3_angle,~-(uint)bVar17 & 0xff,0xff,0,0xff,15.0
);
}
local_1a0 = local_1a0 + fVar2 * 0.5;
} while (local_1a0 <= fVar19);
}
cVar6 = INextBot::IsDebugging((INextBot *)(*(int *)(param_1 + 0x78) + 0x1a3c),4);
if (cVar6 != '\0') {
DevMsg("%3.2f: Can\'t find climb surface normal\n",(double)*(float *)(gpGlobals + 0xc));
}
uVar5 = DAT_01053d50;
uVar4 = DAT_01053d4c;
uVar11 = vec3_origin;
*(undefined4 *)(param_1 + 0x6c) = vec3_origin;
*(undefined4 *)(param_1 + 0x70) = uVar4;
*(undefined4 *)(param_1 + 0x74) = uVar5;
*(undefined4 *)(param_1 + 0x94) = uVar11;
*(undefined4 *)(param_1 + 0x98) = uVar4;
*(undefined4 *)(param_1 + 0x9c) = uVar5;
return '\0';
LAB_00a51e59:
uVar11 = (**(code **)(*piVar7 + 0x130))(piVar7);
pfVar12 = (float *)(**(code **)(*piVar7 + 300))(piVar7);
lVar18 = (longdouble)(**(code **)(*(int *)param_1 + 0x130))(param_1);
pfVar13 = (float *)(**(code **)(*piVar7 + 0x128))(piVar7);
local_11c = 0;
local_118 = 0;
local_ec = 0;
fVar21 = (float)lVar18 + pfVar13[2] + 0.1;
local_124 = local_16c * local_1a0 + local_178;
local_114 = *(float *)(param_2 + 8) - local_124;
local_e7 = local_114 * local_114 != 0.0;
local_fc = (*pfVar12 - *pfVar13) * 0.5;
local_f8 = (pfVar12[1] - pfVar13[1]) * 0.5;
local_f4 = (pfVar12[2] - fVar21) * 0.5;
local_e8 = local_f8 * local_f8 + local_fc * local_fc + local_f4 * local_f4 < 1e-06;
fVar22 = (*pfVar13 + *pfVar12) * 0.5;
fVar20 = (pfVar13[1] + pfVar12[1]) * 0.5;
local_10c = -fVar22;
local_12c = local_180 + fVar22 + local_174 * local_1a0;
local_104 = (fVar21 + pfVar12[2]) * 0.5;
local_108 = -fVar20;
local_128 = local_17c + fVar20 + local_170 * local_1a0;
local_124 = local_124 + local_104;
local_104 = -local_104;
(**(code **)(*enginetrace + 0x14))(enginetrace,(Vector *)&local_12c,uVar11,local_144,&local_7c);
if (*(int *)(ZombieDebugClimb._28_4_ + 0x30) != 0) {
uVar16 = 0xff;
if ((1.0 <= local_50) && (local_48._2_1_ == '\0')) {
uVar16 = ~-(uint)(local_48._3_1_ == '\0') & 0xff;
}
pVVar14 = (Vector *)(**(code **)(*piVar7 + 300))(piVar7);
pVVar15 = (Vector *)(**(code **)(*piVar7 + 0x128))(piVar7);
local_128 = local_170 * local_1a0 + local_17c;
local_124 = *(float *)(param_2 + 8);
local_12c = local_174 * local_1a0 + local_180;
local_148 = local_b0 * local_1a0 + local_178;
local_14c = local_b4 * local_1a0 + local_17c;
local_150 = local_1a0 * local_b8 + local_180;
NDebugOverlay::SweptBox
((Vector *)&local_150,(Vector *)&local_12c,pVVar15,pVVar14,(QAngle *)&vec3_angle,
uVar16,0,0xff,0xff,15.0);
}
if (((1.0 <= local_50) && (local_48._2_1_ == '\0')) && (local_48._3_1_ == '\0')) {
local_180 = local_1a0 * local_174 + local_180;
local_17c = local_1a0 * local_170 + local_17c;
local_178 = local_1a0 * local_16c + local_178;
goto LAB_00a52282;
}
local_1a0 = local_1a0 + fVar2 * 0.25;
if (fVar19 < local_1a0) {
LAB_00a52282:
local_12c = -local_174;
local_128 = -local_170;
local_124 = -local_16c;
VectorAngles((Vector *)&local_12c,local_168);
CBaseEntity::SetAbsAngles(*(CBaseEntity **)(param_1 + 0x78),local_168);
local_15c = local_180;
local_158 = local_17c;
local_154 = local_1d0 + local_178;
(**(code **)(*(int *)param_1 + 0xb8))(param_1,&local_15c);
cVar6 = INextBot::IsDebugging((INextBot *)(*(int *)(param_1 + 0x78) + 0x1a3c),4);
if (cVar6 != '\0') {
local_128 = local_170 * 25.0 + local_17c;
local_124 = local_16c * 25.0 + local_178;
local_12c = local_174 * 25.0 + local_180;
NDebugOverlay::HorzArrow
((Vector *)&local_180,(Vector *)&local_12c,2.0,0xff,0xff,0,0xff,true,15.0);
local_12c = 0.0;
local_128 = -1.0;
local_124 = 0.0;
local_150 = 1.0;
local_14c = 0.0;
local_148 = 0.0;
NDebugOverlay::Circle
((Vector *)&local_180,(Vector *)&local_150,(Vector *)&local_12c,3.0,0xff,0,0,0xff,
true,15.0);
}
cVar6 = (**(code **)(*piVar7 + 0xd8))(piVar7,local_1cc,0xb);
if (cVar6 == '\0') {
return '\0';
}
param_1[0xc0] = (Vector)0x1;
param_1[0xd4] = (Vector)0x1;
*(undefined4 *)(param_1 + 0xd8) = *(undefined4 *)param_2;
*(undefined4 *)(param_1 + 0xdc) = *(undefined4 *)(param_2 + 4);
*(undefined4 *)(param_1 + 0xe0) = *(undefined4 *)(param_2 + 8);
(**(code **)(*piVar7 + 0xec))(piVar7,1);
piVar7 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
pcVar3 = *(code **)(*piVar7 + 0x14);
uVar11 = CBaseEntity::GetGroundEntity(*(CBaseEntity **)(param_1 + 0x78));
(*pcVar3)(piVar7,uVar11);
return cVar6;
}
goto LAB_00a51e59;
}
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.