summaryrefslogtreecommitdiff
path: root/source/mvd_local.h
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2008-10-11 15:05:50 +0000
committerAndrey Nazarov <skuller@skuller.net>2008-10-11 15:05:50 +0000
commitd02633af4e780c4b6f6d938c67d84d2c968adb79 (patch)
tree3379b9615e285346ad6b1f87639912e01ecd44c7 /source/mvd_local.h
parentf8abe42a0d1a42653b39f6cf320d3fbdd1279bb3 (diff)
Major redesign of GTV protocol: added support for persistent GTV connections,
bidirectional pinging, low traffic (`suspended') modes. HTTP server is now gone (remote console logging is temporary gone too), custom binary protocol is used for GTV connections now. MVD client no longer serves other MVD clients, only regular spectators. Changed FIFO buffers to be regular circular buffers, not BIP-buffers. Removed `sv_http_*', `sv_console_auth' variables. Added `sv_mvd_maxclients' variable, `addgtvhost', `delgtvhost' and `listgtvhosts' commands. Renamed `sv_mvd_max*' cvars for consistency. Reset `sv_ghostime' default value back to 6, but changed semantics: it now waits for any packet from client, not just `begin' packet. Added `--disable-mvd-server' and `--disable-mvd-client' options to configure script. FS_Restart() no longer chokes on real files opened for reading. Fixed client chat prompt length. Stubbed out more debugging stuff from dedicated server builds.
Diffstat (limited to 'source/mvd_local.h')
-rw-r--r--source/mvd_local.h88
1 files changed, 29 insertions, 59 deletions
diff --git a/source/mvd_local.h b/source/mvd_local.h
index 3dd0d06..55ca6ca 100644
--- a/source/mvd_local.h
+++ b/source/mvd_local.h
@@ -18,30 +18,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#define MVD_DEBUG( s ) do { if( mvd_debug->integer ) \
- Com_Printf( S_COLOR_BLUE "%s: %s", __func__, s ); } while( 0 )
-
#define MVD_Malloc( size ) Z_TagMalloc( size, TAG_MVD )
#define MVD_Mallocz( size ) Z_TagMallocz( size, TAG_MVD )
#define MVD_CopyString( s ) Z_TagCopyString( s, TAG_MVD )
-#define EDICT_MVDCL( ent ) (( udpClient_t * )( (ent)->client ))
+#define EDICT_MVDCL( ent ) (( mvd_client_t * )( (ent)->client ))
#define CS_NUM( c, n ) ( ( char * )(c) + (n) * MAX_QPATH )
// game features MVD client supports
#define MVD_FEATURES (GMF_CLIENTNUM|GMF_PROPERINUSE|GMF_WANT_ALL_DISCONNECTS)
-typedef enum {
- MVD_DEAD, // not active at all
- MVD_CONNECTING, // connect() in progress
- MVD_CONNECTED, // HTTP request sent
- MVD_CHECKING, // got response, checking magic
- MVD_PREPARING, // got magic, waiting for gamestate
- MVD_WAITING, // stalled, buffering more data
- MVD_READING, // actively running
- MVD_DISCONNECTED // disconnected, running until EOB
-} mvdState_t;
-
#define LAYOUT_MSEC 3000
typedef enum {
@@ -97,48 +83,42 @@ typedef struct {
usercmd_t lastcmd;
//short delta_angles[3];
int jump_held;
-} udpClient_t;
+} mvd_client_t;
#define MAX_MVD_NAME 16
+typedef enum {
+ MVD_DEAD, // no gamestate received yet, unusable
+ MVD_WAITING, // buffering more frames
+ MVD_READING // reading frames
+} mvd_state_t;
+
+struct gtv_s;
+
typedef struct mvd_s {
list_t entry;
- list_t ready;
list_t active;
- int id;
- char name[MAX_MVD_NAME];
+ mvd_state_t state;
+ int id;
+ char name[MAX_MVD_NAME];
+ struct gtv_s *gtv;
+ qboolean (*read_frame)( struct mvd_s * );
// demo related variables
- fileHandle_t demoplayback;
fileHandle_t demorecording;
- int demoloop;
- string_entry_t *demohead, *demoentry;
-
- // connection variables
- mvdState_t state;
- int servercount;
- int clientNum;
- netstream_t stream;
- char address[MAX_QPATH];
- char response[MAX_NET_STRING];
- size_t responseLength;
- size_t contentLength;
- htcoding_t contentCoding;
- int statusCode;
- char statusText[MAX_QPATH];
+
+ // delay buffer
+ fifo_t delay;
size_t msglen;
-#if USE_ZLIB
- z_stream z;
-#endif
- fifo_t zbuf;
+ unsigned num_packets, min_packets;
+ unsigned underflows, overflows;
unsigned framenum;
- unsigned lastReceived;
- unsigned waitTime, waitDelay, waitCount;
// game state
char gamedir[MAX_QPATH];
char mapname[MAX_QPATH];
+ int servercount;
int maxclients;
edict_pool_t pool;
cm_t cm;
@@ -150,13 +130,13 @@ typedef struct mvd_s {
mvd_player_t *players; // [maxclients]
mvd_player_t *dummy; // &players[clientNum]
int numplayers; // number of active players in frame
+ int clientNum;
char layout[MAX_STRING_CHARS];
char oldscores[MAX_STRING_CHARS]; // layout is copied here
qboolean intermission;
- // client lists
- list_t udpClients;
- list_t tcpClients;
+ // UDP client list
+ list_t clients;
} mvd_t;
@@ -165,28 +145,19 @@ typedef struct mvd_s {
//
extern list_t mvd_channels;
-extern list_t mvd_ready;
extern list_t mvd_active;
extern mvd_t mvd_waitingRoom;
extern qboolean mvd_dirty;
extern cvar_t *mvd_shownet;
-extern cvar_t *mvd_debug;
extern cvar_t *mvd_timeout;
extern cvar_t *mvd_chase_msgs;
-void MVD_DPrintf( const char *fmt, ... ) q_printf( 1, 2 );
-void MVD_Dropf( mvd_t *mvd, const char *fmt, ... )
- q_noreturn q_printf( 2, 3 );
void MVD_Destroyf( mvd_t *mvd, const char *fmt, ... )
q_noreturn q_printf( 2, 3 );
void MVD_Disconnect( mvd_t *mvd );
void MVD_BeginWaiting( mvd_t *mvd );
-void MVD_ClearState( mvd_t *mvd );
-void MVD_ChangeLevel( mvd_t *mvd );
void MVD_Finish( mvd_t *mvd, const char *reason ) q_noreturn;
-void MVD_GetStream( const char *uri );
-void MVD_GetStatus( void );
void MVD_Free( mvd_t *mvd );
void MVD_Shutdown( void );
@@ -194,7 +165,6 @@ mvd_t *MVD_SetChannel( int arg );
void MVD_File_g( genctx_t *ctx );
-void MVD_Connect_f( void );
void MVD_Spawn_f( void );
void MVD_StreamedStop_f( void );
@@ -207,19 +177,19 @@ int MVD_Frame( void );
// mvd_parse.c
//
-qboolean MVD_Parse( mvd_t *mvd );
+void MVD_ParseMessage( mvd_t *mvd );
void MVD_ParseEntityString( mvd_t *mvd, const char *data );
+void MVD_FreePlayer( mvd_player_t *player );
//
// mvd_game.c
//
-extern udpClient_t *mvd_clients; /* [svs.maxclients] */
-extern game_export_t mvd_ge;
+extern mvd_client_t *mvd_clients; // [maxclients]
-void MVD_UpdateClient( udpClient_t *client );
-void MVD_SwitchChannel( udpClient_t *client, mvd_t *mvd );
+void MVD_UpdateClient( mvd_client_t *client );
+void MVD_SwitchChannel( mvd_client_t *client, mvd_t *mvd );
void MVD_RemoveClient( client_t *client );
void MVD_BroadcastPrintf( mvd_t *mvd, int level,
int mask, const char *fmt, ... ) q_printf( 4, 5 );