|
|
1.1 ! root 1: // client.h -- primary header for client ! 2: //define PARANOID // speed sapping error checking ! 3: #include <math.h> ! 4: #include <string.h> ! 5: #include <stdarg.h> ! 6: #include <stdio.h> ! 7: #include <stdlib.h> ! 8: #include "ref.h" ! 9: #include "vid.h" ! 10: #include "screen.h" ! 11: #include "sound.h" ! 12: #include "input.h" ! 13: #include "keys.h" ! 14: #include "console.h" ! 15: #include "cdaudio.h" ! 16: //============================================================================= ! 17: typedef struct ! 18: { ! 19: qboolean valid; // cleared if delta parsing was invalid ! 20: int serverframe; ! 21: int servertime; // server time the message is valid for (in msec) ! 22: int deltaframe; ! 23: byte areabits[MAX_MAP_AREAS/8]; // portalarea visibility bits ! 24: player_state_t playerstate; ! 25: int num_entities; ! 26: int parse_entities; // non-masked index into cl_parse_entities array ! 27: } frame_t; ! 28: typedef struct ! 29: { ! 30: entity_state_t baseline; // delta from this if not from a previous frame ! 31: entity_state_t current; ! 32: entity_state_t prev; // will always be valid, but might just be a copy of current ! 33: int serverframe; // if not current, this ent isn't in the frame ! 34: ! 35: int trailcount; // for diminishing grenade trails ! 36: vec3_t lerp_origin; // for trails (variable hz) ! 37: ! 38: int fly_stoptime; ! 39: } centity_t; ! 40: ! 41: ! 42: typedef struct ! 43: { ! 44: char name[MAX_QPATH]; ! 45: struct image_s *skin; ! 46: struct image_s *icon; ! 47: char iconname[MAX_QPATH]; ! 48: struct model_s *model; ! 49: struct model_s *weaponmodel; ! 50: } clientinfo_t; ! 51: ! 52: #define CMD_BACKUP 64 // allow a lot of command backups for very fast systems ! 53: // ! 54: // the client_state_t structure is wiped completely at every ! 55: // server map change ! 56: // ! 57: typedef struct ! 58: { ! 59: int timeoutcount; ! 60: int timedemo_frames; ! 61: int timedemo_start; ! 62: qboolean refresh_prepped; // false if on new level or new ref dll ! 63: qboolean sound_prepped; // ambient sounds can start ! 64: qboolean force_refdef; // vid has changed, so we can't use a paused refdef ! 65: int parse_entities; // index (not anded off) into cl_parse_entities[] ! 66: usercmd_t cmd; ! 67: usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds ! 68: int cmd_time[CMD_BACKUP]; // time sent, for calculating pings ! 69: short predicted_origins[CMD_BACKUP][3]; // for debug comparing against server ! 70: ! 71: float predicted_step; // for stair up smoothing ! 72: unsigned predicted_step_time; ! 73: ! 74: vec3_t predicted_origin; // generated by CL_PredictMovement ! 75: vec3_t predicted_angles; ! 76: vec3_t prediction_error; ! 77: frame_t frame; // received from server ! 78: int surpressCount; // number of messages rate supressed ! 79: frame_t frames[UPDATE_BACKUP]; ! 80: // the client maintains its own idea of view angles, which are ! 81: // sent to the server each frame. It is cleared to 0 upon entering each level. ! 82: // the server sends a delta each frame which is added to the locally ! 83: // tracked view angles to account for standing on rotating objects, ! 84: // and teleport direction changes ! 85: vec3_t viewangles; ! 86: int time; // this is the time value that the client ! 87: // is rendering at. allways <= cls.realtime ! 88: float lerpfrac; // between oldframe and frame ! 89: refdef_t refdef; ! 90: vec3_t v_forward, v_right, v_up; // set when refdef.angles is set ! 91: // ! 92: // transient data from server ! 93: // ! 94: char layout[1024]; // general 2D overlay ! 95: int inventory[MAX_ITEMS]; ! 96: // ! 97: // non-gameserver infornamtion ! 98: // FIXME: move this cinematic stuff into the cin_t structure ! 99: FILE *cinematic_file; ! 100: int cinematictime; // cls.realtime for first cinematic frame ! 101: int cinematicframe; ! 102: char cinematicpalette[768]; ! 103: qboolean cinematicpalette_active; ! 104: // ! 105: // server state information ! 106: // ! 107: qboolean attractloop; // running the attract loop, any key will menu ! 108: int servercount; // server identification for prespawns ! 109: char gamedir[MAX_QPATH]; ! 110: int playernum; ! 111: char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH]; ! 112: // ! 113: // locally derived information from server state ! 114: // ! 115: struct model_s *model_draw[MAX_MODELS]; ! 116: struct cmodel_s *model_clip[MAX_MODELS]; ! 117: struct sfx_s *sound_precache[MAX_SOUNDS]; ! 118: struct image_s *image_precache[MAX_IMAGES]; ! 119: ! 120: clientinfo_t clientinfo[MAX_CLIENTS]; ! 121: clientinfo_t baseclientinfo; ! 122: } client_state_t; ! 123: extern client_state_t cl; ! 124: /* ! 125: ================================================================== ! 126: the client_static_t structure is persistant through an arbitrary number ! 127: of server connections ! 128: ================================================================== ! 129: */ ! 130: typedef enum { ! 131: ca_uninitialized, ! 132: ca_disconnected, // not talking to a server ! 133: ca_connecting, // sending request packets to the server ! 134: ca_connected, // netchan_t established, waiting for svc_serverdata ! 135: ca_active // game views should be displayed ! 136: } connstate_t; ! 137: typedef enum { ! 138: dl_none, ! 139: dl_model, ! 140: dl_sound, ! 141: dl_skin, ! 142: dl_single ! 143: } dltype_t; // download type ! 144: typedef enum {key_game, key_console, key_message, key_menu} keydest_t; ! 145: typedef struct ! 146: { ! 147: connstate_t state; ! 148: keydest_t key_dest; ! 149: int framecount; ! 150: int realtime; // allways increasing, no clamping, etc ! 151: float frametime; // seconds since last frame ! 152: // screen rendering information ! 153: float disable_screen; // showing loading plaque between levels ! 154: // or changing rendering dlls ! 155: // if time gets > 30 seconds ahead, break it ! 156: int disable_servercount; // when we receive a frame and cl.servercount ! 157: // > cls.disable_servercount, clear disable_screen ! 158: // connection information ! 159: char servername[MAX_OSPATH]; // name of server from original connect ! 160: float connect_time; // for connection retransmits ! 161: ! 162: int quakePort; // a 16 bit value that allows quake servers ! 163: // to work around address translating routers ! 164: netchan_t netchan; ! 165: int serverProtocol; // in case we are doing some kind of version hack ! 166: ! 167: int challenge; // from the server to use for connecting ! 168: FILE *download; // file transfer from server ! 169: char downloadtempname[MAX_OSPATH]; ! 170: char downloadname[MAX_OSPATH]; ! 171: int downloadnumber; ! 172: dltype_t downloadtype; ! 173: int downloadpercent; ! 174: // demo recording info must be here, so it isn't cleared on level change ! 175: qboolean demorecording; ! 176: qboolean demowaiting; // don't record until a non-delta message is received ! 177: FILE *demofile; ! 178: } client_static_t; ! 179: extern client_static_t cls; ! 180: //============================================================================= ! 181: // ! 182: // cvars ! 183: // ! 184: extern cvar_t *cl_stereo_separation; ! 185: extern cvar_t *cl_stereo; ! 186: ! 187: extern cvar_t *cl_gun; ! 188: extern cvar_t *cl_add_blend; ! 189: extern cvar_t *cl_add_lights; ! 190: extern cvar_t *cl_add_particles; ! 191: extern cvar_t *cl_add_entities; ! 192: extern cvar_t *cl_predict; ! 193: extern cvar_t *cl_footsteps; ! 194: extern cvar_t *cl_noskins; ! 195: extern cvar_t *cl_autoskins; ! 196: extern cvar_t *cl_upspeed; ! 197: extern cvar_t *cl_forwardspeed; ! 198: extern cvar_t *cl_sidespeed; ! 199: extern cvar_t *cl_yawspeed; ! 200: extern cvar_t *cl_pitchspeed; ! 201: ! 202: extern cvar_t *cl_run; ! 203: extern cvar_t *cl_anglespeedkey; ! 204: extern cvar_t *cl_shownet; ! 205: extern cvar_t *cl_showmiss; ! 206: extern cvar_t *cl_showclamp; ! 207: extern cvar_t *lookspring; ! 208: extern cvar_t *lookstrafe; ! 209: extern cvar_t *sensitivity; ! 210: extern cvar_t *m_pitch; ! 211: extern cvar_t *m_yaw; ! 212: extern cvar_t *m_forward; ! 213: extern cvar_t *m_side; ! 214: extern cvar_t *freelook; ! 215: extern cvar_t *cl_lightlevel; // FIXME HACK ! 216: extern cvar_t *cl_paused; ! 217: extern cvar_t *cl_timedemo; ! 218: typedef struct ! 219: { ! 220: int key; // so entities can reuse same entry ! 221: vec3_t color; ! 222: vec3_t origin; ! 223: float radius; ! 224: float die; // stop lighting after this time ! 225: float decay; // drop this each second ! 226: float minlight; // don't add when contributing less ! 227: } cdlight_t; ! 228: extern centity_t cl_entities[MAX_EDICTS]; ! 229: extern cdlight_t cl_dlights[MAX_DLIGHTS]; ! 230: ! 231: // the cl_parse_entities must be large enough to hold UPDATE_BACKUP frames of ! 232: // entities, so that when a delta compressed message arives from the server ! 233: // it can be un-deltad from the original ! 234: #define MAX_PARSE_ENTITIES 1024 ! 235: extern entity_state_t cl_parse_entities[MAX_PARSE_ENTITIES]; ! 236: //============================================================================= ! 237: extern netadr_t net_from; ! 238: extern sizebuf_t net_message; ! 239: void DrawString (int x, int y, char *s); ! 240: void DrawAltString (int x, int y, char *s); // toggle high bit ! 241: qboolean CL_CheckOrDownloadFile (char *filename); ! 242: ! 243: void CL_AddNetgraph (void); ! 244: void CL_TeleporterParticles (entity_state_t *ent); ! 245: void CL_ParticleEffect (vec3_t org, vec3_t dir, int color, int count); ! 246: void CL_ParticleEffect2 (vec3_t org, vec3_t dir, int color, int count); ! 247: //================================================= ! 248: void CL_ClearEffects (void); ! 249: void CL_ClearTEnts (void); ! 250: void CL_BlasterTrail (vec3_t start, vec3_t end); ! 251: void CL_QuadTrail (vec3_t start, vec3_t end); ! 252: void CL_RailTrail (vec3_t start, vec3_t end); ! 253: void CL_BubbleTrail (vec3_t start, vec3_t end); ! 254: void CL_FlagTrail (vec3_t start, vec3_t end, float color); ! 255: ! 256: // added this ! 257: void CL_PlasmaTrail (vec3_t start, vec3_t end); ! 258: void CL_BoomerTrail (vec3_t start, vec3_t end); ! 259: int CL_ParseEntityBits (unsigned *bits); ! 260: void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int number, int bits); ! 261: void CL_ParseFrame (void); ! 262: void CL_ParseTEnt (void); ! 263: void CL_ParseConfigString (void); ! 264: void CL_ParseMuzzleFlash (void); ! 265: void CL_ParseMuzzleFlash2 (void); ! 266: void SmokeAndFlash(vec3_t origin); ! 267: void CL_SetLightstyle (int i); ! 268: void CL_RunParticles (void); ! 269: void CL_RunDLights (void); ! 270: void CL_RunLightStyles (void); ! 271: void CL_AddEntities (void); ! 272: void CL_AddDLights (void); ! 273: void CL_AddTEnts (void); ! 274: void CL_AddLightStyles (void); ! 275: //================================================= ! 276: void CL_PrepRefresh (void); ! 277: void CL_RegisterSounds (void); ! 278: void CL_Quit_f (void); ! 279: void IN_Accumulate (void); ! 280: void CL_ParseLayout (void); ! 281: // ! 282: // cl_main ! 283: // ! 284: extern refexport_t re; // interface to refresh .dll ! 285: void CL_Init (void); ! 286: void CL_Disconnect (void); ! 287: void CL_Disconnect_f (void); ! 288: void CL_GetChallengePacket (void); ! 289: void CL_PingServers_f (void); ! 290: void CL_Snd_Restart_f (void); ! 291: // ! 292: // cl_input ! 293: // ! 294: typedef struct ! 295: { ! 296: int down[2]; // key nums holding it down ! 297: unsigned downtime; // msec timestamp ! 298: unsigned msec; // msec down this frame ! 299: int state; ! 300: } kbutton_t; ! 301: extern kbutton_t in_mlook, in_klook; ! 302: extern kbutton_t in_strafe; ! 303: extern kbutton_t in_speed; ! 304: void CL_InitInput (void); ! 305: void CL_SendCmd (void); ! 306: void CL_SendMove (usercmd_t *cmd); ! 307: void CL_ClearState (void); ! 308: void CL_ReadPackets (void); ! 309: int CL_ReadFromServer (void); ! 310: void CL_WriteToServer (usercmd_t *cmd); ! 311: void CL_BaseMove (usercmd_t *cmd); ! 312: void IN_CenterView (void); ! 313: float CL_KeyState (kbutton_t *key); ! 314: char *Key_KeynumToString (int keynum); ! 315: // ! 316: // cl_demo.c ! 317: // ! 318: void CL_WriteDemoMessage (void); ! 319: void CL_Stop_f (void); ! 320: void CL_Record_f (void); ! 321: // ! 322: // cl_parse.c ! 323: // ! 324: extern char *svc_strings[256]; ! 325: ! 326: void CL_ParseServerMessage (void); ! 327: void CL_LoadClientinfo (clientinfo_t *ci, char *s); ! 328: void SHOWNET(char *s); ! 329: void CL_ParseClientinfo (int player); ! 330: // ! 331: // cl_view.c ! 332: // ! 333: extern int gun_frame; ! 334: extern struct model_s *gun_model; ! 335: ! 336: void V_Init (void); ! 337: void V_RenderView( float stereo_separation ); ! 338: void V_AddEntity (entity_t *ent); ! 339: void V_AddParticle (vec3_t org, int color, float alpha); ! 340: void V_AddLight (vec3_t org, float intensity, float r, float g, float b); ! 341: void V_AddLightStyle (int style, float r, float g, float b); ! 342: // ! 343: // cl_tent.c ! 344: // ! 345: void CL_RegisterTEntSounds (void); ! 346: void CL_RegisterTEntModels (void); ! 347: void CL_SmokeAndFlash(vec3_t origin); ! 348: // ! 349: // cl_pred.c ! 350: // ! 351: void CL_InitPrediction (void); ! 352: void CL_PredictMove (void); ! 353: void CL_CheckPredictionError (void); ! 354: // ! 355: // cl_fx.c ! 356: // ! 357: cdlight_t *CL_AllocDlight (int key); ! 358: void CL_BigTeleportParticles (vec3_t org); ! 359: void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old); ! 360: void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags); ! 361: void CL_FlyEffect (centity_t *ent, vec3_t origin); ! 362: void CL_BfgParticles (entity_t *ent); ! 363: void CL_AddParticles (void); ! 364: void CL_EntityEvent (entity_state_t *ent); ! 365: // ! 366: // menus ! 367: // ! 368: void M_Init (void); ! 369: void M_Keydown (int key); ! 370: void M_Draw (void); ! 371: void M_Menu_Main_f (void); ! 372: void M_ForceMenuOff (void); ! 373: void M_AddToServerList (netadr_t adr, char *info); ! 374: // ! 375: // cl_inv.c ! 376: // ! 377: void CL_ParseInventory (void); ! 378: void CL_KeyInventory (int key); ! 379: void CL_DrawInventory (void); ! 380: ! 381: // ! 382: // cl_pred.c ! 383: // ! 384: void CL_PredictMovement (void); ! 385: ! 386: #if id386 ! 387: void x86_TimerStart( void ); ! 388: void x86_TimerStop( void ); ! 389: void x86_TimerInit( unsigned long smallest, unsigned longest ); ! 390: unsigned long *x86_TimerGetHistogram( void ); ! 391: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.