/* SV_Map_f handle a map <mapname> command from the console or progs. */ static void SV_Map_f (void) { const char *level; char *expanded; QFile *f; if (!curlevel) curlevel = dstring_newstr (); if (Cmd_Argc () > 2) { SV_Printf ("map <levelname> : continue game on a new level\n"); return; } if (Cmd_Argc () == 1) { SV_Printf ("map is %s \"%s\" (%s)\n", curlevel->str, PR_GetString (&sv_pr_state, SVstring (sv.edicts, message)), nice_time (sv.time)); return; } level = Cmd_Argv (1); // check to make sure the level exists expanded = nva ("maps/%s.bsp", level); f = QFS_FOpenFile (expanded); if (!f) { SV_Printf ("Can't find %s\n", expanded); free (expanded); return; } Qclose (f); free (expanded); if (sv.recording_demo) SV_Stop (0); SV_qtvChanging (); SV_BroadcastCommand ("changing\n"); SV_SendMessagesToAll (); dstring_copystr (curlevel, level); SV_SpawnServer (level); SV_qtvReconnect (); SV_BroadcastCommand ("reconnect\n"); }
/** * @brief Called when each game quits, before Sys_Quit or Sys_Error * @param[in] finalmsg The message all clients get as server shutdown message * @param[in] reconnect True if this is only a restart (new map or map restart), * false if the server shutdown completely and you also want to disconnect all clients */ void SV_Shutdown (const char *finalmsg, qboolean reconnect) { unsigned int i; if (!svs.initialized) return; if (svs.clients) SV_FinalMessage(finalmsg, reconnect); Com_Printf("Shutdown server: %s\n", finalmsg); Master_Shutdown(); SV_ShutdownGameProgs(); NET_DatagramSocketClose(svs.netDatagramSocket); SV_Stop(); for (i = 0; i < sv->numSVModels; i++) { sv_model_t *model = &sv->svModels[i]; if (model->name) Mem_Free(model->name); } /* free current level */ OBJZERO(*sv); /* free server static data */ if (svs.clients) Mem_Free(svs.clients); if (svs.serverMutex != NULL) TH_MutexDestroy(svs.serverMutex); OBJZERO(svs); /* maybe we shut down before we init - e.g. in case of an error */ if (sv_maxclients) sv_maxclients->flags &= ~CVAR_LATCH; if (sv_mapname) sv_mapname->flags &= ~CVAR_NOSET; }