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 #ifndef SERVER_H 23 #define SERVER_H 24 25 typedef struct server_static_s 26 { 27 /// number of svs.clients slots (updated by maxplayers command) 28 int maxclients, maxclients_next; 29 /// client slots 30 struct client_s *clients; 31 /// episode completion information 32 int serverflags; 33 /// cleared when at SV_SpawnServer 34 qboolean changelevel_issued; 35 /// server infostring 36 char serverinfo[MAX_SERVERINFO_STRING]; 37 // performance data 38 float perf_cpuload; 39 float perf_lost; 40 float perf_offset_avg; 41 float perf_offset_max; 42 float perf_offset_sdev; 43 // temporary performance data accumulators 44 float perf_acc_realtime; 45 float perf_acc_sleeptime; 46 float perf_acc_lost; 47 float perf_acc_offset; 48 float perf_acc_offset_squared; 49 float perf_acc_offset_max; 50 int perf_acc_offset_samples; 51 52 // csqc stuff 53 unsigned char *csqc_progdata; 54 size_t csqc_progsize_deflated; 55 unsigned char *csqc_progdata_deflated; 56 57 } server_static_t; 58 59 //============================================================================= 60 61 typedef enum server_state_e {ss_loading, ss_active} server_state_t; 62 63 #define MAX_CONNECTFLOODADDRESSES 16 64 typedef struct server_connectfloodaddress_s 65 { 66 double lasttime; 67 lhnetaddress_t address; 68 } 69 server_connectfloodaddress_t; 70 71 typedef struct server_s 72 { 73 /// false if only a net client 74 qboolean active; 75 76 qboolean paused; 77 double pausedstart; 78 /// handle connections specially 79 qboolean loadgame; 80 81 /// one of the PROTOCOL_ values 82 protocolversion_t protocol; 83 84 double time; 85 86 double frametime; 87 88 // used by PF_checkclient 89 int lastcheck; 90 double lastchecktime; 91 92 // crc of clientside progs at time of level start 93 int csqc_progcrc; // -1 = no progs 94 int csqc_progsize; // -1 = no progs 95 char csqc_progname[MAX_QPATH]; // copied from csqc_progname at level start 96 97 /// collision culling data 98 world_t world; 99 100 /// map name 101 char name[64]; 102 /// maps/<name>.bsp, for model_precache[0] 103 char modelname[64]; 104 struct model_s *worldmodel; 105 // NULL terminated 106 // LordHavoc: precaches are now MAX_QPATH rather than a pointer 107 // updated by SV_ModelIndex 108 char model_precache[MAX_MODELS][MAX_QPATH]; 109 struct model_s *models[MAX_MODELS]; 110 // NULL terminated 111 // LordHavoc: precaches are now MAX_QPATH rather than a pointer 112 // updated by SV_SoundIndex 113 char sound_precache[MAX_SOUNDS][MAX_QPATH]; 114 char lightstyles[MAX_LIGHTSTYLES][64]; 115 /// some actions are only valid during load 116 server_state_t state; 117 118 sizebuf_t datagram; 119 unsigned char datagram_buf[NET_MAXMESSAGE]; 120 121 // copied to all clients at end of frame 122 sizebuf_t reliable_datagram; 123 unsigned char reliable_datagram_buf[NET_MAXMESSAGE]; 124 125 sizebuf_t signon; 126 /// LordHavoc: increased signon message buffer from 8192 127 unsigned char signon_buf[NET_MAXMESSAGE]; 128 129 /// connection flood blocking 130 /// note this is in server_t rather than server_static_t so that it is 131 /// reset on each map command (such as New Game in singleplayer) 132 server_connectfloodaddress_t connectfloodaddresses[MAX_CONNECTFLOODADDRESSES]; 133 134 #define SV_MAX_PARTICLEEFFECTNAME 256 135 qboolean particleeffectnamesloaded; 136 char particleeffectname[SV_MAX_PARTICLEEFFECTNAME][MAX_QPATH]; 137 138 int writeentitiestoclient_stats_culled_pvs; 139 int writeentitiestoclient_stats_culled_trace; 140 int writeentitiestoclient_stats_visibleentities; 141 int writeentitiestoclient_stats_totalentities; 142 int writeentitiestoclient_cliententitynumber; 143 int writeentitiestoclient_clientnumber; 144 sizebuf_t *writeentitiestoclient_msg; 145 vec3_t writeentitiestoclient_testeye; 146 int writeentitiestoclient_pvsbytes; 147 unsigned char writeentitiestoclient_pvs[MAX_MAP_LEAFS/8]; 148 entity_state_t writeentitiestoclient_sendstates[MAX_EDICTS]; 149 unsigned short writeentitiestoclient_csqcsendstates[MAX_EDICTS]; 150 151 int numsendentities; 152 entity_state_t sendentities[MAX_EDICTS]; 153 entity_state_t *sendentitiesindex[MAX_EDICTS]; 154 155 int sententitiesmark; 156 int sententities[MAX_EDICTS]; 157 int sententitiesconsideration[MAX_EDICTS]; 158 159 /// legacy support for self.Version based csqc entity networking 160 unsigned char csqcentityversion[MAX_EDICTS]; // legacy 161 } server_t; 162 163 #define NUM_CSQCENTITIES_PER_FRAME 1024 164 typedef struct csqcentityframedb_s 165 { 166 int framenum; 167 int num; 168 unsigned short entno[NUM_CSQCENTITIES_PER_FRAME]; 169 int sendflags[NUM_CSQCENTITIES_PER_FRAME]; 170 } csqcentityframedb_t; 171 172 // if defined this does ping smoothing, otherwise it does not 173 //#define NUM_PING_TIMES 16 174 175 #define NUM_SPAWN_PARMS 16 176 177 typedef struct client_s 178 { 179 /// false = empty client slot 180 qboolean active; 181 /// false = don't do ClientDisconnect on drop 182 qboolean clientconnectcalled; 183 /// false = don't send datagrams 184 qboolean spawned; 185 /// 1 = send svc_serverinfo and advance to 2, 2 doesn't send, then advances to 0 (allowing unlimited sending) when prespawn is received 186 int sendsignon; 187 188 /// requested rate in bytes per second 189 int rate; 190 191 /// realtime this client connected 192 double connecttime; 193 194 /// keepalive messages must be sent periodically during signon 195 double keepalivetime; 196 197 /// communications handle 198 netconn_t *netconnection; 199 200 int movesequence; 201 /// movement 202 usercmd_t cmd; 203 /// intended motion calced from cmd 204 vec3_t wishdir; 205 206 /// PRVM_EDICT_NUM(clientnum+1) 207 prvm_edict_t *edict; 208 209 #ifdef NUM_PING_TIMES 210 float ping_times[NUM_PING_TIMES]; 211 /// ping_times[num_pings%NUM_PING_TIMES] 212 int num_pings; 213 #endif 214 /// LordHavoc: can be used for prediction or whatever... 215 float ping; 216 217 /// this is used by sv_clmovement_minping code 218 double clmovement_disabletimeout; 219 /// this is used by sv_clmovement_inputtimeout code 220 float clmovement_inputtimeout; 221 222 /// spawn parms are carried from level to level 223 float spawn_parms[NUM_SPAWN_PARMS]; 224 225 // properties that are sent across the network only when changed 226 char name[64], old_name[64]; 227 int colors, old_colors; 228 int frags, old_frags; 229 char playermodel[MAX_QPATH], old_model[MAX_QPATH]; 230 char playerskin[MAX_QPATH], old_skin[MAX_QPATH]; 231 232 /// netaddress support 233 char netaddress[MAX_QPATH]; 234 235 /// visibility state 236 float visibletime[MAX_EDICTS]; 237 238 // scope is whether an entity is currently being networked to this client 239 // sendflags is what properties have changed on the entity since the last 240 // update that was sent 241 int csqcnumedicts; 242 unsigned char csqcentityscope[MAX_EDICTS]; 243 unsigned int csqcentitysendflags[MAX_EDICTS]; 244 245 #define NUM_CSQCENTITYDB_FRAMES 64 246 unsigned char csqcentityglobalhistory[MAX_EDICTS]; // set to 1 if the entity was ever csqc networked to the client, and never reset back to 0 247 csqcentityframedb_t csqcentityframehistory[NUM_CSQCENTITYDB_FRAMES]; 248 int csqcentityframehistory_next; 249 250 /// prevent animated names 251 float nametime; 252 253 /// latest received clc_ackframe (used to detect packet loss) 254 int latestframenum; 255 256 /// cache weaponmodel name lookups 257 char weaponmodel[MAX_QPATH]; 258 int weaponmodelindex; 259 260 /// clientcamera (entity to use as camera) 261 int clientcamera; 262 263 entityframe_database_t *entitydatabase; 264 entityframe4_database_t *entitydatabase4; 265 entityframe5_database_t *entitydatabase5; 266 267 // delta compression of stats 268 unsigned char statsdeltabits[(MAX_CL_STATS+7)/8]; 269 int stats[MAX_CL_STATS]; 270 271 unsigned char unreliablemsg_data[NET_MAXMESSAGE]; 272 sizebuf_t unreliablemsg; 273 int unreliablemsg_splitpoints; 274 int unreliablemsg_splitpoint[NET_MAXMESSAGE/16]; 275 276 // information on an active download if any 277 qfile_t *download_file; 278 int download_expectedposition; ///< next position the client should ack 279 qboolean download_started; 280 char download_name[MAX_QPATH]; 281 qboolean download_deflate; 282 283 // fixangle data 284 qboolean fixangle_angles_set; 285 vec3_t fixangle_angles; 286 287 /// demo recording 288 qfile_t *sv_demo_file; 289 290 // number of skipped entity frames 291 // if it exceeds a limit, an empty entity frame is sent 292 int num_skippedentityframes; 293 } client_t; 294 295 296 //============================================================================= 297 298 // edict->movetype values 299 #define MOVETYPE_NONE 0 ///< never moves 300 #define MOVETYPE_ANGLENOCLIP 1 301 #define MOVETYPE_ANGLECLIP 2 302 #define MOVETYPE_WALK 3 ///< gravity 303 #define MOVETYPE_STEP 4 ///< gravity, special edge handling 304 #define MOVETYPE_FLY 5 305 #define MOVETYPE_TOSS 6 ///< gravity 306 #define MOVETYPE_PUSH 7 ///< no clip to world, push and crush 307 #define MOVETYPE_NOCLIP 8 308 #define MOVETYPE_FLYMISSILE 9 ///< extra size to monsters 309 #define MOVETYPE_BOUNCE 10 310 #define MOVETYPE_BOUNCEMISSILE 11 ///< bounce w/o gravity 311 #define MOVETYPE_FOLLOW 12 ///< track movement of aiment 312 #define MOVETYPE_FAKEPUSH 13 ///< tenebrae's push that doesn't push 313 314 // edict->solid values 315 #define SOLID_NOT 0 ///< no interaction with other objects 316 #define SOLID_TRIGGER 1 ///< touch on edge, but not blocking 317 #define SOLID_BBOX 2 ///< touch on edge, block 318 #define SOLID_SLIDEBOX 3 ///< touch on edge, but not an onground 319 #define SOLID_BSP 4 ///< bsp clip, touch on edge, block 320 // LordHavoc: corpse code 321 #define SOLID_CORPSE 5 ///< same as SOLID_BBOX, except it behaves as SOLID_NOT against SOLID_SLIDEBOX objects (players/monsters) 322 323 // edict->deadflag values 324 #define DEAD_NO 0 325 #define DEAD_DYING 1 326 #define DEAD_DEAD 2 327 328 #define DAMAGE_NO 0 329 #define DAMAGE_YES 1 330 #define DAMAGE_AIM 2 331 332 // edict->flags 333 #define FL_FLY 1 334 #define FL_SWIM 2 335 #define FL_CONVEYOR 4 336 #define FL_CLIENT 8 337 #define FL_INWATER 16 338 #define FL_MONSTER 32 339 #define FL_GODMODE 64 340 #define FL_NOTARGET 128 341 #define FL_ITEM 256 342 #define FL_ONGROUND 512 343 #define FL_PARTIALGROUND 1024 ///< not all corners are valid 344 #define FL_WATERJUMP 2048 ///< player jumping out of water 345 #define FL_JUMPRELEASED 4096 ///< for jump debouncing 346 347 #define SPAWNFLAG_NOT_EASY 256 348 #define SPAWNFLAG_NOT_MEDIUM 512 349 #define SPAWNFLAG_NOT_HARD 1024 350 #define SPAWNFLAG_NOT_DEATHMATCH 2048 351 352 //============================================================================ 353 354 extern cvar_t coop; 355 extern cvar_t deathmatch; 356 extern cvar_t fraglimit; 357 extern cvar_t gamecfg; 358 extern cvar_t noexit; 359 extern cvar_t nomonsters; 360 extern cvar_t pausable; 361 extern cvar_t pr_checkextension; 362 extern cvar_t samelevel; 363 extern cvar_t saved1; 364 extern cvar_t saved2; 365 extern cvar_t saved3; 366 extern cvar_t saved4; 367 extern cvar_t savedgamecfg; 368 extern cvar_t scratch1; 369 extern cvar_t scratch2; 370 extern cvar_t scratch3; 371 extern cvar_t scratch4; 372 extern cvar_t skill; 373 extern cvar_t slowmo; 374 extern cvar_t sv_accelerate; 375 extern cvar_t sv_aim; 376 extern cvar_t sv_airaccel_qw; 377 extern cvar_t sv_airaccel_sideways_friction; 378 extern cvar_t sv_airaccelerate; 379 extern cvar_t sv_airstopaccelerate; 380 extern cvar_t sv_airstrafeaccelerate; 381 extern cvar_t sv_maxairstrafespeed; 382 extern cvar_t sv_aircontrol; 383 extern cvar_t sv_allowdownloads; 384 extern cvar_t sv_allowdownloads_archive; 385 extern cvar_t sv_allowdownloads_config; 386 extern cvar_t sv_allowdownloads_dlcache; 387 extern cvar_t sv_allowdownloads_inarchive; 388 extern cvar_t sv_areagrid_mingridsize; 389 extern cvar_t sv_checkforpacketsduringsleep; 390 extern cvar_t sv_clmovement_enable; 391 extern cvar_t sv_clmovement_minping; 392 extern cvar_t sv_clmovement_minping_disabletime; 393 extern cvar_t sv_clmovement_inputtimeout; 394 extern cvar_t sv_clmovement_maxnetfps; 395 extern cvar_t sv_cullentities_nevercullbmodels; 396 extern cvar_t sv_cullentities_pvs; 397 extern cvar_t sv_cullentities_stats; 398 extern cvar_t sv_cullentities_trace; 399 extern cvar_t sv_cullentities_trace_delay; 400 extern cvar_t sv_cullentities_trace_enlarge; 401 extern cvar_t sv_cullentities_trace_prediction; 402 extern cvar_t sv_cullentities_trace_samples; 403 extern cvar_t sv_cullentities_trace_samples_extra; 404 extern cvar_t sv_debugmove; 405 extern cvar_t sv_echobprint; 406 extern cvar_t sv_edgefriction; 407 extern cvar_t sv_entpatch; 408 extern cvar_t sv_fixedframeratesingleplayer; 409 extern cvar_t sv_freezenonclients; 410 extern cvar_t sv_friction; 411 extern cvar_t sv_gameplayfix_blowupfallenzombies; 412 extern cvar_t sv_gameplayfix_delayprojectiles; 413 extern cvar_t sv_gameplayfix_droptofloorstartsolid; 414 extern cvar_t sv_gameplayfix_droptofloorstartsolid_nudgetocorrect; 415 extern cvar_t sv_gameplayfix_easierwaterjump; 416 extern cvar_t sv_gameplayfix_findradiusdistancetobox; 417 extern cvar_t sv_gameplayfix_grenadebouncedownslopes; 418 extern cvar_t sv_gameplayfix_multiplethinksperframe; 419 extern cvar_t sv_gameplayfix_slidemoveprojectiles; 420 extern cvar_t sv_gameplayfix_noairborncorpse; 421 extern cvar_t sv_gameplayfix_noairborncorpse_allowsuspendeditems; 422 extern cvar_t sv_gameplayfix_setmodelrealbox; 423 extern cvar_t sv_gameplayfix_stepdown; 424 extern cvar_t sv_gameplayfix_stepwhilejumping; 425 extern cvar_t sv_gameplayfix_swiminbmodels; 426 extern cvar_t sv_gameplayfix_upwardvelocityclearsongroundflag; 427 extern cvar_t sv_gameplayfix_gravityunaffectedbyticrate; 428 extern cvar_t sv_gravity; 429 extern cvar_t sv_idealpitchscale; 430 extern cvar_t sv_jumpstep; 431 extern cvar_t sv_jumpvelocity; 432 extern cvar_t sv_maxairspeed; 433 extern cvar_t sv_maxrate; 434 extern cvar_t sv_maxspeed; 435 extern cvar_t sv_maxvelocity; 436 extern cvar_t sv_newflymove; 437 extern cvar_t sv_nostep; 438 extern cvar_t sv_playerphysicsqc; 439 extern cvar_t sv_progs; 440 extern cvar_t sv_protocolname; 441 extern cvar_t sv_random_seed; 442 extern cvar_t sv_ratelimitlocalplayer; 443 extern cvar_t sv_sound_land; 444 extern cvar_t sv_sound_watersplash; 445 extern cvar_t sv_stepheight; 446 extern cvar_t sv_stopspeed; 447 extern cvar_t sv_wallfriction; 448 extern cvar_t sv_wateraccelerate; 449 extern cvar_t sv_waterfriction; 450 extern cvar_t sys_ticrate; 451 extern cvar_t teamplay; 452 extern cvar_t temp1; 453 extern cvar_t timelimit; 454 455 extern mempool_t *sv_mempool; 456 457 /// persistant server info 458 extern server_static_t svs; 459 /// local server 460 extern server_t sv; 461 462 extern client_t *host_client; 463 464 //=========================================================== 465 466 void SV_Init (void); 467 468 void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count); 469 void SV_StartEffect (vec3_t org, int modelindex, int startframe, int framecount, int framerate); 470 void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation); 471 void SV_StartPointSound (vec3_t origin, const char *sample, int volume, float attenuation); 472 473 void SV_ConnectClient (int clientnum, netconn_t *netconnection); 474 void SV_DropClient (qboolean crash); 475 476 void SV_SendClientMessages (void); 477 478 void SV_ReadClientMessage(void); 479 480 // precachemode values: 481 // 0 = fail if not precached, 482 // 1 = warn if not found and precache if possible 483 // 2 = precache 484 int SV_ModelIndex(const char *s, int precachemode); 485 int SV_SoundIndex(const char *s, int precachemode); 486 487 int SV_ParticleEffectIndex(const char *name); 488 489 void SV_SetIdealPitch (void); 490 491 void SV_AddUpdates (void); 492 493 void SV_ClientThink (void); 494 495 void SV_ClientPrint(const char *msg); 496 void SV_ClientPrintf(const char *fmt, ...) DP_FUNC_PRINTF(1); 497 void SV_BroadcastPrint(const char *msg); 498 void SV_BroadcastPrintf(const char *fmt, ...) DP_FUNC_PRINTF(1); 499 500 void SV_Physics (void); 501 void SV_Physics_ClientMove (void); 502 void SV_Physics_ClientEntity (prvm_edict_t *ent); 503 504 qboolean SV_PlayerCheckGround (prvm_edict_t *ent); 505 qboolean SV_CheckBottom (prvm_edict_t *ent); 506 qboolean SV_movestep (prvm_edict_t *ent, vec3_t move, qboolean relink, qboolean noenemy, qboolean settrace); 507 508 /*! Needs to be called any time an entity changes origin, mins, maxs, or solid 509 * sets ent->v.absmin and ent->v.absmax 510 * if touchtriggers, calls prog functions for the intersected triggers 511 */ 512 void SV_LinkEdict (prvm_edict_t *ent, qboolean touch_triggers); 513 514 /*! move an entity that is stuck by small amounts in various directions to try to nudge it back into the collision hull 515 * returns true if it found a better place 516 */ 517 qboolean SV_UnstickEntity (prvm_edict_t *ent); 518 519 /// calculates hitsupercontentsmask for a generic qc entity 520 int SV_GenericHitSuperContentsMask(const prvm_edict_t *edict); 521 /// traces a box move against worldmodel and all entities in the specified area 522 trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask); 523 524 int SV_PointSuperContents(const vec3_t point); 525 526 void SV_FlushBroadcastMessages(void); 527 void SV_WriteClientdataToMessage (client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats); 528 529 void SV_MoveToGoal (void); 530 531 void SV_ApplyClientMove (void); 532 void SV_SaveSpawnparms (void); 533 void SV_SpawnServer (const char *server); 534 535 void SV_CheckVelocity (prvm_edict_t *ent); 536 537 void SV_SetupVM(void); 538 539 void SV_VM_Begin(void); 540 void SV_VM_End(void); 541 542 const char *Host_TimingReport(void); ///< for output in Host_Status_f 543 544 #endif 545 546