summaryrefslogtreecommitdiff
path: root/source/q_msg.h
blob: 622d5f510012ae2376f7d5c142a8c2359b70da5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
Copyright (C) 1997-2001 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

//
// q_msg.h
//

#define SZ_MSG_WRITE        MakeLong( 'w', 'r', 'i', 't' )
#define SZ_MSG_READ         MakeLong( 'r', 'e', 'a', 'd' )
#define SZ_NC_SEND_OLD      MakeLong( 'n', 'c', '1', 's' )
#define SZ_NC_SEND_NEW      MakeLong( 'n', 'c', '2', 's' )
#define SZ_NC_SEND_FRG      MakeLong( 'n', 'c', '2', 'f' )
#define SZ_NC_FRG_IN        MakeLong( 'n', 'c', '2', 'i' )
#define SZ_NC_FRG_OUT       MakeLong( 'n', 'c', '2', 'o' )

typedef struct sizebuf_s {
    uint32_t    tag;
	qboolean	allowoverflow;
	qboolean	overflowed;		// set to qtrue if the buffer size failed
	byte	*data;
	size_t	maxsize;
	size_t	cursize;
	size_t	readcount;
	size_t	bitpos;
} sizebuf_t;

void SZ_Init( sizebuf_t *buf, void *data, size_t length );
void SZ_TagInit( sizebuf_t *buf, void *data, size_t length, uint32_t tag );
void SZ_Clear( sizebuf_t *buf );
void *SZ_GetSpace( sizebuf_t *buf, size_t length );
void SZ_Write( sizebuf_t *buf, const void *data, size_t length );
void SZ_WriteByte( sizebuf_t *sb, int c );
void SZ_WriteShort( sizebuf_t *sb, int c );
void SZ_WriteLong( sizebuf_t *sb, int c );
void SZ_WritePos( sizebuf_t *sb, const vec3_t pos );
void SZ_WriteString( sizebuf_t *sb, const char *string );

//============================================================================

typedef enum {
	MSG_PS_IGNORE_GUNINDEX		= ( 1 << 0 ),
	MSG_PS_IGNORE_GUNFRAMES		= ( 1 << 1 ),
	MSG_PS_IGNORE_BLEND			= ( 1 << 2 ),
	MSG_PS_IGNORE_VIEWANGLES	= ( 1 << 3 ),
	MSG_PS_IGNORE_DELTAANGLES	= ( 1 << 4 ),
	MSG_PS_IGNORE_PREDICTION	= ( 1 << 5 ),	// mutually exclusive with IGNORE_VIEWANGLES
	MSG_PS_FORCE				= ( 1 << 7 ),
	MSG_PS_REMOVE				= ( 1 << 8 )
} msgPsFlags_t;

typedef enum {
	MSG_ES_FORCE				= ( 1 << 0 ),
	MSG_ES_NEWENTITY			= ( 1 << 1 ),
	MSG_ES_FIRSTPERSON			= ( 1 << 2 ),
	MSG_ES_REMOVE	     		= ( 1 << 3 )
} msgEsFlags_t;
	
extern sizebuf_t	msg_write;
extern byte	        msg_write_buffer[MAX_MSGLEN];

extern sizebuf_t	msg_read;
extern byte	        msg_read_buffer[MAX_MSGLEN];

extern const entity_state_t	nullEntityState;
extern const player_state_t	nullPlayerState;
extern const usercmd_t		nullUserCmd;

void	MSG_Init( void );

void	MSG_BeginWriting( void );
void	MSG_WriteChar( int c );
void	MSG_WriteByte( int c );
void	MSG_WriteShort( int c );
void	MSG_WriteLong( int c );
void	MSG_WriteFloat( float f );
void	MSG_WriteString( const char *s );
void	MSG_WriteCoord( float f );
void	MSG_WritePos( const vec3_t pos );
void	MSG_WriteAngle( float f );
void	MSG_WriteAngle16( float f );
void	MSG_WriteBits( int value, int bits );
int		MSG_WriteDeltaUsercmd( const usercmd_t *from, const usercmd_t *cmd, int version );
int		MSG_WriteDeltaUsercmd_Enhanced( const usercmd_t *from, const usercmd_t *cmd, int version );
void	MSG_WriteDir ( const vec3_t vector);
void	MSG_WriteDeltaEntity( const entity_state_t *from, const entity_state_t *to, msgEsFlags_t flags );
void	MSG_WriteDeltaPlayerstate_Default( const player_state_t *from, const player_state_t *to );
int		MSG_WriteDeltaPlayerstate_Enhanced( const player_state_t *from, player_state_t *to, msgPsFlags_t flags );
void	MSG_WriteDeltaPlayerstate_Packet( const player_state_t *from, const player_state_t *to, int number, msgPsFlags_t flags );
void	MSG_FlushTo( sizebuf_t *dest );
void    MSG_Printf( const char *fmt, ... ) q_printf( 1, 2 ); 

static inline void MSG_WriteData( const void *data, size_t length ) {
	memcpy( SZ_GetSpace( &msg_write, length ), data, length );		
}

void	MSG_BeginReading( void );
int		MSG_ReadChar( void );
int		MSG_ReadByte( void );
int		MSG_ReadShort( void );
int     MSG_ReadWord( void );
int		MSG_ReadLong( void );
float	MSG_ReadFloat( void );
char	*MSG_ReadString( void );
char	*MSG_ReadStringLine( void );
char    *MSG_ReadStringLength( size_t *length );
float	MSG_ReadCoord( void );
void	MSG_ReadPos( vec3_t pos );
float	MSG_ReadAngle( void );
float	MSG_ReadAngle16 ( void );
int		MSG_ReadBits( int bits );
void	MSG_ReadDeltaUsercmd( const usercmd_t *from, usercmd_t *cmd );
void	MSG_ReadDeltaUsercmd_Hacked( const usercmd_t *from, usercmd_t *to );
void	MSG_ReadDeltaUsercmd_Enhanced( const usercmd_t *from, usercmd_t *to, int version );
void	MSG_ReadDir( vec3_t vector );
void	MSG_ReadData( void *buffer, int size );
int		MSG_ParseEntityBits( int *bits );
void	MSG_ParseDeltaEntity( const entity_state_t *from, entity_state_t *to, int number, int bits );
void	MSG_ParseDeltaPlayerstate_Default( const player_state_t *from, player_state_t *to, int flags );
void	MSG_ParseDeltaPlayerstate_Enhanced( const player_state_t *from, player_state_t *to, int flags, int extraflags );
void	MSG_ParseDeltaPlayerstate_Packet( const player_state_t *from, player_state_t *to, int flags );

void MSG_ShowDeltaEntityBits( int bits );
void MSG_ShowDeltaPlayerstateBits_Default( int flags );
void MSG_ShowDeltaPlayerstateBits_Enhanced( int flags );
void MSG_ShowDeltaPlayerstateBits_Packet( int flags );
void MSG_ShowDeltaUsercmdBits_Enhanced( int bits );
const char *MSG_ServerCommandString( int cmd );

#define MSG_ShowSVC( cmd ) do { \
	Com_Printf( "%3"PRIz":%s\n", msg_read.readcount - 1, \
        MSG_ServerCommandString( cmd ) ); \
    } while( 0 )