CTerrorGameMovement::CheckForLedge
0x008e4bd0 · 6306 bytes · __thiscall
_ZN19CTerrorGameMovement13CheckForLedgeERK6Vectorff
Decompiled
undefined (4 params)
/* CTerrorGameMovement::CheckForLedge(Vector const&, float, float) */
undefined4 __thiscall
CTerrorGameMovement::CheckForLedge
(CTerrorGameMovement *this,Vector *param_1,float param_2,float param_3)
{
int *piVar1;
CBaseEntity *pCVar2;
char cVar3;
int iVar4;
int iVar5;
int iVar6;
undefined4 uVar7;
int iVar8;
Vector *pVVar9;
Vector *pVVar10;
uint uVar11;
TerrorNavArea *pTVar12;
float *pfVar13;
byte bVar14;
float fVar15;
int local_16c;
QAngle *local_168;
float local_164;
float local_160 [3];
float local_154;
float local_150;
float local_14c;
float local_148;
float local_144;
float local_140;
float local_13c;
float local_138;
float local_134;
float local_130;
float local_12c;
float local_128;
undefined4 local_124;
undefined4 local_120;
float local_11c;
float local_118;
float local_114;
float local_110;
float local_10c;
float local_108;
float local_104;
undefined4 local_100;
undefined4 local_fc;
undefined4 local_f8;
undefined4 local_f4;
undefined4 local_f0;
undefined4 local_ec;
Vector local_e8 [12];
undefined **local_dc [4];
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;
float local_70;
float local_6c;
float local_68;
float local_64;
float local_60;
float local_5c;
undefined4 local_58;
undefined4 local_54;
float local_50;
float local_44;
char local_39;
CBaseEntity *local_24;
bVar14 = 0;
iVar4 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)(this + 0x810));
cVar3 = IsASurvivorTeam(iVar4);
if (cVar3 == '\0') {
pCVar2 = *(CBaseEntity **)(this + 0x810);
iVar4 = CBaseEntity::GetTeamNumber(pCVar2);
if (iVar4 != 3) {
return 0;
}
iVar4 = (**(code **)(*(int *)pCVar2 + 0x544))(pCVar2);
if (iVar4 != 2) {
return 0;
}
}
if (*(float *)(param_1 + 8) <= -400.0 && *(float *)(param_1 + 8) != -400.0) {
return 0;
}
local_14c = 0.0;
local_154 = *(float *)param_1;
local_150 = *(float *)(param_1 + 4);
if ((((-0.01 < local_154) && (local_154 < 0.01)) && (-0.01 < local_150)) && (local_150 < 0.01)) {
return 0;
}
VectorNormalize((Vector *)&local_154);
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
iVar4 = *(int *)(this + 8);
local_70 = local_154 * 100.0 + *(float *)(iVar4 + 0x9c);
local_6c = local_150 * 100.0 + *(float *)(iVar4 + 0xa0);
local_68 = local_14c * 100.0 + *(float *)(iVar4 + 0xa4);
NDebugOverlay::HorzArrow
((Vector *)(iVar4 + 0x9c),(Vector *)&local_70,1.0,0,0,0xff,0xff,true,1000.0);
}
iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar6 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_dc,*(IHandleEntity **)(this + 4),8,
(_func_bool_IHandleEntity_ptr_int *)0x0);
iVar4 = *(int *)(this + 8);
local_dc[0] = &PTR_ShouldHitEntity_00c54558;
local_144 = *(float *)(iVar4 + 0xa0);
local_140 = *(float *)(iVar4 + 0xa4);
local_148 = *(float *)(iVar4 + 0x9c);
local_138 = local_144 - param_3 * local_150;
local_134 = local_140 - param_3 * local_14c;
local_13c = local_148 - param_3 * local_154;
uVar7 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
local_8c = 0;
local_bc = local_13c - local_148;
local_b4 = local_134 - local_140;
*(int *)(this + 2000) = *(int *)(this + 2000) + 1;
local_b8 = local_138 - local_144;
local_87 = local_b4 * local_b4 + local_bc * local_bc + local_b8 * local_b8 != 0.0;
local_9c = (*(float *)(iVar4 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
local_98 = (*(float *)(iVar4 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
local_94 = (*(float *)(iVar4 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
local_ac = (*(float *)(iVar4 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
local_cc = local_148 + local_ac;
local_a8 = (*(float *)(iVar4 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
local_ac = -local_ac;
piVar1 = *(int **)(this + 0x7cc);
local_a4 = (*(float *)(iVar4 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
local_c8 = local_144 + local_a8;
local_a8 = -local_a8;
local_c4 = local_140 + local_a4;
local_a4 = -local_a4;
if (piVar1 != (int *)0x0) {
cVar3 = (**(code **)(*piVar1 + 0x10))(piVar1,&local_cc);
if (cVar3 != '\0') {
(**(code **)(*enginetrace + 0x20))
(enginetrace,&local_cc,*(undefined4 *)(this + 0x7cc),uVar7,
(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
goto LAB_008e4fb2;
}
}
local_168 = (QAngle *)&local_cc;
(**(code **)(*enginetrace + 0x14))
(enginetrace,local_168,uVar7,(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
LAB_008e4fb2:
local_168 = (QAngle *)&local_cc;
if ((local_39 == '\0') && (local_44 != 1.0)) {
iVar4 = *(int *)(this + 8);
local_140 = *(float *)(iVar4 + 0xa4);
local_148 = *(float *)(iVar4 + 0x9c);
local_144 = *(float *)(iVar4 + 0xa0);
local_134 = local_140 - param_2;
local_13c = local_148;
local_138 = local_144;
uVar7 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
local_8c = 0;
local_bc = local_13c - local_148;
local_b8 = local_138 - local_144;
*(int *)(this + 2000) = *(int *)(this + 2000) + 1;
local_b4 = local_134 - local_140;
local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 != 0.0;
local_9c = (*(float *)(iVar4 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
local_98 = (*(float *)(iVar4 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
local_94 = (*(float *)(iVar4 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
local_ac = (*(float *)(iVar4 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
local_cc = local_148 + local_ac;
local_a8 = (*(float *)(iVar4 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
local_ac = -local_ac;
piVar1 = *(int **)(this + 0x7cc);
local_a4 = (*(float *)(iVar4 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
local_c8 = local_144 + local_a8;
local_a8 = -local_a8;
local_c4 = local_140 + local_a4;
local_a4 = -local_a4;
if ((piVar1 == (int *)0x0) ||
(cVar3 = (**(code **)(*piVar1 + 0x10))(piVar1,local_168), cVar3 == '\0')) {
(**(code **)(*enginetrace + 0x14))
(enginetrace,local_168,uVar7,(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
}
else {
(**(code **)(*enginetrace + 0x20))
(enginetrace,local_168,*(undefined4 *)(this + 0x7cc),uVar7,
(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
}
if ((local_39 == '\0') && (1.0 <= local_44)) {
local_16c = 0;
local_130 = local_64;
local_12c = local_60;
local_128 = local_5c;
do {
iVar4 = *(int *)(this + 8);
local_144 = *(float *)(iVar4 + 0xa0);
local_140 = *(float *)(iVar4 + 0xa4);
local_148 = *(float *)(iVar4 + 0x9c);
local_138 = local_144 - param_3 * local_150;
local_13c = local_148 - param_3 * local_154;
local_134 = (local_140 - param_3 * local_14c) - (float)local_16c * param_2;
uVar7 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
local_8c = 0;
local_bc = local_13c - local_148;
local_b8 = local_138 - local_144;
*(int *)(this + 2000) = *(int *)(this + 2000) + 1;
local_b4 = local_134 - local_140;
local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 != 0.0;
local_9c = (*(float *)(iVar4 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
local_98 = (*(float *)(iVar4 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
local_94 = (*(float *)(iVar4 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
local_88 = local_9c * local_9c + local_98 * local_98 + local_94 * local_94 < 1e-06;
local_ac = (*(float *)(iVar4 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
local_cc = local_148 + local_ac;
local_a8 = (*(float *)(iVar4 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
local_ac = -local_ac;
piVar1 = *(int **)(this + 0x7cc);
local_c8 = local_144 + local_a8;
local_a8 = -local_a8;
local_a4 = (*(float *)(iVar4 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
local_c4 = local_140 + local_a4;
local_a4 = -local_a4;
if ((piVar1 == (int *)0x0) ||
(cVar3 = (**(code **)(*piVar1 + 0x10))(piVar1,local_168), cVar3 == '\0')) {
(**(code **)(*enginetrace + 0x14))
(enginetrace,local_168,uVar7,(CTraceFilterSimple *)local_dc,(Vector *)&local_70)
;
}
else {
(**(code **)(*enginetrace + 0x20))
(enginetrace,local_168,*(undefined4 *)(this + 0x7cc),uVar7,
(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
}
if ((local_39 == '\0') && (local_44 < 1.0)) goto LAB_008e57a6;
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
NDebugOverlay::SweptBox
((Vector *)&local_70,(Vector *)&local_64,(Vector *)(iVar8 + 0xc),
(Vector *)(iVar4 + 0x18),(QAngle *)&vec3_angle,0xff,0,0x80,100,1000.0);
}
local_16c = local_16c + 1;
} while (local_16c != 3);
if (local_39 == '\0') {
LAB_008e57a6:
if ((local_44 != 1.0) &&
(cVar3 = IsAbleToGrabEntity(local_24), pCVar2 = local_24, cVar3 != '\0')) {
local_124 = local_58;
local_120 = local_54;
local_11c = local_50;
local_118 = local_64;
local_114 = local_60;
local_110 = local_5c;
if (local_24 != (CBaseEntity *)0x0) {
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::Cross3D
((Vector *)(*(int *)(this + 0x810) + 0x289c),10.0,0,0xff,0,true,1000.0);
NDebugOverlay::Cross3D((Vector *)&local_64,16.0,0xff,0,0,true,1000.0);
}
local_140 = local_110;
local_134 = local_110 + 64.0;
pVVar9 = (Vector *)(iVar5 + 0x24);
local_13c = local_118;
local_138 = local_114;
local_148 = local_118;
local_144 = local_114;
pVVar10 = (Vector *)(iVar6 + 0x30);
uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
CGameMovement::GameMovementTraceHull
((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
(Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
(ITraceFilter *)local_dc,(CGameTrace *)&local_70);
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::SweptBox
((Vector *)&local_70,(Vector *)&local_64,pVVar9,pVVar10,
(QAngle *)&vec3_angle,0xff,0,0,100,1000.0);
}
if (local_44 != 1.0) {
local_148 = *(float *)(*(int *)(this + 8) + 0x9c);
local_144 = *(float *)(*(int *)(this + 8) + 0xa0);
local_13c = local_148;
local_138 = local_144;
uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
CGameMovement::GameMovementTraceHull
((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
(Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
(ITraceFilter *)local_dc,(CGameTrace *)&local_70);
if ((local_39 != '\0') || (local_44 != 1.0)) {
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) == 0) {
return 0;
}
NDebugOverlay::SweptBox
((Vector *)&local_70,(Vector *)&local_64,pVVar9,pVVar10,
(QAngle *)&vec3_angle,0xff,0,0,100,1000.0);
return 0;
}
}
local_144 = local_60;
local_148 = local_64;
local_140 = local_5c;
local_138 = local_60 - local_150 * 32.0;
local_134 = local_5c - local_14c * 32.0;
local_13c = local_64 - local_154 * 32.0;
uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
CGameMovement::GameMovementTraceHull
((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
(Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
(ITraceFilter *)local_dc,(CGameTrace *)&local_70);
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::SweptBox
((Vector *)&local_70,(Vector *)&local_64,pVVar9,pVVar10,
(QAngle *)&vec3_angle,0,0xff,0x80,100,1000.0);
NDebugOverlay::SweptBox
((Vector *)&local_148,(Vector *)&local_13c,pVVar9,pVVar10,
(QAngle *)&vec3_angle,0xff,0x7f,0,0,100.0);
}
if ((local_39 == '\0') && (0.1 <= local_44)) {
local_140 = local_5c;
local_134 = local_5c - 65.0;
local_13c = local_64;
local_138 = local_60;
local_148 = local_64;
local_144 = local_60;
uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
CGameMovement::GameMovementTraceHull
((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
(Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
(ITraceFilter *)local_dc,(CGameTrace *)&local_70);
if ((local_39 == '\0') &&
(((local_44 != 1.0 && (0.7 <= local_50)) &&
(cVar3 = IsAbleToGrabEntity(local_24), cVar3 != '\0')))) {
local_10c = local_64;
local_108 = local_60;
local_104 = local_5c;
iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
local_100 = 0xc1000000;
local_fc = 0xc1000000;
local_f8 = 0;
local_110 = local_5c - *(float *)(iVar4 + 0x20);
local_148 = local_118;
local_144 = local_114;
local_140 = local_104;
local_134 = local_104 - 60.0;
local_13c = local_118;
local_138 = local_114;
local_f4 = 0x41000000;
local_f0 = 0x41000000;
local_ec = 0x3f800000;
uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
CGameMovement::GameMovementTraceHull
((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
(Vector *)&local_100,(Vector *)&local_f4,uVar11,(ITraceFilter *)local_dc,
(CGameTrace *)&local_70);
if (local_39 == '\0') {
if ((1.0 <= local_44) || (local_50 < 0.7)) {
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::SweptBox
((Vector *)&local_148,(Vector *)&local_13c,(Vector *)&local_100,
(Vector *)&local_f4,(QAngle *)&vec3_angle,0,0xff,0,10,1000.0);
}
pTVar12 = (TerrorNavArea *)
CNavMesh::GetNearestNavArea
(TheNavMesh,(Vector *)&local_118,true,120.0,false,false,
false);
if ((pTVar12 != (TerrorNavArea *)0x0) &&
(0.0 < *(float *)(pTVar12 + 0x158) || *(float *)(pTVar12 + 0x158) == 0.0)) {
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::HorzArrow
((Vector *)&local_118,(Vector *)(pTVar12 + 0x2c),5.0,0xff,0,0,0xff
,true,30.0);
DevMsg("nearby area is %d\n",*(undefined4 *)(pTVar12 + 0x8c));
}
pfVar13 = &local_118;
pVVar9 = local_e8;
for (iVar4 = 3; iVar4 != 0; iVar4 = iVar4 + -1) {
*(float *)pVVar9 = *pfVar13;
pfVar13 = pfVar13 + (uint)bVar14 * -2 + 1;
pVVar9 = pVVar9 + ((uint)bVar14 * -2 + 1) * 4;
}
VectorAngles((Vector *)&local_124,local_168);
for (; 90.0 < local_c8; local_c8 = local_c8 - 90.0) {
}
sincosf(local_c8 * 0.017453292,local_160,&local_164);
fVar15 = (float)(~-(uint)(local_160[0] < local_164) &
(uint)(1.0 - local_160[0]) |
(uint)(1.0 - local_164) & -(uint)(local_160[0] < local_164));
iVar4 = *(int *)(*(CTerrorPlayer **)(this + 0x810) + 0x2ba0);
local_118 = (local_10c - local_118) * fVar15 + local_118;
local_114 = (local_108 - local_114) * fVar15 + local_114;
if (iVar4 == 1) {
local_110 = local_110 + 8.0;
}
else if (iVar4 == 3) {
local_110 = local_110 + 3.0;
}
CTerrorPlayer::SetGrabTarget
(*(CTerrorPlayer **)(this + 0x810),(Vector *)&local_118,
(Vector *)&local_10c,local_e8,(Vector *)&local_124,
(Vector *)&local_130,pCVar2,pTVar12);
return 2;
}
if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::Sphere((Vector *)&local_118,120.0,0xff,0,0,true,1000.0);
NDebugOverlay::Cross((Vector *)&local_118,120.0,0xff,0,0x80,true,1000.0);
}
}
else if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::SweptBox
((Vector *)&local_148,(Vector *)&local_13c,(Vector *)&local_100,
(Vector *)&local_f4,(QAngle *)&vec3_angle,0xff,0,0,10,1000.0);
return 0;
}
}
else if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::Box((Vector *)&local_148,(Vector *)&local_100,(Vector *)&local_f4,
0xff,0,0,10,1000.0);
return 0;
}
}
}
}
}
}
}
}
else if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
NDebugOverlay::HorzArrow
((Vector *)&local_148,(Vector *)&local_13c,2.0,0xff,0,0,0x14,true,1000.0);
return 0;
}
return 0;
}
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.