sv_recorder seems to be ready for qtv :)

This commit is contained in:
Bill Currie 2005-05-02 00:45:25 +00:00
parent 7644b7fc8e
commit 0213efb331
5 changed files with 80 additions and 55 deletions

View file

@ -136,6 +136,11 @@ typedef struct {
packet_players_t players;
} client_frame_t;
typedef enum {
dt_tp_normal,
dt_tp_demo,
} delta_type_t;
typedef enum {
dt_pvs_normal,
dt_pvs_fat,
@ -143,6 +148,7 @@ typedef enum {
} delta_pvs_t;
typedef struct {
delta_type_t type;
delta_pvs_t pvs;
int delta_sequence;
int cur_frame;

View file

@ -38,13 +38,13 @@ typedef struct recorder_s recorder_t;
void SVR_Init (void);
recorder_t *SVR_AddUser (void (*writer)(struct sizebuf_s *),
int (*frame)(void),
void (*finish)(struct sizebuf_s *));
void (*finish)(struct sizebuf_s *),
int demo);
void SVR_RemoveUser (recorder_t *r);
struct sizebuf_s *SVR_WriteBegin (byte type, int to, int size);
struct sizebuf_s *SVR_Datagram (void);
void SVR_ForceFrame (void);
int SVR_Frame (void);
void SVR_WritePacket (void);
void SV_SendDemoMessage (void);
#endif//__sv_recorder_h

View file

@ -406,7 +406,7 @@ SV_Record (char *name)
} else
QFS_Remove (demo_text->str);
recorder = SVR_AddUser (demo_write, demo_frame, demo_finish);
recorder = SVR_AddUser (demo_write, demo_frame, demo_finish, 1);
demo_time = sv.time;
/*-------------------------------------------------*/

View file

