extensions/sdktools/vhelpers.cpp
changeset 1628 3fd76ba845b8
parent 1611 1bd18b7530eb
child 1636 c13834955093
     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();