/* * SV_Demo_WriteSnap */ void SV_Demo_WriteSnap( void ) { int i; msg_t msg; uint8_t msg_buffer[MAX_MSGLEN]; if( !svs.demo.file ) return; for( i = 0; i < sv_maxclients->integer; i++ ) { if( svs.clients[i].state >= CS_SPAWNED && svs.clients[i].edict && !( svs.clients[i].edict->r.svflags & SVF_NOCLIENT ) ) break; } if( i == sv_maxclients->integer ) { // FIXME Com_Printf( "No players left, stopping server side demo recording\n" ); SV_Demo_Stop_f(); return; } MSG_Init( &msg, msg_buffer, sizeof( msg_buffer ) ); SV_BuildClientFrameSnap( &svs.demo.client ); SV_WriteFrameSnapToClient( &svs.demo.client, &msg ); SV_AddReliableCommandsToMessage( &svs.demo.client, &msg ); SV_Demo_WriteMessage( &msg ); svs.demo.duration = svs.gametime - svs.demo.basetime; svs.demo.client.lastframe = sv.framenum; // FIXME: is this needed? }
/* * SV_SendClientDatagram */ static bool SV_SendClientDatagram( client_t *client ) { if( client->edict && ( client->edict->r.svflags & SVF_FAKECLIENT ) ) return true; SV_InitClientMessage( client, &tmpMessage, NULL, 0 ); SV_AddReliableCommandsToMessage( client, &tmpMessage ); // send over all the relevant entity_state_t // and the player_state_t SV_BuildClientFrameSnap( client ); SV_WriteFrameSnapToClient( client, &tmpMessage ); return SV_SendMessageToClient( client, &tmpMessage ); }