client.h (15497B)
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 // client.h -- primary header for client 21 22 //define PARANOID // speed sapping error checking 23 24 #include <math.h> 25 #include <string.h> 26 #include <stdarg.h> 27 #include <stdio.h> 28 #include <stdlib.h> 29 30 #include "ref.h" 31 32 #include "vid.h" 33 #include "screen.h" 34 #include "sound.h" 35 #include "input.h" 36 #include "keys.h" 37 #include "console.h" 38 #include "cdaudio.h" 39 40 //============================================================================= 41 42 typedef struct 43 { 44 qboolean valid; // cleared if delta parsing was invalid 45 int serverframe; 46 int servertime; // server time the message is valid for (in msec) 47 int deltaframe; 48 byte areabits[MAX_MAP_AREAS/8]; // portalarea visibility bits 49 player_state_t playerstate; 50 int num_entities; 51 int parse_entities; // non-masked index into cl_parse_entities array 52 } frame_t; 53 54 typedef struct 55 { 56 entity_state_t baseline; // delta from this if not from a previous frame 57 entity_state_t current; 58 entity_state_t prev; // will always be valid, but might just be a copy of current 59 60 int serverframe; // if not current, this ent isn't in the frame 61 62 int trailcount; // for diminishing grenade trails 63 vec3_t lerp_origin; // for trails (variable hz) 64 65 int fly_stoptime; 66 } centity_t; 67 68 #define MAX_CLIENTWEAPONMODELS 20 // PGM -- upped from 16 to fit the chainfist vwep 69 70 typedef struct 71 { 72 char name[MAX_QPATH]; 73 char cinfo[MAX_QPATH]; 74 struct image_s *skin; 75 struct image_s *icon; 76 char iconname[MAX_QPATH]; 77 struct model_s *model; 78 struct model_s *weaponmodel[MAX_CLIENTWEAPONMODELS]; 79 } clientinfo_t; 80 81 extern char cl_weaponmodels[MAX_CLIENTWEAPONMODELS][MAX_QPATH]; 82 extern int num_cl_weaponmodels; 83 84 #define CMD_BACKUP 64 // allow a lot of command backups for very fast systems 85 86 // 87 // the client_state_t structure is wiped completely at every 88 // server map change 89 // 90 typedef struct 91 { 92 int timeoutcount; 93 94 int timedemo_frames; 95 int timedemo_start; 96 97 qboolean refresh_prepped; // false if on new level or new ref dll 98 qboolean sound_prepped; // ambient sounds can start 99 qboolean force_refdef; // vid has changed, so we can't use a paused refdef 100 101 int parse_entities; // index (not anded off) into cl_parse_entities[] 102 103 usercmd_t cmd; 104 usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds 105 int cmd_time[CMD_BACKUP]; // time sent, for calculating pings 106 short predicted_origins[CMD_BACKUP][3]; // for debug comparing against server 107 108 float predicted_step; // for stair up smoothing 109 unsigned predicted_step_time; 110 111 vec3_t predicted_origin; // generated by CL_PredictMovement 112 vec3_t predicted_angles; 113 vec3_t prediction_error; 114 115 frame_t frame; // received from server 116 int surpressCount; // number of messages rate supressed 117 frame_t frames[UPDATE_BACKUP]; 118 119 // the client maintains its own idea of view angles, which are 120 // sent to the server each frame. It is cleared to 0 upon entering each level. 121 // the server sends a delta each frame which is added to the locally 122 // tracked view angles to account for standing on rotating objects, 123 // and teleport direction changes 124 vec3_t viewangles; 125 126 int time; // this is the time value that the client 127 // is rendering at. always <= cls.realtime 128 float lerpfrac; // between oldframe and frame 129 130 refdef_t refdef; 131 132 vec3_t v_forward, v_right, v_up; // set when refdef.angles is set 133 134 // 135 // transient data from server 136 // 137 char layout[1024]; // general 2D overlay 138 int inventory[MAX_ITEMS]; 139 140 // 141 // non-gameserver infornamtion 142 // FIXME: move this cinematic stuff into the cin_t structure 143 FILE *cinematic_file; 144 int cinematictime; // cls.realtime for first cinematic frame 145 int cinematicframe; 146 char cinematicpalette[768]; 147 qboolean cinematicpalette_active; 148 149 // 150 // server state information 151 // 152 qboolean attractloop; // running the attract loop, any key will menu 153 int servercount; // server identification for prespawns 154 char gamedir[MAX_QPATH]; 155 int playernum; 156 157 char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH]; 158 159 // 160 // locally derived information from server state 161 // 162 struct model_s *model_draw[MAX_MODELS]; 163 struct cmodel_s *model_clip[MAX_MODELS]; 164 165 struct sfx_s *sound_precache[MAX_SOUNDS]; 166 struct image_s *image_precache[MAX_IMAGES]; 167 168 clientinfo_t clientinfo[MAX_CLIENTS]; 169 clientinfo_t baseclientinfo; 170 } client_state_t; 171 172 extern client_state_t cl; 173 174 /* 175 ================================================================== 176 177 the client_static_t structure is persistant through an arbitrary number 178 of server connections 179 180 ================================================================== 181 */ 182 183 typedef enum { 184 ca_uninitialized, 185 ca_disconnected, // not talking to a server 186 ca_connecting, // sending request packets to the server 187 ca_connected, // netchan_t established, waiting for svc_serverdata 188 ca_active // game views should be displayed 189 } connstate_t; 190 191 typedef enum { 192 dl_none, 193 dl_model, 194 dl_sound, 195 dl_skin, 196 dl_single 197 } dltype_t; // download type 198 199 typedef enum {key_game, key_console, key_message, key_menu} keydest_t; 200 201 typedef struct 202 { 203 connstate_t state; 204 keydest_t key_dest; 205 206 int framecount; 207 int realtime; // always increasing, no clamping, etc 208 float frametime; // seconds since last frame 209 210 // screen rendering information 211 float disable_screen; // showing loading plaque between levels 212 // or changing rendering dlls 213 // if time gets > 30 seconds ahead, break it 214 int disable_servercount; // when we receive a frame and cl.servercount 215 // > cls.disable_servercount, clear disable_screen 216 217 // connection information 218 char servername[MAX_OSPATH]; // name of server from original connect 219 float connect_time; // for connection retransmits 220 221 int quakePort; // a 16 bit value that allows quake servers 222 // to work around address translating routers 223 netchan_t netchan; 224 int serverProtocol; // in case we are doing some kind of version hack 225 226 int challenge; // from the server to use for connecting 227 228 FILE *download; // file transfer from server 229 char downloadtempname[MAX_OSPATH]; 230 char downloadname[MAX_OSPATH]; 231 int downloadnumber; 232 dltype_t downloadtype; 233 int downloadpercent; 234 235 // demo recording info must be here, so it isn't cleared on level change 236 qboolean demorecording; 237 qboolean demowaiting; // don't record until a non-delta message is received 238 FILE *demofile; 239 } client_static_t; 240 241 extern client_static_t cls; 242 243 //============================================================================= 244 245 // 246 // cvars 247 // 248 extern cvar_t *cl_stereo_separation; 249 extern cvar_t *cl_stereo; 250 251 extern cvar_t *cl_gun; 252 extern cvar_t *cl_add_blend; 253 extern cvar_t *cl_add_lights; 254 extern cvar_t *cl_add_particles; 255 extern cvar_t *cl_add_entities; 256 extern cvar_t *cl_predict; 257 extern cvar_t *cl_footsteps; 258 extern cvar_t *cl_noskins; 259 extern cvar_t *cl_autoskins; 260 261 extern cvar_t *cl_upspeed; 262 extern cvar_t *cl_forwardspeed; 263 extern cvar_t *cl_sidespeed; 264 265 extern cvar_t *cl_yawspeed; 266 extern cvar_t *cl_pitchspeed; 267 268 extern cvar_t *cl_run; 269 270 extern cvar_t *cl_anglespeedkey; 271 272 extern cvar_t *cl_shownet; 273 extern cvar_t *cl_showmiss; 274 extern cvar_t *cl_showclamp; 275 276 extern cvar_t *lookspring; 277 extern cvar_t *lookstrafe; 278 extern cvar_t *sensitivity; 279 280 extern cvar_t *m_pitch; 281 extern cvar_t *m_yaw; 282 extern cvar_t *m_forward; 283 extern cvar_t *m_side; 284 285 extern cvar_t *freelook; 286 287 extern cvar_t *cl_lightlevel; // FIXME HACK 288 289 extern cvar_t *cl_paused; 290 extern cvar_t *cl_timedemo; 291 292 extern cvar_t *cl_vwep; 293 294 typedef struct 295 { 296 int key; // so entities can reuse same entry 297 vec3_t color; 298 vec3_t origin; 299 float radius; 300 float die; // stop lighting after this time 301 float decay; // drop this each second 302 float minlight; // don't add when contributing less 303 } cdlight_t; 304 305 extern centity_t cl_entities[MAX_EDICTS]; 306 extern cdlight_t cl_dlights[MAX_DLIGHTS]; 307 308 // the cl_parse_entities must be large enough to hold UPDATE_BACKUP frames of 309 // entities, so that when a delta compressed message arives from the server 310 // it can be un-deltad from the original 311 #define MAX_PARSE_ENTITIES 1024 312 extern entity_state_t cl_parse_entities[MAX_PARSE_ENTITIES]; 313 314 //============================================================================= 315 316 extern netadr_t net_from; 317 extern sizebuf_t net_message; 318 319 void DrawString (int x, int y, char *s); 320 void DrawAltString (int x, int y, char *s); // toggle high bit 321 qboolean CL_CheckOrDownloadFile (char *filename); 322 323 void CL_AddNetgraph (void); 324 325 //ROGUE 326 typedef struct cl_sustain 327 { 328 int id; 329 int type; 330 int endtime; 331 int nextthink; 332 int thinkinterval; 333 vec3_t org; 334 vec3_t dir; 335 int color; 336 int count; 337 int magnitude; 338 void (*think)(struct cl_sustain *self); 339 } cl_sustain_t; 340 341 #define MAX_SUSTAINS 32 342 void CL_ParticleSteamEffect2(cl_sustain_t *self); 343 344 void CL_TeleporterParticles (entity_state_t *ent); 345 void CL_ParticleEffect (vec3_t org, vec3_t dir, int color, int count); 346 void CL_ParticleEffect2 (vec3_t org, vec3_t dir, int color, int count); 347 348 // RAFAEL 349 void CL_ParticleEffect3 (vec3_t org, vec3_t dir, int color, int count); 350 351 352 //================================================= 353 354 // ======== 355 // PGM 356 typedef struct particle_s 357 { 358 struct particle_s *next; 359 360 float time; 361 362 vec3_t org; 363 vec3_t vel; 364 vec3_t accel; 365 float color; 366 float colorvel; 367 float alpha; 368 float alphavel; 369 } cparticle_t; 370 371 372 #define PARTICLE_GRAVITY 40 373 #define BLASTER_PARTICLE_COLOR 0xe0 374 // PMM 375 #define INSTANT_PARTICLE -10000.0 376 // PGM 377 // ======== 378 379 void CL_ClearEffects (void); 380 void CL_ClearTEnts (void); 381 void CL_BlasterTrail (vec3_t start, vec3_t end); 382 void CL_QuadTrail (vec3_t start, vec3_t end); 383 void CL_RailTrail (vec3_t start, vec3_t end); 384 void CL_BubbleTrail (vec3_t start, vec3_t end); 385 void CL_FlagTrail (vec3_t start, vec3_t end, float color); 386 387 // RAFAEL 388 void CL_IonripperTrail (vec3_t start, vec3_t end); 389 390 // ======== 391 // PGM 392 void CL_BlasterParticles2 (vec3_t org, vec3_t dir, unsigned int color); 393 void CL_BlasterTrail2 (vec3_t start, vec3_t end); 394 void CL_DebugTrail (vec3_t start, vec3_t end); 395 void CL_SmokeTrail (vec3_t start, vec3_t end, int colorStart, int colorRun, int spacing); 396 void CL_Flashlight (int ent, vec3_t pos); 397 void CL_ForceWall (vec3_t start, vec3_t end, int color); 398 void CL_FlameEffects (centity_t *ent, vec3_t origin); 399 void CL_GenericParticleEffect (vec3_t org, vec3_t dir, int color, int count, int numcolors, int dirspread, float alphavel); 400 void CL_BubbleTrail2 (vec3_t start, vec3_t end, int dist); 401 void CL_Heatbeam (vec3_t start, vec3_t end); 402 void CL_ParticleSteamEffect (vec3_t org, vec3_t dir, int color, int count, int magnitude); 403 void CL_TrackerTrail (vec3_t start, vec3_t end, int particleColor); 404 void CL_Tracker_Explode(vec3_t origin); 405 void CL_TagTrail (vec3_t start, vec3_t end, float color); 406 void CL_ColorFlash (vec3_t pos, int ent, int intensity, float r, float g, float b); 407 void CL_Tracker_Shell(vec3_t origin); 408 void CL_MonsterPlasma_Shell(vec3_t origin); 409 void CL_ColorExplosionParticles (vec3_t org, int color, int run); 410 void CL_ParticleSmokeEffect (vec3_t org, vec3_t dir, int color, int count, int magnitude); 411 void CL_Widowbeamout (cl_sustain_t *self); 412 void CL_Nukeblast (cl_sustain_t *self); 413 void CL_WidowSplash (vec3_t org); 414 // PGM 415 // ======== 416 417 int CL_ParseEntityBits (unsigned *bits); 418 void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int number, int bits); 419 void CL_ParseFrame (void); 420 421 void CL_ParseTEnt (void); 422 void CL_ParseConfigString (void); 423 void CL_ParseMuzzleFlash (void); 424 void CL_ParseMuzzleFlash2 (void); 425 void SmokeAndFlash(vec3_t origin); 426 427 void CL_SetLightstyle (int i); 428 429 void CL_RunParticles (void); 430 void CL_RunDLights (void); 431 void CL_RunLightStyles (void); 432 433 void CL_AddEntities (void); 434 void CL_AddDLights (void); 435 void CL_AddTEnts (void); 436 void CL_AddLightStyles (void); 437 438 //================================================= 439 440 void CL_PrepRefresh (void); 441 void CL_RegisterSounds (void); 442 443 void CL_Quit_f (void); 444 445 void IN_Accumulate (void); 446 447 void CL_ParseLayout (void); 448 449 450 // 451 // cl_main 452 // 453 extern refexport_t re; // interface to refresh .dll 454 455 void CL_Init (void); 456 457 void CL_FixUpGender(void); 458 void CL_Disconnect (void); 459 void CL_Disconnect_f (void); 460 void CL_GetChallengePacket (void); 461 void CL_PingServers_f (void); 462 void CL_Snd_Restart_f (void); 463 void CL_RequestNextDownload (void); 464 465 // 466 // cl_input 467 // 468 typedef struct 469 { 470 int down[2]; // key nums holding it down 471 unsigned downtime; // msec timestamp 472 unsigned msec; // msec down this frame 473 int state; 474 } kbutton_t; 475 476 extern kbutton_t in_mlook, in_klook; 477 extern kbutton_t in_strafe; 478 extern kbutton_t in_speed; 479 480 void CL_InitInput (void); 481 void CL_SendCmd (void); 482 void CL_SendMove (usercmd_t *cmd); 483 484 void CL_ClearState (void); 485 486 void CL_ReadPackets (void); 487 488 int CL_ReadFromServer (void); 489 void CL_WriteToServer (usercmd_t *cmd); 490 void CL_BaseMove (usercmd_t *cmd); 491 492 void IN_CenterView (void); 493 494 float CL_KeyState (kbutton_t *key); 495 char *Key_KeynumToString (int keynum); 496 497 // 498 // cl_demo.c 499 // 500 void CL_WriteDemoMessage (void); 501 void CL_Stop_f (void); 502 void CL_Record_f (void); 503 504 // 505 // cl_parse.c 506 // 507 extern char *svc_strings[256]; 508 509 void CL_ParseServerMessage (void); 510 void CL_LoadClientinfo (clientinfo_t *ci, char *s); 511 void SHOWNET(char *s); 512 void CL_ParseClientinfo (int player); 513 void CL_Download_f (void); 514 515 // 516 // cl_view.c 517 // 518 extern int gun_frame; 519 extern struct model_s *gun_model; 520 521 void V_Init (void); 522 void V_RenderView( float stereo_separation ); 523 void V_AddEntity (entity_t *ent); 524 void V_AddParticle (vec3_t org, int color, float alpha); 525 void V_AddLight (vec3_t org, float intensity, float r, float g, float b); 526 void V_AddLightStyle (int style, float r, float g, float b); 527 528 // 529 // cl_tent.c 530 // 531 void CL_RegisterTEntSounds (void); 532 void CL_RegisterTEntModels (void); 533 void CL_SmokeAndFlash(vec3_t origin); 534 535 536 // 537 // cl_pred.c 538 // 539 void CL_InitPrediction (void); 540 void CL_PredictMove (void); 541 void CL_CheckPredictionError (void); 542 543 // 544 // cl_fx.c 545 // 546 cdlight_t *CL_AllocDlight (int key); 547 void CL_BigTeleportParticles (vec3_t org); 548 void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old); 549 void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags); 550 void CL_FlyEffect (centity_t *ent, vec3_t origin); 551 void CL_BfgParticles (entity_t *ent); 552 void CL_AddParticles (void); 553 void CL_EntityEvent (entity_state_t *ent); 554 // RAFAEL 555 void CL_TrapParticles (entity_t *ent); 556 557 // 558 // menus 559 // 560 void M_Init (void); 561 void M_Keydown (int key); 562 void M_Draw (void); 563 void M_Menu_Main_f (void); 564 void M_ForceMenuOff (void); 565 void M_AddToServerList (netadr_t adr, char *info); 566 567 // 568 // cl_inv.c 569 // 570 void CL_ParseInventory (void); 571 void CL_KeyInventory (int key); 572 void CL_DrawInventory (void); 573 574 // 575 // cl_pred.c 576 // 577 void CL_PredictMovement (void); 578 579 #if id386 580 void x86_TimerStart( void ); 581 void x86_TimerStop( void ); 582 void x86_TimerInit( unsigned long smallest, unsigned longest ); 583 unsigned long *x86_TimerGetHistogram( void ); 584 #endif