X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=host.c;h=10b964c17a9e192f4cb39f2927c19445c5331074;hb=da0612b4ffbcdd7552c9b2cbb510f1ecd6da1e97;hp=385a1c2bbd20092067566345577d41eac7a172d1;hpb=c49d3bf46e9015474feea7c291b7f52c9095ae7c;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index 385a1c2b..10b964c1 100644 --- a/host.c +++ b/host.c @@ -71,6 +71,7 @@ cvar_t cl_maxfps = {CVAR_SAVE, "cl_maxfps", "1000"}; cvar_t sv_echobprint = {CVAR_SAVE, "sv_echobprint", "1"}; cvar_t sys_ticrate = {CVAR_SAVE, "sys_ticrate","0.05"}; +cvar_t sv_fixedframeratesingleplayer = {0, "sv_fixedframeratesingleplayer", "0"}; cvar_t serverprofile = {0, "serverprofile","0"}; cvar_t fraglimit = {CVAR_NOTIFY, "fraglimit","0"}; @@ -81,6 +82,7 @@ cvar_t samelevel = {0, "samelevel","0"}; cvar_t noexit = {CVAR_NOTIFY, "noexit","0"}; cvar_t developer = {0, "developer","0"}; +cvar_t developer_entityparsing = {0, "developer_entityparsing", "0"}; cvar_t skill = {0, "skill","1"}; cvar_t deathmatch = {0, "deathmatch","0"}; @@ -114,8 +116,8 @@ This shuts down both the client and server */ void Host_Error (const char *error, ...) { - static char hosterrorstring1[4096]; - static char hosterrorstring2[4096]; + static char hosterrorstring1[MAX_INPUTLINE]; + static char hosterrorstring2[MAX_INPUTLINE]; static qboolean hosterror = false; va_list argptr; @@ -147,7 +149,7 @@ void Host_Error (const char *error, ...) Host_ShutdownServer (false); if (cls.state == ca_dedicated) - Sys_Error ("Host_Error: %s\n",hosterrorstring2); // dedicated servers exit + Sys_Error ("Host_Error: %s",hosterrorstring2); // dedicated servers exit CL_Disconnect (); cls.demonum = -1; @@ -166,53 +168,42 @@ void Host_ServerOptions (void) // COMMANDLINEOPTION: Server: -dedicated [playerlimit] starts a dedicated server (with a command console), default playerlimit is 8 // COMMANDLINEOPTION: Server: -listen [playerlimit] starts a multiplayer server with graphical client, like singleplayer but other players can connect, default playerlimit is 8 - if (cl_available) + // if no client is in the executable or -dedicated is specified on + // commandline, start a dedicated server + i = COM_CheckParm ("-dedicated"); + if (i || !cl_available) { - // client exists, check what mode the user wants - i = COM_CheckParm ("-dedicated"); + cls.state = ca_dedicated; + // check for -dedicated specifying how many players + if (i && i + 1 < com_argc && atoi (com_argv[i+1]) >= 1) + svs.maxclients = atoi (com_argv[i+1]); + if (COM_CheckParm ("-listen")) + Con_Printf ("Only one of -dedicated or -listen can be specified\n"); + // default sv_public on for dedicated servers (often hosted by serious administrators), off for listen servers (often hosted by clueless users) + Cvar_SetValue("sv_public", 1); + } + else if (cl_available) + { + // client exists and not dedicated, check if -listen is specified + cls.state = ca_disconnected; + i = COM_CheckParm ("-listen"); if (i) { - cls.state = ca_dedicated; // default players unless specified if (i + 1 < com_argc && atoi (com_argv[i+1]) >= 1) svs.maxclients = atoi (com_argv[i+1]); - if (COM_CheckParm ("-listen")) - Sys_Error ("Only one of -dedicated or -listen can be specified"); } else { - cls.state = ca_disconnected; - i = COM_CheckParm ("-listen"); - if (i) - { - // default players unless specified - if (i + 1 < com_argc && atoi (com_argv[i+1]) >= 1) - svs.maxclients = atoi (com_argv[i+1]); - } - else - { - // default players in some games, singleplayer in most - if (gamemode != GAME_GOODVSBAD2 && gamemode != GAME_NEXUIZ && gamemode != GAME_BATTLEMECH) - svs.maxclients = 1; - } + // default players in some games, singleplayer in most + if (gamemode != GAME_GOODVSBAD2 && gamemode != GAME_NEXUIZ && gamemode != GAME_BATTLEMECH) + svs.maxclients = 1; } } - else - { - // no client in the executable, always start dedicated server - if (COM_CheckParm ("-listen")) - Sys_Error ("-listen not available in a dedicated server executable"); - cls.state = ca_dedicated; - // check for -dedicated specifying how many players - i = COM_CheckParm ("-dedicated"); - // default players unless specified - if (i && i + 1 < com_argc && atoi (com_argv[i+1]) >= 1) - svs.maxclients = atoi (com_argv[i+1]); - } svs.maxclients = bound(1, svs.maxclients, MAX_SCOREBOARD); - svs.clients = Mem_Alloc(sv_mempool, sizeof(client_t) * svs.maxclients); + svs.clients = (client_t *)Mem_Alloc(sv_mempool, sizeof(client_t) * svs.maxclients); if (svs.maxclients > 1 && !deathmatch.integer) Cvar_SetValueQuick(&deathmatch, 1); @@ -236,6 +227,7 @@ void Host_InitLocal (void) Cvar_RegisterVariable (&sv_echobprint); Cvar_RegisterVariable (&sys_ticrate); + Cvar_RegisterVariable (&sv_fixedframeratesingleplayer); Cvar_RegisterVariable (&serverprofile); Cvar_RegisterVariable (&fraglimit); @@ -247,6 +239,7 @@ void Host_InitLocal (void) Cvar_RegisterVariable (&developer); if (forcedeveloper) // make it real now that the cvar is registered Cvar_SetValue("developer", 1); + Cvar_RegisterVariable (&developer_entityparsing); Cvar_RegisterVariable (&deathmatch); Cvar_RegisterVariable (&coop); @@ -315,7 +308,7 @@ FIXME: make this just a stuffed echo? void SV_ClientPrintf(const char *fmt, ...) { va_list argptr; - char msg[4096]; + char msg[MAX_INPUTLINE]; va_start(argptr,fmt); dpvsnprintf(msg,sizeof(msg),fmt,argptr); @@ -359,7 +352,7 @@ Sends text to all active clients void SV_BroadcastPrintf(const char *fmt, ...) { va_list argptr; - char msg[4096]; + char msg[MAX_INPUTLINE]; va_start(argptr,fmt); dpvsnprintf(msg,sizeof(msg),fmt,argptr); @@ -378,7 +371,7 @@ Send text over to the client to be executed void Host_ClientCommands(const char *fmt, ...) { va_list argptr; - char string[1024]; + char string[MAX_INPUTLINE]; va_start(argptr,fmt); dpvsnprintf(string, sizeof(string), fmt, argptr); @@ -488,15 +481,13 @@ void Host_ShutdownServer(qboolean crash) { int i, count; sizebuf_t buf; - char message[4]; + unsigned char message[4]; Con_DPrintf("Host_ShutdownServer\n"); if (!sv.active) return; - SV_VM_Begin(); - NetConn_Heartbeat(2); NetConn_Heartbeat(2); @@ -509,10 +500,11 @@ void Host_ShutdownServer(qboolean crash) if (count) Con_Printf("Host_ShutdownServer: NetConn_SendToAll failed for %u clients\n", count); + SV_VM_Begin(); for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++) - if (host_client->active) { + if (host_client->active) SV_DropClient(crash); // server shutdown - } + SV_VM_End(); NetConn_CloseServerPorts(); @@ -522,10 +514,6 @@ void Host_ShutdownServer(qboolean crash) // memset(&sv, 0, sizeof(sv)); memset(svs.clients, 0, svs.maxclients*sizeof(client_t)); - - PRVM_ResetProg(); - - SV_VM_End(); } @@ -599,23 +587,17 @@ qboolean Host_FilterTime (double time) timeleft = timecap - (realtime - oldrealtime); if (timeleft > 0) { +#if 1 + if (timeleft * 1000 >= 10) + Sys_Sleep(1); +#else int msleft; // don't totally hog the CPU - if (cls.state == ca_dedicated) - { - // if dedicated, try to use as little cpu as possible by waiting - // just a little longer than necessary - // (yes this means it doesn't quite keep up with the framerate) - msleft = (int)ceil(timeleft * 1000); - } - else - { - // if not dedicated, try to hit exactly a steady framerate by not - // sleeping the full amount - msleft = (int)floor(timeleft * 1000); - } - if (msleft > 0) + // try to hit exactly a steady framerate by not sleeping the full amount + msleft = (int)floor(timeleft * 1000); + if (msleft >= 10) Sys_Sleep(msleft); +#endif return false; } @@ -671,8 +653,11 @@ Host_ServerFrame */ void Host_ServerFrame (void) { - // never run more than 5 frames at a time as a sanity limit - int framecount, framelimit = 5; + // never run more than 1 frame per call because multiple frames per call it + // does not handle overload gracefully, slowing down is better than a + // sudden significant drop in framerate (or worse, freezing until the + // problem goes away) + int framecount, framelimit = 1; double advancetime; if (!sv.active) { @@ -681,7 +666,7 @@ void Host_ServerFrame (void) } sv.timer += host_realframetime; - + // run the world state // don't allow simulation to run too fast or too slow or logic glitches can occur for (framecount = 0;framecount < framelimit && sv.timer > 0;framecount++) @@ -689,7 +674,7 @@ void Host_ServerFrame (void) // setup the VM frame SV_VM_Begin(); - if (cl.islocalgame) + if (cl.islocalgame && !sv_fixedframeratesingleplayer.integer) advancetime = min(sv.timer, sys_ticrate.value); else advancetime = sys_ticrate.value; @@ -879,7 +864,6 @@ void Host_StartVideo(void) vid_opened = true; VID_Start(); CDAudio_Startup(); - CL_InitTEnts(); // We must wait after sound startup to load tent sounds } } @@ -1051,6 +1035,26 @@ void Host_Init (void) Cbuf_Execute(); } + // check for special demo mode +// COMMANDLINEOPTION: Client: -demo runs a playdemo and quits + i = COM_CheckParm("-demo"); + if (i && i + 1 < com_argc) + if (!sv.active && !cls.demoplayback && !cls.connect_trying) + { + Cbuf_AddText(va("playdemo %s\n", com_argv[i + 1])); + Cbuf_Execute(); + } + + // check for special demolooponly mode +// COMMANDLINEOPTION: Client: -demolooponly runs a playdemo and quits + i = COM_CheckParm("-demolooponly"); + if (i && i + 1 < com_argc) + if (!sv.active && !cls.demoplayback && !cls.connect_trying) + { + Cbuf_AddText(va("playdemo %s\n", com_argv[i + 1])); + Cbuf_Execute(); + } + if (cls.state == ca_dedicated || COM_CheckParm("-listen")) if (!sv.active && !cls.demoplayback && !cls.connect_trying) {