//========= 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 \t 0 = Entity under your crosshair \n \t 1 = Weapon held by player under your crosshair \n \t 2 = Your viewmodel \n \t 3 = 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 ;
}
}
}
}