140 lines
3.7 KiB
C++
140 lines
3.7 KiB
C++
|
//========= 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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|