summaryrefslogtreecommitdiff
path: root/game/client/tf/vgui/strange_count_transfer_panel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/vgui/strange_count_transfer_panel.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/vgui/strange_count_transfer_panel.cpp')
-rw-r--r--game/client/tf/vgui/strange_count_transfer_panel.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/game/client/tf/vgui/strange_count_transfer_panel.cpp b/game/client/tf/vgui/strange_count_transfer_panel.cpp
new file mode 100644
index 0000000..d16a941
--- /dev/null
+++ b/game/client/tf/vgui/strange_count_transfer_panel.cpp
@@ -0,0 +1,269 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+
+#include "cbase.h"
+#include "strange_count_transfer_panel.h"
+#include "cdll_client_int.h"
+#include "ienginevgui.h"
+#include "econ_item_tools.h"
+#include "econ_ui.h"
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CStatModuleItemSelectionPanel : public CItemCriteriaSelectionPanel
+{
+ DECLARE_CLASS_SIMPLE( CStatModuleItemSelectionPanel, CItemCriteriaSelectionPanel );
+public:
+ CStatModuleItemSelectionPanel( Panel *pParent, const CEconItemView* pCorrespondingItem )
+ : BaseClass( pParent, NULL )
+ , m_pCorrespondingItem( pCorrespondingItem )
+ , m_mapXifierClassCount( CaselessStringLessThan )
+ {
+ int nCount = InventoryManager()->GetLocalInventory()->GetItemCount();
+ for( int i=0; i<nCount; ++i )
+ {
+ if ( !BIsItemStrange( InventoryManager()->GetLocalInventory()->GetItem( i ) ) )
+ continue;
+
+ const char *pItemXifier = InventoryManager()->GetLocalInventory()->GetItem( i )->GetItemDefinition()->GetXifierRemapClass();
+ auto idx = m_mapXifierClassCount.Find( pItemXifier );
+ if ( idx == m_mapXifierClassCount.InvalidIndex() )
+ {
+ idx = m_mapXifierClassCount.Insert( pItemXifier, 0 );
+ }
+
+ m_mapXifierClassCount[ idx ] = m_mapXifierClassCount[ idx ] + 1;
+ }
+ }
+
+ void ApplySchemeSettings( vgui::IScheme *pScheme )
+ {
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ vgui::Label* pWeaponLabel = dynamic_cast<vgui::Label*>( FindChildByName("ItemSlotLabel") );
+ if ( pWeaponLabel )
+ {
+ pWeaponLabel->SetVisible( false );
+ }
+
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose:
+ //-----------------------------------------------------------------------------
+ const char *GetItemNotSelectableReason( const CEconItemView *pItem ) const
+ {
+ if ( !pItem )
+ return NULL;
+
+ if ( !BIsItemStrange( pItem ) )
+ return "#TF_StrangeCount_Transfer_NotStrange";
+
+ if ( m_pCorrespondingItem )
+ {
+ if ( pItem->GetItemID() == m_pCorrespondingItem->GetItemID() )
+ return "#TF_StrangeCount_Transfer_Self";
+
+ if ( !CEconTool_StrangeCountTransfer::AreItemsEligibleForStrangeCountTransfer( m_pCorrespondingItem, pItem ) )
+ return "#TF_StrangeCount_Transfer_TypeMismatch";
+ }
+
+ const char *pItemXifier = pItem->GetItemDefinition()->GetXifierRemapClass();
+ auto idx = m_mapXifierClassCount.Find( pItemXifier );
+ int nCount = 0;
+ if ( !pItemXifier )
+ {
+ // if no xifier, find atleast 1 other matching item
+ CPlayerInventory *pInventory = InventoryManager()->GetLocalInventory();
+ if ( pInventory )
+ {
+ for ( int i = 0; i < pInventory->GetItemCount(); i++ )
+ {
+ CEconItemView *pIterItem = pInventory->GetItem( i );
+ if ( pIterItem->GetItemDefIndex() == pItem->GetItemDefIndex() && BIsItemStrange(pIterItem) )
+ {
+ // find 2 or more, yourself and another
+ if ( ++nCount >= 2 )
+ return NULL;
+ }
+ }
+ }
+ }
+ else if ( idx != m_mapXifierClassCount.InvalidIndex() )
+ {
+ nCount = m_mapXifierClassCount[ idx ];
+ }
+
+ if ( nCount < 2 )
+ {
+ return "#TF_StrangeCount_Transfer_NotEnoughMatches";
+ }
+
+ return NULL;
+ }
+
+protected:
+ const char * m_pszTitleToken;
+ const CEconItemView* m_pCorrespondingItem;
+ CUtlMap< const char*, int > m_mapXifierClassCount;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CStrangeCountTransferPanel::CStrangeCountTransferPanel( vgui::Panel *parent, CEconItemView* pToolItem )
+ : BaseClass( parent, "StrangeCountTrasnferDialog" )
+ , m_pToolItem( pToolItem )
+{
+ Assert( pToolItem );
+
+ ListenForGameEvent( "gameui_hidden" );
+
+ m_hSelectionPanel = 0;
+ m_pSelectingItemModelPanel = NULL;
+
+ EditablePanel* pBG = new EditablePanel( this, "BG" );
+
+ m_pSourceStrangeModelPanel = new CItemModelPanel( pBG, "SourceItem" );
+ m_pSourceStrangeModelPanel->SetActAsButton( true, true );
+ m_pTargetStrangeModelPanel = new CItemModelPanel( pBG, "TargetItem" );
+ m_pTargetStrangeModelPanel->SetActAsButton( true, true );
+ m_pOKButton = new CExButton( pBG, "OkButton", "" );
+
+ vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/ClientScheme.res", "ClientScheme" );
+ SetScheme( scheme );
+ SetProportional( true );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CStrangeCountTransferPanel::~CStrangeCountTransferPanel( void )
+{
+ if ( m_hSelectionPanel )
+ {
+ m_hSelectionPanel->MarkForDeletion();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStrangeCountTransferPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ LoadControlSettings( GetResFile() );
+}
+
+void CStrangeCountTransferPanel::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ UpdateOKButton();
+
+ m_pSourceStrangeModelPanel->SetTooltip( EconUI()->GetBackpackPanel()->GetMouseOverToolTipPanel(), "" );
+ m_pTargetStrangeModelPanel->SetTooltip( EconUI()->GetBackpackPanel()->GetMouseOverToolTipPanel(), "" );
+}
+
+void CStrangeCountTransferPanel::OnCommand( const char *command )
+{
+ if( FStrEq( "apply", command ) )
+ {
+ GCSDK::CProtoBufMsg<CMsgApplyStrangeCountTransfer> msg( k_EMsgGCApplyStrangeCountTransfer );
+
+ if ( !m_pToolItem || !m_pSourceStrangeModelPanel->GetItem() || !m_pTargetStrangeModelPanel->GetItem() )
+ return;
+
+ msg.Body().set_tool_item_id( m_pToolItem->GetItemID() );
+ msg.Body().set_item_src_item_id( m_pSourceStrangeModelPanel->GetItem()->GetItemID() );
+ msg.Body().set_item_dest_item_id( m_pTargetStrangeModelPanel->GetItem()->GetItemID() );
+ GCClientSystem()->BSendMessage( msg );
+
+ EconUI()->Gamestats_ItemTransaction( IE_ITEM_USED_TOOL, m_pToolItem, "applied_strangecounttransfer", m_pToolItem->GetItemDefIndex() );
+
+ GCClientSystem()->BSendMessage( msg );
+
+ SetVisible( false );
+ MarkForDeletion();
+
+ return;
+ }
+ else if ( FStrEq( "cancel", command ) )
+ {
+ MarkForDeletion();
+ return;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+void CStrangeCountTransferPanel::FireGameEvent( IGameEvent *event )
+{
+ if ( FStrEq( event->GetName(), "gameui_hidden" ) )
+ {
+ SetVisible( false );
+ MarkForDeletion();
+ return;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStrangeCountTransferPanel::OnItemPanelMousePressed( vgui::Panel *panel )
+{
+ CItemModelPanel *pItemPanel = dynamic_cast < CItemModelPanel * > ( panel );
+
+ if ( pItemPanel && IsVisible() && !pItemPanel->IsGreyedOut() )
+ {
+ m_pSelectingItemModelPanel = pItemPanel;
+
+ CEconItemView* pOtherItem = pItemPanel == m_pSourceStrangeModelPanel ? m_pTargetStrangeModelPanel->GetItem()
+ : m_pSourceStrangeModelPanel->GetItem();
+
+ m_hSelectionPanel = new CStatModuleItemSelectionPanel( GetParent(), pOtherItem );
+
+ // Clicked on an item in the crafting area. Open up the selection panel.
+ m_hSelectionPanel->ShowDuplicateCounts( false );
+ m_hSelectionPanel->ShowPanel( 0, true );
+ m_hSelectionPanel->SetCaller( this );
+ m_hSelectionPanel->SetZPos( GetZPos() + 1 );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStrangeCountTransferPanel::OnSelectionReturned( KeyValues *data )
+{
+ Assert( m_pSelectingItemModelPanel );
+
+ if ( data && m_pSelectingItemModelPanel )
+ {
+ uint64 ulIndex = data->GetUint64( "itemindex", INVALID_ITEM_ID );
+
+ CEconItemView* pSelectedItem = InventoryManager()->GetLocalInventory()->GetInventoryItemByItemID( ulIndex );
+ m_pSelectingItemModelPanel->SetItem( pSelectedItem );
+ }
+
+ UpdateOKButton();
+
+ m_pSelectingItemModelPanel = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStrangeCountTransferPanel::UpdateOKButton()
+{
+ bool bOKEnabled = m_pSourceStrangeModelPanel->GetItem() && m_pTargetStrangeModelPanel->GetItem();
+ m_pOKButton->SetEnabled( bOKEnabled );
+} \ No newline at end of file