diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/vgui/tf_item_pickup_panel.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf/vgui/tf_item_pickup_panel.cpp')
| -rw-r--r-- | game/client/tf/vgui/tf_item_pickup_panel.cpp | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/game/client/tf/vgui/tf_item_pickup_panel.cpp b/game/client/tf/vgui/tf_item_pickup_panel.cpp new file mode 100644 index 0000000..c26d5bd --- /dev/null +++ b/game/client/tf/vgui/tf_item_pickup_panel.cpp @@ -0,0 +1,384 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "vgui/IInput.h" +#include <vgui/IVGui.h> +#include <vgui/IScheme.h> +#include "tf_item_pickup_panel.h" +#include "iclientmode.h" +#include "baseviewport.h" +#include "econ_entity.h" +#include "c_baseplayer.h" +#include "gamestringpool.h" +#include "vgui_controls/TextImage.h" +#include "vgui_controls/Label.h" +#include "vgui_controls/Button.h" +#include "econ_item_system.h" +#include "ienginevgui.h" +#include "achievementmgr.h" +#include "fmtstr.h" +#include "tf_item_inventory.h" +#include "item_confirm_delete_dialog.h" +#include "backpack_panel.h" +#include "econ_ui.h" +#include "c_tf_player.h" +#include "character_info_panel.h" + +ConVar tf_explanations_discardpanel( "tf_explanations_discardpanel", "0", FCVAR_ARCHIVE, "Whether the user has seen explanations for this panel." ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFItemPickupPanel::CTFItemPickupPanel( Panel *parent ) : CItemPickupPanel( parent ) +{ + m_pClassImage = NULL; + m_pClassImageBG = NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemPickupPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + m_pClassImage = dynamic_cast<vgui::ImagePanel*>(FindChildByName( "classimage" )); + m_pClassImageBG = FindChildByName( "classimageoutline" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemPickupPanel::OnCommand( const char *command ) +{ + if ( !Q_stricmp( command, "changeloadout" ) ) + { + // We dont want the UI to close -- we're about to change our loadout + SetReturnToGame( false ); + AcknowledgeItems(); + + int iClass = TF_CLASS_UNDEFINED; + if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() ) + { + if ( m_aItems[m_iSelectedItem].pItem.IsValid() && !m_aItems[m_iSelectedItem].bDiscarded ) + { + // Open the loadout panel with the first class that can use this item (or the base loadout screen if it's an all-class item) + if ( m_aItems[m_iSelectedItem].pItem.GetStaticData()->CanBeUsedByAllClasses() ) + { + iClass = TF_CLASS_UNDEFINED; + } + else + { + for ( int i = TF_FIRST_NORMAL_CLASS; i < TF_LAST_NORMAL_CLASS; i++ ) + { + if ( m_aItems[m_iSelectedItem].pItem.GetStaticData()->CanBeUsedByClass(i) ) + { + iClass = -i; + break; + } + } + + if ( iClass == TF_CLASS_UNDEFINED ) + { + // Item's not usable by any class. Go to backpack. + iClass = ECONUI_BACKPACK; + } + } + } + } + + ShowPanel( false ); + + EconUI()->OpenEconUI( iClass, true ); + } + else + { + BaseClass::OnCommand( command ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemPickupPanel::UpdateModelPanels( void ) +{ + BaseClass::UpdateModelPanels(); + + if ( m_pClassImage ) + { + m_pClassImage->SetVisible( false ); + if ( m_pClassImageBG ) + { + m_pClassImageBG->SetVisible( false ); + } + if ( m_aModelPanels[2]->HasItem() ) + { + CEconItemView *pItem = m_aModelPanels[2]->GetItem(); + + int iClass = -1; + if ( pItem->GetStaticData()->CanBeUsedByAllClasses() ) + { + iClass = TF_CLASS_UNDEFINED; + } + else + { + // Find a class that can use the item, and show that class image + for ( int i = TF_FIRST_NORMAL_CLASS; i < TF_LAST_NORMAL_CLASS; i++ ) + { + if ( pItem->GetStaticData()->CanBeUsedByClass(i) ) + { + iClass = i; + break; + } + } + } + + if ( iClass != -1 ) + { + m_pClassImage->SetImage( g_pszItemClassImagesRed[iClass] ); + m_pClassImage->SetVisible( true ); + if ( m_pClassImageBG ) + { + m_pClassImageBG->SetVisible( true ); + } + } + } + } + + // Update the loadout button as appropriate + if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() ) + { + bool bDiscarded = false; + if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() ) + { + bDiscarded = m_aItems[m_iSelectedItem].bDiscarded; + } + + // Open the loadout panel with the first class that can use this item + if ( m_aItems[m_iSelectedItem].pItem.IsValid() && !bDiscarded ) + { + if ( m_aItems[m_iSelectedItem].pItem.GetStaticData()->CanBeUsedByAllClasses() ) + { + SetDialogVariable("loadouttext", g_pVGuiLocalize->Find( "#OpenGeneralLoadout" ) ); + } + else + { + int iClass = TF_CLASS_UNDEFINED; + for ( int i = TF_FIRST_NORMAL_CLASS; i < TF_LAST_NORMAL_CLASS; i++ ) + { + if ( m_aItems[m_iSelectedItem].pItem.GetStaticData()->CanBeUsedByClass(i) ) + { + iClass = i; + break; + } + } + + if ( iClass != TF_CLASS_UNDEFINED ) + { + wchar_t wzLocalized[128]; + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#OpenSpecificLoadout" ), 1, g_pVGuiLocalize->Find( g_aPlayerClassNames[iClass] ) ); + SetDialogVariable("loadouttext", wzLocalized ); + } + else + { + SetDialogVariable("loadouttext", g_pVGuiLocalize->Find( "#OpenBackpack" ) ); + m_pOpenLoadoutButton->SetVisible( true ); + } + } + } + } +} + +static vgui::DHANDLE<CTFItemPickupPanel> g_TFItemPickupPanel; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFItemPickupPanel *OpenTFItemPickupPanel( void ) +{ + if (!g_TFItemPickupPanel.Get()) + { + g_TFItemPickupPanel = vgui::SETUP_PANEL( new CTFItemPickupPanel( NULL ) ); + g_TFItemPickupPanel->InvalidateLayout( false, true ); + } + + engine->ClientCmd_Unrestricted( "gameui_activate" ); + g_TFItemPickupPanel->ShowPanel( true ); + + return g_TFItemPickupPanel; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFItemPickupPanel *GetTFItemPickupPanel( void ) +{ + return g_TFItemPickupPanel.Get(); +} + +//======================================================================================================================================================= +// ITEM DISCARD PANEL +//======================================================================================================================================================= +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFItemDiscardPanel::CTFItemDiscardPanel( Panel *parent ) : CItemDiscardPanel( parent ) +{ + m_flStartExplanationsAt = 0; + m_pExplanationALabel = NULL; + m_pExplanationBLabel = NULL; + m_pExplanationCaratLabel = NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemDiscardPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + m_pExplanationALabel = dynamic_cast<vgui::Label*>( FindChildByName("ExplanationLabel") ); + m_pExplanationBLabel = dynamic_cast<vgui::Label*>( FindChildByName("ExplanationLabel2") ); + m_pExplanationCaratLabel = dynamic_cast<vgui::Label*>( FindChildByName("CaratLabel2") ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemDiscardPanel::PerformLayout( void ) +{ + BaseClass::PerformLayout(); + + m_pExplanationALabel->SetVisible( !m_bDiscardedNewItem && !m_bMadeRoom ); + m_pExplanationBLabel->SetVisible( !m_bDiscardedNewItem && !m_bMadeRoom ); + m_pExplanationCaratLabel->SetVisible( !m_bDiscardedNewItem && !m_bMadeRoom ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemDiscardPanel::ShowPanel(bool bShow) +{ + BaseClass::ShowPanel( bShow ); + + if ( bShow ) + { + if ( !tf_explanations_discardpanel.GetBool() ) + { + m_flStartExplanationsAt = engine->Time() + 0.5; + vgui::ivgui()->AddTickSignal( GetVPanel() ); + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemDiscardPanel::OnTick( void ) +{ + BaseClass::OnTick(); + + if ( m_flStartExplanationsAt && m_flStartExplanationsAt < engine->Time() && TFModalStack()->IsEmpty() ) + { + m_flStartExplanationsAt = 0; + + tf_explanations_discardpanel.SetValue( 1 ); + + CExplanationPopup *pPopup = dynamic_cast<CExplanationPopup*>( FindChildByName("StartExplanation") ); + if ( pPopup ) + { + pPopup->Popup(); + } + } + + if ( !m_flStartExplanationsAt ) + { + vgui::ivgui()->RemoveTickSignal( GetVPanel() ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFItemDiscardPanel::OnCommand( const char *command ) +{ + if ( !Q_stricmp( command, "show_explanations" ) ) + { + if ( !m_flStartExplanationsAt ) + { + m_flStartExplanationsAt = engine->Time(); + vgui::ivgui()->AddTickSignal( GetVPanel() ); + } + RequestFocus(); + } + else + { + BaseClass::OnCommand( command ); + } +} + +#if defined(DEBUG) +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void Test_ItemPickupPanel( const CCommand &args ) +{ + int iClass = TF_CLASS_PYRO; + C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); + if ( pLocalPlayer ) + { + iClass = pLocalPlayer->GetPlayerClass()->GetClassIndex(); + } + + CItemPickupPanel *pItemPanel = EconUI()->OpenItemPickupPanel(); + pItemPanel->InvalidateLayout( false, true ); + + for ( int i = 0; i < CLASS_LOADOUT_POSITION_COUNT; i++ ) + { + CEconItemView *pItem = TFInventoryManager()->GetItemInLoadoutForClass( iClass, i ); + if ( pItem && pItem->IsValid() ) + { + pItemPanel->AddItem( pItem ); + } + } + + pItemPanel->DebugRandomizePickupMethods(); +} +ConCommand test_itempickuppanel( "test_itempickuppanel", Test_ItemPickupPanel, "Debugging tool to test the item pickup panel. Usage: test_itempickuppanel\n", FCVAR_CHEAT ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void Test_ItemDiscardPanel( const CCommand &args ) +{ + int iClass = TF_CLASS_PYRO; + C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); + if ( pLocalPlayer ) + { + iClass = pLocalPlayer->GetPlayerClass()->GetClassIndex(); + } + + CItemDiscardPanel *pItemPanel = EconUI()->OpenItemDiscardPanel(); + pItemPanel->InvalidateLayout( false, true ); + + CEconItemView *pItemView = NULL; + + bool bAllItems = (args.ArgC() <= 1); + for ( int i = bAllItems ? 0 : clamp( atoi(args[1]), 0, 2 ); i <= 2 && !pItemView; i++ ) + { + pItemView = TFInventoryManager()->GetItemInLoadoutForClass( iClass, i ); + } + + if ( pItemView ) + { + pItemPanel->SetItem( pItemView ); + } +} + +ConCommand test_itemdiscardpanel( "test_itemdiscardpanel", Test_ItemDiscardPanel, "Debugging tool to test the item discard panel. Usage: test_itemdiscardpanel <weapon name>\n <weapon id>: 0 = primary, 1 = secondary, 2 = melee.", FCVAR_CHEAT ); +#endif // defined(DEBUG) + |