Home | History | Annotate | Download | only in server
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 // server.h
     21 
     22 #define	QW_SERVER
     23 
     24 #define	MAX_MASTERS	8				// max recipients for heartbeat packets
     25 
     26 #define	MAX_SIGNON_BUFFERS	8
     27 
     28 typedef enum {
     29 	ss_dead,			// no map loaded
     30 	ss_loading,			// spawning level edicts
     31 	ss_active			// actively running
     32 } server_state_t;
     33 // some qc commands are only valid before the server has finished
     34 // initializing (precache commands, static sounds / objects, etc)
     35 
     36 typedef struct
     37 {
     38 	qboolean	active;				// false when server is going down
     39 	server_state_t	state;			// precache commands are only valid during load
     40 
     41 	double		time;
     42 
     43 	int			lastcheck;			// used by PF_checkclient
     44 	double		lastchecktime;		// for monster ai
     45 
     46 	qboolean	paused;				// are we paused?
     47 
     48 	//check player/eyes models for hacks
     49 	unsigned	model_player_checksum;
     50 	unsigned	eyes_player_checksum;
     51 
     52 	char		name[64];			// map name
     53 	char		modelname[MAX_QPATH];		// maps/<name>.bsp, for model_precache[0]
     54 	struct model_s 	*worldmodel;
     55 	char		*model_precache[MAX_MODELS];	// NULL terminated
     56 	char		*sound_precache[MAX_SOUNDS];	// NULL terminated
     57 	char		*lightstyles[MAX_LIGHTSTYLES];
     58 	struct model_s		*models[MAX_MODELS];
     59 
     60 	int			num_edicts;			// increases towards MAX_EDICTS
     61 	edict_t		*edicts;			// can NOT be array indexed, because
     62 									// edict_t is variable sized, but can
     63 									// be used to reference the world ent
     64 
     65 	byte		*pvs, *phs;			// fully expanded and decompressed
     66 
     67 	// added to every client's unreliable buffer each frame, then cleared
     68 	sizebuf_t	datagram;
     69 	byte		datagram_buf[MAX_DATAGRAM];
     70 
     71 	// added to every client's reliable buffer each frame, then cleared
     72 	sizebuf_t	reliable_datagram;
     73 	byte		reliable_datagram_buf[MAX_MSGLEN];
     74 
     75 	// the multicast buffer is used to send a message to a set of clients
     76 	sizebuf_t	multicast;
     77 	byte		multicast_buf[MAX_MSGLEN];
     78 
     79 	// the master buffer is used for building log packets
     80 	sizebuf_t	master;
     81 	byte		master_buf[MAX_DATAGRAM];
     82 
     83 	// the signon buffer will be sent to each client as they connect
     84 	// includes the entity baselines, the static entities, etc
     85 	// large levels will have >MAX_DATAGRAM sized signons, so
     86 	// multiple signon messages are kept
     87 	sizebuf_t	signon;
     88 	int			num_signon_buffers;
     89 	int			signon_buffer_size[MAX_SIGNON_BUFFERS];
     90 	byte		signon_buffers[MAX_SIGNON_BUFFERS][MAX_DATAGRAM];
     91 } server_t;
     92 
     93 
     94 #define	NUM_SPAWN_PARMS			16
     95 
     96 typedef enum
     97 {
     98 	cs_free,		// can be reused for a new connection
     99 	cs_zombie,		// client has been disconnected, but don't reuse
    100 					// connection for a couple seconds
    101 	cs_connected,	// has been assigned to a client_t, but not in game yet
    102 	cs_spawned		// client is fully in game
    103 } client_state_t;
    104 
    105 typedef struct
    106 {
    107 	// received from client
    108 
    109 	// reply
    110 	double				senttime;
    111 	float				ping_time;
    112 	packet_entities_t	entities;
    113 } client_frame_t;
    114 
    115 #define MAX_BACK_BUFFERS 4
    116 
    117 typedef struct client_s
    118 {
    119 	client_state_t	state;
    120 
    121 	int				spectator;			// non-interactive
    122 
    123 	qboolean		sendinfo;			// at end of frame, send info to all
    124 										// this prevents malicious multiple broadcasts
    125 	float			lastnametime;		// time of last name change
    126 	int				lastnamecount;		// time of last name change
    127 	unsigned		checksum;			// checksum for calcs
    128 	qboolean		drop;				// lose this guy next opportunity
    129 	int				lossage;			// loss percentage
    130 
    131 	int				userid;							// identifying number
    132 	char			userinfo[MAX_INFO_STRING];		// infostring
    133 
    134 	usercmd_t		lastcmd;			// for filling in big drops and partial predictions
    135 	double			localtime;			// of last message
    136 	int				oldbuttons;
    137 
    138 	float			maxspeed;			// localized maxspeed
    139 	float			entgravity;			// localized ent gravity
    140 
    141 	edict_t			*edict;				// EDICT_NUM(clientnum+1)
    142 	char			name[32];			// for printing to other people
    143 										// extracted from userinfo
    144 	int				messagelevel;		// for filtering printed messages
    145 
    146 	// the datagram is written to after every frame, but only cleared
    147 	// when it is sent out to the client.  overflow is tolerated.
    148 	sizebuf_t		datagram;
    149 	byte			datagram_buf[MAX_DATAGRAM];
    150 
    151 	// back buffers for client reliable data
    152 	sizebuf_t	backbuf;
    153 	int			num_backbuf;
    154 	int			backbuf_size[MAX_BACK_BUFFERS];
    155 	byte		backbuf_data[MAX_BACK_BUFFERS][MAX_MSGLEN];
    156 
    157 	double			connection_started;	// or time of disconnect for zombies
    158 	qboolean		send_message;		// set on frames a datagram arived on
    159 
    160 // spawn parms are carried from level to level
    161 	float			spawn_parms[NUM_SPAWN_PARMS];
    162 
    163 // client known data for deltas
    164 	int				old_frags;
    165 
    166 	int				stats[MAX_CL_STATS];
    167 
    168 
    169 	client_frame_t	frames[UPDATE_BACKUP];	// updates can be deltad from here
    170 
    171 	FILE			*download;			// file being downloaded
    172 	int				downloadsize;		// total bytes
    173 	int				downloadcount;		// bytes sent
    174 
    175 	int				spec_track;			// entnum of player tracking
    176 
    177 	double			whensaid[10];       // JACK: For floodprots
    178  	int			whensaidhead;       // Head value for floodprots
    179  	double			lockedtill;
    180 
    181 	qboolean		upgradewarn;		// did we warn him?
    182 
    183 	FILE			*upload;
    184 	char			uploadfn[MAX_QPATH];
    185 	netadr_t		snap_from;
    186 	qboolean		remote_snap;
    187 
    188 //===== NETWORK ============
    189 	int				chokecount;
    190 	int				delta_sequence;		// -1 = no compression
    191 	netchan_t		netchan;
    192 } client_t;
    193 
    194 // a client can leave the server in one of four ways:
    195 // dropping properly by quiting or disconnecting
    196 // timing out if no valid messages are received for timeout.value seconds
    197 // getting kicked off by the server operator
    198 // a program error, like an overflowed reliable buffer
    199 
    200 //=============================================================================
    201 
    202 
    203 #define	STATFRAMES	100
    204 typedef struct
    205 {
    206 	double	active;
    207 	double	idle;
    208 	int		count;
    209 	int		packets;
    210 
    211 	double	latched_active;
    212 	double	latched_idle;
    213 	int		latched_packets;
    214 } svstats_t;
    215 
    216 // MAX_CHALLENGES is made large to prevent a denial
    217 // of service attack that could cycle all of them
    218 // out before legitimate users connected
    219 #define	MAX_CHALLENGES	1024
    220 
    221 typedef struct
    222 {
    223 	netadr_t	adr;
    224 	int			challenge;
    225 	int			time;
    226 } challenge_t;
    227 
    228 typedef struct
    229 {
    230 	int			spawncount;			// number of servers spawned since start,
    231 									// used to check late spawns
    232 	client_t	clients[MAX_CLIENTS];
    233 	int			serverflags;		// episode completion information
    234 
    235 	double		last_heartbeat;
    236 	int			heartbeat_sequence;
    237 	svstats_t	stats;
    238 
    239 	char		info[MAX_SERVERINFO_STRING];
    240 
    241 	// log messages are used so that fraglog processes can get stats
    242 	int			logsequence;	// the message currently being filled
    243 	double		logtime;		// time of last swap
    244 	sizebuf_t	log[2];
    245 	byte		log_buf[2][MAX_DATAGRAM];
    246 
    247 	challenge_t	challenges[MAX_CHALLENGES];	// to prevent invalid IPs from connecting
    248 } server_static_t;
    249 
    250 //=============================================================================
    251 
    252 // edict->movetype values
    253 #define	MOVETYPE_NONE			0		// never moves
    254 #define	MOVETYPE_ANGLENOCLIP	1
    255 #define	MOVETYPE_ANGLECLIP		2
    256 #define	MOVETYPE_WALK			3		// gravity
    257 #define	MOVETYPE_STEP			4		// gravity, special edge handling
    258 #define	MOVETYPE_FLY			5
    259 #define	MOVETYPE_TOSS			6		// gravity
    260 #define	MOVETYPE_PUSH			7		// no clip to world, push and crush
    261 #define	MOVETYPE_NOCLIP			8
    262 #define	MOVETYPE_FLYMISSILE		9		// extra size to monsters
    263 #define	MOVETYPE_BOUNCE			10
    264 
    265 // edict->solid values
    266 #define	SOLID_NOT				0		// no interaction with other objects
    267 #define	SOLID_TRIGGER			1		// touch on edge, but not blocking
    268 #define	SOLID_BBOX				2		// touch on edge, block
    269 #define	SOLID_SLIDEBOX			3		// touch on edge, but not an onground
    270 #define	SOLID_BSP				4		// bsp clip, touch on edge, block
    271 
    272 // edict->deadflag values
    273 #define	DEAD_NO					0
    274 #define	DEAD_DYING				1
    275 #define	DEAD_DEAD				2
    276 
    277 #define	DAMAGE_NO				0
    278 #define	DAMAGE_YES				1
    279 #define	DAMAGE_AIM				2
    280 
    281 // edict->flags
    282 #define	FL_FLY					1
    283 #define	FL_SWIM					2
    284 #define	FL_GLIMPSE				4
    285 #define	FL_CLIENT				8
    286 #define	FL_INWATER				16
    287 #define	FL_MONSTER				32
    288 #define	FL_GODMODE				64
    289 #define	FL_NOTARGET				128
    290 #define	FL_ITEM					256
    291 #define	FL_ONGROUND				512
    292 #define	FL_PARTIALGROUND		1024	// not all corners are valid
    293 #define	FL_WATERJUMP			2048	// player jumping out of water
    294 
    295 // entity effects
    296 
    297 //define	EF_BRIGHTFIELD			1
    298 //define	EF_MUZZLEFLASH 			2
    299 #define	EF_BRIGHTLIGHT 			4
    300 #define	EF_DIMLIGHT 			8
    301 
    302 
    303 #define	SPAWNFLAG_NOT_EASY			256
    304 #define	SPAWNFLAG_NOT_MEDIUM		512
    305 #define	SPAWNFLAG_NOT_HARD			1024
    306 #define	SPAWNFLAG_NOT_DEATHMATCH	2048
    307 
    308 #define	MULTICAST_ALL			0
    309 #define	MULTICAST_PHS			1
    310 #define	MULTICAST_PVS			2
    311 
    312 #define	MULTICAST_ALL_R			3
    313 #define	MULTICAST_PHS_R			4
    314 #define	MULTICAST_PVS_R			5
    315 
    316 //============================================================================
    317 
    318 extern	cvar_t	sv_mintic, sv_maxtic;
    319 extern	cvar_t	sv_maxspeed;
    320 
    321 extern	netadr_t	master_adr[MAX_MASTERS];	// address of the master server
    322 
    323 extern	cvar_t	spawn;
    324 extern	cvar_t	teamplay;
    325 extern	cvar_t	deathmatch;
    326 extern	cvar_t	fraglimit;
    327 extern	cvar_t	timelimit;
    328 
    329 extern	server_static_t	svs;				// persistant server info
    330 extern	server_t		sv;					// local server
    331 
    332 extern	client_t	*host_client;
    333 
    334 extern	edict_t		*sv_player;
    335 
    336 extern	char		localmodels[MAX_MODELS][5];	// inline model names for precache
    337 
    338 extern	char		localinfo[MAX_LOCALINFO_STRING+1];
    339 
    340 extern	int			host_hunklevel;
    341 extern	FILE		*sv_logfile;
    342 extern	FILE		*sv_fraglogfile;
    343 
    344 //===========================================================
    345 
    346 //
    347 // sv_main.c
    348 //
    349 void SV_Shutdown (void);
    350 void SV_Frame (float time);
    351 void SV_FinalMessage (char *message);
    352 void SV_DropClient (client_t *drop);
    353 
    354 int SV_CalcPing (client_t *cl);
    355 void SV_FullClientUpdate (client_t *client, sizebuf_t *buf);
    356 
    357 int SV_ModelIndex (char *name);
    358 
    359 qboolean SV_CheckBottom (edict_t *ent);
    360 qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink);
    361 
    362 void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg);
    363 
    364 void SV_MoveToGoal (void);
    365 
    366 void SV_SaveSpawnparms (void);
    367 
    368 void SV_Physics_Client (edict_t	*ent);
    369 
    370 void SV_ExecuteUserCommand (char *s);
    371 void SV_InitOperatorCommands (void);
    372 
    373 void SV_SendServerinfo (client_t *client);
    374 void SV_ExtractFromUserinfo (client_t *cl);
    375 
    376 
    377 void Master_Heartbeat (void);
    378 void Master_Packet (void);
    379 
    380 //
    381 // sv_init.c
    382 //
    383 void SV_SpawnServer (char *server);
    384 void SV_FlushSignon (void);
    385 
    386 
    387 //
    388 // sv_phys.c
    389 //
    390 void SV_ProgStartFrame (void);
    391 void SV_Physics (void);
    392 void SV_CheckVelocity (edict_t *ent);
    393 void SV_AddGravity (edict_t *ent, float scale);
    394 qboolean SV_RunThink (edict_t *ent);
    395 void SV_Physics_Toss (edict_t *ent);
    396 void SV_RunNewmis (void);
    397 void SV_Impact (edict_t *e1, edict_t *e2);
    398 void SV_SetMoveVars(void);
    399 
    400 //
    401 // sv_send.c
    402 //
    403 void SV_SendClientMessages (void);
    404 
    405 void SV_Multicast (vec3_t origin, int to);
    406 void SV_StartSound (edict_t *entity, int channel, char *sample, int volume,
    407     float attenuation);
    408 void SV_ClientPrintf (client_t *cl, int level, char *fmt, ...);
    409 void SV_BroadcastPrintf (int level, char *fmt, ...);
    410 void SV_BroadcastCommand (char *fmt, ...);
    411 void SV_SendMessagesToAll (void);
    412 void SV_FindModelNumbers (void);
    413 
    414 //
    415 // sv_user.c
    416 //
    417 void SV_ExecuteClientMessage (client_t *cl);
    418 void SV_UserInit (void);
    419 void SV_TogglePause (const char *msg);
    420 
    421 
    422 //
    423 // svonly.c
    424 //
    425 typedef enum {RD_NONE, RD_CLIENT, RD_PACKET} redirect_t;
    426 void SV_BeginRedirect (redirect_t rd);
    427 void SV_EndRedirect (void);
    428 
    429 //
    430 // sv_ccmds.c
    431 //
    432 void SV_Status_f (void);
    433 
    434 //
    435 // sv_ents.c
    436 //
    437 void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg);
    438 
    439 //
    440 // sv_nchan.c
    441 //
    442 
    443 void ClientReliableCheckBlock(client_t *cl, int maxsize);
    444 void ClientReliable_FinishWrite(client_t *cl);
    445 void ClientReliableWrite_Begin(client_t *cl, int c, int maxsize);
    446 void ClientReliableWrite_Angle(client_t *cl, float f);
    447 void ClientReliableWrite_Angle16(client_t *cl, float f);
    448 void ClientReliableWrite_Byte(client_t *cl, int c);
    449 void ClientReliableWrite_Char(client_t *cl, int c);
    450 void ClientReliableWrite_Float(client_t *cl, float f);
    451 void ClientReliableWrite_Coord(client_t *cl, float f);
    452 void ClientReliableWrite_Long(client_t *cl, int c);
    453 void ClientReliableWrite_Short(client_t *cl, int c);
    454 void ClientReliableWrite_String(client_t *cl, char *s);
    455 void ClientReliableWrite_SZ(client_t *cl, void *data, int len);
    456 
    457