Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

server.h (9867B)


      1 /*
      2 Copyright (C) 1997-2001 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 
     23 //define	PARANOID			// speed sapping error checking
     24 
     25 #include "../qcommon/qcommon.h"
     26 #include "../game/game.h"
     27 
     28 //=============================================================================
     29 
     30 #define	MAX_MASTERS	8				// max recipients for heartbeat packets
     31 
     32 typedef enum {
     33 	ss_dead,			// no map loaded
     34 	ss_loading,			// spawning level edicts
     35 	ss_game,			// actively running
     36 	ss_cinematic,
     37 	ss_demo,
     38 	ss_pic
     39 } server_state_t;
     40 // some qc commands are only valid before the server has finished
     41 // initializing (precache commands, static sounds / objects, etc)
     42 
     43 typedef struct
     44 {
     45 	server_state_t	state;			// precache commands are only valid during load
     46 
     47 	qboolean	attractloop;		// running cinematics and demos for the local system only
     48 	qboolean	loadgame;			// client begins should reuse existing entity
     49 
     50 	unsigned	time;				// always sv.framenum * 100 msec
     51 	int			framenum;
     52 
     53 	char		name[MAX_QPATH];			// map name, or cinematic name
     54 	struct cmodel_s		*models[MAX_MODELS];
     55 
     56 	char		configstrings[MAX_CONFIGSTRINGS][MAX_QPATH];
     57 	entity_state_t	baselines[MAX_EDICTS];
     58 
     59 	// the multicast buffer is used to send a message to a set of clients
     60 	// it is only used to marshall data until SV_Multicast is called
     61 	sizebuf_t	multicast;
     62 	byte		multicast_buf[MAX_MSGLEN];
     63 
     64 	// demo server information
     65 	FILE		*demofile;
     66 	qboolean	timedemo;		// don't time sync
     67 } server_t;
     68 
     69 #define EDICT_NUM(n) ((edict_t *)((byte *)ge->edicts + ge->edict_size*(n)))
     70 #define NUM_FOR_EDICT(e) ( ((byte *)(e)-(byte *)ge->edicts ) / ge->edict_size)
     71 
     72 
     73 typedef enum
     74 {
     75 	cs_free,		// can be reused for a new connection
     76 	cs_zombie,		// client has been disconnected, but don't reuse
     77 					// connection for a couple seconds
     78 	cs_connected,	// has been assigned to a client_t, but not in game yet
     79 	cs_spawned		// client is fully in game
     80 } client_state_t;
     81 
     82 typedef struct
     83 {
     84 	int					areabytes;
     85 	byte				areabits[MAX_MAP_AREAS/8];		// portalarea visibility bits
     86 	player_state_t		ps;
     87 	int					num_entities;
     88 	int					first_entity;		// into the circular sv_packet_entities[]
     89 	int					senttime;			// for ping calculations
     90 } client_frame_t;
     91 
     92 #define	LATENCY_COUNTS	16
     93 #define	RATE_MESSAGES	10
     94 
     95 typedef struct client_s
     96 {
     97 	client_state_t	state;
     98 
     99 	char			userinfo[MAX_INFO_STRING];		// name, etc
    100 
    101 	int				lastframe;			// for delta compression
    102 	usercmd_t		lastcmd;			// for filling in big drops
    103 
    104 	int				commandMsec;		// every seconds this is reset, if user
    105 										// commands exhaust it, assume time cheating
    106 
    107 	int				frame_latency[LATENCY_COUNTS];
    108 	int				ping;
    109 
    110 	int				message_size[RATE_MESSAGES];	// used to rate drop packets
    111 	int				rate;
    112 	int				surpressCount;		// number of messages rate supressed
    113 
    114 	edict_t			*edict;				// EDICT_NUM(clientnum+1)
    115 	char			name[32];			// extracted from userinfo, high bits masked
    116 	int				messagelevel;		// for filtering printed messages
    117 
    118 	// The datagram is written to by sound calls, prints, temp ents, etc.
    119 	// It can be harmlessly overflowed.
    120 	sizebuf_t		datagram;
    121 	byte			datagram_buf[MAX_MSGLEN];
    122 
    123 	client_frame_t	frames[UPDATE_BACKUP];	// updates can be delta'd from here
    124 
    125 	byte			*download;			// file being downloaded
    126 	int				downloadsize;		// total bytes (can't use EOF because of paks)
    127 	int				downloadcount;		// bytes sent
    128 
    129 	int				lastmessage;		// sv.framenum when packet was last received
    130 	int				lastconnect;
    131 
    132 	int				challenge;			// challenge of this user, randomly generated
    133 
    134 	netchan_t		netchan;
    135 } client_t;
    136 
    137 // a client can leave the server in one of four ways:
    138 // dropping properly by quiting or disconnecting
    139 // timing out if no valid messages are received for timeout.value seconds
    140 // getting kicked off by the server operator
    141 // a program error, like an overflowed reliable buffer
    142 
    143 //=============================================================================
    144 
    145 // MAX_CHALLENGES is made large to prevent a denial
    146 // of service attack that could cycle all of them
    147 // out before legitimate users connected
    148 #define	MAX_CHALLENGES	1024
    149 
    150 typedef struct
    151 {
    152 	netadr_t	adr;
    153 	int			challenge;
    154 	int			time;
    155 } challenge_t;
    156 
    157 
    158 typedef struct
    159 {
    160 	qboolean	initialized;				// sv_init has completed
    161 	int			realtime;					// always increasing, no clamping, etc
    162 
    163 	char		mapcmd[MAX_TOKEN_CHARS];	// ie: *intro.cin+base 
    164 
    165 	int			spawncount;					// incremented each server start
    166 											// used to check late spawns
    167 
    168 	client_t	*clients;					// [maxclients->value];
    169 	int			num_client_entities;		// maxclients->value*UPDATE_BACKUP*MAX_PACKET_ENTITIES
    170 	int			next_client_entities;		// next client_entity to use
    171 	entity_state_t	*client_entities;		// [num_client_entities]
    172 
    173 	int			last_heartbeat;
    174 
    175 	challenge_t	challenges[MAX_CHALLENGES];	// to prevent invalid IPs from connecting
    176 
    177 	// serverrecord values
    178 	FILE		*demofile;
    179 	sizebuf_t	demo_multicast;
    180 	byte		demo_multicast_buf[MAX_MSGLEN];
    181 } server_static_t;
    182 
    183 //=============================================================================
    184 
    185 extern	netadr_t	net_from;
    186 extern	sizebuf_t	net_message;
    187 
    188 extern	netadr_t	master_adr[MAX_MASTERS];	// address of the master server
    189 
    190 extern	server_static_t	svs;				// persistant server info
    191 extern	server_t		sv;					// local server
    192 
    193 extern	cvar_t		*sv_paused;
    194 extern	cvar_t		*maxclients;
    195 extern	cvar_t		*sv_noreload;			// don't reload level state when reentering
    196 extern	cvar_t		*sv_airaccelerate;		// don't reload level state when reentering
    197 											// development tool
    198 extern	cvar_t		*sv_enforcetime;
    199 
    200 extern	client_t	*sv_client;
    201 extern	edict_t		*sv_player;
    202 
    203 //===========================================================
    204 
    205 //
    206 // sv_main.c
    207 //
    208 void SV_FinalMessage (char *message, qboolean reconnect);
    209 void SV_DropClient (client_t *drop);
    210 
    211 int SV_ModelIndex (char *name);
    212 int SV_SoundIndex (char *name);
    213 int SV_ImageIndex (char *name);
    214 
    215 void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg);
    216 
    217 void SV_ExecuteUserCommand (char *s);
    218 void SV_InitOperatorCommands (void);
    219 
    220 void SV_SendServerinfo (client_t *client);
    221 void SV_UserinfoChanged (client_t *cl);
    222 
    223 
    224 void Master_Heartbeat (void);
    225 void Master_Packet (void);
    226 
    227 //
    228 // sv_init.c
    229 //
    230 void SV_InitGame (void);
    231 void SV_Map (qboolean attractloop, char *levelstring, qboolean loadgame);
    232 
    233 
    234 //
    235 // sv_phys.c
    236 //
    237 void SV_PrepWorldFrame (void);
    238 
    239 //
    240 // sv_send.c
    241 //
    242 typedef enum {RD_NONE, RD_CLIENT, RD_PACKET} redirect_t;
    243 #define	SV_OUTPUTBUF_LENGTH	(MAX_MSGLEN - 16)
    244 
    245 extern	char	sv_outputbuf[SV_OUTPUTBUF_LENGTH];
    246 
    247 void SV_FlushRedirect (int sv_redirected, char *outputbuf);
    248 
    249 void SV_DemoCompleted (void);
    250 void SV_SendClientMessages (void);
    251 
    252 void SV_Multicast (vec3_t origin, multicast_t to);
    253 void SV_StartSound (vec3_t origin, edict_t *entity, int channel,
    254 					int soundindex, float volume,
    255 					float attenuation, float timeofs);
    256 void SV_ClientPrintf (client_t *cl, int level, char *fmt, ...);
    257 void SV_BroadcastPrintf (int level, char *fmt, ...);
    258 void SV_BroadcastCommand (char *fmt, ...);
    259 
    260 //
    261 // sv_user.c
    262 //
    263 void SV_Nextserver (void);
    264 void SV_ExecuteClientMessage (client_t *cl);
    265 
    266 //
    267 // sv_ccmds.c
    268 //
    269 void SV_ReadLevelFile (void);
    270 void SV_Status_f (void);
    271 
    272 //
    273 // sv_ents.c
    274 //
    275 void SV_WriteFrameToClient (client_t *client, sizebuf_t *msg);
    276 void SV_RecordDemoMessage (void);
    277 void SV_BuildClientFrame (client_t *client);
    278 
    279 
    280 void SV_Error (char *error, ...);
    281 
    282 //
    283 // sv_game.c
    284 //
    285 extern	game_export_t	*ge;
    286 
    287 void SV_InitGameProgs (void);
    288 void SV_ShutdownGameProgs (void);
    289 void SV_InitEdict (edict_t *e);
    290 
    291 
    292 
    293 //============================================================
    294 
    295 //
    296 // high level object sorting to reduce interaction tests
    297 //
    298 
    299 void SV_ClearWorld (void);
    300 // called after the world model has been loaded, before linking any entities
    301 
    302 void SV_UnlinkEdict (edict_t *ent);
    303 // call before removing an entity, and before trying to move one,
    304 // so it doesn't clip against itself
    305 
    306 void SV_LinkEdict (edict_t *ent);
    307 // Needs to be called any time an entity changes origin, mins, maxs,
    308 // or solid.  Automatically unlinks if needed.
    309 // sets ent->v.absmin and ent->v.absmax
    310 // sets ent->leafnums[] for pvs determination even if the entity
    311 // is not solid
    312 
    313 int SV_AreaEdicts (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype);
    314 // fills in a table of edict pointers with edicts that have bounding boxes
    315 // that intersect the given area.  It is possible for a non-axial bmodel
    316 // to be returned that doesn't actually intersect the area on an exact
    317 // test.
    318 // returns the number of pointers filled in
    319 // ??? does this always return the world?
    320 
    321 //===================================================================
    322 
    323 //
    324 // functions that interact with everything apropriate
    325 //
    326 int SV_PointContents (vec3_t p);
    327 // returns the CONTENTS_* value from the world at the given point.
    328 // Quake 2 extends this to also check entities, to allow moving liquids
    329 
    330 
    331 trace_t SV_Trace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passedict, int contentmask);
    332 // mins and maxs are relative
    333 
    334 // if the entire move stays in a solid volume, trace.allsolid will be set,
    335 // trace.startsolid will be set, and trace.fraction will be 0
    336 
    337 // if the starting point is in a solid, it will be allowed to move out
    338 // to an open area
    339 
    340 // passedict is explicitly excluded from clipping checks (normally NULL)
    341