//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //===========================================================================// #include "cbase.h" #include "vgui/IInput.h" #include "materialsystem/imaterialvar.h" #include #include #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; } } } }