X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=host.c;h=465545ad74c7f7ac088537e0d80f5c2ae1c1e202;hb=fdc383f68458695b081a8418beb36d7097c6f455;hp=18b5c1a04df8627a777a6c7fad1401697da05cd3;hpb=b82d346b06f2dbd3d4fff3ef6b7ad986739d6cf7;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index 18b5c1a0..465545ad 100644 --- a/host.c +++ b/host.c @@ -133,11 +133,17 @@ This shuts down both the client and server ================ */ char hosterrorstring[4096]; +extern char sv_spawnmap[MAX_QPATH]; +extern char sv_loadgame[MAX_OSPATH]; void Host_Error (const char *error, ...) { va_list argptr; static qboolean inerror = false; + // make sure we don't get in a loading loop + sv_loadgame[0] = 0; + sv_spawnmap[0] = 0; + // LordHavoc: if first frame has not been shown, or currently shutting // down, do Sys_Error instead if (!host_loopactive || host_shuttingdown) @@ -164,6 +170,8 @@ void Host_Error (const char *error, ...) va_end (argptr); Con_Printf ("Host_Error: %s\n",hosterrorstring); + CL_Parse_DumpPacket(); + PR_Crash(); if (sv.active) @@ -175,6 +183,9 @@ void Host_Error (const char *error, ...) CL_Disconnect (); cls.demonum = -1; + // unload any partially loaded models + Mod_ClearErrorModels(); + inerror = false; longjmp (host_abortserver, 1); @@ -310,13 +321,13 @@ Writes key bindings and archived cvars to config.cfg */ void Host_WriteConfiguration (void) { - QFile *f; + qfile_t *f; // dedicated servers initialize the host but don't parse and set the // config.cfg cvars if (host_initialized && cls.state != ca_dedicated) { - f = Qopen (va("%s/config.cfg",com_gamedir), "w"); + f = FS_Open ("config.cfg", "w", false); if (!f) { Con_Printf ("Couldn't write config.cfg.\n"); @@ -326,7 +337,7 @@ void Host_WriteConfiguration (void) Key_WriteBindings (f); Cvar_WriteVariables (f); - Qclose (f); + FS_Close (f); } } @@ -461,6 +472,8 @@ void SV_DropClient (qboolean crash) MSG_WriteByte (&client->message, host_client - svs.clients); MSG_WriteByte (&client->message, 0); } + + NET_Heartbeat (1); } /* @@ -488,6 +501,9 @@ void Host_ShutdownServer(qboolean crash) // stop all client sounds immediately CL_Disconnect (); + NET_Heartbeat (2); + NET_Heartbeat (2); + // flush any pending messages - like the score!!! start = Sys_DoubleTime(); do @@ -682,6 +698,9 @@ void Host_ServerFrame (void) // send all messages to the clients SV_SendClientMessages (); + +// send an heartbeat if enough time has passed since the last one + NET_Heartbeat (0); } @@ -722,6 +741,9 @@ void _Host_Frame (float time) // process console commands Cbuf_Execute (); + // LordHavoc: map and load are delayed until video is initialized + Host_PerformSpawnServerAndLoadGame(); + NET_Poll(); // if running the server locally, make intentions now @@ -810,11 +832,11 @@ void Host_Frame (float time) time1 = Sys_DoubleTime (); _Host_Frame (time); - time2 = Sys_DoubleTime (); - + time2 = Sys_DoubleTime (); + timetotal += time2 - time1; timecount++; - + if (timecount < 1000) return; @@ -834,7 +856,6 @@ void Host_Frame (float time) //============================================================================ void Render_Init(void); -void QuakeIO_Init(void); /* ==================== @@ -858,7 +879,6 @@ void Host_Init (void) Memory_Init_Commands(); R_Modules_Init(); Cbuf_Init (); - QuakeIO_Init (); V_Init (); COM_Init (); Host_InitLocal (); @@ -876,32 +896,28 @@ void Host_Init (void) if (cls.state != ca_dedicated) { - VID_InitCvars(); - - Gamma_Init(); - Palette_Init(); - -#ifndef _WIN32 // on non win32, mouse comes before video for security reasons - IN_Init (); -#endif - VID_Init (vid_fullscreen.integer, vid_width.integer, vid_height.integer); + VID_Shared_Init(); + VID_Init(); Render_Init(); S_Init (); CDAudio_Init (); - Sbar_Init (); CL_Init (); -#ifdef _WIN32 // on non win32, mouse comes before video for security reasons - IN_Init (); -#endif } Cbuf_InsertText ("exec quake.rc\n"); + Cbuf_Execute (); + Cbuf_Execute (); + Cbuf_Execute (); + Cbuf_Execute (); host_initialized = true; - - Sys_Printf ("========Quake Initialized=========\n"); + + Con_Printf ("========Quake Initialized=========\n"); + + if (cls.state != ca_dedicated) + VID_Open(); } @@ -916,20 +932,19 @@ to run quit through here before the final handoff to the sys code. void Host_Shutdown(void) { static qboolean isdown = false; - + if (isdown) { - printf ("recursive shutdown\n"); + Con_Printf ("recursive shutdown\n"); return; } isdown = true; - Host_WriteConfiguration (); + Host_WriteConfiguration (); CDAudio_Shutdown (); NET_Shutdown (); S_Shutdown(); - IN_Shutdown (); if (cls.state != ca_dedicated) {