cl.intermission = 0;
SCR_UpdateScreen renders depending on cl.intermission and ignores con_forcedup.
Background: con_forcedup is set to true when !cl.worldmodel || cls.signon != SIGNONS (no world model for client or not fully signed on to a server ... even if the server in question is single player or yourself). SCR_UpdateScreen doesn't check con_forcedup to determine whether or not to draw the intermission screen ... likely because the entire cl state gets wiped when a new map is loaded. But a new map isn't always loaded.
Situations this can occur:
1. Demo record is stopped during intermission. No new map is going to load.
2. Player doesn't have the next map. In particular, for being connected to a non-local server.
Trying to fix by changing how SCR_UpdateScreen works might result in undesirable results like the console flashing on-screen between maps.
Might also be beneficial put this at the end of CL_Disconnect, but I haven't tested it to verify proper behavior in all circumstances:
..
SCR_EndLoadingPlaque (); // Which also gets rid of the "Loading" plaque.
// Resulting function:
Code: Select all
/*
=====================
CL_Disconnect
Sends a disconnect message to the server
This is also called on Host_Error, so it shouldn't cause any errors
=====================
*/
void CL_Disconnect (void)
{
// stop sounds (especially looping!)
S_StopAllSounds (true);
// if running a local server, shut it down
if (cls.demoplayback)
CL_StopPlayback ();
else if (cls.state == ca_connected)
{
if (cls.demorecording)
CL_Stop_f ();
Con_DPrintf ("Sending clc_disconnect\n");
SZ_Clear (&cls.message);
MSG_WriteByte (&cls.message, clc_disconnect);
NET_SendUnreliableMessage (cls.netcon, &cls.message);
SZ_Clear (&cls.message);
NET_Close (cls.netcon);
cls.state = ca_disconnected;
if (sv.active)
Host_ShutdownServer(false);
}
cls.demoplayback = cls.timedemo = false;
cls.signon = 0;
cl.intermission = 0; // Baker: So critical. SCR_UpdateScreen uses this.
}