You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.7 KiB
139 lines
3.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//===========================================================================// |
|
|
|
#include "cbase.h" |
|
#include "vgui/IInput.h" |
|
#include "materialsystem/imaterialvar.h" |
|
#include <vgui_controls/EditablePanel.h> |
|
#include <mathlib/mathlib.h> |
|
#include "view.h" |
|
#include "studio_stats.h" |
|
#include "coordsize.h" |
|
#include "collisionutils.h" |
|
|
|
enum |
|
{ |
|
RSTUDIOSTATMODE_NONE = 0, |
|
RSTUDIOSTATMODE_HELDWEAPON, |
|
RSTUDIOSTATMODE_VIEWMODEL, |
|
RSTUDIOSTATMODE_VIEWMODEL_ATTACHMENT, |
|
}; |
|
|
|
IClientRenderable *g_pStudioStatsEntity = NULL; |
|
static ConVar r_studio_stats( "r_studio_stats", "0", FCVAR_CHEAT ); |
|
static ConVar r_studio_stats_lock( "r_studio_stats_lock", "0", FCVAR_CHEAT, "Lock the current studio stats entity selection" ); |
|
static ConVar r_studio_stats_mode( "r_studio_stats_mode", "0", FCVAR_CHEAT, "Sets a mode for r_studio_stats. Modes are as follows:\n\t0 = Entity under your crosshair\n\t1 = Weapon held by player under your crosshair\n\t2 = Your viewmodel\n\t3 = The first entity attached to your viewmodel" ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class CStudioStatsEnumerator : public IPartitionEnumerator |
|
{ |
|
public: |
|
CStudioStatsEnumerator( Ray_t& shot ) |
|
{ |
|
m_rayShot = shot; |
|
m_bHit = false; |
|
} |
|
|
|
virtual IterationRetval_t EnumElement( IHandleEntity *pHandleEntity ) |
|
{ |
|
trace_t tr; |
|
enginetrace->ClipRayToEntity( m_rayShot, MASK_SHOT, pHandleEntity, &tr ); |
|
|
|
if ( tr.fraction < 1.0 ) |
|
{ |
|
ICollideable *pCollideable = enginetrace->GetCollideable( pHandleEntity ); |
|
IClientUnknown *pUnk = pCollideable->GetIClientUnknown(); |
|
if ( pUnk ) |
|
{ |
|
g_pStudioStatsEntity = pUnk->GetClientRenderable(); |
|
|
|
if ( g_pStudioStatsEntity ) |
|
{ |
|
m_bHit = true; |
|
return ITERATION_STOP; |
|
} |
|
} |
|
} |
|
|
|
return ITERATION_CONTINUE; |
|
} |
|
|
|
bool Hit( void ) const { return m_bHit; } |
|
|
|
private: |
|
Ray_t m_rayShot; |
|
bool m_bHit; |
|
}; |
|
|
|
|
|
void StudioStats_FindClosestEntity( CClientRenderablesList *pClientRenderablesList ) |
|
{ |
|
if ( r_studio_stats_lock.GetBool() ) |
|
return; |
|
|
|
g_pStudioStatsEntity = NULL; |
|
if ( r_studio_stats.GetBool() == false ) |
|
return; |
|
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
int iStudioStatMode = r_studio_stats_mode.GetInt(); |
|
|
|
if ( iStudioStatMode == RSTUDIOSTATMODE_VIEWMODEL ) |
|
{ |
|
g_pStudioStatsEntity = pPlayer->GetViewModel(); |
|
return; |
|
} |
|
if ( iStudioStatMode == RSTUDIOSTATMODE_VIEWMODEL_ATTACHMENT ) |
|
{ |
|
C_BaseEntity *pVM = pPlayer->GetViewModel(); |
|
if ( pVM ) |
|
{ |
|
g_pStudioStatsEntity = pVM->FirstMoveChild(); |
|
} |
|
return; |
|
} |
|
|
|
trace_t tr; |
|
Vector vecStart, vecEnd; |
|
VectorMA( MainViewOrigin(), MAX_TRACE_LENGTH, MainViewForward(), vecEnd ); |
|
VectorMA( MainViewOrigin(), 10, MainViewForward(), vecStart ); |
|
|
|
Ray_t shotRay; |
|
shotRay.Init( vecStart, vecEnd ); |
|
CStudioStatsEnumerator studioEnum( shotRay ); |
|
partition->EnumerateElementsAlongRay( PARTITION_ALL_CLIENT_EDICTS, shotRay, false, &studioEnum ); |
|
|
|
if ( g_pStudioStatsEntity ) |
|
{ |
|
C_BaseEntity *pEntity = g_pStudioStatsEntity->GetIClientUnknown()->GetBaseEntity(); |
|
|
|
if ( pEntity && ( pEntity != C_BasePlayer::GetLocalPlayer() ) ) |
|
{ |
|
switch ( iStudioStatMode ) |
|
{ |
|
default: |
|
case RSTUDIOSTATMODE_NONE: |
|
g_pStudioStatsEntity = pEntity->GetClientRenderable(); |
|
break; |
|
|
|
case RSTUDIOSTATMODE_HELDWEAPON: |
|
{ |
|
C_BasePlayer *pTargetPlayer = ToBasePlayer( pEntity ); |
|
if ( pTargetPlayer && pTargetPlayer->GetActiveWeapon() ) |
|
{ |
|
g_pStudioStatsEntity = pTargetPlayer->GetActiveWeapon()->GetClientRenderable(); |
|
} |
|
} |
|
break; |
|
} |
|
} |
|
} |
|
}
|
|
|