L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)