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.

184 lines
5.1 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Target reticle hud element
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "hud.h"
#include "c_basetfplayer.h"
#include "tf_shareddefs.h"
#include "iclientmode.h"
#include "clientmode_tfnormal.h"
#include "materialsystem/imaterial.h"
#include "materialsystem/imesh.h"
#include "hud_targetreticle.h"
#include "model_types.h"
#include "view_scene.h"
#include "view.h"
#include <vgui/Cursor.h>
#include <vgui_controls/Controls.h>
#include <vgui/ISurface.h>
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CTargetReticle::CTargetReticle( void )
: BaseClass( NULL, "CTargetReticle" ),
m_CursorNone(vgui::dc_none)
{
SetCursor( m_CursorNone );
SetPaintBackgroundEnabled( false );
SetAutoDelete( false );
m_hTargetEntity = NULL;
m_pTargetLabel = NULL;
m_iReticleId = 0;
m_iReticleLeftId = 0;
m_iReticleRightId = 0;
m_iRenderTextureId = 0;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CTargetReticle::~CTargetReticle()
{
if ( m_pTargetLabel != NULL )
{
delete m_pTargetLabel;
m_pTargetLabel = NULL;
}
SetParent( (vgui::Panel *)NULL );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTargetReticle::Init( C_BaseEntity *pEntity, const char *sName )
{
vgui::Panel *pParent = GetClientModeNormal()->GetViewport();
SetParent( pParent );
SetCursor( pParent->GetCursor() );
if ( !m_pTargetLabel )
{
m_pTargetLabel = new vgui::Label( pParent, "TargetLabel", "Unnamed" );
m_pTargetLabel->SetPos( 0, 0 );
m_pTargetLabel->SetFgColor( Color( 255, 170, 0, 255 ) );
m_pTargetLabel->SetPaintBackgroundEnabled( false );
m_pTargetLabel->SetAutoDelete( false );
m_pTargetLabel->SetCursor( m_CursorNone );
}
SetSize( XRES(32),YRES(32) );
m_hTargetEntity = pEntity;
m_pTargetLabel->SetText( sName );
int contentW, contentH;
m_pTargetLabel->GetContentSize( contentW, contentH );
m_pTargetLabel->SetWide( contentW );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_BaseEntity *CTargetReticle::GetTarget( void )
{
return m_hTargetEntity;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTargetReticle::Update( void )
{
if ( !m_hTargetEntity )
{
C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
pPlayer->Remove_Target( this );
return;
}
// Load our textures..
if ( !m_iReticleId )
{
m_iReticleId = vgui::surface()->CreateNewTextureID();
vgui::surface()->DrawSetTextureFile( m_iReticleId, "Hud/target_reticle" , true, false);
}
if ( !m_iReticleLeftId )
{
m_iReticleLeftId = vgui::surface()->CreateNewTextureID();
vgui::surface()->DrawSetTextureFile( m_iReticleLeftId, "Hud/target_reticle_left", true, false );
}
if ( !m_iReticleRightId )
{
m_iReticleRightId = vgui::surface()->CreateNewTextureID();
vgui::surface()->DrawSetTextureFile( m_iReticleRightId, "Hud/target_reticle_right" , true, false);
}
int iX, iY;
GetTargetInScreenSpace( m_hTargetEntity, iX, iY );
int halfWidth = GetWide() / 2;
halfWidth = MAX( halfWidth, m_pTargetLabel->GetWide() / 2 );
m_iRenderTextureId = m_iReticleId;
if( iX < halfWidth || iX > ScreenWidth()-halfWidth )
{
// It's off the screen. See what side it's on.
Vector vCenter = m_hTargetEntity->WorldSpaceCenter( );
if( CurrentViewRight().Dot( vCenter - CurrentViewOrigin() ) > 0 )
{
m_iRenderTextureId = m_iReticleRightId;
iX = ScreenWidth() - halfWidth;
}
else
{
m_iRenderTextureId = m_iReticleLeftId;
iX = halfWidth;
}
// Put Y in the center of the screen.
iY = ScreenHeight() / 2;
}
// Move the icon there
SetPos( iX - (GetWide() / 2), iY - (GetTall() / 2) );
// Center the text under it
m_pTargetLabel->SetPos( iX - (m_pTargetLabel->GetWide() / 2), iY + (GetTall() / 2) );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTargetReticle::Paint()
{
if ( !m_hTargetEntity || !m_iRenderTextureId )
return;
C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
if ( pPlayer == NULL || pPlayer->GetHealth() < 1 )
return;
// Show hide label based on EMP state
bool suppress_reticle = pPlayer->HasPowerup(POWERUP_EMP);
m_pTargetLabel->SetVisible( suppress_reticle ? false : true );
// Don't draw the reticle either
if ( suppress_reticle )
return;
vgui::surface()->DrawSetTexture( m_iRenderTextureId );
vgui::surface()->DrawSetColor( 255, 255, 255, 255 );
vgui::surface()->DrawTexturedRect( 0, 0, GetWide(), GetTall() );
}