diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 2b4c88a9..4bd4d9a1 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -692,6 +692,13 @@ void CL_ParseServerData( sizebuf_t *msg ) Q_strncpy( gamefolder, MSG_ReadString( msg ), MAX_STRING ); host.features = (uint)MSG_ReadLong( msg ); + if( Con_FixedFont( )) + { + // seperate the printfs so the server message can have a color + Con_Print( "\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n" ); + Con_Print( va( "%c%s\n\n", 2, clgame.maptitle )); + } + // receive the player hulls for( i = 0; i < MAX_MAP_HULLS * 3; i++ ) { @@ -789,6 +796,7 @@ void CL_ParseServerData( sizebuf_t *msg ) memset( &clgame.movevars, 0, sizeof( clgame.movevars )); memset( &clgame.oldmovevars, 0, sizeof( clgame.oldmovevars )); + memset( &clgame.centerPrint, 0, sizeof( clgame.centerPrint )); } /* diff --git a/engine/client/cl_pmove.c b/engine/client/cl_pmove.c index f17ffe7d..f4d93240 100644 --- a/engine/client/cl_pmove.c +++ b/engine/client/cl_pmove.c @@ -88,7 +88,7 @@ CL_IsPredicted */ qboolean CL_IsPredicted( void ) { - if( cl_nopred->value ) + if( cl_nopred->value || cl.intermission ) return false; return true; } @@ -100,6 +100,8 @@ CL_LocalWeapons */ qboolean CL_LocalWeapons( void ) { + if( cl.intermission ) + return false; if( cl_lw && cl_lw->value ) return true; return false; @@ -1238,7 +1240,7 @@ void CL_PredictMovement( qboolean repredicting ) CL_SetUpPlayerPrediction( false, false ); - if( !cl.validsequence || cl.intermission ) + if( !cl.validsequence ) return; if(( cls.netchan.outgoing_sequence - cls.netchan.incoming_acknowledged ) >= CL_UPDATE_MASK ) diff --git a/engine/client/cl_scrn.c b/engine/client/cl_scrn.c index ebac70a9..65ef5f61 100644 --- a/engine/client/cl_scrn.c +++ b/engine/client/cl_scrn.c @@ -480,6 +480,7 @@ qboolean SCR_LoadFixedWidthFont( const char *fontname ) cls.creditsFont.hFontTexture = GL_LoadTexture( fontname, NULL, 0, TF_IMAGE, NULL ); R_GetTextureParms( &fontWidth, NULL, cls.creditsFont.hFontTexture ); cls.creditsFont.charHeight = clgame.scrInfo.iCharHeight = fontWidth / 16; + cls.creditsFont.type = FONT_FIXED; cls.creditsFont.valid = true; // build fixed rectangles @@ -519,6 +520,7 @@ qboolean SCR_LoadVariableWidthFont( const char *fontname ) { src = (qfont_t *)buffer; cls.creditsFont.charHeight = clgame.scrInfo.iCharHeight = src->rowheight; + cls.creditsFont.type = FONT_VARIABLE; // build rectangles for( i = 0; i < 256; i++ ) diff --git a/engine/client/client.h b/engine/client/client.h index 7d69475b..42ed4361 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -294,12 +294,16 @@ typedef struct pfnEventHook func; // user-defined function } cl_user_event_t; +#define FONT_FIXED 0 +#define FONT_VARIABLE 1 + typedef struct { int hFontTexture; // handle to texture wrect_t fontRc[256]; // rectangles byte charWidths[256]; int charHeight; + int type; qboolean valid; // all rectangles are valid } cl_font_t; @@ -732,6 +736,7 @@ int pfnDecalIndexFromName( const char *szDecalName ); int pfnIndexFromTrace( struct pmtrace_s *pTrace ); void NetAPI_CancelAllRequests( void ); int CL_FindModelIndex( const char *m ); +cl_entity_t *CL_GetLocalPlayer( void ); model_t *CL_LoadClientSprite( const char *filename ); HSPRITE pfnSPR_Load( const char *szPicName ); HSPRITE pfnSPR_LoadExt( const char *szPicName, uint texFlags ); @@ -885,6 +890,7 @@ void CL_RunLightStyles( void ); // extern convar_t *con_fontsize; qboolean Con_Visible( void ); +qboolean Con_FixedFont( void ); void Con_VidInit( void ); void Con_Shutdown( void ); void Con_ToggleConsole_f( void ); diff --git a/engine/client/gl_alias.c b/engine/client/gl_alias.c index 8daf0cc5..8fff0b48 100644 --- a/engine/client/gl_alias.c +++ b/engine/client/gl_alias.c @@ -535,7 +535,7 @@ void *Mod_LoadAllSkins( int numskins, daliasskintype_t *pskintype ) { if( pskintype->type == ALIAS_SKIN_SINGLE ) { - Mod_FloodFillSkin( skin, m_pAliasHeader->skinwidth, m_pAliasHeader->skinheight ); +// Mod_FloodFillSkin( skin, m_pAliasHeader->skinwidth, m_pAliasHeader->skinheight ); // save 8 bit texels for the player model to remap m_pAliasHeader->texels[i] = Mem_Alloc( loadmodel->mempool, size ); @@ -574,7 +574,7 @@ void *Mod_LoadAllSkins( int numskins, daliasskintype_t *pskintype ) for( j = 0; j < groupskins; j++ ) { - Mod_FloodFillSkin( skin, m_pAliasHeader->skinwidth, m_pAliasHeader->skinheight ); +// Mod_FloodFillSkin( skin, m_pAliasHeader->skinwidth, m_pAliasHeader->skinheight ); if( j == 0 ) { m_pAliasHeader->texels[i] = Mem_Alloc( loadmodel->mempool, size ); diff --git a/engine/client/gl_rpart.c b/engine/client/gl_rpart.c index 2dce943f..bb3f8475 100644 --- a/engine/client/gl_rpart.c +++ b/engine/client/gl_rpart.c @@ -69,6 +69,7 @@ particle_t *cl_active_tracers; particle_t *cl_free_particles; particle_t *cl_particles = NULL; // particle pool static vec3_t cl_avelocities[NUMVERTEXNORMALS]; +static float cl_lasttimewarn = 0.0f; /* ================ @@ -221,7 +222,12 @@ particle_t *R_AllocParticle( void (*callback)( particle_t*, float )) if( !cl_free_particles ) { - MsgDev( D_ERROR, "Overflow %d particles\n", GI->max_particles ); + if( cl_lasttimewarn < host.realtime ) + { + // don't spam about overflow + MsgDev( D_ERROR, "Overflow %d particles\n", GI->max_particles ); + cl_lasttimewarn = host.realtime + 1.0f; + } return NULL; } @@ -267,7 +273,12 @@ particle_t *R_AllocTracer( const vec3_t org, const vec3_t vel, float life ) if( !cl_free_particles ) { - MsgDev( D_ERROR, "Overflow %d tracers\n", GI->max_particles ); + if( cl_lasttimewarn < host.realtime ) + { + // don't spam about overflow + MsgDev( D_ERROR, "Overflow %d tracers\n", GI->max_particles ); + cl_lasttimewarn = host.realtime + 1.0f; + } return NULL; } diff --git a/engine/client/s_main.c b/engine/client/s_main.c index 0777b2c5..75d875df 100644 --- a/engine/client/s_main.c +++ b/engine/client/s_main.c @@ -1294,7 +1294,7 @@ int S_GetCurrentDynamicSounds( soundlist_t *pout, int size ) looped = ( channels[i].use_loop && channels[i].sfx->cache->loopStart != -1 ); - if( channels[i].entchannel == CHAN_STATIC && looped ) + if( channels[i].entchannel == CHAN_STATIC && looped && !FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE )) continue; // never serialize static looped sounds. It will be restoring in game code if( channels[i].isSentence && channels[i].name[0] ) diff --git a/engine/common/console.c b/engine/common/console.c index 392d1d46..60b6fffe 100644 --- a/engine/common/console.c +++ b/engine/common/console.c @@ -534,6 +534,18 @@ qboolean Con_Visible( void ) return (con.vislines > 0); } +/* +================ +Con_FixedFont +================ +*/ +qboolean Con_FixedFont( void ) +{ + if( con.curFont && con.curFont->valid && con.curFont->type == FONT_FIXED ) + return true; + return false; +} + static qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font ) { int i, fontWidth; @@ -550,6 +562,7 @@ static qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font ) if( font->hFontTexture && fontWidth != 0 ) { font->charHeight = fontWidth / 16; + font->type = FONT_FIXED; // build fixed rectangles for( i = 0; i < 256; i++ ) @@ -592,6 +605,7 @@ static qboolean Con_LoadVariableWidthFont( const char *fontname, cl_font_t *font { src = (qfont_t *)buffer; font->charHeight = src->rowheight; + font->type = FONT_VARIABLE; // build rectangles for( i = 0; i < 256; i++ ) @@ -694,7 +708,7 @@ static int Con_DrawGenericChar( int x, int y, int number, rgba_t color ) if( !con.curFont || !con.curFont->valid ) return 0; - if( number < 32 ) return 0; +// if( number < 32 ) return 0; if( y < -con.curFont->charHeight ) return 0; @@ -966,11 +980,19 @@ void Con_Print( const char *txt ) static int cr_pending = 0; static char buf[MAX_PRINT_MSG]; static int bufpos = 0; + int c, mask; // client not running if( !con.initialized || !con.buffer || host.type == HOST_DEDICATED ) return; + if( txt[0] == 2 ) + { + mask = 128; // go to colored text + txt++; + } + else mask = 0; + for( ; *txt; txt++ ) { if( cr_pending ) @@ -979,7 +1001,9 @@ void Con_Print( const char *txt ) cr_pending = 0; } - switch( *txt ) + c = *txt; + + switch( c ) { case '\0': break; @@ -993,7 +1017,7 @@ void Con_Print( const char *txt ) bufpos = 0; break; default: - buf[bufpos++] = *txt; + buf[bufpos++] = c | mask; if(( bufpos >= sizeof( buf ) - 1 ) || bufpos >= ( con.linewidth - 1 )) { Con_AddLine( buf, bufpos ); diff --git a/engine/common/sys_win.c b/engine/common/sys_win.c index 1f4e6f42..bdeeaae3 100644 --- a/engine/common/sys_win.c +++ b/engine/common/sys_win.c @@ -582,6 +582,8 @@ void Sys_Print( const char *pMsg ) } else { + if( msg[i] == '\1' || msg[i] == '\2' ) + i++; *b = *c = msg[i]; b++, c++; } diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 17b165c4..ecb7f2fd 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -1928,6 +1928,8 @@ void SV_StartSound( edict_t *ent, int chan, const char *sample, float vol, float msg_dest = MSG_INIT; else if( chan == CHAN_STATIC ) msg_dest = MSG_ALL; + else if( FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE )) + msg_dest = MSG_ALL; else msg_dest = MSG_PAS_R; // always sending stop sound command @@ -2726,9 +2728,10 @@ void pfnWriteString( const char *src ) int len = Q_strlen( src ) + 1; int rem = (255 - svgame.msg_realsize); - if( len >= rem ) + if( len == 1 || len >= rem ) { - MsgDev( D_ERROR, "pfnWriteString: exceeds %i symbols\n", rem ); + if( len >= rem ) + MsgDev( D_ERROR, "pfnWriteString: exceeds %i symbols\n", rem ); MSG_WriteChar( &sv.multicast, 0 ); svgame.msg_realsize += 1; return; diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index 346f5f1e..336d57c3 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -58,6 +58,8 @@ int SV_ModelIndex( const char *filename ) if( sv.state != ss_loading ) { + MsgDev( D_WARN, "late precache of %s\n", name ); + // send the update to everyone MSG_BeginServerCmd( &sv.reliable_datagram, svc_modelindex ); MSG_WriteUBitLong( &sv.reliable_datagram, i, MAX_MODEL_BITS ); @@ -103,6 +105,8 @@ int SV_SoundIndex( const char *filename ) if( sv.state != ss_loading ) { + MsgDev( D_WARN, "late precache of %s\n", name ); + // send the update to everyone MSG_BeginServerCmd( &sv.reliable_datagram, svc_soundindex ); MSG_WriteUBitLong( &sv.reliable_datagram, i, MAX_SOUND_BITS ); diff --git a/engine/server/sv_save.c b/engine/server/sv_save.c index 28a959d1..d24af567 100644 --- a/engine/server/sv_save.c +++ b/engine/server/sv_save.c @@ -2035,7 +2035,7 @@ int SV_SaveGameSlot( const char *pSaveName, const char *pSaveComment ) return 1; } -int SV_SaveReadHeader( file_t *pFile, GAME_HEADER *pHeader, int readGlobalState ) +int SV_SaveReadHeader( file_t *pFile, GAME_HEADER *pHeader ) { int i, tag, size, tokenCount, tokenSize; char *pszTokenList; @@ -2092,13 +2092,11 @@ int SV_SaveReadHeader( file_t *pFile, GAME_HEADER *pHeader, int readGlobalState SaveRestore_Init( pSaveData, (char *)(pszTokenList), size ); FS_Read( pFile, SaveRestore_GetBuffer( pSaveData ), size ); - if( readGlobalState ) - svgame.dllFuncs.pfnResetGlobalState(); + svgame.dllFuncs.pfnResetGlobalState(); svgame.dllFuncs.pfnSaveReadFields( pSaveData, "GameHeader", pHeader, gGameHeader, ARRAYSIZE( gGameHeader )); - if( readGlobalState ) - svgame.dllFuncs.pfnRestoreGlobalState( pSaveData ); + svgame.dllFuncs.pfnRestoreGlobalState( pSaveData ); SV_SaveFinish( pSaveData ); @@ -2141,7 +2139,7 @@ qboolean SV_LoadGame( const char *pName ) if( pFile ) { - if( SV_SaveReadHeader( pFile, &gameHeader, 1 )) + if( SV_SaveReadHeader( pFile, &gameHeader )) { SV_DirectoryExtract( pFile, gameHeader.mapCount ); validload = true;