/** * @brief Sets the @c cls.state to @c ca_disconnected and informs the server * @sa CL_Drop * @note Goes from a connected state to disconnected state * Sends a disconnect message to the server * This is also called on @c Com_Error, so it shouldn't cause any errors */ void CL_Disconnect (void) { if (cls.state < ca_connecting) return; Com_Printf("Disconnecting...\n"); /* send a disconnect message to the server */ if (!Com_ServerState()) { dbuffer msg; NET_WriteByte(&msg, clc_stringcmd); NET_WriteString(&msg, NET_STATE_DISCONNECT "\n"); NET_WriteMsg(cls.netStream, msg); /* make sure, that this is send */ NET_Wait(0); } NET_StreamFinished(cls.netStream); cls.netStream = nullptr; CL_ClearState(); S_Stop(); R_ShutdownModels(false); R_FreeWorldImages(); CL_SetClientState(ca_disconnected); CL_ClearBattlescapeEvents(); GAME_EndBattlescape(); }
/** * @sa R_Init */ void R_Shutdown (void) { const cmdList_t *commands; for (commands = r_commands; commands->name; commands++) Cmd_RemoveCommand(commands->name); R_ShutdownThreads(); R_ShutdownModels(true); R_ShutdownImages(); R_ShutdownPrograms(); R_FontShutdown(); R_ShutdownFBObjects(); /* shut down OS specific OpenGL stuff like contexts, etc. */ Rimp_Shutdown(); }