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/econ/item_rental_ui.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/econ/item_rental_ui.cpp')
| -rw-r--r-- | game/client/econ/item_rental_ui.cpp | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/game/client/econ/item_rental_ui.cpp b/game/client/econ/item_rental_ui.cpp new file mode 100644 index 0000000..44025a5 --- /dev/null +++ b/game/client/econ/item_rental_ui.cpp @@ -0,0 +1,274 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + + +#include "cbase.h" +#include "rtime.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/TextEntry.h" +#include "vgui/IInput.h" +#include "econ_item_system.h" +#include "econ_item_constants.h" +#include "econ_gcmessages.h" +#include "econ_item_inventory.h" +#include "item_rental_ui.h" + +#ifdef TF_CLIENT_DLL +#include "c_tf_gamestats.h" +#endif + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +//----------------------------------------------------------------------------- +// Purpose: Confirm item preview. +//----------------------------------------------------------------------------- +class CConfirmItemPreviewDialog : public CBaseToolUsageDialog +{ + DECLARE_CLASS_SIMPLE( CConfirmItemPreviewDialog, CBaseToolUsageDialog ); + +public: + CConfirmItemPreviewDialog( vgui::Panel *pParent, CEconItemView *pPreviewItem ); + ~CConfirmItemPreviewDialog(); + + virtual void ApplySchemeSettings( vgui::IScheme *scheme ); + virtual void Apply( void ); + +private: + + CEconItemView* m_pPreviewItem; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CConfirmItemPreviewDialog::CConfirmItemPreviewDialog( vgui::Panel *parent, CEconItemView *pPreviewItem ) : CBaseToolUsageDialog( parent, "ConfirmItemPreviewDialog", pPreviewItem, pPreviewItem ) +{ + m_pPreviewItem = pPreviewItem; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CConfirmItemPreviewDialog::~CConfirmItemPreviewDialog() +{ + delete m_pPreviewItem; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CConfirmItemPreviewDialog::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + LoadControlSettings( "Resource/UI/econ/ConfirmItemPreviewDialog.res" ); + + BaseClass::ApplySchemeSettings( pScheme ); + + m_pTitleLabel = dynamic_cast<vgui::Label*>( FindChildByName("TitleLabel") ); + if ( m_pTitleLabel ) + { + wchar_t *pszBaseString = g_pVGuiLocalize->Find( "ItemPreviewDialogTitle" ); + if ( pszBaseString ) + { + wchar_t wTemp[256]; + g_pVGuiLocalize->ConstructString_safe( wTemp, pszBaseString, 1, m_pToolModelPanel->GetItem()->GetItemName() ); + m_pTitleLabel->SetText( wTemp ); + m_pTitleLabel->GetTextImage()->ClearColorChangeStream(); + } + } + + m_pSubjectModelPanel->SetVisible( false ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CConfirmItemPreviewDialog::Apply( void ) +{ + // Notify the GC that the player wants to preview this item. + GCSDK::CGCMsg< MsgGCItemPreviewRequest_t > msg( k_EMsgGCItemPreviewRequest ); + + msg.Body().m_unItemDefIndex = m_pToolModelPanel->GetItem()->GetItemDefIndex(); + + // OGS LOGGING HERE + + GCClientSystem()->BSendMessage( msg ); + + EconUI()->SetPreventClosure( false ); +} + +//----------------------------------------------------------------------------- +// Purpose: GC Msg handler to receive the item preview query response. +//----------------------------------------------------------------------------- +class CGCItemPreviewStatusResponse : public GCSDK::CGCClientJob +{ +public: + CGCItemPreviewStatusResponse( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {} + + virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket ) + { + GCSDK::CGCMsg<MsgGCItemPreviewCheckStatusResponse_t> msg( pNetPacket ); + + CStorePanel *pStorePanel = EconUI()->GetStorePanel(); + if ( !pStorePanel ) + return true; + + if ( msg.Body().m_eResponse == k_EGCMsgResponseOK ) + { + // We can preview the item. + CEconItemView *pPreviewItem = new CEconItemView(); + pPreviewItem->Init( msg.Body().m_unItemDefIndex, AE_UNIQUE, AE_USE_SCRIPT_VALUE, true ); + CConfirmItemPreviewDialog *dialog = vgui::SETUP_PANEL( new CConfirmItemPreviewDialog( pStorePanel->GetPropertySheet()->GetActivePage(), pPreviewItem ) ); + MakeModalAndBringToFront( dialog ); + } + else + { +#ifdef TF_CLIENT_DLL + C_CTFGameStats::ImmediateWriteInterfaceEvent( "store_preview_item_denied", CFmtStr( "%i", msg.Body().m_unItemDefIndex ).Access() ); +#endif + + // We aren't allowed to preview an item right now. + CTFMessageBoxDialog* pDialog = ShowMessageBox( "#ItemPreview_PreviewStartFailedTitle", "#ItemPreview_PreviewStartFailedText", "#GameUI_OK" ); + RTime32 nextTime = msg.Body().m_timePreviewTime + EconUI()->GetStorePanel()->GetPriceSheet()->GetPreviewPeriod(); + + locchar_t wzValue[64]; + char time_buf[k_RTimeRenderBufferSize]; + GLocalizationProvider()->ConvertUTF8ToLocchar( CRTime::Render( nextTime, time_buf ), wzValue, sizeof( wzValue ) ); + pDialog->AddStringToken( "date_time", wzValue ); + } + + return true; + } + +}; + +GC_REG_JOB( GCSDK::CGCClient, CGCItemPreviewStatusResponse, "CGCItemPreviewStatusResponse", k_EMsgGCItemPreviewStatusResponse, GCSDK::k_EServerTypeGCClient ); + +//----------------------------------------------------------------------------- +// Purpose: The GC is telling us our request has been granted. +//----------------------------------------------------------------------------- +class CGCItemPreviewRequestResponse : public GCSDK::CGCClientJob +{ +public: + CGCItemPreviewRequestResponse( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {} + + static void OnPreviewItemConfirm( bool bConfirmed, void *pContext ) + { + InventoryManager()->ShowItemsPickedUp( true, false ); + + CStorePage* pStorePage = dynamic_cast<CStorePage*>( EconUI()->GetStorePanel()->GetActivePage() ); + if ( pStorePage ) + { + pStorePage->UpdateModelPanels(); + } + } + + virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket ) + { + GCSDK::CGCMsg<MsgGCItemPreviewRequestResponse_t> msg( pNetPacket ); + + CStorePanel *pStorePanel = EconUI()->GetStorePanel(); + if ( !pStorePanel ) + return true; + + if ( msg.Body().m_eResponse == k_EGCMsgResponseOK ) + { + // The preview has started. + ShowMessageBox( "#ItemPreview_PreviewStartedTitle", "#ItemPreview_PreviewStartedText", "#GameUI_OK", OnPreviewItemConfirm ); + } + else + { + // The preview cannot start right now for some reason. + } + + return true; + } + +}; + +GC_REG_JOB( GCSDK::CGCClient, CGCItemPreviewRequestResponse, "CGCItemPreviewRequestResponse", k_EMsgGCItemPreviewRequestResponse, GCSDK::k_EServerTypeGCClient ); + +void OpenStoreToItem( bool bConfirmed, void *pContext ) +{ + CEconPreviewExpiredNotification* pNotification = (CEconPreviewExpiredNotification*) pContext; + if ( pNotification ) + { + pNotification->SetIsInUse( false ); + pNotification->MarkForDeletion(); + if ( bConfirmed ) + { + EconUI()->OpenStorePanel( pNotification->GetItemDefIndex(), true ); + } + } +} + +CEconPreviewNotification::CEconPreviewNotification( uint64 ulSteamID, uint32 iItemDef ) + : CEconNotification() +{ + SetSteamID( ulSteamID ); + SetLifetime( 20.0f ); + + m_pItemDef = GetItemSchema()->GetItemDefinition( iItemDef ); + if ( !m_pItemDef ) + return; + + AddStringToken( "item_name", g_pVGuiLocalize->Find(m_pItemDef->GetItemBaseName()) ); +} + +void CEconPreviewExpiredNotification::Trigger() +{ + CTFGenericConfirmDialog *pDialog = ShowConfirmDialog( "#TF_PreviewItem_Expired_Title", "#TF_PreviewItem_Expired_Text", "#TF_PreviewItem_BuyIt", "#TF_PreviewItem_NotNow", &OpenStoreToItem ); + pDialog->SetContext( this ); + pDialog->AddStringToken( "item_name", g_pVGuiLocalize->Find(m_pItemDef->GetItemBaseName()) ); + SetIsInUse( true ); +} + +//----------------------------------------------------------------------------- +// Purpose: The GC is telling us our preview item has expired. +//----------------------------------------------------------------------------- +class CGCItemPreviewExpireNotification : public GCSDK::CGCClientJob +{ +public: + CGCItemPreviewExpireNotification( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {} + + virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket ) + { + GCSDK::CGCMsg<MsgGCItemPreviewExpireNotification_t> msg( pNetPacket ); + + CEconPreviewExpiredNotification *pNotification = new CEconPreviewExpiredNotification( msg.Hdr().m_ulSteamID, msg.Body().m_unItemDefIndex ); + pNotification->SetText( "#TF_PreviewItem_Expired" ); + NotificationQueue_Add( pNotification ); + + return true; + } + +}; + +GC_REG_JOB( GCSDK::CGCClient, CGCItemPreviewExpireNotification, "CGCItemPreviewExpireNotification", k_EMsgGCItemPreviewExpireNotification, GCSDK::k_EServerTypeGCClient ); + + +//----------------------------------------------------------------------------- +// Purpose: The GC is telling us we bought our preview item! +//----------------------------------------------------------------------------- +class CGCItemPreviewItemBoughtNotification : public GCSDK::CGCClientJob +{ +public: + CGCItemPreviewItemBoughtNotification( GCSDK::CGCClient *pClient ) : GCSDK::CGCClientJob( pClient ) {} + + virtual bool BYieldingRunGCJob( GCSDK::IMsgNetPacket *pNetPacket ) + { + GCSDK::CProtoBufMsg<CMsgGCItemPreviewItemBoughtNotification> msg( pNetPacket ); + + CEconPreviewItemBoughtNotification *pNotification = new CEconPreviewItemBoughtNotification( msg.Hdr().client_steam_id(), msg.Body().item_def_index() ); + pNotification->SetText( "#TF_PreviewItem_ItemBought" ); + NotificationQueue_Add( pNotification ); + + return true; + } + +}; + +GC_REG_JOB( GCSDK::CGCClient, CGCItemPreviewItemBoughtNotification, "CGCItemPreviewItemBoughtNotification", k_EMsgGCItemPreviewItemBoughtNotification, GCSDK::k_EServerTypeGCClient );
\ No newline at end of file |