Home | History | Annotate | Download | only in WinQuake
      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 typedef struct
     23 {
     24 	int			maxclients;
     25 	int			maxclientslimit;
     26 	struct client_s	*clients;		// [maxclients]
     27 	int			serverflags;		// episode completion information
     28 	qboolean	changelevel_issued;	// cleared when at SV_SpawnServer
     29 } server_static_t;
     30 
     31 //=============================================================================
     32 
     33 typedef enum {ss_loading, ss_active, server_state_t_max = 1 << 30} server_state_t;
     34 
     35 typedef struct
     36 {
     37 	qboolean	active;				// false if only a net client
     38 
     39 	qboolean	paused;
     40 	qboolean	loadgame;			// handle connections specially
     41 
     42 	double		time;
     43 
     44 	int			lastcheck;			// used by PF_checkclient
     45 	double		lastchecktime;
     46 
     47 	char		name[64];			// map name
     48 #ifdef QUAKE2
     49 	char		startspot[64];
     50 #endif
     51 	char		modelname[64];		// maps/<name>.bsp, for model_precache[0]
     52 	struct model_s 	*worldmodel;
     53 	char		*model_precache[MAX_MODELS];	// NULL terminated
     54 	struct model_s	*models[MAX_MODELS];
     55 	char		*sound_precache[MAX_SOUNDS];	// NULL terminated
     56 	char		*lightstyles[MAX_LIGHTSTYLES];
     57 	int			num_edicts;
     58 	int			max_edicts;
     59 	edict_t		*edicts;			// can NOT be array indexed, because
     60 									// edict_t is variable sized, but can
     61 									// be used to reference the world ent
     62 	server_state_t	state;			// some actions are only valid during load
     63 
     64 	sizebuf_t	datagram;
     65 	byte		datagram_buf[MAX_DATAGRAM];
     66 
     67 	sizebuf_t	reliable_datagram;	// copied to all clients at end of frame
     68 	byte		reliable_datagram_buf[MAX_DATAGRAM];
     69 
     70 	sizebuf_t	signon;
     71 	byte		signon_buf[8192];
     72 } server_t;
     73 
     74 
     75 #define	NUM_PING_TIMES		16
     76 #define	NUM_SPAWN_PARMS		16
     77 
     78 typedef struct client_s
     79 {
     80 	qboolean		active;				// false = client is free
     81 	qboolean		spawned;			// false = don't send datagrams
     82 	qboolean		dropasap;			// has been told to go to another level
     83 	qboolean		privileged;			// can execute any host command
     84 	qboolean		sendsignon;			// only valid before spawned
     85 
     86 	double			last_message;		// reliable messages must be sent
     87 										// periodically
     88 
     89 	struct qsocket_s *netconnection;	// communications handle
     90 
     91 	usercmd_t		cmd;				// movement
     92 	vec3_t			wishdir;			// intended motion calced from cmd
     93 
     94 	sizebuf_t		message;			// can be added to at any time,
     95 										// copied and clear once per frame
     96 	byte			msgbuf[MAX_MSGLEN];
     97 	edict_t			*edict;				// EDICT_NUM(clientnum+1)
     98 	char			name[32];			// for printing to other people
     99 	int				colors;
    100 
    101 	float			ping_times[NUM_PING_TIMES];
    102 	int				num_pings;			// ping_times[num_pings%NUM_PING_TIMES]
    103 
    104 // spawn parms are carried from level to level
    105 	float			spawn_parms[NUM_SPAWN_PARMS];
    106 
    107 // client known data for deltas
    108 	int				old_frags;
    109 } client_t;
    110 
    111 
    112 //=============================================================================
    113 
    114 // edict->movetype values
    115 #define	MOVETYPE_NONE			0		// never moves
    116 #define	MOVETYPE_ANGLENOCLIP	1
    117 #define	MOVETYPE_ANGLECLIP		2
    118 #define	MOVETYPE_WALK			3		// gravity
    119 #define	MOVETYPE_STEP			4		// gravity, special edge handling
    120 #define	MOVETYPE_FLY			5
    121 #define	MOVETYPE_TOSS			6		// gravity
    122 #define	MOVETYPE_PUSH			7		// no clip to world, push and crush
    123 #define	MOVETYPE_NOCLIP			8
    124 #define	MOVETYPE_FLYMISSILE		9		// extra size to monsters
    125 #define	MOVETYPE_BOUNCE			10
    126 #ifdef QUAKE2
    127 #define MOVETYPE_BOUNCEMISSILE	11		// bounce w/o gravity
    128 #define MOVETYPE_FOLLOW			12		// track movement of aiment
    129 #endif
    130 
    131 // edict->solid values
    132 #define	SOLID_NOT				0		// no interaction with other objects
    133 #define	SOLID_TRIGGER			1		// touch on edge, but not blocking
    134 #define	SOLID_BBOX				2		// touch on edge, block
    135 #define	SOLID_SLIDEBOX			3		// touch on edge, but not an onground
    136 #define	SOLID_BSP				4		// bsp clip, touch on edge, block
    137 
    138 // edict->deadflag values
    139 #define	DEAD_NO					0
    140 #define	DEAD_DYING				1
    141 #define	DEAD_DEAD				2
    142 
    143 #define	DAMAGE_NO				0
    144 #define	DAMAGE_YES				1
    145 #define	DAMAGE_AIM				2
    146 
    147 // edict->flags
    148 #define	FL_FLY					1
    149 #define	FL_SWIM					2
    150 //#define	FL_GLIMPSE				4
    151 #define	FL_CONVEYOR				4
    152 #define	FL_CLIENT				8
    153 #define	FL_INWATER				16
    154 #define	FL_MONSTER				32
    155 #define	FL_GODMODE				64
    156 #define	FL_NOTARGET				128
    157 #define	FL_ITEM					256
    158 #define	FL_ONGROUND				512
    159 #define	FL_PARTIALGROUND		1024	// not all corners are valid
    160 #define	FL_WATERJUMP			2048	// player jumping out of water
    161 #define	FL_JUMPRELEASED			4096	// for jump debouncing
    162 #ifdef QUAKE2
    163 #define FL_FLASHLIGHT			8192
    164 #define FL_ARCHIVE_OVERRIDE		1048576
    165 #endif
    166 
    167 // entity effects
    168 
    169 #define	EF_BRIGHTFIELD			1
    170 #define	EF_MUZZLEFLASH 			2
    171 #define	EF_BRIGHTLIGHT 			4
    172 #define	EF_DIMLIGHT 			8
    173 #ifdef QUAKE2
    174 #define EF_DARKLIGHT			16
    175 #define EF_DARKFIELD			32
    176 #define EF_LIGHT				64
    177 #define EF_NODRAW				128
    178 #endif
    179 
    180 #define	SPAWNFLAG_NOT_EASY			256
    181 #define	SPAWNFLAG_NOT_MEDIUM		512
    182 #define	SPAWNFLAG_NOT_HARD			1024
    183 #define	SPAWNFLAG_NOT_DEATHMATCH	2048
    184 
    185 #ifdef QUAKE2
    186 // server flags
    187 #define	SFL_EPISODE_1		1
    188 #define	SFL_EPISODE_2		2
    189 #define	SFL_EPISODE_3		4
    190 #define	SFL_EPISODE_4		8
    191 #define	SFL_NEW_UNIT		16
    192 #define	SFL_NEW_EPISODE		32
    193 #define	SFL_CROSS_TRIGGERS	65280
    194 #endif
    195 
    196 //============================================================================
    197 
    198 extern	cvar_t	teamplay;
    199 extern	cvar_t	skill;
    200 extern	cvar_t	deathmatch;
    201 extern	cvar_t	coop;
    202 extern	cvar_t	fraglimit;
    203 extern	cvar_t	timelimit;
    204 
    205 extern	server_static_t	svs;				// persistant server info
    206 extern	server_t		sv;					// local server
    207 
    208 extern	client_t	*host_client;
    209 
    210 extern	jmp_buf 	host_abortserver;
    211 
    212 extern	double		host_time;
    213 
    214 extern	edict_t		*sv_player;
    215 
    216 //===========================================================
    217 
    218 void SV_Init (void);
    219 
    220 void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count);
    221 void SV_StartSound (edict_t *entity, int channel, const char *sample, int volume,
    222     float attenuation);
    223 
    224 void SV_DropClient (qboolean crash);
    225 
    226 void SV_SendClientMessages (void);
    227 void SV_ClearDatagram (void);
    228 
    229 int SV_ModelIndex (const char *name);
    230 
    231 void SV_SetIdealPitch (void);
    232 
    233 void SV_AddUpdates (void);
    234 
    235 void SV_ClientThink (void);
    236 void SV_AddClientToServer (struct qsocket_s	*ret);
    237 
    238 void SV_ClientPrintf (const char *fmt, ...);
    239 void SV_BroadcastPrintf (const char *fmt, ...);
    240 
    241 void SV_Physics (void);
    242 
    243 qboolean SV_CheckBottom (edict_t *ent);
    244 qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink);
    245 
    246 void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg);
    247 
    248 void SV_MoveToGoal (void);
    249 
    250 void SV_CheckForNewClients (void);
    251 void SV_RunClients (void);
    252 void SV_SaveSpawnparms ();
    253 #ifdef QUAKE2
    254 void SV_SpawnServer (char *server, char *startspot);
    255 #else
    256 void SV_SpawnServer (char *server);
    257 #endif
    258