mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-21 03:01:15 +00:00
serious cleanup of demo_t in preparation for converting it to a more
general recorder struct to be shared between the demo recorder and qtv proxy connection(s)
This commit is contained in:
parent
8950f3188f
commit
12eb4eb72e
3 changed files with 80 additions and 112 deletions
|
@ -37,28 +37,9 @@ typedef struct header_s {
|
|||
byte full;
|
||||
int to;
|
||||
int size;
|
||||
byte data[1]; // gcc doesn't allow [] (?)
|
||||
byte data[1];
|
||||
} header_t;
|
||||
|
||||
typedef struct demoinfo_s {
|
||||
vec3_t origin;
|
||||
vec3_t angles;
|
||||
int weaponframe;
|
||||
int skinnum;
|
||||
int model;
|
||||
int effects;
|
||||
} demoinfo_t;
|
||||
|
||||
typedef struct demo_client_s {
|
||||
demoinfo_t info;
|
||||
float sec;
|
||||
int parsecount;
|
||||
vec3_t angle;
|
||||
float cmdtime;
|
||||
int flags;
|
||||
int frame;
|
||||
} demo_client_t;
|
||||
|
||||
typedef struct demobuf_s {
|
||||
sizebuf_t sz;
|
||||
int bufsize;
|
||||
|
@ -66,7 +47,6 @@ typedef struct demobuf_s {
|
|||
} demobuf_t;
|
||||
|
||||
typedef struct demo_frame_s {
|
||||
demo_client_t clients[MAX_CLIENTS];
|
||||
double time;
|
||||
demobuf_t buf;
|
||||
} demo_frame_t;
|
||||
|
@ -75,36 +55,23 @@ typedef struct demo_frame_s {
|
|||
#define DEMO_FRAMES_MASK (DEMO_FRAMES - 1)
|
||||
|
||||
typedef struct demo_s {
|
||||
QFile *file;
|
||||
|
||||
demobuf_t *dbuf;
|
||||
|
||||
dbuffer_t dbuffer;
|
||||
byte buffer[20 * MAX_MSGLEN];
|
||||
|
||||
sizebuf_t datagram;
|
||||
byte datagram_data[MAX_DATAGRAM];
|
||||
|
||||
int lastto;
|
||||
int lasttype;
|
||||
double time, pingtime;
|
||||
|
||||
client_t recorder;
|
||||
delta_t delta;
|
||||
int stats[MAX_CLIENTS][MAX_CL_STATS]; // ouch!
|
||||
demoinfo_t info[MAX_CLIENTS];
|
||||
demo_frame_t frames[DEMO_FRAMES];
|
||||
int forceFrame;
|
||||
|
||||
int parsecount;
|
||||
int lastwritten;
|
||||
|
||||
int size;
|
||||
qboolean disk;
|
||||
void *dest;
|
||||
byte *mfile;
|
||||
struct dstring_s *name;
|
||||
struct dstring_s *text;
|
||||
|
||||
int forceFrame;
|
||||
int size; // XXX doesn't belong here
|
||||
} demo_t;
|
||||
|
||||
extern demo_t demo;
|
||||
|
|
|
@ -52,7 +52,15 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
#include "sv_demo.h"
|
||||
#include "sv_progs.h"
|
||||
|
||||
demo_t demo;
|
||||
demo_t demo;
|
||||
static byte demo_buffer[20 * MAX_MSGLEN];
|
||||
static byte demo_datagram_data[MAX_DATAGRAM];
|
||||
static QFile *demo_file;
|
||||
static byte *demo_mfile;
|
||||
static qboolean demo_disk;
|
||||
static dstring_t *demo_name; // filename of mvd
|
||||
static dstring_t *demo_text; // filename of description file
|
||||
static void *demo_dest;
|
||||
|
||||
#define MIN_DEMO_MEMORY 0x100000
|
||||
#define USECACHE (sv_demoUseCache->int_val && svs.demomemsize)
|
||||
|
@ -105,7 +113,7 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time)
|
|||
msec = 0;
|
||||
|
||||
c = msec;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
|
||||
if (demo.lasttype != type || demo.lastto != to) {
|
||||
demo.lasttype = type;
|
||||
|
@ -113,19 +121,19 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time)
|
|||
switch (demo.lasttype) {
|
||||
case dem_all:
|
||||
c = dem_all;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
break;
|
||||
case dem_multiple:
|
||||
c = dem_multiple;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
|
||||
i = LittleLong (demo.lastto);
|
||||
demo.size += DWRITE (&i, sizeof (i), demo.dest);
|
||||
demo.size += DWRITE (&i, sizeof (i), demo_dest);
|
||||
break;
|
||||
case dem_single:
|
||||
case dem_stats:
|
||||
c = demo.lasttype + (demo.lastto << 3);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
break;
|
||||
default:
|
||||
SV_Stop (0);
|
||||
|
@ -134,21 +142,21 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time)
|
|||
}
|
||||
} else {
|
||||
c = dem_read;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
}
|
||||
|
||||
|
||||
len = LittleLong (msg->cursize);
|
||||
demo.size += DWRITE (&len, 4, demo.dest);
|
||||
demo.size += DWRITE (msg->data, msg->cursize, demo.dest);
|
||||
demo.size += DWRITE (&len, 4, demo_dest);
|
||||
demo.size += DWRITE (msg->data, msg->cursize, demo_dest);
|
||||
|
||||
if (demo.disk)
|
||||
Qflush (demo.file);
|
||||
if (demo_disk)
|
||||
Qflush (demo_file);
|
||||
else if (demo.size - demo_size > demo_max_size) {
|
||||
demo_size = demo.size;
|
||||
demo.mfile -= 0x80000;
|
||||
Qwrite (demo.file, svs.demomem, 0x80000);
|
||||
Qflush (demo.file);
|
||||
demo_mfile -= 0x80000;
|
||||
Qwrite (demo_file, svs.demomem, 0x80000);
|
||||
Qflush (demo_file);
|
||||
memmove (svs.demomem, svs.demomem + 0x80000, demo.size - 0x80000);
|
||||
}
|
||||
}
|
||||
|
@ -357,13 +365,13 @@ SV_Stop (int reason)
|
|||
|
||||
if (reason == 2) {
|
||||
// stop and remove
|
||||
if (demo.disk)
|
||||
Qclose (demo.file);
|
||||
if (demo_disk)
|
||||
Qclose (demo_file);
|
||||
|
||||
QFS_Remove (demo.name->str);
|
||||
QFS_Remove (demo.text->str);
|
||||
QFS_Remove (demo_name->str);
|
||||
QFS_Remove (demo_text->str);
|
||||
|
||||
demo.file = NULL;
|
||||
demo_file = NULL;
|
||||
sv.demorecording = false;
|
||||
|
||||
SV_BroadcastPrintf (PRINT_CHAT,
|
||||
|
@ -385,14 +393,14 @@ SV_Stop (int reason)
|
|||
|
||||
SV_DemoWritePackets (demo.parsecount - demo.lastwritten + 1);
|
||||
// finish up
|
||||
if (!demo.disk) {
|
||||
Qwrite (demo.file, svs.demomem, demo.size - demo_size);
|
||||
Qflush (demo.file);
|
||||
if (!demo_disk) {
|
||||
Qwrite (demo_file, svs.demomem, demo.size - demo_size);
|
||||
Qflush (demo_file);
|
||||
}
|
||||
|
||||
Qclose (demo.file);
|
||||
Qclose (demo_file);
|
||||
|
||||
demo.file = NULL;
|
||||
demo_file = NULL;
|
||||
sv.demorecording = false;
|
||||
if (!reason)
|
||||
SV_BroadcastPrintf (PRINT_CHAT, "Server recording completed\n");
|
||||
|
@ -409,8 +417,8 @@ SV_Stop (int reason)
|
|||
if ((p = strstr (sv_onrecordfinish->string, " ")) != NULL)
|
||||
*p = 0; // strip parameters
|
||||
|
||||
strcpy (path, demo.name->str);
|
||||
strcpy (path + strlen (demo.name->str) - 3, "txt");
|
||||
strcpy (path, demo_name->str);
|
||||
strcpy (path + strlen (demo_name->str) - 3, "txt");
|
||||
|
||||
sv_redirected = RD_NONE; // onrecord script is called always
|
||||
// from the console
|
||||
|
@ -501,12 +509,12 @@ SV_InitRecord (void)
|
|||
{
|
||||
if (!USECACHE) {
|
||||
dwrite = &Qwrite;
|
||||
demo.dest = demo.file;
|
||||
demo.disk = true;
|
||||
demo_dest = demo_file;
|
||||
demo_disk = true;
|
||||
} else {
|
||||
dwrite = &memwrite;
|
||||
demo.mfile = svs.demomem;
|
||||
demo.dest = &demo.mfile;
|
||||
demo_mfile = svs.demomem;
|
||||
demo_dest = &demo_mfile;
|
||||
}
|
||||
|
||||
demo_size = 0;
|
||||
|
@ -527,18 +535,18 @@ SV_WriteRecordDemoMessage (sizebuf_t *msg)
|
|||
byte c;
|
||||
|
||||
c = 0;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
|
||||
c = dem_read;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
|
||||
len = LittleLong (msg->cursize);
|
||||
demo.size += DWRITE (&len, 4, demo.dest);
|
||||
demo.size += DWRITE (&len, 4, demo_dest);
|
||||
|
||||
demo.size += DWRITE (msg->data, msg->cursize, demo.dest);
|
||||
demo.size += DWRITE (msg->data, msg->cursize, demo_dest);
|
||||
|
||||
if (demo.disk)
|
||||
Qflush (demo.file);
|
||||
if (demo_disk)
|
||||
Qflush (demo_file);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -548,19 +556,19 @@ SV_WriteSetDemoMessage (void)
|
|||
byte c;
|
||||
|
||||
c = 0;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
|
||||
c = dem_set;
|
||||
demo.size += DWRITE (&c, sizeof (c), demo.dest);
|
||||
demo.size += DWRITE (&c, sizeof (c), demo_dest);
|
||||
|
||||
|
||||
len = LittleLong (0);
|
||||
demo.size += DWRITE (&len, 4, demo.dest);
|
||||
demo.size += DWRITE (&len, 4, demo_dest);
|
||||
len = LittleLong (0);
|
||||
demo.size += DWRITE (&len, 4, demo.dest);
|
||||
demo.size += DWRITE (&len, 4, demo_dest);
|
||||
|
||||
if (demo.disk)
|
||||
Qflush (demo.file);
|
||||
if (demo_disk)
|
||||
Qflush (demo_file);
|
||||
}
|
||||
|
||||
static const char *
|
||||
|
@ -640,27 +648,22 @@ SV_Record (char *name)
|
|||
client_t *player;
|
||||
const char *gamedir, *s;
|
||||
|
||||
{
|
||||
// save over memset
|
||||
dstring_t *tn = demo.name, *tt = demo.text;
|
||||
memset (&demo, 0, sizeof (demo));
|
||||
dstring_clearstr (demo.name = tn);
|
||||
dstring_clearstr (demo.text = tt);
|
||||
}
|
||||
demo.recorder.delta.pvs = dt_pvs_fat;
|
||||
memset (&demo, 0, sizeof (demo));
|
||||
|
||||
demo.delta.pvs = dt_pvs_fat;
|
||||
for (i = 0; i < UPDATE_BACKUP; i++) {
|
||||
demo.recorder.delta.frames[i].entities.entities = demo_entities[i];
|
||||
demo.recorder.delta.frames[i].players.players = demo_players[i];
|
||||
demo.delta.frames[i].entities.entities = demo_entities[i];
|
||||
demo.delta.frames[i].players.players = demo_players[i];
|
||||
}
|
||||
|
||||
DemoBuffer_Init (&demo.dbuffer, demo.buffer, sizeof (demo.buffer));
|
||||
DemoBuffer_Init (&demo.dbuffer, demo_buffer, sizeof (demo_buffer));
|
||||
DemoSetMsgBuf (NULL, &demo.frames[0].buf);
|
||||
|
||||
demo.datagram.maxsize = sizeof (demo.datagram_data);
|
||||
demo.datagram.data = demo.datagram_data;
|
||||
demo.datagram.maxsize = sizeof (demo_datagram_data);
|
||||
demo.datagram.data = demo_datagram_data;
|
||||
|
||||
demo.file = QFS_Open (name, "wb");
|
||||
if (!demo.file) {
|
||||
demo_file = QFS_Open (name, "wb");
|
||||
if (!demo_file) {
|
||||
Con_Printf ("ERROR: couldn't open %s\n", name);
|
||||
return;
|
||||
}
|
||||
|
@ -670,19 +673,19 @@ SV_Record (char *name)
|
|||
s = name + strlen (name);
|
||||
while (s > name && *s != '/')
|
||||
s--;
|
||||
dstring_copystr (demo.name, s + (*s == '/'));
|
||||
dstring_copystr (demo_name, s + (*s == '/'));
|
||||
|
||||
SV_BroadcastPrintf (PRINT_CHAT, "Server started recording (%s):\n%s\n",
|
||||
demo.disk ? "disk" : "memory", demo.name->str);
|
||||
Cvar_Set (serverdemo, demo.name->str);
|
||||
demo_disk ? "disk" : "memory", demo_name->str);
|
||||
Cvar_Set (serverdemo, demo_name->str);
|
||||
|
||||
dstring_copystr (demo.text, name);
|
||||
strcpy (demo.text->str + strlen (demo.text->str) - 3, "txt");
|
||||
dstring_copystr (demo_text, name);
|
||||
strcpy (demo_text->str + strlen (demo_text->str) - 3, "txt");
|
||||
|
||||
if (sv_demotxt->int_val) {
|
||||
QFile *f;
|
||||
|
||||
f = QFS_Open (demo.text->str, "w+t");
|
||||
f = QFS_Open (demo_text->str, "w+t");
|
||||
if (f != NULL) {
|
||||
char date[20];
|
||||
time_t tim;
|
||||
|
@ -697,7 +700,7 @@ SV_Record (char *name)
|
|||
Qclose (f);
|
||||
}
|
||||
} else
|
||||
QFS_Remove (demo.text->str);
|
||||
QFS_Remove (demo_text->str);
|
||||
|
||||
sv.demorecording = true;
|
||||
demo.pingtime = demo.time = sv.time;
|
||||
|
@ -1078,8 +1081,8 @@ Demo_Init (void)
|
|||
size = MIN_DEMO_MEMORY;
|
||||
}
|
||||
|
||||
demo.name = dstring_newstr ();
|
||||
demo.text = dstring_newstr ();
|
||||
demo_name = dstring_newstr ();
|
||||
demo_text = dstring_newstr ();
|
||||
|
||||
svs.demomem = Hunk_AllocName (size, "demo");
|
||||
svs.demomemsize = size;
|
||||
|
|
|
@ -863,12 +863,11 @@ SV_SendDemoMessage (void)
|
|||
msg.allowoverflow = true;
|
||||
msg.overflowed = false;
|
||||
|
||||
if (!demo.recorder.delta.delta_sequence)
|
||||
demo.recorder.delta.delta_sequence = -1;
|
||||
demo.recorder.delta.cur_frame = (demo.recorder.delta.delta_sequence + 1)
|
||||
& UPDATE_MASK;
|
||||
demo.recorder.delta.out_frame = demo.recorder.delta.cur_frame;
|
||||
SV_WriteEntitiesToClient (&demo.recorder.delta, &msg);
|
||||
if (!demo.delta.delta_sequence)
|
||||
demo.delta.delta_sequence = -1;
|
||||
demo.delta.cur_frame = (demo.delta.delta_sequence + 1) & UPDATE_MASK;
|
||||
demo.delta.out_frame = demo.delta.cur_frame;
|
||||
SV_WriteEntitiesToClient (&demo.delta, &msg);
|
||||
DemoWrite_Begin (dem_all, 0, msg.cursize);
|
||||
SZ_Write (&demo.dbuf->sz, msg.data, msg.cursize);
|
||||
// copy the accumulated multicast datagram
|
||||
|
@ -879,9 +878,8 @@ SV_SendDemoMessage (void)
|
|||
SZ_Clear (&demo.datagram);
|
||||
}
|
||||
|
||||
demo.recorder.delta.delta_sequence =
|
||||
demo.recorder.netchan.incoming_sequence & UPDATE_MASK;
|
||||
demo.recorder.netchan.incoming_sequence++;
|
||||
demo.delta.delta_sequence++;
|
||||
demo.delta.delta_sequence &= UPDATE_MASK;
|
||||
demo.frames[demo.parsecount & DEMO_FRAMES_MASK].time = demo.time = sv.time;
|
||||
|
||||
// that's a backup of 3sec at 20fps, should be enough
|
||||
|
|
Loading…
Reference in a new issue