PlayerLocomotion::Approach
0x0076d810 · 3274 bytes · __cdecl
_ZN16PlayerLocomotion8ApproachERK6Vectorf
Decompiled
undefined (2 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* PlayerLocomotion::Approach(Vector const&, float) */
void PlayerLocomotion::Approach(Vector *param_1,float param_2)
{
uint *puVar1;
CTerrorPlayer *pCVar2;
CBaseEntity *pCVar3;
char cVar4;
INextBot *pIVar5;
Vector *pVVar6;
int iVar7;
int *piVar8;
float *pfVar9;
int iVar10;
int *piVar11;
CBasePlayer *this;
longdouble lVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
undefined4 uVar19;
float local_84;
float local_80;
float local_7c;
float local_74;
CBaseEntity *local_70;
undefined4 local_64;
undefined4 local_60;
undefined4 local_58;
undefined4 local_54;
int local_50;
float local_4c;
float local_48;
float local_40;
float local_3c;
float local_38;
float local_34;
float local_30;
float local_2c;
float local_28;
float local_24;
float local_20;
local_64 = 0;
local_60 = 0;
if (_towlower == 0) {
local_50 = 0;
}
else {
(**(code **)(_towlower + 0x50))
(_towlower,&local_64,0,0,0,0,
"/data/src/game/server/nextbot/player/nextbotplayerlocomotion.cpp",0x1d7,
&Approach(Vector_const&,float)::tm_fmt,"(%s)%s","NextBot",
"PlayerLocomotion::Approach");
local_50 = _towlower;
}
iVar7 = _DAT_0105db00;
local_58 = local_64;
local_54 = local_60;
/* try { // try from 0076db16 to 0076db76 has its CatchHandler @ 0076e55d */
if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
(iVar10 = ThreadGetCurrentId(), iVar7 == iVar10)) {
if ((char *)*_DAT_0105d15c != "PlayerLocomotion::Approach") {
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xcaaf2b,(char *)0x0,0xca8906);
}
puVar1 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar1 = *puVar1 | 4;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
uVar19 = 0x3f800000;
/* try { // try from 0076d8d9 to 0076daa9 has its CatchHandler @ 0076e53c */
ILocomotion::Approach(param_1,param_2);
(**(code **)(*(int *)param_1 + 0x17c))(param_1,param_2,uVar19);
pIVar5 = (INextBot *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
cVar4 = INextBot::IsDebugging(pIVar5,0x10);
if (cVar4 != '\0') {
pVVar6 = (Vector *)(**(code **)(*(int *)param_1 + 300))(param_1);
NDebugOverlay::Line(pVVar6,(Vector *)param_2,0xff,0xff,0,true,0.1);
}
iVar7 = (**(code **)(*(int *)param_1 + 0xb0))(param_1);
if ((iVar7 == 0) ||
(piVar8 = (int *)__dynamic_cast(iVar7,&INextBot::typeinfo,&INextBotPlayerInput::typeinfo,
0xfffffffe), piVar8 == (int *)0x0)) {
DevMsg("PlayerLocomotion::Approach: No INextBotPlayerInput\n ");
LAB_0076daaa:
iVar7 = _DAT_0105db00;
if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
(iVar10 = ThreadGetCurrentId(), iVar7 == iVar10)) {
cVar4 = CVProfNode::ExitScope();
if (cVar4 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
if (local_50 == 0) {
return;
}
(**(code **)(local_50 + 0x54))(local_50,local_58,local_54,0,0,0);
return;
}
CBasePlayer::EyeVectors
(*(CBasePlayer **)(param_1 + 0x6c),(Vector *)&local_4c,(Vector *)0x0,(Vector *)0x0);
local_7c = SQRT(local_48 * local_48 + local_4c * local_4c);
if (local_7c == 0.0) {
local_7c = 0.0;
local_80 = 0.0;
local_84 = -0.0;
}
else {
local_7c = 1.0 / local_7c;
local_80 = local_4c * local_7c;
local_7c = local_7c * local_48;
local_84 = -local_80;
}
pfVar9 = (float *)(**(code **)(*(int *)param_1 + 300))(param_1);
fVar14 = *(float *)param_2 - *pfVar9;
fVar13 = *(float *)((int)param_2 + 4) - pfVar9[1];
fVar15 = SQRT(fVar14 * fVar14 + fVar13 * fVar13);
if (fVar15 == 0.0) {
local_74 = 0.0;
local_70 = (CBaseEntity *)0x0;
}
else {
fVar14 = fVar14 * (1.0 / fVar15);
fVar13 = fVar13 * (1.0 / fVar15);
local_70 = (CBaseEntity *)(local_80 * fVar14 + local_7c * fVar13);
local_74 = fVar14 * local_7c + fVar13 * local_84;
}
pCVar2 = *(CTerrorPlayer **)(param_1 + 0x6c);
this = (CBasePlayer *)0x0;
if (pCVar2 != (CTerrorPlayer *)0x0) {
cVar4 = (**(code **)(*(int *)pCVar2 + 0x16c))(pCVar2);
if (cVar4 != '\0') {
uVar19 = CMultiPlayerAnimState::GetMainActivity(*(CMultiPlayerAnimState **)(pCVar2 + 0x2910));
cVar4 = CTerrorPlayer::IsMotionControlledZ(pCVar2,uVar19);
if (cVar4 != '\0') {
(**(code **)(*piVar8 + 0x48))(piVar8,0xbf800000);
goto LAB_0076daaa;
}
}
this = *(CBasePlayer **)(param_1 + 0x6c);
}
/* try { // try from 0076db8e to 0076dc13 has its CatchHandler @ 0076e53c */
cVar4 = CBasePlayer::IsOnLadder(this);
if (((cVar4 != '\0') && (cVar4 = (**(code **)(*(int *)param_1 + 0x114))(param_1), cVar4 != '\0'))
&& (*(int *)(param_1 + 0xa4) - 3U < 2)) {
(**(code **)(*piVar8 + 0x20))(piVar8,0xbf800000);
iVar7 = *(int *)(param_1 + 0xa8);
if (iVar7 != 0) {
pVVar6 = (Vector *)(**(code **)(*(int *)param_1 + 300))(param_1);
CalcClosestPointOnLine
(pVVar6,(Vector *)(iVar7 + 0x10),(Vector *)(iVar7 + 4),(Vector *)&local_40,
(float *)0x0);
iVar7 = *(int *)(param_1 + 0xa8);
local_34 = *(float *)(iVar7 + 4) - *(float *)(iVar7 + 0x10);
local_30 = *(float *)(iVar7 + 8) - *(float *)(iVar7 + 0x14);
local_2c = *(float *)(iVar7 + 0xc) - *(float *)(iVar7 + 0x18);
VectorNormalize((Vector *)&local_34);
iVar7 = *(int *)(param_1 + 0xa8);
fVar18 = *(float *)(iVar7 + 0x44) * local_34 - *(float *)(iVar7 + 0x40) * local_30;
fVar17 = *(float *)(iVar7 + 0x40) * local_2c - local_34 * *(float *)(iVar7 + 0x48);
fVar16 = *(float *)(iVar7 + 0x48) * local_30 - *(float *)(iVar7 + 0x44) * local_2c;
pfVar9 = (float *)(**(code **)(*(int *)param_1 + 300))(param_1);
local_28 = *pfVar9 - local_40;
fVar14 = local_28 * fVar16;
local_24 = pfVar9[1] - local_3c;
fVar15 = local_24 * fVar17;
local_20 = pfVar9[2] - local_38;
fVar13 = local_20 * fVar18;
VectorNormalize((Vector *)&local_28);
piVar11 = (int *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
piVar11 = (int *)(**(code **)(*piVar11 + 0xc4))(piVar11);
lVar12 = (longdouble)(**(code **)(*piVar11 + 0x118))(piVar11);
if ((float)lVar12 * 0.25 + 5.0 < fVar13 + fVar14 + fVar15) {
if (fVar17 * local_24 + fVar16 * local_28 + fVar18 * local_20 <= 0.0) {
(**(code **)(*piVar8 + 0x38))(piVar8,0xbf800000);
}
else {
(**(code **)(*piVar8 + 0x30))();
}
}
}
goto LAB_0076dbf5;
}
if ((*(int *)(NextBotPlayerMoveDirect._28_4_ + 0x30) != 0) && (0.25 < fVar15)) {
/* try { // try from 0076dd75 to 0076e15e has its CatchHandler @ 0076e53c */
(**(code **)(*piVar8 + 0x58))(piVar8,local_70,local_74);
}
if (0.25 < (float)local_70) {
(**(code **)(*piVar8 + 0x20))(piVar8,0xbf800000);
pIVar5 = (INextBot *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
cVar4 = INextBot::IsDebugging(pIVar5,0x10);
if (cVar4 != '\0') {
pCVar3 = *(CBaseEntity **)(param_1 + 0x6c);
if (((byte)pCVar3[0x14d] & 8) == 0) {
local_28 = local_80 * 50.0 + *(float *)(pCVar3 + 0x2e0);
local_24 = local_7c * 50.0 + *(float *)(pCVar3 + 0x2e4);
local_20 = *(float *)(pCVar3 + 0x2e8);
local_70 = pCVar3;
}
else {
CBaseEntity::CalcAbsolutePosition(pCVar3);
local_70 = *(CBaseEntity **)(param_1 + 0x6c);
local_28 = local_80 * 50.0 + *(float *)(pCVar3 + 0x2e0);
local_24 = local_7c * 50.0 + *(float *)(pCVar3 + 0x2e4);
local_20 = *(float *)(pCVar3 + 0x2e8);
if ((*(uint *)(local_70 + 0x14c) & 0x800) != 0) {
CBaseEntity::CalcAbsolutePosition(local_70);
}
}
NDebugOverlay::HorzArrow
((Vector *)(local_70 + 0x2e0),(Vector *)&local_28,15.0,0,0xff,0,0xff,true,0.1);
}
}
else if ((float)local_70 < -0.25) {
(**(code **)(*piVar8 + 0x28))(piVar8,0xbf800000);
pIVar5 = (INextBot *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
cVar4 = INextBot::IsDebugging(pIVar5,0x10);
if (cVar4 != '\0') {
pCVar3 = *(CBaseEntity **)(param_1 + 0x6c);
if (((byte)pCVar3[0x14d] & 8) == 0) {
local_28 = *(float *)(pCVar3 + 0x2e0) - local_80 * 50.0;
local_24 = *(float *)(pCVar3 + 0x2e4) - local_7c * 50.0;
local_20 = *(float *)(pCVar3 + 0x2e8);
local_70 = pCVar3;
}
else {
CBaseEntity::CalcAbsolutePosition(pCVar3);
local_70 = *(CBaseEntity **)(param_1 + 0x6c);
local_28 = *(float *)(pCVar3 + 0x2e0) - local_80 * 50.0;
local_24 = *(float *)(pCVar3 + 0x2e4) - local_7c * 50.0;
local_20 = *(float *)(pCVar3 + 0x2e8);
if ((*(uint *)(local_70 + 0x14c) & 0x800) != 0) {
CBaseEntity::CalcAbsolutePosition(local_70);
}
}
NDebugOverlay::HorzArrow
((Vector *)(local_70 + 0x2e0),(Vector *)&local_28,15.0,0xff,0,0,0xff,true,0.1);
}
}
if (local_74 <= -0.25) {
/* try { // try from 0076e1ad to 0076e536 has its CatchHandler @ 0076e53c */
(**(code **)(*piVar8 + 0x30))(piVar8,0xbf800000);
pIVar5 = (INextBot *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
cVar4 = INextBot::IsDebugging(pIVar5,0x10);
if (cVar4 == '\0') goto LAB_0076dbf5;
pCVar3 = *(CBaseEntity **)(param_1 + 0x6c);
if (((byte)pCVar3[0x14d] & 8) == 0) {
local_28 = *(float *)(pCVar3 + 0x2e0) - local_7c * 50.0;
local_24 = *(float *)(pCVar3 + 0x2e4) - local_84 * 50.0;
local_20 = *(float *)(pCVar3 + 0x2e8);
local_70 = pCVar3;
}
else {
CBaseEntity::CalcAbsolutePosition(pCVar3);
local_70 = *(CBaseEntity **)(param_1 + 0x6c);
local_28 = *(float *)(pCVar3 + 0x2e0) - local_7c * 50.0;
local_24 = *(float *)(pCVar3 + 0x2e4) - local_84 * 50.0;
local_20 = *(float *)(pCVar3 + 0x2e8);
if ((*(uint *)(local_70 + 0x14c) & 0x800) != 0) {
CBaseEntity::CalcAbsolutePosition(local_70);
}
}
iVar10 = 0;
iVar7 = 0xff;
}
else {
if (local_74 < 0.25) goto LAB_0076dbf5;
(**(code **)(*piVar8 + 0x38))(piVar8,0xbf800000);
pIVar5 = (INextBot *)(**(code **)(*(int *)param_1 + 0xb0))(param_1);
cVar4 = INextBot::IsDebugging(pIVar5,0x10);
if (cVar4 == '\0') goto LAB_0076dbf5;
pCVar3 = *(CBaseEntity **)(param_1 + 0x6c);
if (((byte)pCVar3[0x14d] & 8) == 0) {
local_28 = local_7c * 50.0 + *(float *)(pCVar3 + 0x2e0);
local_24 = local_84 * 50.0 + *(float *)(pCVar3 + 0x2e4);
local_20 = *(float *)(pCVar3 + 0x2e8);
local_70 = pCVar3;
}
else {
CBaseEntity::CalcAbsolutePosition(pCVar3);
local_70 = *(CBaseEntity **)(param_1 + 0x6c);
local_28 = local_7c * 50.0 + *(float *)(pCVar3 + 0x2e0);
local_24 = local_84 * 50.0 + *(float *)(pCVar3 + 0x2e4);
local_20 = *(float *)(pCVar3 + 0x2e8);
if ((*(uint *)(local_70 + 0x14c) & 0x800) != 0) {
CBaseEntity::CalcAbsolutePosition(local_70);
}
}
iVar10 = 0xff;
iVar7 = 0;
}
NDebugOverlay::HorzArrow
((Vector *)(local_70 + 0x2e0),(Vector *)&local_28,15.0,iVar7,iVar10,0xff,0xff,true,0.1);
LAB_0076dbf5:
cVar4 = (**(code **)(*(int *)param_1 + 0xe4))(param_1);
if (cVar4 == '\0') {
(**(code **)(*piVar8 + 0x50))(piVar8,0xbf800000);
}
iVar7 = _DAT_0105db00;
if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
(iVar10 = ThreadGetCurrentId(), iVar7 == iVar10)) {
cVar4 = CVProfNode::ExitScope();
if (cVar4 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
if (local_50 == 0) {
return;
}
(**(code **)(local_50 + 0x54))(local_50,local_58,local_54,0,0,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.