#define RIC_GUNSHOTQUAD 2
cvar_t cl_sound_ric_gunshot = {CF_CLIENT, "cl_sound_ric_gunshot", "0", "specifies if and when the related cl_sound_ric and cl_sound_tink sounds apply to TE_GUNSHOT/TE_GUNSHOTQUAD, 0 = no sound, 1 = TE_GUNSHOT, 2 = TE_GUNSHOTQUAD, 3 = TE_GUNSHOT and TE_GUNSHOTQUAD"};
cvar_t cl_sound_r_exp3 = {CF_CLIENT, "cl_sound_r_exp3", "weapons/r_exp3.wav", "sound to play during TE_EXPLOSION and related effects (empty cvar disables sound)"};
+cvar_t snd_cdautopause = {CF_CLIENT | CF_ARCHIVE, "snd_cdautopause", "1", "pause the CD track while the game is paused"};
+
cvar_t cl_serverextension_download = {CF_CLIENT, "cl_serverextension_download", "0", "indicates whether the server supports the download command"};
cvar_t cl_joinbeforedownloadsfinish = {CF_CLIENT | CF_ARCHIVE, "cl_joinbeforedownloadsfinish", "1", "if non-zero the game will begin after the map is loaded before other downloads finish"};
cvar_t cl_nettimesyncfactor = {CF_CLIENT | CF_ARCHIVE, "cl_nettimesyncfactor", "0", "rate at which client time adapts to match server time, 1 = instantly, 0.125 = slowly, 0 = not at all (only applied in bound modes 0, 1, 2, 3)"};
//static qbool QW_CL_IsUploading(void);
static void QW_CL_StopUpload_f(cmd_state_t *cmd);
+static inline void CL_SetSignonStage_WithMsg(int signon_stage)
+{
+ cls.signon = signon_stage;
+ dpsnprintf(cl_connect_status, sizeof(cl_connect_status), "Connect: signon stage %i of %i", cls.signon, SIGNONS);
+ Con_DPrint(cl_connect_status);
+}
+
/*
==================
CL_ParseStartSoundPacket
if(cls.state != ca_dedicated)
{
if(countdownupdate <= 0) // check if time stepped backwards
- {
- SCR_UpdateLoadingScreenIfShown();
countdownupdate = 2;
- }
}
}
// if we're still in signon stages, request the next one
if (cls.signon != SIGNONS)
{
- cls.signon = SIGNONS-1;
+ CL_SetSignonStage_WithMsg(SIGNONS - 1);
// we'll go to SIGNONS when the first entity update is received
MSG_WriteByte(&cls.netcon->message, qw_clc_stringcmd);
MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "begin %i", cl.qw_servercount));
return;
}
- cls.signon = 2;
+ CL_SetSignonStage_WithMsg(2);
cls.qw_downloadnumber = 0;
cls.qw_downloadtype = dl_model;
QW_CL_RequestNextDownload();
return;
}
- cls.signon = 2;
+ CL_SetSignonStage_WithMsg(2);
cls.qw_downloadnumber = 0;
cls.qw_downloadtype = dl_sound;
QW_CL_RequestNextDownload();
S_StopAllSounds();
cl.intermission = 0;
- cls.signon = 1; // not active anymore, but not disconnected
+ CL_SetSignonStage_WithMsg(1); // not active anymore, but not disconnected
Con_Printf("\nChanging map...\n");
}
An svc_signonnum has been received, perform a client side setup
=====================
*/
-static void CL_SignonReply (void)
+static void CL_SignonReply(int signon_stage)
{
+ CL_SetSignonStage_WithMsg(signon_stage);
+
Con_DPrintf("CL_SignonReply: %i\n", cls.signon);
switch (cls.signon)
{
SCR_BeginLoadingPlaque(false);
S_StopAllSounds();
+ // prevent dlcache assets from the previous map from interfering with this one
+ FS_UnloadPacks_dlcache();
// free q3 shaders so that any newly downloaded shaders will be active
- Mod_FreeQ3Shaders();
+ // bones_was_here: we free the q3 shaders later in CL_SignonReply
+ //Mod_FreeQ3Shaders();
}
// check memory integrity
cl.loadfinished = false;
cls.state = ca_connected;
- cls.signon = 1;
+ CL_SetSignonStage_WithMsg(1);
// note: on QW protocol we can't set up the gameworld until after
// downloads finish...
extern cvar_t cl_lerpexcess;
static void CL_NetworkTimeReceived(double newtime)
{
+ cl.opt_inputs_since_update = 0;
cl.mtime[1] = cl.mtime[0];
cl.mtime[0] = newtime;
- if (cl_nolerp.integer || cls.timedemo || cl.mtime[1] == cl.mtime[0] || cls.signon < SIGNONS)
+ if (cls.timedemo || cl.mtime[1] == cl.mtime[0] || cls.signon < SIGNONS)
cl.time = cl.mtime[1] = newtime;
else if (cls.demoplayback)
{
Con_DPrintf("--- cl.time > cl.mtime[0] (%f > %f ... %f)\n", cl.time, cl.mtime[1], cl.mtime[0]);
}
- if (cl_nettimesyncboundmode.integer < 4)
- {
- // doesn't make sense for modes > 3
- cl.time += (cl.mtime[1] - cl.time) * bound(0, cl_nettimesyncfactor.value, 1);
- timehigh = cl.mtime[1] + (cl.mtime[0] - cl.mtime[1]) * cl_nettimesyncboundtolerance.value;
- }
-
+selectmode:
switch (cl_nettimesyncboundmode.integer)
{
+ default:
+ Cvar_SetQuick(&cl_nettimesyncboundmode, cl_nettimesyncboundmode.defstring);
+ goto selectmode;
case 1:
- cl.time = bound(cl.mtime[1], cl.time, cl.mtime[0]);
- break;
-
case 2:
- if (cl.time < cl.mtime[1] || cl.time > timehigh)
- cl.time = cl.mtime[1];
- break;
-
case 3:
- if ((cl.time < cl.mtime[1] && cl.oldtime < cl.mtime[1]) || (cl.time > timehigh && cl.oldtime > timehigh))
- cl.time = cl.mtime[1];
+ // doesn't make sense for modes > 3
+ cl.time += (cl.mtime[1] - cl.time) * bound(0, cl_nettimesyncfactor.value, 1);
+ timehigh = cl.mtime[1] + (cl.mtime[0] - cl.mtime[1]) * cl_nettimesyncboundtolerance.value;
+ switch (cl_nettimesyncboundmode.integer)
+ {
+ case 1:
+ cl.time = bound(cl.mtime[1], cl.time, cl.mtime[0]);
+ break;
+ case 2:
+ if (cl.time < cl.mtime[1] || cl.time > timehigh)
+ cl.time = cl.mtime[1];
+ break;
+ case 3:
+ if ((cl.time < cl.mtime[1] && cl.oldtime < cl.mtime[1]) || (cl.time > timehigh && cl.oldtime > timehigh))
+ cl.time = cl.mtime[1];
+ break;
+ }
break;
case 4:
EntityFrameQW_CL_ReadFrame(false);
// first update is the final signon stage
if (cls.signon == SIGNONS - 1)
- {
- cls.signon = SIGNONS;
- CL_SignonReply ();
- }
+ CL_SignonReply(SIGNONS);
break;
case qw_svc_deltapacketentities:
EntityFrameQW_CL_ReadFrame(true);
// first update is the final signon stage
if (cls.signon == SIGNONS - 1)
- {
- cls.signon = SIGNONS;
- CL_SignonReply ();
- }
+ CL_SignonReply(SIGNONS);
break;
case qw_svc_maxspeed:
case qw_svc_setpause:
cl.paused = MSG_ReadByte(&cl_message) != 0;
- if (cl.paused)
+ if (cl.paused && snd_cdautopause.integer)
CDAudio_Pause ();
- else
+ else if (bgmvolume.value > 0.0f)
CDAudio_Resume ();
S_PauseGameSounds (cl.paused);
break;
cmdlogname[cmdindex] = temp;
SHOWNET("fast update");
if (cls.signon == SIGNONS - 1)
- {
// first update is the final signon stage
- cls.signon = SIGNONS;
- CL_SignonReply ();
- }
+ CL_SignonReply(SIGNONS);
EntityFrameQuake_ReadEntity (cmd&127);
continue;
}
case svc_setpause:
cl.paused = MSG_ReadByte(&cl_message) != 0;
- if (cl.paused)
+ if (cl.paused && snd_cdautopause.integer)
CDAudio_Pause ();
- else
+ else if (bgmvolume.value > 0.0f)
CDAudio_Resume ();
S_PauseGameSounds (cl.paused);
break;
// reconnect somehow, so allow signon 1 even if at signon 1
if (i <= cls.signon && i != 1)
Host_Error ("Received signon %i when at %i", i, cls.signon);
- cls.signon = i;
- CL_SignonReply ();
+ CL_SignonReply(i);
break;
case svc_killedmonster:
break;
case svc_entities:
if (cls.signon == SIGNONS - 1)
- {
// first update is the final signon stage
- cls.signon = SIGNONS;
- CL_SignonReply ();
- }
+ CL_SignonReply(SIGNONS);
if (cls.protocol == PROTOCOL_DARKPLACES1 || cls.protocol == PROTOCOL_DARKPLACES2 || cls.protocol == PROTOCOL_DARKPLACES3)
EntityFrame_CL_ReadFrame();
else if (cls.protocol == PROTOCOL_DARKPLACES4)
Cvar_RegisterVariable(&cl_sound_ric3);
Cvar_RegisterVariable(&cl_sound_ric_gunshot);
Cvar_RegisterVariable(&cl_sound_r_exp3);
+ Cvar_RegisterVariable(&snd_cdautopause);
Cvar_RegisterVariable(&cl_joinbeforedownloadsfinish);