//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// #include "cbase.h" #include "c_vguiscreen.h" #include #include "ienginevgui.h" #include "vgui_bitmapimage.h" #include "vgui_bitmappanel.h" #include "vgui_controls/Label.h" #include "tf_weapon_pda.h" #include "vgui/ISurface.h" #include "tf_controls.h" #include "c_tf_player.h" #include "tf_weapon_invis.h" #include #include "clientmode.h" #include #include using namespace vgui; //----------------------------------------------------------------------------- // Control screen //----------------------------------------------------------------------------- class CPDAPanel : public CVGuiScreenPanel { DECLARE_CLASS( CPDAPanel, CVGuiScreenPanel ); public: CPDAPanel( vgui::Panel *parent, const char *panelName ); ~CPDAPanel(); virtual bool Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ); virtual void OnTick(); protected: C_BaseCombatWeapon *GetOwningWeapon(); }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel, "pda_panel" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel::CPDAPanel( vgui::Panel *parent, const char *panelName ) : BaseClass( parent, "CPDAPanel", vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/PDAControlPanelScheme.res", "TFBase" ) ) { } CPDAPanel::~CPDAPanel() { } //----------------------------------------------------------------------------- // Initialization //----------------------------------------------------------------------------- bool CPDAPanel::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ) { // Make sure we get ticked... vgui::ivgui()->AddTickSignal( GetVPanel() ); if (!BaseClass::Init(pKeyValues, pInitData)) return false; return true; } //----------------------------------------------------------------------------- // Returns the object it's attached to //----------------------------------------------------------------------------- C_BaseCombatWeapon *CPDAPanel::GetOwningWeapon() { C_BaseEntity *pScreenEnt = GetEntity(); if (!pScreenEnt) return NULL; C_BaseEntity *pOwner = pScreenEnt->GetOwnerEntity(); if (!pOwner) return NULL; C_BaseViewModel *pViewModel = dynamic_cast< C_BaseViewModel * >( pOwner ); if ( !pViewModel ) return NULL; return pViewModel->GetOwningWeapon(); } //----------------------------------------------------------------------------- // Frame-based update //----------------------------------------------------------------------------- void CPDAPanel::OnTick() { BaseClass::OnTick(); SetVisible( true ); } //----------------------------------------------------------------------------- // Engineer Destroy PDA //----------------------------------------------------------------------------- class CPDAPanel_Engineer_Destroy : public CPDAPanel { DECLARE_CLASS( CPDAPanel_Engineer_Destroy, CPDAPanel ); public: CPDAPanel_Engineer_Destroy( vgui::Panel *parent, const char *panelName ); }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Engineer_Destroy, "pda_panel_engineer_destroy" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Engineer_Destroy::CPDAPanel_Engineer_Destroy( vgui::Panel *parent, const char *panelName ) : CPDAPanel( parent, "CPDAPanel_Engineer_Destroy" ) { } //----------------------------------------------------------------------------- // Engineer Build PDA //----------------------------------------------------------------------------- class CPDAPanel_Engineer_Build : public CPDAPanel { DECLARE_CLASS( CPDAPanel_Engineer_Build, CPDAPanel ); public: CPDAPanel_Engineer_Build( vgui::Panel *parent, const char *panelName ); }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Engineer_Build, "pda_panel_engineer_build" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Engineer_Build::CPDAPanel_Engineer_Build( vgui::Panel *parent, const char *panelName ) : CPDAPanel( parent, "CPDAPanel_Engineer" ) { } //----------------------------------------------------------------------------- // Spy PDA //----------------------------------------------------------------------------- class CPDAPanel_Spy : public CPDAPanel { DECLARE_CLASS( CPDAPanel_Spy, CPDAPanel ); public: CPDAPanel_Spy( vgui::Panel *parent, const char *panelName ); }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Spy, "pda_panel_spy" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Spy::CPDAPanel_Spy( vgui::Panel *parent, const char *panelName ) : CPDAPanel( parent, "CPDAPanel_Spy" ) { } //----------------------------------------------------------------------------- // Spy Invis PDA //----------------------------------------------------------------------------- class CPDAPanel_Spy_Invis : public CPDAPanel { DECLARE_CLASS( CPDAPanel_Spy_Invis, CPDAPanel ); public: CPDAPanel_Spy_Invis( vgui::Panel *parent, const char *panelName ); virtual void OnTick(); private: ProgressBar *m_pInvisProgress; }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Spy_Invis, "pda_panel_spy_invis" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Spy_Invis::CPDAPanel_Spy_Invis( vgui::Panel *parent, const char *panelName ) : CPDAPanel( parent, "CPDAPanel_Spy_Invis" ) { vgui::ivgui()->AddTickSignal( GetVPanel() ); m_pInvisProgress = new ProgressBar( this, "InvisProgress" ); } //----------------------------------------------------------------------------- // Update the progress bar with how much invis we have left //----------------------------------------------------------------------------- void CPDAPanel_Spy_Invis::OnTick( void ) { C_BaseCombatWeapon *pInvisWeapon = GetOwningWeapon(); if ( !pInvisWeapon ) return; C_TFPlayer *pPlayer = ToTFPlayer( pInvisWeapon->GetOwner() ); if ( pPlayer && !pPlayer->IsDormant() ) { if ( m_pInvisProgress ) { float flMeter = pPlayer->m_Shared.GetSpyCloakMeter(); m_pInvisProgress->SetProgress( flMeter / 100.0f ); } } } //----------------------------------------------------------------------------- // Spy Invis PDA panel for the pocketwatch //----------------------------------------------------------------------------- class CPDAPanel_Spy_Invis_Pocket : public CPDAPanel { DECLARE_CLASS( CPDAPanel_Spy_Invis_Pocket, CPDAPanel ); public: CPDAPanel_Spy_Invis_Pocket( vgui::Panel *parent, const char *panelName ); virtual void OnTick(); protected: ProgressBar *m_pInvisProgress; float m_flPrevProgress; }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Spy_Invis_Pocket, "pda_panel_spy_invis_pocket" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Spy_Invis_Pocket::CPDAPanel_Spy_Invis_Pocket( vgui::Panel *parent, const char *panelName ) : CPDAPanel( parent, "CPDAPanel_Spy_Invis_Pocket" ) { vgui::ivgui()->AddTickSignal( GetVPanel() ); CircularProgressBar* pCircularProgressBar = new CircularProgressBar( this, "InvisProgress" ); pCircularProgressBar->SetReverseProgress( true ); m_pInvisProgress = pCircularProgressBar; m_flPrevProgress = -1; } //----------------------------------------------------------------------------- // Update the progress bar with how much invis we have left //----------------------------------------------------------------------------- void CPDAPanel_Spy_Invis_Pocket::OnTick( void ) { C_BaseCombatWeapon *pInvisWeapon = GetOwningWeapon(); if ( !pInvisWeapon ) return; C_TFPlayer *pPlayer = ToTFPlayer( pInvisWeapon->GetOwner() ); if ( pPlayer && !pPlayer->IsDormant() ) { if ( m_pInvisProgress ) { float flMeter = pPlayer->m_Shared.GetSpyCloakMeter(); if ( m_flPrevProgress != flMeter ) { m_flPrevProgress = flMeter; if ( flMeter == 100.f ) { m_pInvisProgress->SetFgColor( COLOR_GREEN ); } else if ( flMeter < 40.f ) { m_pInvisProgress->SetFgColor( COLOR_RED ); } else { m_pInvisProgress->SetFgColor( COLOR_YELLOW ); } m_pInvisProgress->SetProgress( flMeter / 100.0f ); } } } } //----------------------------------------------------------------------------- // Spy Invis PDA panel for the TTG pocketwatch //----------------------------------------------------------------------------- class CPDAPanel_Spy_Invis_Pocket_TTG : public CPDAPanel_Spy_Invis_Pocket { DECLARE_CLASS( CPDAPanel_Spy_Invis_Pocket_TTG, CPDAPanel_Spy_Invis_Pocket ); public: CPDAPanel_Spy_Invis_Pocket_TTG( vgui::Panel *parent, const char *panelName ); }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Spy_Invis_Pocket_TTG, "pda_panel_spy_invis_pocket_ttg" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Spy_Invis_Pocket_TTG::CPDAPanel_Spy_Invis_Pocket_TTG( vgui::Panel *parent, const char *panelName ) : CPDAPanel_Spy_Invis_Pocket( parent, "CPDAPanel_Spy_Invis_Pocket_TTG" ) { dynamic_cast(m_pInvisProgress)->SetStartSegment( 7 ); // Do the pellet first. } //----------------------------------------------------------------------------- // Spy Invis PDA panel for the Hitman pocketwatch //----------------------------------------------------------------------------- class CPDAPanel_Spy_Invis_Pocket_HM : public CPDAPanel_Spy_Invis_Pocket { DECLARE_CLASS( CPDAPanel_Spy_Invis_Pocket_HM, CPDAPanel_Spy_Invis_Pocket ); public: CPDAPanel_Spy_Invis_Pocket_HM( vgui::Panel *parent, const char *panelName ); }; DECLARE_VGUI_SCREEN_FACTORY( CPDAPanel_Spy_Invis_Pocket_HM, "pda_panel_spy_invis_pocket_hm" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CPDAPanel_Spy_Invis_Pocket_HM::CPDAPanel_Spy_Invis_Pocket_HM( vgui::Panel *parent, const char *panelName ) : CPDAPanel_Spy_Invis_Pocket( parent, "CPDAPanel_Spy_Invis_Pocket_HM" ) { }