DEMO CODE
-When a demo is playing back, all NET_SendMessages are skipped, and
-NET_GetMessages are read from the demo file.
+When a demo is playing back, all outgoing network messages are skipped, and
+incoming messages are read from the demo file.
Whenever cl.time gets past the last received message, another message is
read from the demo file.
/*
====================
-CL_GetMessage
+CL_ReadDemoMessage
-Handles recording and playback of demos, on top of NET_ code
+Handles playback of demos
====================
*/
-int CL_GetMessage (void)
+void CL_ReadDemoMessage(void)
{
- int r, i;
- float f;
+ int r, i;
+ float f;
- if (cls.demoplayback)
- {
- if (cls.demopaused) // LordHavoc: pausedemo
- return 0;
+ if (!cls.demoplayback)
+ return;
+
+ // LordHavoc: pausedemo
+ if (cls.demopaused)
+ return;
- // decide if it is time to grab the next message
- if (cls.signon == SIGNONS) // always grab until fully connected
+ while (1)
+ {
+ // decide if it is time to grab the next message
+ // always grab until fully connected
+ if (cls.signon == SIGNONS)
{
if (cls.timedemo)
{
if (host_framecount == cls.td_lastframe)
- return 0; // already read this frame's message
+ {
+ // already read this frame's message
+ return;
+ }
+ if (cls.td_lastframe == -1)
+ {
+ // we start counting on the second frame
+ // (after parsing connection stuff)
+ cls.td_startframe = host_framecount + 1;
+ }
cls.td_lastframe = host_framecount;
- // if this is the second frame, grab the real td_starttime
- // so the bogus time on the first frame doesn't count
- if (host_framecount == cls.td_startframe + 1)
+ // if this is the first official frame we can now grab the real
+ // td_starttime so the bogus time on the first frame doesn't
+ // count against the final report
+ if (host_framecount == cls.td_startframe)
cls.td_starttime = realtime;
}
else if (cl.time <= cl.mtime[0])
{
- return 0; // don't need another message yet
+ // don't need another message yet
+ return;
}
}
- // get the next message
- FS_Read (cls.demofile, &net_message.cursize, 4);
- VectorCopy (cl.mviewangles[0], cl.mviewangles[1]);
- for (i=0 ; i<3 ; i++)
+ // get the next message
+ FS_Read(cls.demofile, &net_message.cursize, 4);
+ net_message.cursize = LittleLong(net_message.cursize);
+ VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
+ for (i = 0;i < 3;i++)
{
- r = FS_Read (cls.demofile, &f, 4);
- cl.mviewangles[0][i] = LittleFloat (f);
+ r = FS_Read(cls.demofile, &f, 4);
+ cl.mviewangles[0][i] = LittleFloat(f);
}
- net_message.cursize = LittleLong (net_message.cursize);
- if (net_message.cursize > MAX_DATAGRAM)
- Host_Error ("Demo message > MAX_DATAGRAM");
- r = FS_Read (cls.demofile, net_message.data, net_message.cursize);
- if (r != net_message.cursize)
+ if (net_message.cursize > NET_MAXMESSAGE)
+ Host_Error("Demo message > NET_MAXMESSAGE");
+ if (FS_Read(cls.demofile, net_message.data, net_message.cursize) == (size_t)net_message.cursize)
{
- CL_Disconnect ();
- return 0;
+ MSG_BeginReading();
+ CL_ParseServerMessage();
}
-
- return 1;
- }
-
- while (1)
- {
- r = NET_GetMessage (cls.netcon);
-
- if (r != 1 && r != 2)
- return r;
-
- // discard nop keepalive message
- if (net_message.cursize == 1 && net_message.data[0] == svc_nop)
- Con_Printf ("<-- server to client keepalive\n");
else
- break;
+ {
+ CL_Disconnect();
+ return;
+ }
}
-
- if (cls.demorecording)
- CL_WriteDemoMessage ();
-
- return r;
}
track = -1;
// get the demo name
- strncpy (name, Cmd_Argv(1), sizeof (name) - 1);
- name[sizeof (name) - 1] = '\0';
- FS_DefaultExtension (name, ".dem");
+ strlcpy (name, Cmd_Argv(1), sizeof (name));
+ FS_DefaultExtension (name, ".dem", sizeof (name));
// start the map up
if (c > 2)
// disconnect from server
CL_Disconnect ();
+ // update networking ports (this is mainly just needed at startup)
+ NetConn_ClientFrame();
+
// open the demo file
- strcpy (name, Cmd_Argv(1));
- FS_DefaultExtension (name, ".dem");
+ strlcpy (name, Cmd_Argv(1), sizeof (name));
+ FS_DefaultExtension (name, ".dem", sizeof (name));
Con_Printf ("Playing demo from %s.\n", name);
cls.demofile = FS_Open (name, "rb", false);
scr_con_current = 0;
cls.timedemo = true;
- cls.td_startframe = host_framecount;
- cls.td_lastframe = -1; // get a new message this frame
+ // get first message this frame
+ cls.td_lastframe = -1;
}