1.1 --- a/extensions/sdktools/vhelpers.cpp Mon Oct 22 02:54:27 2007 +0000
1.2 +++ b/extensions/sdktools/vhelpers.cpp Mon Oct 22 03:27:22 2007 +0000
1.3 @@ -36,6 +36,24 @@
1.4 CallHelper s_GetVelocity;
1.5 CallHelper s_EyeAngles;
1.6
1.7 +class CTraceFilterSimple : public CTraceFilterEntitiesOnly
1.8 +{
1.9 +public:
1.10 + CTraceFilterSimple(const IHandleEntity *passentity): m_pPassEnt(passentity)
1.11 + {
1.12 + }
1.13 + virtual bool ShouldHitEntity(IHandleEntity *pServerEntity, int contentsMask)
1.14 + {
1.15 + if (pServerEntity == m_pPassEnt)
1.16 + {
1.17 + return false;
1.18 + }
1.19 + return true;
1.20 + }
1.21 +private:
1.22 + const IHandleEntity *m_pPassEnt;
1.23 +};
1.24 +
1.25 bool SetupTeleport()
1.26 {
1.27 if (s_Teleport.setup)
1.28 @@ -185,6 +203,65 @@
1.29 return true;
1.30 }
1.31
1.32 +int GetClientAimTarget(edict_t *pEdict, bool only_players)
1.33 +{
1.34 + CBaseEntity *pEntity = pEdict->GetUnknown() ? pEdict->GetUnknown()->GetBaseEntity() : NULL;
1.35 +
1.36 + if (pEntity == NULL)
1.37 + {
1.38 + return -1;
1.39 + }
1.40 +
1.41 + Vector eye_position;
1.42 + QAngle eye_angles;
1.43 +
1.44 + /* Get the private information we need */
1.45 + serverClients->ClientEarPosition(pEdict, &eye_position);
1.46 + if (!GetEyeAngles(pEntity, &eye_angles))
1.47 + {
1.48 + return -2;
1.49 + }
1.50 +
1.51 + Vector aim_dir;
1.52 + AngleVectors(eye_angles, &aim_dir);
1.53 + VectorNormalize(aim_dir);
1.54 +
1.55 + Vector vec_end = eye_position + aim_dir * 8000;
1.56 +
1.57 + Ray_t ray;
1.58 + ray.Init(eye_position, vec_end);
1.59 +
1.60 + trace_t tr;
1.61 + CTraceFilterSimple simple(pEdict->GetIServerEntity());
1.62 +
1.63 + enginetrace->TraceRay(ray, MASK_SOLID|CONTENTS_DEBRIS|CONTENTS_HITBOX, &simple, &tr);
1.64 +
1.65 + if (tr.fraction == 1.0f || tr.m_pEnt == NULL)
1.66 + {
1.67 + return -1;
1.68 + }
1.69 +
1.70 + edict_t *pTarget = gameents->BaseEntityToEdict(tr.m_pEnt);
1.71 + if (pTarget == NULL)
1.72 + {
1.73 + return -1;
1.74 + }
1.75 +
1.76 + int ent_index = engine->IndexOfEdict(pTarget);
1.77 +
1.78 + IGamePlayer *pTargetPlayer = playerhelpers->GetGamePlayer(ent_index);
1.79 + if (pTargetPlayer != NULL && !pTargetPlayer->IsInGame())
1.80 + {
1.81 + return -1;
1.82 + }
1.83 + else if (only_players && pTargetPlayer == NULL)
1.84 + {
1.85 + return -1;
1.86 + }
1.87 +
1.88 + return ent_index;
1.89 +}
1.90 +
1.91 bool IsEyeAnglesSupported()
1.92 {
1.93 return SetupGetEyeAngles();