//----------------------------------------------------------------------------- // Purpose: rebuilds the list of possible completions from the current entered text //----------------------------------------------------------------------------- void CConsolePanel::RebuildCompletionList(const char *text) { ClearCompletionList(); // we need the length of the text for the partial string compares int len = Q_strlen(text); if ( len < 1 ) { // Fill the completion list with history instead for ( int i = 0 ; i < m_CommandHistory.Count(); i++ ) { CHistoryItem *item = &m_CommandHistory[ i ]; CompletionItem *comp = new CompletionItem(); m_CompletionList.AddToTail( comp ); comp->m_bIsCommand = false; comp->m_pCommand = NULL; comp->m_pText = new CHistoryItem( *item ); } return; } bool bNormalBuild = true; // if there is a space in the text, and the command isn't of the type to know how to autocomplet, then command completion is over const char *space = strstr( text, " " ); if ( space ) { ConCommand *pCommand = FindAutoCompleteCommmandFromPartial( text ); if ( !pCommand ) return; bNormalBuild = false; CUtlVector< CUtlString > commands; int count = pCommand->AutoCompleteSuggest( text, commands ); Assert( count <= COMMAND_COMPLETION_MAXITEMS ); int i; for ( i = 0; i < count; i++ ) { // match found, add to list CompletionItem *item = new CompletionItem(); m_CompletionList.AddToTail( item ); item->m_bIsCommand = false; item->m_pCommand = NULL; item->m_pText = new CHistoryItem( commands[ i ].String() ); } } if ( bNormalBuild ) { // look through the command list for all matches ConCommandBase const *cmd = (ConCommandBase const *)cvar->GetCommands(); while (cmd) { if ( cmd->IsFlagSet( FCVAR_DEVELOPMENTONLY ) || cmd->IsFlagSet( FCVAR_HIDDEN ) ) { cmd = cmd->GetNext(); continue; } if ( !strnicmp(text, cmd->GetName(), len)) { // match found, add to list CompletionItem *item = new CompletionItem(); m_CompletionList.AddToTail( item ); item->m_pCommand = (ConCommandBase *)cmd; const char *tst = cmd->GetName(); if ( !cmd->IsCommand() ) { item->m_bIsCommand = false; ConVar *var = ( ConVar * )cmd; ConVar_ServerBounded *pBounded = dynamic_cast<ConVar_ServerBounded*>( var ); if ( pBounded || var->IsFlagSet( FCVAR_NEVER_AS_STRING ) ) { char strValue[512]; int intVal = pBounded ? pBounded->GetInt() : var->GetInt(); float floatVal = pBounded ? pBounded->GetFloat() : var->GetFloat(); if ( floatVal == intVal ) Q_snprintf( strValue, sizeof( strValue ), "%d", intVal ); else Q_snprintf( strValue, sizeof( strValue ), "%f", floatVal ); item->m_pText = new CHistoryItem( var->GetName(), strValue ); } else { item->m_pText = new CHistoryItem( var->GetName(), var->GetString() ); } } else { item->m_bIsCommand = true; item->m_pText = new CHistoryItem( tst ); } } cmd = cmd->GetNext(); } // Now sort the list by command name if ( m_CompletionList.Count() >= 2 ) { for ( int i = 0 ; i < m_CompletionList.Count(); i++ ) { for ( int j = i + 1; j < m_CompletionList.Count(); j++ ) { const CompletionItem *i1, *i2; i1 = m_CompletionList[ i ]; i2 = m_CompletionList[ j ]; if ( Q_stricmp( i1->GetName(), i2->GetName() ) > 0 ) { CompletionItem *temp = m_CompletionList[ i ]; m_CompletionList[ i ] = m_CompletionList[ j ]; m_CompletionList[ j ] = temp; } } } } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ConVar_PrintDescription( const ConCommandBase *pVar ) { bool bMin, bMax; float fMin, fMax; const char *pStr; assert( pVar ); Color clr; clr.SetColor( 255, 100, 100, 255 ); if ( !pVar->IsCommand() ) { ConVar *var = ( ConVar * )pVar; const ConVar_ServerBounded *pBounded = dynamic_cast<const ConVar_ServerBounded*>( var ); bMin = var->GetMin( fMin ); bMax = var->GetMax( fMax ); const char *value = NULL; char tempVal[ 32 ]; if ( pBounded || var->IsFlagSet( FCVAR_NEVER_AS_STRING ) ) { value = tempVal; int intVal = pBounded ? pBounded->GetInt() : var->GetInt(); float floatVal = pBounded ? pBounded->GetFloat() : var->GetFloat(); if ( fabs( (float)intVal - floatVal ) < 0.000001 ) { Q_snprintf( tempVal, sizeof( tempVal ), "%d", intVal ); } else { Q_snprintf( tempVal, sizeof( tempVal ), "%f", floatVal ); } } else { value = var->GetString(); } if ( value ) { ConColorMsg( clr, "\"%s\" = \"%s\"", var->GetName(), value ); if ( stricmp( value, var->GetDefault() ) ) { ConMsg( " ( def. \"%s\" )", var->GetDefault() ); } } if ( bMin ) { ConMsg( " min. %f", fMin ); } if ( bMax ) { ConMsg( " max. %f", fMax ); } ConMsg( "\n" ); // Handled virtualized cvars. if ( pBounded && fabs( pBounded->GetFloat() - var->GetFloat() ) > 0.0001f ) { ConColorMsg( clr, "** NOTE: The real value is %.3f but the server has temporarily restricted it to %.3f **\n", var->GetFloat(), pBounded->GetFloat() ); } } else { ConCommand *var = ( ConCommand * )pVar; ConColorMsg( clr, "\"%s\"\n", var->GetName() ); } ConVar_PrintFlags( pVar ); pStr = pVar->GetHelpText(); if ( pStr && pStr[0] ) { ConMsg( " - %s\n", pStr ); } }
void CServerGameDLL::ApplyGameSettings( KeyValues *pKV ) { if ( !pKV ) return; // Fix the game settings request when a generic request for // map launch comes in (it might be nested under reservation // processing) bool bAlreadyLoadingMap = false; char const *szBspName = NULL; const char *pGameDir = COM_GetModDirectory(); if ( !Q_stricmp( pKV->GetName(), "::ExecGameTypeCfg" ) ) { if ( !engine ) return; char const *szNewMap = pKV->GetString( "map/mapname", "" ); if ( !szNewMap || !*szNewMap ) return; KeyValues *pLaunchOptions = engine->GetLaunchOptions(); if ( !pLaunchOptions ) return; if ( FindLaunchOptionByValue( pLaunchOptions, "changelevel" ) || FindLaunchOptionByValue( pLaunchOptions, "changelevel2" ) ) return; if ( FindLaunchOptionByValue( pLaunchOptions, "map_background" ) ) { return; } bAlreadyLoadingMap = true; if ( FindLaunchOptionByValue( pLaunchOptions, "reserved" ) ) { // We are already reserved, but we still need to let the engine // baseserver know how many human slots to allocate pKV->SetInt( "members/numSlots", g_bOfflineGame ? 1 : 8 ); return; } pKV->SetName( pGameDir ); } if ( Q_stricmp( pKV->GetName(), pGameDir ) || bAlreadyLoadingMap ) return; //g_bOfflineGame = pKV->GetString( "map/offline", NULL ) != NULL; g_bOfflineGame = !Q_stricmp( pKV->GetString( "system/network", "LIVE" ), "offline" ); //Msg( "GameInterface reservation payload:\n" ); //KeyValuesDumpAsDevMsg( pKV ); // Vitaliy: Disable cheats as part of reservation in case they were enabled (unless we are on Steam Beta) if ( sv_force_transmit_ents.IsFlagSet( FCVAR_DEVELOPMENTONLY ) && // any convar with FCVAR_DEVELOPMENTONLY flag will be sufficient here sv_cheats && sv_cheats->GetBool() ) { sv_cheats->SetValue( 1 ); } // Between here and the last part: apply settings... char const *szMapCommand = pKV->GetString( "map/mapcommand", "map" ); const char *szMode = pKV->GetString( "game/mode", "sdk" ); #if 0 char const *szGameMode = pKV->GetString( "game/mode", "" ); if ( szGameMode && *szGameMode ) { extern ConVar mp_gamemode; mp_gamemode.SetValue( szGameMode ); } #endif // 0 // LAUNCH GAME if ( !Q_stricmp( szMode, "sdk" ) ) { szBspName = pKV->GetString( "game/mission", NULL ); if ( !szBspName ) return; engine->ServerCommand( CFmtStr( "%s %s reserved\n", szMapCommand, szBspName ) ); } else { bool bSuccess = false; #ifndef DISABLE_PYTHON try { bSuccess = bp::extract<bool>(gamemgr.attr("_ApplyGameSettings")( PyKeyValuesToDict( pKV ) )); } catch( boost::python::error_already_set & ) { Warning("ApplyGameSettings: Error occurred while letting Python apply game settings\n"); PyErr_Print(); } #endif // DISABLE_PYTHON if( !bSuccess ) Warning( "ApplyGameSettings: Unknown game mode!\n" ); } }