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.

364 lines
9.1 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: HUD Target ID element
//
// $NoKeywords: $
//=============================================================================
#include "cbase.h"
#include "c_tf_player.h"
#include "c_playerresource.h"
#include "c_tf_playerresource.h"
#include "tf_classdata.h"
#include "hud.h"
#include "hudelement.h"
#include "iclientmode.h"
#include "tf_imagepanel.h"
#include "item_model_panel.h"
#include "tf_hud_playerstatus.h"
#include "tf_spectatorgui.h"
#include "vgui/ILocalize.h"
#include "vgui/ISurface.h"
#include "vgui/IInput.h"
#include <vgui/IVGui.h>
#include <vgui/IScheme.h>
#include <vgui_controls/Panel.h>
#include <vgui_controls/Frame.h>
#include "vgui_controls/TextImage.h"
#include "vgui_controls/Label.h"
#include "vgui_controls/Button.h"
#include "ienginevgui.h"
#include "hud_chat.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
using namespace vgui;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CDisguiseStatus : public CHudElement, public EditablePanel
{
DECLARE_CLASS_SIMPLE( CDisguiseStatus, EditablePanel );
public:
CDisguiseStatus( const char *pElementName );
void Init( void );
virtual void ApplySchemeSettings( IScheme *scheme );
virtual void PerformLayout( void );
virtual void Paint( void );
void ShowAndUpdateStatus( void );
void HideStatus( void );
virtual bool ShouldDraw( void );
void CheckName( void );
void CheckWeapon( void );
void CheckHealth( void );
private:
CPanelAnimationVar( HFont, m_hFont, "TextFont", "TargetID" );
CTFImagePanel *m_pBGPanel;
CEmbeddedItemModelPanel *m_pModelPanel;
CTFSpectatorGUIHealth *m_pDisguiseHealth;
Label *m_pDisguiseNameLabel;
Label *m_pWeaponNameLabel;
bool m_bDisguised;
CTFWeaponBase *m_pDisguiseWeapon;
int m_iDisguiseTeam;
};
DECLARE_HUDELEMENT( CDisguiseStatus );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CDisguiseStatus::CDisguiseStatus( const char *pElementName ) :
CHudElement( pElementName ), BaseClass( NULL, "DisguiseStatus" )
{
Panel *pParent = g_pClientMode->GetViewport();
SetParent( pParent );
SetHiddenBits( HIDEHUD_MISCSTATUS );
m_pModelPanel = NULL;
m_pBGPanel = NULL;
m_pDisguiseNameLabel = NULL;
m_pWeaponNameLabel = NULL;
m_pDisguiseHealth = new CTFSpectatorGUIHealth( this, "SpectatorGUIHealth" );
m_bDisguised = true;
m_pDisguiseWeapon = NULL;
m_iDisguiseTeam = TEAM_UNASSIGNED;
}
//-----------------------------------------------------------------------------
// Purpose: Setup
//-----------------------------------------------------------------------------
void CDisguiseStatus::Init( void )
{
HideStatus();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::ApplySchemeSettings( vgui::IScheme *scheme )
{
BaseClass::ApplySchemeSettings( scheme );
LoadControlSettings( "Resource/UI/DisguiseStatusPanel.res" );
m_pModelPanel = dynamic_cast<CEmbeddedItemModelPanel*>( FindChildByName("itemmodelpanel") );
m_pBGPanel = dynamic_cast<CTFImagePanel *> ( FindChildByName("DisguiseStatusBG") );
m_pDisguiseNameLabel = dynamic_cast<Label *>(FindChildByName("DisguiseNameLabel"));
m_pWeaponNameLabel = dynamic_cast<Label *>(FindChildByName("WeaponNameLabel"));
SetPaintBackgroundEnabled( false );
HideStatus();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CDisguiseStatus::ShouldDraw( void )
{
bool bShow = false;
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return false;
if ( !pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) )
{
bShow = false;
}
else
{
bShow = true;
}
if ( bShow && (!m_bDisguised || (m_pDisguiseWeapon != pPlayer->m_Shared.GetDisguiseWeapon()) || (m_iDisguiseTeam != pPlayer->m_Shared.GetDisguiseTeam()) ) )
{
ShowAndUpdateStatus();
}
else if ( !bShow && m_bDisguised )
{
HideStatus();
}
return bShow;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::ShowAndUpdateStatus( void )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
m_iDisguiseTeam = pPlayer->m_Shared.GetDisguiseTeam();
// m_pModelPanel->SetVisible( false );
if ( m_pBGPanel )
{
m_pBGPanel->SetVisible( true );
m_pBGPanel->SetBGTeam( m_iDisguiseTeam );
m_pBGPanel->UpdateBGImage();
}
if ( m_pDisguiseNameLabel )
{
m_pDisguiseNameLabel->SetVisible( true );
CheckName();
}
if ( m_pWeaponNameLabel )
{
m_pWeaponNameLabel->SetVisible( true );
CheckWeapon();
}
if ( m_pDisguiseHealth )
{
m_pDisguiseHealth->SetVisible( true );
CheckHealth();
}
m_bDisguised = true;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::HideStatus( void )
{
if ( m_pModelPanel )
{
m_pModelPanel->SetVisible( false );
}
if ( m_pBGPanel )
{
m_pBGPanel->SetVisible( false );
}
if ( m_pDisguiseNameLabel )
{
m_pDisguiseNameLabel->SetVisible( false );
}
if ( m_pWeaponNameLabel )
{
m_pWeaponNameLabel->SetVisible( false );
}
if ( m_pDisguiseHealth )
{
m_pDisguiseHealth->SetVisible( false );
}
m_bDisguised = false;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::CheckName( void )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
int nIndex = pPlayer->m_Shared.GetDisguiseTargetIndex();
if ( nIndex != TF_DISGUISE_TARGET_INDEX_NONE )
{
if ( g_PR != NULL )
{
const char *pszName = g_PR->GetPlayerName( nIndex );
if ( pszName && pszName[0] )
{
SetDialogVariable( "disguisename", pszName );
return;
}
}
}
SetDialogVariable( "disguisename", pPlayer->GetPlayerName() );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::CheckWeapon( void )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
m_pDisguiseWeapon = pPlayer->m_Shared.GetDisguiseWeapon();
if ( m_pDisguiseWeapon )
{
const wchar_t *pszDisguiseWeapon = g_pVGuiLocalize->Find( m_pDisguiseWeapon->GetTFWpnData().szPrintName );
CAttributeContainer *pContainer = m_pDisguiseWeapon->GetAttributeContainer();
if ( pContainer )
{
CEconItemView *pItem = pContainer->GetItem();
if ( pItem )
{
pszDisguiseWeapon = pItem->GetItemName();
}
}
SetDialogVariable( "weaponname", pszDisguiseWeapon );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::CheckHealth( void )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
if ( !m_pDisguiseHealth )
return;
m_pDisguiseHealth->SetHealth( pPlayer->m_Shared.GetDisguiseHealth(), pPlayer->m_Shared.GetDisguiseMaxHealth(), pPlayer->m_Shared.GetDisguiseMaxBuffedHealth() );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDisguiseStatus::PerformLayout( void )
{
/*
int iXIndent = XRES(5);
int iXPostdent = XRES(10);
int iWidth = m_pTargetHealth->GetWide() + iXIndent + iXPostdent;
int iTextW, iTextH;
int iDataW, iDataH;
if ( m_pTargetNameLabel && m_pTargetDataLabel )
{
m_pTargetNameLabel->GetContentSize( iTextW, iTextH );
m_pTargetDataLabel->GetContentSize( iDataW, iDataH );
iWidth += max(iTextW,iDataW);
SetSize( iWidth, GetTall() );
int nOffset = m_bArenaPanelVisible ? YRES (120) : 0; // HACK: move the targetID up a bit so it won't overlap the panel
SetPos( (ScreenWidth() - iWidth) * 0.5, m_nOriginalY - nOffset );
if ( m_pBGPanel )
{
m_pBGPanel->SetSize( iWidth, GetTall() );
}
}
*/
BaseClass::PerformLayout();
};
//-----------------------------------------------------------------------------
// Purpose: Draw function for the element
//-----------------------------------------------------------------------------
void CDisguiseStatus::Paint()
{
C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
if ( !pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) )
return;
// ConVarRef cl_hud_minmode( "cl_hud_minmode", true );
// if ( cl_hud_minmode.IsValid() && cl_hud_minmode.GetBool() )
// {
// HideStatus();
// return;
// }
CheckName();
CheckWeapon();
CheckHealth();
}