//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Disconnect prompt to warn leavers of penalty they will incur // // $NoKeywords: $ //============================================================================= #include "cbase.h" #include "tf_hud_disconnect_prompt.h" #include "econ_controls.h" #include "tf_gc_client.h" #include "tf_gamerules.h" using namespace vgui; CTFDisconnectConfirmDialog::CTFDisconnectConfirmDialog( const char *pTitle, const char *pTextKey, const char *pConfirmBtnText, const char *pCancelBtnText, GenericConfirmDialogCallback callback, vgui::Panel *pParent ) : CTFGenericConfirmDialog( pTitle, pTextKey, pConfirmBtnText, pCancelBtnText, callback, pParent ) { m_eAbandonStatus = GTFGCClientSystem()->GetCurrentServerAbandonStatus(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- const char *CTFDisconnectConfirmDialog::GetResFile() { switch ( m_eAbandonStatus ) { case k_EAbandonGameStatus_Safe: return "Resource/UI/econ/ConfirmDialogAbandonSafe.res"; case k_EAbandonGameStatus_AbandonWithoutPenalty: return "Resource/UI/econ/ConfirmDialogAbandonNoPenalty.res"; case k_EAbandonGameStatus_AbandonWithPenalty: return "Resource/UI/econ/ConfirmDialogAbandonPenalty.res"; } return "Resource/UI/econ/ConfirmDialogOptOut.res"; } void CTFDisconnectConfirmDialog::SetReason( eDisconnectReason reason ) { m_eReason = reason; } void CTFDisconnectConfirmDialog::OnCommand( const char *command ) { if( FStrEq( command, "confirm" ) ) { // Check this before disconnecting if ( GTFGCClientSystem()->BExitMatchmakingAfterDisconnect() ) { GTFGCClientSystem()->EndMatchmaking( true ); } engine->DisconnectInternal(); int nCount = m_confirmCommands.Count(); for( int i=0; iClientCmd_Unrestricted( m_confirmCommands[i] ); } } else if( FStrEq( command, "cancel" ) ) { int nCount = m_cancelCommands.Count(); for( int i=0; iClientCmd_Unrestricted( m_cancelCommands[i] ); } } // This will clean us up if we get a cancel or confirm command BaseClass::OnCommand( command ); } void CTFDisconnectConfirmDialog::AddConfirmCommand( const char *command ) { m_confirmCommands.AddToTail( command ); } void CTFDisconnectConfirmDialog::AddCancelCommand( const char *command ) { m_cancelCommands.AddToTail( command ); } // // Extern Helper to Build Dialog CTFDisconnectConfirmDialog *BuildDisconnectConfirmDialog () { EAbandonGameStatus eAbandonStatus = GTFGCClientSystem()->GetCurrentServerAbandonStatus(); const char* pszTitle = NULL; const char* pszBody = NULL; const char* pszConfirm = NULL; switch ( eAbandonStatus ) { case k_EAbandonGameStatus_Safe: pszTitle = "#TF_MM_Disconnect_Title"; pszBody = "#TF_MM_Disconnect"; pszConfirm = "#TF_MM_Rejoin_Leave"; break; case k_EAbandonGameStatus_AbandonWithoutPenalty: pszTitle = "#TF_MM_Abandon_Title"; pszBody = "#TF_MM_Abandon_NoPenalty"; pszConfirm = "#TF_MM_Rejoin_Leave"; break; case k_EAbandonGameStatus_AbandonWithPenalty: pszTitle = "#TF_MM_Abandon_Title"; pszBody = ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() ) ? "TF_MM_Abandon_Ban" : "#TF_MM_Abandon"; pszConfirm = "#TF_MM_Rejoin_Abandon"; break; } CTFDisconnectConfirmDialog *pDialog = vgui::SETUP_PANEL( new CTFDisconnectConfirmDialog( pszTitle, pszBody, pszConfirm, "#TF_MM_Rejoin_Stay", NULL, NULL ) ); return pDialog; } // sent from quit and disconnect attempts CON_COMMAND( cl_disconnect_prompt, "Prompt about disconnect" ) { CTFDisconnectConfirmDialog *pDialog = vgui::SETUP_PANEL( new CTFDisconnectConfirmDialog( "#TF_MM_Abandon_Title", "#TF_MM_Abandon", "#TF_Coach_Yes", "#TF_Coach_No", NULL, NULL ) ); if ( pDialog ) { pDialog->Show(); } } bool HandleDisconnectAttempt() { // !FIXME! We could show different messages depending on the abandon status if( engine->IsInGame() && GameRules() && GameRules()->ShouldConfirmOnDisconnect() && GTFGCClientSystem()->GetCurrentServerAbandonStatus() == k_EAbandonGameStatus_AbandonWithPenalty ) { CTFDisconnectConfirmDialog *pDialog = vgui::SETUP_PANEL( new CTFDisconnectConfirmDialog( "#TF_MM_Abandon_Title", "#TF_MM_Abandon", "#TF_Coach_Yes", "#TF_Coach_No", NULL, NULL ) ); if ( pDialog ) { pDialog->Show(); } // The disconnect was handled by us. Stop the engine from handling it. return true; } // We're not changing the disconnect behavior in any way. Let the engine take care of it. return false; } //----------------------------------------------------------------------------- // CTFRejoinConfirmDialog //----------------------------------------------------------------------------- CTFRejoinConfirmDialog::CTFRejoinConfirmDialog( const char *pTitle, const char *pTextKey, const char *pConfirmBtnText, const char *pCancelBtnText, GenericConfirmDialogCallback callback, vgui::Panel *pParent ) : CTFGenericConfirmDialog( pTitle, pTextKey, pConfirmBtnText, pCancelBtnText, callback, pParent ) { m_eAbandonStatus = GTFGCClientSystem()->GetAssignedMatchAbandonStatus(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- const char *CTFRejoinConfirmDialog::GetResFile() { switch ( m_eAbandonStatus ) { case k_EAbandonGameStatus_Safe: return "Resource/UI/econ/ConfirmDialogAbandonSafe.res"; case k_EAbandonGameStatus_AbandonWithoutPenalty: return "Resource/UI/econ/ConfirmDialogAbandonNoPenalty.res"; case k_EAbandonGameStatus_AbandonWithPenalty: return "Resource/UI/econ/ConfirmDialogAbandonPenalty.res"; } return "Resource/UI/econ/ConfirmDialogOptOut.res"; } //----------------------------------------------------------------------------- void CTFRejoinConfirmDialog::CloseRejoinWindow() { FinishUp(); }