]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host.c
fix for dedicated server spewing error about cl_avidemo
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index 7dbd63209d15c5ab299f708f15044f182bddac83..28ff3f1d1bff7bcd16d0ccc91571789f31de4c73 100644 (file)
--- a/host.c
+++ b/host.c
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // host.c -- coordinates spawning and killing of local servers
 
 #include "quakedef.h"
+#include <time.h>
 
 /*
 
@@ -44,9 +45,7 @@ double                realtime;                               // without any filtering or bounding
 double         oldrealtime;                    // last frame run
 int                    host_framecount;
 
-double         sv_frametime;
-
-int                    minimum_memory;
+int                    forcedeveloper;                 // used for -developer commandline parameter, hacky hacky
 
 client_t       *host_client;                   // current client
 
@@ -144,7 +143,7 @@ void Host_Error (char *error, ...)
        }
        inerror = true;
        
-//     SCR_EndLoadingPlaque ();                // reenable screen updates
+       SCR_EndLoadingPlaque ();                // reenable screen updates
 
        va_start (argptr,error);
        vsprintf (hosterrorstring,error,argptr);
@@ -202,6 +201,11 @@ void       Host_FindMaxClients (void)
                else
                        svs.maxclients = 8;
        }
+
+       // BloodBath doesn't support single player games
+       if (gamemode == GAME_BLOODBATH && svs.maxclients < 4)
+               svs.maxclients = 4;
+
        if (svs.maxclients < 1)
                svs.maxclients = 8;
        else if (svs.maxclients > MAX_SCOREBOARD)
@@ -248,6 +252,8 @@ void Host_InitLocal (void)
        Cvar_RegisterVariable (&noexit);
        Cvar_RegisterVariable (&skill);
        Cvar_RegisterVariable (&developer);
+       if (forcedeveloper) // make it real now that the cvar is registered
+               Cvar_SetValue("developer", 1);
        Cvar_RegisterVariable (&deathmatch);
        Cvar_RegisterVariable (&coop);
 
@@ -296,7 +302,7 @@ void Host_WriteConfiguration (void)
 =================
 SV_ClientPrintf
 
-Sends text across to be displayed 
+Sends text across to be displayed
 FIXME: make this just a stuffed echo?
 =================
 */
@@ -519,6 +525,7 @@ Host_FilterTime
 Returns false if the time is too short to run a frame
 ===================
 */
+extern cvar_t cl_avidemo;
 qboolean Host_FilterTime (double time)
 {
        double timecap;
@@ -530,9 +537,17 @@ qboolean Host_FilterTime (double time)
                Cvar_SetValue("host_minfps", 10.0f);
        if (host_maxfps.value < host_minfps.value)
                Cvar_SetValue("host_maxfps", host_minfps.value);
+       if (cl_avidemo.value < 0.1f && cl_avidemo.value != 0.0f)
+               Cvar_SetValue("cl_avidemo", 0.0f);
 
-        // check if framerate is too high
-       if (!cls.timedemo)
+       // check if framerate is too high
+       if (cl_avidemo.value >= 0.1f)
+       {
+               timecap = 1.0 / (double)cl_avidemo.value;
+               if ((realtime - oldrealtime) < timecap)
+                       return false;
+       }
+       else if (!cls.timedemo)
        {
                timecap = sys_ticrate.value;
                if (cls.state == ca_connected)
@@ -555,6 +570,12 @@ qboolean Host_FilterTime (double time)
 
        if (host_framerate.value > 0)
                host_frametime = host_framerate.value;
+       else if (cl_avidemo.value >= 0.1f)
+       {
+               // don't allow really short frames
+               //if (host_frametime > (1.0 / cl_avidemo.value))
+                       host_frametime = (1.0 / cl_avidemo.value);
+       }
        else
        {
                // don't allow really short frames
@@ -563,7 +584,7 @@ qboolean Host_FilterTime (double time)
        }
 
        cl.frametime = host_frametime = bound(0, host_frametime * slowmo.value, 0.1f); // LordHavoc: the QC code relies on no less than 10fps
-       
+
        return true;
 }
 
@@ -603,20 +624,23 @@ void Host_ServerFrame (void)
        if (cls.state != ca_dedicated && svs.maxclients > 1 && ((realtime - lastservertime) < sys_ticrate.value))
                return;
 // run the world state
-       sv.frametime = pr_global_struct->frametime = frametimetotal;
+       if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
+               sv.frametime = pr_global_struct->frametime = frametimetotal;
+       else
+               sv.frametime = 0;
        frametimetotal = 0;
        lastservertime = realtime;
 //     pr_global_struct->frametime = host_frametime;
 
 // set the time and clear the general datagram
        SV_ClearDatagram ();
-       
+
 // check for new clients
        SV_CheckForNewClients ();
 
 // read client messages
        SV_RunClients ();
-       
+
 // move things around and think
 // always pause in single player if in console or menus
        if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
@@ -711,8 +735,10 @@ void _Host_Frame (float time)
 // update audio
        if (cls.signon == SIGNONS)
        {
-               S_Update (r_origin, vpn, vright, vup);
-               CL_DecayLights ();
+               // LordHavoc: this used to use renderer variables (eww)
+               vec3_t forward, right, up;
+               AngleVectors(cl.viewangles, forward, right, up);
+               S_Update (cl_entities[cl.viewentity].render.origin, forward, right, up);
        }
        else
                S_Update (vec3_origin, vec3_origin, vec3_origin, vec3_origin);
@@ -781,8 +807,18 @@ Host_Init
 */
 void Host_Init (void)
 {
+       // LordHavoc: quake never seeded the random number generator before... heh
+       srand(time(NULL));
+
        com_argc = host_parms.argc;
        com_argv = host_parms.argv;
+       // FIXME: this is evil, but possibly temporary
+       if (COM_CheckParm("-developer"))
+       {
+               forcedeveloper = true;
+               developer.integer = 1;
+               developer.value = 1;
+       }
 
        Memory_Init ();
        Cmd_Init ();
@@ -856,7 +892,7 @@ void Host_Shutdown(void)
        isdown = true;
 
 // keep Con_Printf from trying to update the screen
-       scr_disabled_for_loading = true;
+//     scr_disabled_for_loading = true;
 
        Host_WriteConfiguration ();