@ -92,7 +92,6 @@ typedef struct rec_s {
int lasttype;
double time, pingtime;
delta_t delta;
int stats[MAX_CLIENTS][MAX_CL_STATS]; // ouch!
demo_frame_t frames[DEMO_FRAMES];
int forceFrame;
@ -106,6 +105,9 @@ struct recorder_s {
void (*write)(sizebuf_t *);
int (*frame)(void);
void (*finish)(sizebuf_t *);
delta_t delta;
entity_state_t entities[UPDATE_MASK][MAX_DEMO_PACKET_ENTITIES];
plent_state_t players[UPDATE_MASK][MAX_CLIENTS];
};
static rec_t rec;
@ -114,7 +116,7 @@ static recorder_t recorders_list[3];
static byte buffer[20 * MAX_MSGLEN];
static byte datagram_data[MAX_DATAGRAM];
static byte msg_buffer[MAX_DATAGRAM];
static byte msg_buffer[2][MAX_DATAGRAM];
#define MIN_DEMO_MEMORY 0x100000
#define USECACHE (sv_demoUseCache->int_val && svs.demomemsize)
@ -124,9 +126,6 @@ static byte msg_buffer[MAX_DATAGRAM];
#define HEADER ((int) &((header_t *) 0)->data)
static entity_state_t entities[UPDATE_MASK + 1][MAX_DEMO_PACKET_ENTITIES];
static plent_state_t players[UPDATE_MASK + 1][MAX_CLIENTS];
static void
dbuffer_init (dbuffer_t *dbuffer, byte *buf, size_t size)
{
@ -303,15 +302,7 @@ move_buf (void)
static void
clear_rec (void)
{
int i;
memset (&rec, 0, sizeof (rec));
rec.delta.pvs = dt_pvs_fat;
for (i = 0; i < UPDATE_BACKUP; i++) {
rec.delta.frames[i].entities.entities = entities[i];
rec.delta.frames[i].players.players = players[i];
}
dbuffer_init (&rec.dbuffer, buffer, sizeof (buffer));
set_msgbuf (NULL, &rec.frames[0].buf);
@ -335,9 +326,10 @@ SVR_Init (void)
recorder_t *
SVR_AddUser (void (*write)(sizebuf_t *), int (*frame)(void),
void (*finish)(sizebuf_t *))
void (*finish)(sizebuf_t *), int demo)
{
recorder_t *r;
int i;
if (!free_recorders)
return 0;
@ -350,9 +342,19 @@ SVR_AddUser (void (*write)(sizebuf_t *), int (*frame)(void),
r = free_recorders;
free_recorders = r->next;
memset (r, 0, sizeof (*r));
r->next = sv.recorders;
sv.recorders = r;
if (demo)
r->delta.type = dt_tp_demo;
r->delta.pvs = dt_pvs_fat;
for (i = 0; i < UPDATE_BACKUP; i++) {
r->delta.frames[i].entities.entities = r->entities[i];
r->delta.frames[i].players.players = r->players[i];
}
r->write = write;
r->frame = frame;
r->finish = finish;
@ -364,11 +366,11 @@ void
SVR_RemoveUser (recorder_t *r)
{
recorder_t **_r;
sizebuf_t msg;//, *dbuf;
sizebuf_t msg;
memset (&msg, 0, sizeof (msg));
msg.data = msg_buffer;
msg.maxsize = sizeof (msg_buffer);
msg.data = msg_buffer[0];
msg.maxsize = sizeof (msg_buffer[0]);
// rec.dbuf->sz.cursize = 0;
// rec.dbuf->h = 0;
@ -397,38 +399,51 @@ SVR_RemoveUser (recorder_t *r)
}
static void
write_datagram (void)
write_datagram (recorder_t *r)
{
sizebuf_t *dbuf;
sizebuf_t msg;
sizebuf_t msg, dst;
memset (&msg, 0, sizeof (msg));
msg.data = msg_buffer;
msg.maxsize = sizeof (msg_buffer);
msg.data = msg_buffer[0];
msg.maxsize = sizeof (msg_buffer[0]);
msg.allowoverflow = true;
if (!rec.delta.delta_sequence)
rec.delta.delta_sequence = -1;
rec.delta.cur_frame = (rec.delta.delta_sequence + 1) & UPDATE_MASK;
rec.delta.out_frame = rec.delta.cur_frame;
SV_WriteEntitiesToClient (&rec.delta, &msg);
dbuf = SVR_WriteBegin (dem_all, 0, msg.cursize);
SZ_Write (dbuf, msg.data, msg.cursize);
memset (&dst, 0, sizeof (dst));
dst.data = msg_buffer[1];
dst.maxsize = sizeof (msg_buffer[1]);
dst.allowoverflow = true;
// MSG_WriteByte (&msg, 0);
// MSG_WriteByte (&msg, dem_all);
// MSG_WriteLong (&msg, 0);
if (!r->delta.delta_sequence)
r->delta.delta_sequence = -1;
r->delta.cur_frame = (r->delta.delta_sequence + 1) & UPDATE_MASK;
r->delta.out_frame = r->delta.cur_frame;
SV_WriteEntitiesToClient (&r->delta, &msg);
// copy the accumulated multicast datagram
// for this client out to the message
if (rec.datagram.cursize) {
dbuf = SVR_WriteBegin (dem_all, 0, rec.datagram.cursize);
SZ_Write (dbuf, rec.datagram.data, rec.datagram.cursize);
SZ_Clear (&rec.datagram);
if (rec.datagram.cursize)
SZ_Write (&msg, rec.datagram.data, rec.datagram.cursize);
// if (msg.cursize > 6) {
if (msg.cursize) {
// msg.data[2] = ((msg.cursize - 6) >> 0) & 0xff;
// msg.data[3] = ((msg.cursize - 6) >> 8) & 0xff;
// msg.data[4] = ((msg.cursize - 6) >> 16) & 0xff;
// msg.data[5] = ((msg.cursize - 6) >> 24) & 0xff;
double time = rec.frames[rec.lastwritten & DEMO_FRAMES_MASK].time;
write_msg (&msg, dem_all, 0, time, &dst);
r->write (&dst);
}
rec.delta.delta_sequence++;
rec.delta.delta_sequence &= UPDATE_MASK;
r->delta.delta_sequence++;
r->delta.delta_sequence &= UPDATE_MASK;
rec.frames[rec.parsecount & DEMO_FRAMES_MASK].time = rec.time = sv.time;
}
void
SVR_WritePacket (void)
static void
write_packet (void)
{
demo_frame_t *frame;
double time;
@ -436,11 +451,11 @@ SVR_WritePacket (void)
recorder_t *r;
memset (&msg, 0, sizeof (msg));
msg.data = msg_buffer;
msg.maxsize = sizeof (msg_buffer);
msg.data = msg_buffer[0];
msg.maxsize = sizeof (msg_buffer[0]);
msg.allowoverflow = true;
frame = &rec.frames[rec.lastwritten++ & DEMO_FRAMES_MASK];
frame = &rec.frames[rec.lastwritten & DEMO_FRAMES_MASK];
time = frame->time;
rec.dbuf = &frame->buf;
@ -466,7 +481,7 @@ SVR_WriteBegin (byte type, int to, int size)
if (!move && rec.dbuffer.end > rec.dbuffer.start)
move = true;
SVR_WritePacket ();
write_packet ();
if (move && rec.dbuffer.start > rec.dbuf->bufsize + HEADER + size)
move_buf ();
}
@ -546,9 +561,9 @@ SV_SendDemoMessage (void)
{
int i, j;
client_t *c;
byte buf[MAX_DATAGRAM];
sizebuf_t msg, *dbuf;
sizebuf_t *dbuf;
int stats[MAX_CL_STATS];
recorder_t *r;
if (sv_demoPings->value && sv.time - rec.pingtime > sv_demoPings->value) {
demo_pings ();
@ -584,19 +599,15 @@ SV_SendDemoMessage (void)
}
}
write_packet ();
// send over all the objects that are in the PVS
// this will include clients, a packetentities, and
// possibly a nails update
msg.data = buf;
msg.maxsize = sizeof (buf);
msg.cursize = 0;
msg.allowoverflow = true;
msg.overflowed = false;
write_datagram ();
SVR_WritePacket ();
for (r = sv.recorders; r; r = r->next)
write_datagram (r);
SZ_Clear (&rec.datagram);
rec.parsecount++;
set_msgbuf (rec.dbuf, &rec.frames[rec.parsecount & DEMO_FRAMES_MASK].buf);
rec.lastwritten++;
}

8
ruamoko/scheme/.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
*.dat
*.gz
*.qfo
*.src
*.sym
.vimrc
Makefile.in
Makefile