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.
 
 
 
 
 
 

285 lines
9.8 KiB

//========= Copyright © 1996-2008, Valve Corporation, All rights reserved. ============//
//
// Purpose: Client handler implementations for instruction players how to play
//
//=============================================================================//
#include "cbase.h"
#include "c_gameinstructor.h"
#include "c_baselesson.h"
#include "c_cs_player.h"
#include "cs_gamerules.h"
#include "gametypes.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
extern CUtlDict< int, int > g_LessonActionMap;
extern ConVar gameinstructor_verbose;
enum Mod_LessonAction
{
// Enum starts from end of LessonAction
LESSON_ACTION_GAME_TYPE_IS = LESSON_ACTION_MOD_START,
LESSON_ACTION_GAME_MODE_IS,
LESSON_ACTION_CASUAL_OR_TRAINING,
LESSON_ACTION_HAS_DEFUSER,
LESSON_ACTION_HAS_ANY_ITEMS,
LESSON_ACTION_HAS_MULTIPLE_ITEMS,
LESSON_ACTION_HAS_MULTIPLE_WEAPONS,
LESSON_ACTION_HAS_BUYMENU_OPEN,
LESSON_ACTION_ROUND_STATE_IS,
LESSON_ACTION_TOTAL
};
void CScriptedIconLesson::Mod_PreReadLessonsFromFile( void )
{
// Add custom actions to the map
CScriptedIconLesson::LessonActionMap.Insert( "game type is", LESSON_ACTION_GAME_TYPE_IS );
CScriptedIconLesson::LessonActionMap.Insert( "game mode is", LESSON_ACTION_GAME_MODE_IS );
CScriptedIconLesson::LessonActionMap.Insert( "is casual or training", LESSON_ACTION_CASUAL_OR_TRAINING );
CScriptedIconLesson::LessonActionMap.Insert( "has defuser", LESSON_ACTION_HAS_DEFUSER );
CScriptedIconLesson::LessonActionMap.Insert( "has any items", LESSON_ACTION_HAS_ANY_ITEMS );
CScriptedIconLesson::LessonActionMap.Insert( "has multiple items", LESSON_ACTION_HAS_MULTIPLE_ITEMS );
CScriptedIconLesson::LessonActionMap.Insert( "has multiple weapons", LESSON_ACTION_HAS_MULTIPLE_WEAPONS );
CScriptedIconLesson::LessonActionMap.Insert( "is buymenu open", LESSON_ACTION_HAS_BUYMENU_OPEN );
CScriptedIconLesson::LessonActionMap.Insert( "round state is", LESSON_ACTION_ROUND_STATE_IS ); //0=freezetime; 1=mid-round; 2=round is over;
}
bool CScriptedIconLesson::Mod_ProcessElementAction( int iAction, bool bNot, const char *pchVarName, EHANDLE &hVar, const CGameInstructorSymbol *pchParamName, float fParam, C_BaseEntity *pParam, const char *pchParam, bool &bModHandled )
{
// Assume we're going to handle the action
bModHandled = true;
C_BaseEntity *pVar = hVar.Get();
switch ( iAction )
{
case LESSON_ACTION_GAME_TYPE_IS:
{
return ( bNot ) ? ( g_pGameTypes->GetCurrentGameType() != fParam ) : ( g_pGameTypes->GetCurrentGameType() == fParam );
break;
}
case LESSON_ACTION_GAME_MODE_IS:
{
return ( bNot ) ? ( g_pGameTypes->GetCurrentGameMode() != fParam ) : ( g_pGameTypes->GetCurrentGameMode() == fParam );
break;
}
case LESSON_ACTION_CASUAL_OR_TRAINING:
{
return ( (g_pGameTypes->GetCurrentGameType() == CS_GameType_Classic && g_pGameTypes->GetCurrentGameMode() == CS_GameMode::Classic_Casual) || g_pGameTypes->GetCurrentGameType() == CS_GameType_Training );
break;
}
case LESSON_ACTION_HAS_DEFUSER:
{
C_CSPlayer *pPlayer = dynamic_cast< C_CSPlayer* >( pVar );
if ( !pPlayer )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s]->HasDefuser()", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "... " );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
ConColorMsg( CBaseLesson::m_rgbaVerboseClose, "\tVar handle as CSPlayer returned NULL!\n" );
}
return false;
}
bool bHasDefuser = pPlayer->HasDefuser();
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s]->HasSpareWeapon()", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "%s ", ( bHasDefuser ? "true" : "false" ) );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
}
return ( bNot ) ? ( !bHasDefuser ) : ( bHasDefuser );
}
case LESSON_ACTION_HAS_ANY_ITEMS:
{
C_CSPlayer *pPlayer = dynamic_cast< C_CSPlayer* >( pVar );
if ( !pPlayer )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s]->GetCSWeapon( ITEM )", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "... " );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
ConColorMsg( CBaseLesson::m_rgbaVerboseClose, "\tVar handle as CSPlayer returned NULL!\n" );
}
return false;
}
bool bHasItem = false;
for ( int i = ITEM_FIRST; i <= ITEM_MAX; i = i + 1 )
{
if ( pPlayer->GetCSWeapon( (CSWeaponID)i ) )
{
bHasItem = true;
break;
}
}
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s]->GetCSWeapon( ITEM )", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "%s ", ( bHasItem ? "true" : "false" ) );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
}
return ( bNot ) ? ( !bHasItem ) : ( bHasItem );
}
case LESSON_ACTION_HAS_MULTIPLE_ITEMS:
{
C_CSPlayer *pPlayer = dynamic_cast< C_CSPlayer* >( pVar );
if ( !pPlayer )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s] item count ", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "... " );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
ConColorMsg( CBaseLesson::m_rgbaVerboseClose, "\tVar handle as CSPlayer returned NULL!\n" );
}
return false;
}
int nItems = 0;
for ( int i = ITEM_FIRST; i <= ITEM_MAX; i++ )
if ( pPlayer->GetCSWeapon( (CSWeaponID)i ) )
nItems++;
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s] item count ", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "%d ", ( nItems ) );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
}
return ( bNot ) ? ( nItems < 2 ) : ( nItems >= 2 );
}
case LESSON_ACTION_HAS_MULTIPLE_WEAPONS:
{
C_CSPlayer *pPlayer = dynamic_cast< C_CSPlayer* >( pVar );
if ( !pPlayer )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s] weapon count ", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "... " );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
ConColorMsg( CBaseLesson::m_rgbaVerboseClose, "\tVar handle as CSPlayer returned NULL!\n" );
}
return false;
}
int nWeapons = 0;
for ( int i = WEAPON_FIRST; i <= WEAPON_LAST; i++ )
{
if ( pPlayer->GetCSWeapon( (CSWeaponID)i ) )
nWeapons++;
}
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s] weapon count ", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "%d ", ( nWeapons ) );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
}
return ( bNot ) ? ( nWeapons < 2 ) : ( nWeapons >= 2 );
}
case LESSON_ACTION_HAS_BUYMENU_OPEN:
{
C_CSPlayer *pPlayer = dynamic_cast< C_CSPlayer* >( pVar );
if ( !pPlayer )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s]->IsBuyMenuOpen()", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "... " );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
ConColorMsg( CBaseLesson::m_rgbaVerboseClose, "\tVar handle as CSPlayer returned NULL!\n" );
}
return false;
}
bool bHasMenuOpen = pPlayer->IsBuyMenuOpen();
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t[%s]->IsBuyMenuOpen()", pchVarName );
ConColorMsg( CBaseLesson::m_rgbaVerboseName, "%s ", ( bHasMenuOpen ? "true" : "false" ) );
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, ( bNot ) ? ( "== false\n" ) : ( "== true\n" ) );
}
return ( bNot ) ? ( !bHasMenuOpen ) : ( bHasMenuOpen );
}
case LESSON_ACTION_ROUND_STATE_IS:
{
int RoundState;
if ( CSGameRules()->IsFreezePeriod() )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t Round is in freeze time.\n" );
}
RoundState = 0;// freeze time
}
else if ( CSGameRules()->IsRoundOver() )
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t Round is over.\n" );
}
RoundState = 2;// round is over
}
else
{
if ( gameinstructor_verbose.GetInt() > 0 && ShouldShowSpew() )
{
ConColorMsg( CBaseLesson::m_rgbaVerbosePlain, "\t Round is in progress.\n" );
}
RoundState = 1;// in the round
}
return ( bNot ) ? ( RoundState != fParam ) : ( RoundState == fParam );
}
default:
// Didn't handle this action
bModHandled = false;
break;
}
return false;
}
bool C_GameInstructor::Mod_HiddenByOtherElements( void )
{
//C_ASW_Marine *pLocalMarine = C_ASW_Marine::GetLocalMarine();
//if ( pLocalMarine && pLocalMarine->IsControllingTurret() )
//{
// return true;
//}
return false;
}