Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
6.1 KiB

5 years ago
//========= 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; i<nCount; ++i )
{
engine->ClientCmd_Unrestricted( m_confirmCommands[i] );
}
}
else if( FStrEq( command, "cancel" ) )
{
int nCount = m_cancelCommands.Count();
for( int i=0; i<nCount; ++i )
{
engine->ClientCmd_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();
}