Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

243 lines
6.1 KiB

//========= Copyright © 1996-2008, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=====================================================================================//
#include "cbase.h"
#include "basemodpanel.h"
#include "UIGameData.h"
// vgui controls
#include "vgui/ILocalize.h"
// matchsystem
#include "matchmaking/imatchframework.h"
#ifndef _GAMECONSOLE
#include "steam/steam_api.h"
#endif
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
using namespace BaseModUI;
using namespace vgui;
//
// Invite approval
//
static int s_nInviteApprovalConf = 0;
static ISelectStorageDeviceClient *s_pPendingInviteStorageSelector = NULL;
enum InviteUserMapping_t
{
INVITE_USER_BLOCK_INPUT,
INVITE_USER_ALLOW_INPUT
};
static void Invite_MapUserForUiInput( InviteUserMapping_t eUi )
{
// Check invited user if it was the active user
#ifdef _GAMECONSOLE
if ( XBX_GetInvitedUserId() == XBX_INVALID_USER_ID )
return;
for ( DWORD k = 0; k < XBX_GetNumGameUsers(); ++ k )
{
if ( XBX_GetInvitedUserId() == (DWORD) XBX_GetUserId( k ) )
return;
}
// Invited user artificial mapping
switch ( eUi )
{
case INVITE_USER_BLOCK_INPUT:
XBX_ClearUserId( XBX_GetInvitedUserId() );
break;
case INVITE_USER_ALLOW_INPUT:
XBX_SetUserId( XBX_GetNumGameUsers(), XBX_GetInvitedUserId() );
break;
}
#endif
}
static void Invite_NotifyAction( char const *szNotifyAction )
{
s_nInviteApprovalConf = 0;
Invite_MapUserForUiInput( INVITE_USER_BLOCK_INPUT );
g_pMatchFramework->GetEventsSubscription()->BroadcastEvent( new KeyValues(
"OnInvite", "action", szNotifyAction ) );
}
static void Invite_Approved()
{
CUIGameData::Get()->Invite_Connecting();
Invite_NotifyAction( "join" );
}
static void Invite_Declined()
{
Invite_NotifyAction( "deny" );
}
void CUIGameData::RunFrame_Invite()
{
if ( s_nInviteApprovalConf )
{
#if 0 // TODO: UI: // Check that the confirmation wasn't dismissed without notifying the invite system
// Check that the confirmation wasn't dismissed without notifying the invite system
GenericConfirmation* confirmation =
static_cast<GenericConfirmation*>( CBaseModPanel::GetSingleton().GetWindow( WT_GENERICCONFIRMATION ) );
if ( !confirmation ||
confirmation->GetUsageId() != s_nInviteApprovalConf )
{
// Well, pretend like user declined the prompt
Invite_Declined();
}
#endif
}
if ( s_pPendingInviteStorageSelector && !IsXUIOpen() )
{
SelectStorageDevice( s_pPendingInviteStorageSelector );
s_pPendingInviteStorageSelector = NULL;
}
}
//=============================================================================
#ifdef _GAMECONSOLE
class CInviteSelectStorageDevice : public CChangeStorageDevice
{
public:
explicit CInviteSelectStorageDevice();
public:
virtual void DeviceChangeCompleted( bool bChanged );
};
CInviteSelectStorageDevice::CInviteSelectStorageDevice() :
CChangeStorageDevice( XBX_GetInvitedUserId() )
{
// Get UI panel
CBaseModPanel &ui = CBaseModPanel::GetSingleton();
ui.OnGameUIActivated();
// Allow non-involved controller
m_bAnyController = true;
// Don't force to re-select, just reload configs
m_bForce = false;
Invite_MapUserForUiInput( INVITE_USER_ALLOW_INPUT );
}
void CInviteSelectStorageDevice::DeviceChangeCompleted( bool bChanged )
{
CChangeStorageDevice::DeviceChangeCompleted( bChanged );
// Proceed with joining the invite session
Invite_NotifyAction( "join" );
}
#endif
//=============================================================================
bool CUIGameData::Invite_IsStorageDeviceValid()
{
#ifdef _GAMECONSOLE
//
// Note: the only code path that should lead to this routine is
// from invite accepting code.
// XBX_GetInvitedUserId() is set to the user id of who accepted the invite
// For that user the storage device has to be validated.
//
// If this function returns "true" it means that the user has a valid device
// selected and it is safe to proceed with the invite.
//
// If this function returns "false" it will send the "join" action OnInvite event
// after storage device selection process is over.
//
int iCtrlr = XBX_GetInvitedUserId();
if ( iCtrlr < 0 || iCtrlr >= XUSER_MAX_COUNT )
return true;
// Check what device the guy currently has mapped
DWORD dwDevice = XBX_GetStorageDeviceId( iCtrlr );
if ( XBX_DescribeStorageDevice( dwDevice ) ||
XBX_STORAGE_DECLINED == dwDevice )
// The guy has a valid device selected
// or allow the guy to play because we already
// told him earlier that his settings will not
// be saved
return true;
//
// Need to show device selector
//
s_pPendingInviteStorageSelector = new CInviteSelectStorageDevice;
return false;
#endif
return true;
}
void CUIGameData::Invite_Confirm()
{
// Activate game ui
CBaseModPanel &ui = CBaseModPanel::GetSingleton();
if ( !ui.IsVisible() )
{
// Activate game ui to see the dialog
engine->ExecuteClientCmd( "gameui_activate" );
}
#if 0 // TODO: UI: // Show a prompt
// Get current window
CBaseModFrame *pFrame = NULL;
WINDOW_TYPE wt = ui.GetActiveWindowType();
if ( wt != WT_NONE &&
wt != WT_GENERICCONFIRMATION )
pFrame = ui.GetWindow( wt );
// Show a prompt
GenericConfirmation* confirmation =
static_cast<GenericConfirmation*>( ui.
OpenWindow( WT_GENERICCONFIRMATION, pFrame, false ) );
GenericConfirmation::Data_t data;
data.pWindowTitle = "#L4D360UI_LeaveInviteConf";
data.pMessageText = "#L4D360UI_LeaveInviteConfTxt";
data.bOkButtonEnabled = true;
data.bCancelButtonEnabled = true;
data.pfnOkCallback = Invite_Approved;
data.pfnCancelCallback = Invite_Declined;
s_nInviteApprovalConf = confirmation->SetUsageData(data);
#endif
Invite_MapUserForUiInput( INVITE_USER_ALLOW_INPUT );
}
void CUIGameData::Invite_Connecting()
{
// Close any session that we might have outstanding
g_pMatchFramework->CloseSession();
#if 0 // TODO: UI: // Navigate to attract screen which might take a frame
// Navigate to attract screen which might take a frame
CBaseModPanel::GetSingleton().CloseAllWindows( CBaseModPanel::CLOSE_POLICY_EVEN_MSGS );
CAttractScreen::SetAttractMode( CAttractScreen::ATTRACT_ACCEPTINVITE );
CBaseModPanel::GetSingleton().OpenWindow( WT_ATTRACTSCREEN, NULL, true );
#endif
}