diff options
Diffstat (limited to 'game/client/tf/tf_hud_disguise_status.cpp')
| -rw-r--r-- | game/client/tf/tf_hud_disguise_status.cpp | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/game/client/tf/tf_hud_disguise_status.cpp b/game/client/tf/tf_hud_disguise_status.cpp new file mode 100644 index 0000000..b5798da --- /dev/null +++ b/game/client/tf/tf_hud_disguise_status.cpp @@ -0,0 +1,364 @@ +//========= 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(); +}
\ No newline at end of file |