diff --git a/code/client/cl_console.cpp b/code/client/cl_console.cpp index a23c400..b138271 100644 --- a/code/client/cl_console.cpp +++ b/code/client/cl_console.cpp @@ -288,6 +288,8 @@ void CL_ConInit() } Con_ClearNotify(); + CL_LoadCommandHistory(); + Cmd_AddCommand( "toggleconsole", Con_ToggleConsole_f ); Cmd_AddCommand( "messagemode", Con_MessageMode_f ); Cmd_AddCommand( "messagemode2", Con_MessageMode2_f ); @@ -642,6 +644,7 @@ static void Con_FixPosition() } } + void Con_ScrollLines( int lines ) { if (lines == 0) @@ -651,6 +654,7 @@ void Con_ScrollLines( int lines ) Con_FixPosition(); } + void Con_ScrollPages( int pages ) { if (pages == 0) @@ -661,6 +665,7 @@ void Con_ScrollPages( int pages ) Con_FixPosition(); } + void Con_Top() { con.display = con.totallines; @@ -669,6 +674,7 @@ void Con_Top() } } + void Con_Bottom() { con.display = con.current; diff --git a/code/client/cl_keys.cpp b/code/client/cl_keys.cpp index 2d9329a..598053d 100644 --- a/code/client/cl_keys.cpp +++ b/code/client/cl_keys.cpp @@ -1140,3 +1140,89 @@ void Key_ClearStates() anykeydown = 0; } + + +#define HISTORY_PATH "cnq3cmdhistory" + + +static const cvar_t* con_saveCmdHistory; + + +void CL_LoadCommandHistory() +{ + con_saveCmdHistory = Cvar_Get( "con_saveCmdHistory", "0", CVAR_ARCHIVE ); + + fileHandle_t f; + FS_FOpenFileRead( HISTORY_PATH, &f, qfalse ); + if ( f == NULL ) + return; + + int count; + if ( FS_Read( &count, sizeof(int), f ) != sizeof(int) || + count <= 0 || + count > COMMAND_HISTORY ) { + FS_FCloseFile( f ); + return; + } + + int lengths[COMMAND_HISTORY]; + const int lengthBytes = sizeof(int) * count; + if ( FS_Read( lengths, lengthBytes, f ) != lengthBytes ) { + FS_FCloseFile( f ); + return; + } + + for ( int i = 0; i < count; ++i ) { + const int l = lengths[i]; + if ( l <= 0 || + FS_Read( historyEditLines[i].buffer, l, f ) != l ) { + FS_FCloseFile( f ); + return; + } + historyEditLines[i].buffer[l] = '\0'; + historyEditLines[i].cursor = l; + } + + nextHistoryLine = count; + historyLine = count; + const int totalCount = ARRAY_LEN( historyEditLines ); + for ( int i = count; i < totalCount; ++i ) { + historyEditLines[i].buffer[0] = '\0'; + } + + FS_FCloseFile(f); +} + + +void CL_SaveCommandHistory() +{ + if ( con_saveCmdHistory->integer == 0 ) + return; + + const fileHandle_t f = FS_FOpenFileWrite( HISTORY_PATH ); + if ( f == NULL ) + return; + + int count = 0; + int lengths[COMMAND_HISTORY]; + const int totalCount = ARRAY_LEN( historyEditLines ); + for ( int i = 0; i < totalCount; ++i ) { + const char* const s = historyEditLines[(historyLine + i) % COMMAND_HISTORY].buffer; + if ( *s == '\0' ) + continue; + + lengths[count++] = strlen( s ); + } + + FS_Write( &count, sizeof(count), f ); + FS_Write( lengths, sizeof(int) * count, f ); + for ( int i = 0, j = 0; i < totalCount; ++i ) { + const char* const s = historyEditLines[(historyLine + i) % COMMAND_HISTORY].buffer; + if ( *s == '\0' ) + continue; + + FS_Write( s, lengths[j++], f ); + } + + FS_FCloseFile( f ); +} diff --git a/code/client/cl_main.cpp b/code/client/cl_main.cpp index ae90063..966e5cf 100644 --- a/code/client/cl_main.cpp +++ b/code/client/cl_main.cpp @@ -2114,6 +2114,8 @@ void CL_Shutdown() CL_ShutdownUI(); + CL_SaveCommandHistory(); + Cmd_RemoveCommand ("cmd"); Cmd_RemoveCommand ("configstrings"); Cmd_RemoveCommand ("userinfo"); diff --git a/code/client/keys.h b/code/client/keys.h index caeb865..d76d792 100644 --- a/code/client/keys.h +++ b/code/client/keys.h @@ -41,3 +41,6 @@ qbool Key_GetOverstrikeMode(); void Key_SetOverstrikeMode( qbool state ); void Key_ClearStates(); int Key_GetKey( const char* binding ); + +void CL_LoadCommandHistory(); +void CL_SaveCommandHistory();