]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host.c
now runs scripts at startup differently - runs scripts twice, once only executing...
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index dadc7ed3eb5000a86b24ba0134178b2038635108..89e5dab93e4f1ba2296262eb3a8d4b68850623e0 100644 (file)
--- a/host.c
+++ b/host.c
@@ -132,11 +132,10 @@ Host_Error
 This shuts down both the client and server
 ================
 */
+void PRVM_ProcessError(void);
 static char hosterrorstring1[4096];
 static char hosterrorstring2[4096];
 static qboolean hosterror = false;
-extern char sv_spawnmap[MAX_QPATH];
-extern char sv_loadgame[MAX_OSPATH];
 void Host_Error (const char *error, ...)
 {
        va_list argptr;
@@ -158,14 +157,17 @@ void Host_Error (const char *error, ...)
 
        strcpy(hosterrorstring2, hosterrorstring1);
 
-       // make sure we don't get in a loading loop
-       sv_loadgame[0] = 0;
-       sv_spawnmap[0] = 0;
-
        CL_Parse_DumpPacket();
 
        PR_Crash();
 
+       //PRVM_Crash(); // crash current prog
+
+       // crash all prvm progs
+       PRVM_CrashAll();
+
+       PRVM_ProcessError();
+
        if (sv.active)
                Host_ShutdownServer (false);
 
@@ -251,9 +253,12 @@ void Host_ServerOptions (void)
 Host_InitLocal
 ======================
 */
+void Host_SaveConfig_f(void);
 void Host_InitLocal (void)
 {
        Host_InitCommands ();
+       
+       Cmd_AddCommand("saveconfig", Host_SaveConfig_f);
 
        Cvar_RegisterVariable (&host_framerate);
        Cvar_RegisterVariable (&host_speeds);
@@ -291,12 +296,12 @@ void Host_InitLocal (void)
 
 /*
 ===============
-Host_WriteConfiguration
+Host_SaveConfig_f
 
 Writes key bindings and archived cvars to config.cfg
 ===============
 */
-void Host_WriteConfiguration (void)
+void Host_SaveConfig_f(void)
 {
        qfile_t *f;
 
@@ -541,7 +546,7 @@ Returns false if the time is too short to run a frame
 extern cvar_t cl_avidemo;
 qboolean Host_FilterTime (double time)
 {
-       double timecap;
+       double timecap, timeleft;
        realtime += time;
 
        if (slowmo.value < 0.0f)
@@ -554,21 +559,24 @@ qboolean Host_FilterTime (double time)
                Cvar_SetValue("cl_avidemo", 0.0f);
 
        // 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)
+       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
+               // default to sys_ticrate (server framerate - presumably low) unless we
+               // have a good reason to run faster
                timecap = sys_ticrate.value;
-               if (vid_activewindow && (cls.state == ca_connected || cl_videoplaying))
+               if (cl_avidemo.value >= 0.1f)
+                       timecap = 1.0 / (double)cl_avidemo.value;
+               else if (vid_activewindow)
                        timecap = 1.0 / host_maxfps.value;
 
-               if ((realtime - oldrealtime) < timecap)
+               timeleft = oldrealtime + timecap - realtime;
+               if (timeleft > 0)
+               {
+                       // don't totally hog the CPU
+                       if (timeleft >= 0.02)
+                               Sys_Sleep();
                        return false;
+               }
        }
 
        // LordHavoc: copy into host_realframetime as well
@@ -676,6 +684,7 @@ void _Host_Frame (float time)
        static double time2 = 0;
        static double time3 = 0;
        int pass1, pass2, pass3;
+       usercmd_t cmd; // Used for receiving input
 
        if (setjmp(host_abortserver))
                return;                 // something bad happened, or the server disconnected
@@ -685,11 +694,7 @@ void _Host_Frame (float time)
 
        // decide the simulation time
        if (!Host_FilterTime(time))
-       {
-               // if time was rejected, don't totally hog the CPU
-               Sys_Sleep();
                return;
-       }
 
        cl.islocalgame = NetConn_IsLocalGame();
 
@@ -699,15 +704,15 @@ void _Host_Frame (float time)
        // allow mice or other external controllers to add commands
        IN_Commands();
 
+       // Collect input into cmd
+       IN_ProcessMove(&cmd);
+
        // process console commands
        Cbuf_Execute();
 
-       // LordHavoc: map and load are delayed until video is initialized
-       Host_PerformSpawnServerAndLoadGame();
-
        // if running the server locally, make intentions now
        if (cls.state == ca_connected && sv.active)
-               CL_SendCmd();
+               CL_SendCmd(&cmd);
 
 //-------------------
 //
@@ -737,11 +742,11 @@ void _Host_Frame (float time)
                // if running the server remotely, send intentions now after
                // the incoming messages have been read
                if (!sv.active)
-                       CL_SendCmd();
+                       CL_SendCmd(&cmd);
                CL_ReadFromServer();
        }
 
-       ui_update();
+       //ui_update();
 
        CL_VideoFrame();
 
@@ -755,12 +760,12 @@ void _Host_Frame (float time)
                time2 = Sys_DoubleTime();
 
        // update audio
-       if (cls.signon == SIGNONS)
+       if (cls.signon == SIGNONS && cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active)
        {
                // 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);
+               vec3_t forward, left, up, origin;
+               Matrix4x4_ToVectors(&cl_entities[cl.viewentity].render.matrix, forward, left, up, origin);
+               S_Update(origin, forward, left, up);
        }
        else
                S_Update(vec3_origin, vec3_origin, vec3_origin, vec3_origin);
@@ -779,6 +784,7 @@ void _Host_Frame (float time)
 
        host_framecount++;
        host_loopactive = true;
+
 }
 
 void Host_Frame (float time)
@@ -848,9 +854,8 @@ void Host_Init (void)
        Host_InitLocal();
        Key_Init();
        Con_Init();
-       Chase_Init();
-       M_Init();
        PR_Init();
+       PRVM_Init();
        Mod_Init();
        NetConn_Init();
        SV_Init();
@@ -869,10 +874,8 @@ void Host_Init (void)
                CL_Init();
        }
 
-       Cbuf_InsertText ("exec quake.rc\n");
-       Cbuf_Execute();
-       Cbuf_Execute();
-       Cbuf_Execute();
+       // only cvars are executed when host_initialized == false
+       Cbuf_InsertText("exec quake.rc\n");
        Cbuf_Execute();
 
        host_initialized = true;
@@ -880,7 +883,16 @@ void Host_Init (void)
        Con_DPrintf ("========Initialized=========\n");
 
        if (cls.state != ca_dedicated)
+       {
                VID_Open();
+               SCR_BeginLoadingPlaque();
+               MR_Init();
+       }
+
+       // stuff it again so the first host frame will execute it again, this time
+       // in its entirety
+       Cbuf_InsertText("exec quake.rc\n");
+       Cbuf_Execute();
 }
 
 
@@ -903,11 +915,18 @@ void Host_Shutdown(void)
        }
        isdown = true;
 
-       Host_WriteConfiguration ();
+       // Shutdown menu
+       if(MR_Shutdown)
+               MR_Shutdown();
+
+       // AK shutdown PRVM
+       // AK hmm, no PRVM_Shutdown(); yet
+
+
+       Host_SaveConfig_f();
 
        CDAudio_Shutdown ();
        NetConn_Shutdown ();
-       S_Shutdown();
 
        if (cls.state != ca_dedicated)
        {