L L4D2node

AvoidPushawayProps

0x004710a0 · 1410 bytes · __cdecl

_Z18AvoidPushawayPropsP20CBaseCombatCharacterP8CUserCmd

Decompiled

undefined (2 params)

/* AvoidPushawayProps(CBaseCombatCharacter*, CUserCmd*) */

void AvoidPushawayProps(CBaseCombatCharacter *param_1,CUserCmd *param_2)

{
  char cVar1;
  QAngle *pQVar2;
  int iVar3;
  Vector *pVVar4;
  int *piVar5;
  int iVar6;
  float *pfVar7;
  int iVar8;
  CBaseEntity *pCVar9;
  longdouble lVar10;
  float fVar11;
  float fVar12;
  float fVar13;
  float local_858;
  float local_854;
  float local_850;
  float local_84c;
  float local_848;
  float local_844;
  float local_840;
  float local_83c;
  float local_838;
  float local_834;
  float local_830;
  float local_82c;
  float local_828;
  float local_824;
  float local_820;
  CBaseEntity *local_81c [515];
  
  cVar1 = (**(code **)(*g_pGameRules + 0x21c))(g_pGameRules);
  if (cVar1 == '\0') {
    AngleVectors((QAngle *)(param_2 + 0xc),(Vector *)&local_858,(Vector *)&local_84c,(Vector *)0x0);
  }
  else {
    pQVar2 = (QAngle *)(**(code **)(*g_pGameRules + 0x220))(g_pGameRules);
    AngleVectors(pQVar2,(Vector *)&local_858,(Vector *)&local_84c,(Vector *)0x0);
  }
  iVar3 = GetPushawayEnts(param_1,local_81c,0x200,0.0,1,(CPushAwayEnumerator *)0x0);
  pVVar4 = (Vector *)(**(code **)(*(int *)param_1 + 0x288))(param_1);
  if (iVar3 < 1) {
    return;
  }
  iVar8 = 0;
  do {
    while ((pCVar9 = local_81c[iVar8], pCVar9 != (CBaseEntity *)0x0 &&
           (piVar5 = (int *)__dynamic_cast(pCVar9,&CBaseEntity::typeinfo,
                                           &IMultiplayerPhysics::typeinfo,0xfffffffe),
           piVar5 != (int *)0x0))) {
      iVar6 = (**(code **)*piVar5)(piVar5);
      if (iVar6 == 1) {
        lVar10 = (longdouble)(**(code **)(*piVar5 + 4))(piVar5);
        pCVar9 = local_81c[iVar8];
        fVar12 = (float)lVar10;
        if (fVar12 <= 10.0) {
          fVar12 = 10.0;
        }
        if (30.0 <= fVar12) {
          fVar12 = 30.0;
        }
        if (fVar12 <= 0.0) {
          fVar12 = 0.0;
        }
        fVar12 = fVar12 * 0.033333335;
        goto LAB_004711f1;
      }
LAB_00471160:
      iVar8 = iVar8 + 1;
      if (iVar8 == iVar3) {
        return;
      }
    }
    fVar12 = 1.0;
LAB_004711f1:
    CCollisionProperty::CalcNearestPoint
              ((CCollisionProperty *)(pCVar9 + 0x194),pVVar4,(Vector *)&local_840);
    CCollisionProperty::CalcNearestPoint
              ((CCollisionProperty *)(param_1 + 0x194),(Vector *)&local_840,(Vector *)&local_834);
    local_828 = local_834 - local_840;
    local_824 = local_830 - local_83c;
    local_820 = local_82c - local_838;
    lVar10 = (longdouble)VectorNormalize((Vector *)&local_828);
    fVar11 = (float)lVar10;
    if ((5.0 < fVar11) &&
       (cVar1 = CCollisionProperty::IsPointInBounds
                          ((CCollisionProperty *)(param_1 + 0x194),(Vector *)&local_840),
       cVar1 == '\0')) goto LAB_00471160;
    if ((-0.01 < local_828) && (((local_828 < 0.01 && (-0.01 < local_824)) && (local_824 < 0.01))))
    {
      if ((-0.01 < local_820) && (local_820 < 0.01)) {
        local_824 = *(float *)(pVVar4 + 4) - local_83c;
        local_820 = *(float *)(pVVar4 + 8) - local_838;
        local_828 = *(float *)pVVar4 - local_840;
        lVar10 = (longdouble)VectorNormalize((Vector *)&local_828);
        fVar11 = (float)lVar10;
        if ((local_828 <= -0.01) ||
           (((0.01 <= local_828 || (local_824 <= -0.01)) || (0.01 <= local_824))))
        goto LAB_004713e0;
      }
      if ((-0.01 < local_820) && (local_820 < 0.01)) {
        pfVar7 = (float *)(**(code **)(*(int *)local_81c[iVar8] + 0x288))(local_81c[iVar8]);
        local_828 = *(float *)pVVar4 - *pfVar7;
        local_824 = *(float *)(pVVar4 + 4) - pfVar7[1];
        local_820 = *(float *)(pVVar4 + 8) - pfVar7[2];
        lVar10 = (longdouble)VectorNormalize((Vector *)&local_828);
        fVar11 = (float)lVar10;
      }
    }
LAB_004713e0:
    fVar13 = 1.0;
    if (1.0 <= fVar11) {
      fVar13 = fVar11;
    }
    fVar12 = (*(float *)(sv_pushaway_player_force._28_4_ + 0x2c) / fVar13) * fVar12;
    if (*(float *)(sv_pushaway_max_player_force._28_4_ + 0x2c) <= fVar12) {
      fVar12 = *(float *)(sv_pushaway_max_player_force._28_4_ + 0x2c);
    }
    (**(code **)(*(int *)param_1 + 0x4f0))(param_1,local_81c[iVar8]);
    if ((((*(char **)(local_81c[iVar8] + 0x7c) == "func_door_rotating") ||
         (cVar1 = CBaseEntity::ClassMatchesComplex(local_81c[iVar8],"func_door_rotating"),
         cVar1 != '\0')) || (*(char **)(local_81c[iVar8] + 0x7c) == "prop_door_rotating")) ||
       (cVar1 = CBaseEntity::ClassMatchesComplex(local_81c[iVar8],"prop_door_rotating"),
       cVar1 != '\0')) {
      fVar12 = fVar12 * 0.25;
    }
    iVar8 = iVar8 + 1;
    *(float *)(param_2 + 0x18) =
         local_858 * local_828 * fVar12 + local_854 * local_824 * fVar12 +
         *(float *)(param_2 + 0x18) + local_850 * fVar12 * local_820;
    *(float *)(param_2 + 0x1c) =
         local_828 * fVar12 * local_84c + local_824 * fVar12 * local_848 +
         *(float *)(param_2 + 0x1c) + fVar12 * local_820 * local_844;
    if (iVar8 == iVar3) {
      return;
    }
  } while( true );
}

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)