Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

140 lines
3.7 KiB

5 years ago
//========= 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;
}
}
}
}