1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19*/
20// protocol.h -- communications protocols
21
22#define	PROTOCOL_VERSION	28
23
24#define QW_CHECK_HASH 0x5157
25
26//=========================================
27
28#define	PORT_CLIENT	27001
29#define	PORT_MASTER	27000
30#define	PORT_SERVER	27500
31
32//=========================================
33
34// out of band message id bytes
35
36// M = master, S = server, C = client, A = any
37// the second character will allways be \n if the message isn't a single
38// byte long (?? not true anymore?)
39
40#define	S2C_CHALLENGE		'c'
41#define	S2C_CONNECTION		'j'
42#define	A2A_PING			'k'	// respond with an A2A_ACK
43#define	A2A_ACK				'l'	// general acknowledgement without info
44#define	A2A_NACK			'm'	// [+ comment] general failure
45#define A2A_ECHO			'e' // for echoing
46#define	A2C_PRINT			'n'	// print a message on client
47
48#define	S2M_HEARTBEAT		'a'	// + serverinfo + userlist + fraglist
49#define	A2C_CLIENT_COMMAND	'B'	// + command line
50#define	S2M_SHUTDOWN		'C'
51
52
53//==================
54// note that there are some defs.qc that mirror to these numbers
55// also related to svc_strings[] in cl_parse
56//==================
57
58//
59// server to client
60//
61#define	svc_bad				0
62#define	svc_nop				1
63#define	svc_disconnect		2
64#define	svc_updatestat		3	// [byte] [byte]
65//define	svc_version			4	// [long] server version
66#define	svc_setview			5	// [short] entity number
67#define	svc_sound			6	// <see code>
68//define	svc_time			7	// [float] server time
69#define	svc_print			8	// [byte] id [string] null terminated string
70#define	svc_stufftext		9	// [string] stuffed into client's console buffer
71								// the string should be \n terminated
72#define	svc_setangle		10	// [angle3] set the view angle to this absolute value
73
74#define	svc_serverdata		11	// [long] protocol ...
75#define	svc_lightstyle		12	// [byte] [string]
76//define	svc_updatename		13	// [byte] [string]
77#define	svc_updatefrags		14	// [byte] [short]
78//define	svc_clientdata		15	// <shortbits + data>
79#define	svc_stopsound		16	// <see code>
80//define	svc_updatecolors	17	// [byte] [byte] [byte]
81//define	svc_particle		18	// [vec3] <variable>
82#define	svc_damage			19
83
84#define	svc_spawnstatic		20
85//	svc_spawnbinary		21
86#define	svc_spawnbaseline	22
87
88#define	svc_temp_entity		23	// variable
89#define	svc_setpause		24	// [byte] on / off
90//	svc_signonnum		25	// [byte]  used for the signon sequence
91
92#define	svc_centerprint		26	// [string] to put in center of the screen
93
94#define	svc_killedmonster	27
95#define	svc_foundsecret		28
96
97#define	svc_spawnstaticsound	29	// [coord3] [byte] samp [byte] vol [byte] aten
98
99#define	svc_intermission	30		// [vec3_t] origin [vec3_t] angle
100#define	svc_finale			31		// [string] text
101
102#define	svc_cdtrack			32		// [byte] track
103#define svc_sellscreen		33
104
105#define	svc_smallkick		34		// set client punchangle to 2
106#define	svc_bigkick			35		// set client punchangle to 4
107
108#define	svc_updateping		36		// [byte] [short]
109#define	svc_updateentertime	37		// [byte] [float]
110
111#define	svc_updatestatlong	38		// [byte] [long]
112
113#define	svc_muzzleflash		39		// [short] entity
114
115#define	svc_updateuserinfo	40		// [byte] slot [long] uid
116									// [string] userinfo
117
118#define	svc_download		41		// [short] size [size bytes]
119#define	svc_playerinfo		42		// variable
120#define	svc_nails			43		// [byte] num [48 bits] xyzpy 12 12 12 4 8
121#define	svc_chokecount		44		// [byte] packets choked
122#define	svc_modellist		45		// [strings]
123#define	svc_soundlist		46		// [strings]
124#define	svc_packetentities	47		// [...]
125#define	svc_deltapacketentities	48		// [...]
126#define svc_maxspeed		49		// maxspeed change, for prediction
127#define svc_entgravity		50		// gravity change, for prediction
128#define svc_setinfo			51		// setinfo on a client
129#define svc_serverinfo		52		// serverinfo
130#define svc_updatepl		53		// [byte] [byte]
131
132
133//==============================================
134
135//
136// client to server
137//
138#define	clc_bad			0
139#define	clc_nop 		1
140//define	clc_doublemove	2
141#define	clc_move		3		// [[usercmd_t]
142#define	clc_stringcmd	4		// [string] message
143#define	clc_delta		5		// [byte] sequence number, requests delta compression of message
144#define clc_tmove		6		// teleport request, spectator only
145#define clc_upload		7		// teleport request, spectator only
146
147
148//==============================================
149
150// playerinfo flags from server
151// playerinfo allways sends: playernum, flags, origin[] and framenumber
152
153#define	PF_MSEC			(1<<0)
154#define	PF_COMMAND		(1<<1)
155#define	PF_VELOCITY1	(1<<2)
156#define	PF_VELOCITY2	(1<<3)
157#define	PF_VELOCITY3	(1<<4)
158#define	PF_MODEL		(1<<5)
159#define	PF_SKINNUM		(1<<6)
160#define	PF_EFFECTS		(1<<7)
161#define	PF_WEAPONFRAME	(1<<8)		// only sent for view player
162#define	PF_DEAD			(1<<9)		// don't block movement any more
163#define	PF_GIB			(1<<10)		// offset the view height differently
164#define	PF_NOGRAV		(1<<11)		// don't apply gravity for prediction
165
166//==============================================
167
168// if the high bit of the client to server byte is set, the low bits are
169// client move cmd bits
170// ms and angle2 are allways sent, the others are optional
171#define	CM_ANGLE1 	(1<<0)
172#define	CM_ANGLE3 	(1<<1)
173#define	CM_FORWARD	(1<<2)
174#define	CM_SIDE		(1<<3)
175#define	CM_UP		(1<<4)
176#define	CM_BUTTONS	(1<<5)
177#define	CM_IMPULSE	(1<<6)
178#define	CM_ANGLE2 	(1<<7)
179
180//==============================================
181
182// the first 16 bits of a packetentities update holds 9 bits
183// of entity number and 7 bits of flags
184#define	U_ORIGIN1	(1<<9)
185#define	U_ORIGIN2	(1<<10)
186#define	U_ORIGIN3	(1<<11)
187#define	U_ANGLE2	(1<<12)
188#define	U_FRAME		(1<<13)
189#define	U_REMOVE	(1<<14)		// REMOVE this entity, don't add it
190#define	U_MOREBITS	(1<<15)
191
192// if MOREBITS is set, these additional flags are read in next
193#define	U_ANGLE1	(1<<0)
194#define	U_ANGLE3	(1<<1)
195#define	U_MODEL		(1<<2)
196#define	U_COLORMAP	(1<<3)
197#define	U_SKIN		(1<<4)
198#define	U_EFFECTS	(1<<5)
199#define	U_SOLID		(1<<6)		// the entity should be solid for prediction
200
201//==============================================
202
203// a sound with no channel is a local only sound
204// the sound field has bits 0-2: channel, 3-12: entity
205#define	SND_VOLUME		(1<<15)		// a byte
206#define	SND_ATTENUATION	(1<<14)		// a byte
207
208#define DEFAULT_SOUND_PACKET_VOLUME 255
209#define DEFAULT_SOUND_PACKET_ATTENUATION 1.0
210
211// svc_print messages have an id, so messages can be filtered
212#define	PRINT_LOW			0
213#define	PRINT_MEDIUM		1
214#define	PRINT_HIGH			2
215#define	PRINT_CHAT			3	// also go to chat buffer
216
217//
218// temp entity events
219//
220#define	TE_SPIKE			0
221#define	TE_SUPERSPIKE		1
222#define	TE_GUNSHOT			2
223#define	TE_EXPLOSION		3
224#define	TE_TAREXPLOSION		4
225#define	TE_LIGHTNING1		5
226#define	TE_LIGHTNING2		6
227#define	TE_WIZSPIKE			7
228#define	TE_KNIGHTSPIKE		8
229#define	TE_LIGHTNING3		9
230#define	TE_LAVASPLASH		10
231#define	TE_TELEPORT			11
232#define	TE_BLOOD			12
233#define	TE_LIGHTNINGBLOOD	13
234
235
236/*
237==========================================================
238
239  ELEMENTS COMMUNICATED ACROSS THE NET
240
241==========================================================
242*/
243
244#define	MAX_CLIENTS		32
245
246#define	UPDATE_BACKUP	64	// copies of entity_state_t to keep buffered
247							// must be power of two
248#define	UPDATE_MASK		(UPDATE_BACKUP-1)
249
250// entity_state_t is the information conveyed from the server
251// in an update message
252typedef struct
253{
254	int		number;			// edict index
255
256	int		flags;			// nolerp, etc
257	vec3_t	origin;
258	vec3_t	angles;
259	int		modelindex;
260	int		frame;
261	int		colormap;
262	int		skinnum;
263	int		effects;
264} entity_state_t;
265
266
267#define	MAX_PACKET_ENTITIES	64	// doesn't count nails
268typedef struct
269{
270	int		num_entities;
271	entity_state_t	entities[MAX_PACKET_ENTITIES];
272} packet_entities_t;
273
274typedef struct usercmd_s
275{
276	byte	msec;
277	vec3_t	angles;
278	short	forwardmove, sidemove, upmove;
279	byte	buttons;
280	byte	impulse;
281} usercmd_t;
282
283