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.
*/
// host.c -- coordinates spawning and killing of local servers
+#include <time.h>
#include "quakedef.h"
+#include "cl_video.h"
/*
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
}
inerror = true;
-// SCR_EndLoadingPlaque (); // reenable screen updates
-
va_start (argptr,error);
vsprintf (hosterrorstring,error,argptr);
va_end (argptr);
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)
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);
=================
SV_ClientPrintf
-Sends text across to be displayed
+Sends text across to be displayed
FIXME: make this just a stuffed echo?
=================
*/
va_start (argptr,fmt);
vsprintf (string, fmt,argptr);
va_end (argptr);
-
+
MSG_WriteByte (&host_client->message, svc_stufftext);
MSG_WriteString (&host_client->message, string);
}
Returns false if the time is too short to run a frame
===================
*/
+extern cvar_t cl_avidemo;
qboolean Host_FilterTime (double time)
{
double timecap;
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)
+ {
+ // default to sys_ticrate (server framerate - presumably low) unless we're the active window and either connected to a server or playing a video
timecap = sys_ticrate.value;
- if (cls.state == ca_connected)
+ if (vid_activewindow && (cls.state == ca_connected || cl_videoplaying))
timecap = 1.0 / host_maxfps.value;
if ((realtime - oldrealtime) < timecap)
if (host_framerate.value > 0)
host_frametime = host_framerate.value;
+ else if (cl_avidemo.value >= 0.1f)
+ host_frametime = (1.0 / cl_avidemo.value);
else
{
// don't allow really short frames
}
cl.frametime = host_frametime = bound(0, host_frametime * slowmo.value, 0.1f); // LordHavoc: the QC code relies on no less than 10fps
-
+
return true;
}
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) )
ui_update();
+ CL_VideoFrame();
+
// update video
if (host_speeds.integer)
time1 = Sys_DoubleTime ();
// 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);
*/
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 ();
NET_Init ();
SV_Init ();
- Con_Printf ("Exe: "__TIME__" "__DATE__"\n");
+ Con_Printf ("Builddate: %s\n", buildstring);
if (cls.state != ca_dedicated)
{
}
isdown = true;
-// keep Con_Printf from trying to update the screen
- scr_disabled_for_loading = true;
-
Host_WriteConfiguration ();
CDAudio_Shutdown ();