]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host.c
added DP_EF_DOUBLESIDED extension to list
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index 385a1c2bbd20092067566345577d41eac7a172d1..10b964c17a9e192f4cb39f2927c19445c5331074 100644 (file)
--- 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 <demoname> 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 <demoname> 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)
        {