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 // client.h 21 22 typedef struct 23 { 24 vec3_t viewangles; 25 26 // intended velocities 27 float forwardmove; 28 float sidemove; 29 float upmove; 30 #ifdef QUAKE2 31 byte lightlevel; 32 #endif 33 } usercmd_t; 34 35 typedef struct 36 { 37 int length; 38 char map[MAX_STYLESTRING]; 39 } lightstyle_t; 40 41 typedef struct 42 { 43 char name[MAX_SCOREBOARDNAME]; 44 float entertime; 45 int frags; 46 int colors; // two 4 bit fields 47 byte translations[VID_GRADES*256]; 48 } scoreboard_t; 49 50 typedef struct 51 { 52 int destcolor[3]; 53 int percent; // 0-256 54 } cshift_t; 55 56 #define CSHIFT_CONTENTS 0 57 #define CSHIFT_DAMAGE 1 58 #define CSHIFT_BONUS 2 59 #define CSHIFT_POWERUP 3 60 #define NUM_CSHIFTS 4 61 62 #define NAME_LENGTH 64 63 64 65 // 66 // client_state_t should hold all pieces of the client state 67 // 68 69 #define SIGNONS 4 // signon messages to receive before connected 70 71 #define MAX_DLIGHTS 32 72 typedef struct 73 { 74 vec3_t origin; 75 float radius; 76 float die; // stop lighting after this time 77 float decay; // drop this each second 78 float minlight; // don't add when contributing less 79 int key; 80 #ifdef QUAKE2 81 qboolean dark; // subtracts light instead of adding 82 #endif 83 } dlight_t; 84 85 86 #define MAX_BEAMS 24 87 typedef struct 88 { 89 int entity; 90 struct model_s *model; 91 float endtime; 92 vec3_t start, end; 93 } beam_t; 94 95 #define MAX_EFRAGS 640 96 97 #define MAX_MAPSTRING 2048 98 #define MAX_DEMOS 8 99 #define MAX_DEMONAME 16 100 101 typedef enum { 102 ca_dedicated, // a dedicated server with no ability to start a client 103 ca_disconnected, // full screen console with no connection 104 ca_connected, // valid netcon, talking to a server 105 cactive_t_max = 1 << 30 106 } cactive_t; 107 108 // 109 // the client_static_t structure is persistant through an arbitrary number 110 // of server connections 111 // 112 typedef struct 113 { 114 cactive_t state; 115 116 // personalization data sent to server 117 char mapstring[MAX_QPATH]; 118 char spawnparms[MAX_MAPSTRING]; // to restart a level 119 120 // demo loop control 121 int demonum; // -1 = don't play demos 122 char demos[MAX_DEMOS][MAX_DEMONAME]; // when not playing 123 124 // demo recording info must be here, because record is started before 125 // entering a map (and clearing client_state_t) 126 qboolean demorecording; 127 qboolean demoplayback; 128 qboolean timedemo; 129 int forcetrack; // -1 = use normal cd track 130 FILE *demofile; 131 int td_lastframe; // to meter out one message a frame 132 int td_startframe; // host_framecount at start 133 float td_starttime; // realtime at second frame of timedemo 134 135 136 // connection information 137 int signon; // 0 to SIGNONS 138 struct qsocket_s *netcon; 139 sizebuf_t message; // writing buffer to send to server 140 141 } client_static_t; 142 143 extern client_static_t cls; 144 145 // 146 // the client_state_t structure is wiped completely at every 147 // server signon 148 // 149 typedef struct 150 { 151 int movemessages; // since connecting to this server 152 // throw out the first couple, so the player 153 // doesn't accidentally do something the 154 // first frame 155 usercmd_t cmd; // last command sent to the server 156 157 // information for local display 158 int stats[MAX_CL_STATS]; // health, etc 159 int items; // inventory bit flags 160 float item_gettime[32]; // cl.time of aquiring item, for blinking 161 float faceanimtime; // use anim frame if cl.time < this 162 163 cshift_t cshifts[NUM_CSHIFTS]; // color shifts for damage, powerups 164 cshift_t prev_cshifts[NUM_CSHIFTS]; // and content types 165 166 // the client maintains its own idea of view angles, which are 167 // sent to the server each frame. The server sets punchangle when 168 // the view is temporarliy offset, and an angle reset commands at the start 169 // of each level and after teleporting. 170 vec3_t mviewangles[2]; // during demo playback viewangles is lerped 171 // between these 172 vec3_t viewangles; 173 174 vec3_t mvelocity[2]; // update by server, used for lean+bob 175 // (0 is newest) 176 vec3_t velocity; // lerped between mvelocity[0] and [1] 177 178 vec3_t punchangle; // temporary offset 179 180 // pitch drifting vars 181 float idealpitch; 182 float pitchvel; 183 qboolean nodrift; 184 float driftmove; 185 double laststop; 186 187 float viewheight; 188 float crouch; // local amount for smoothing stepups 189 190 qboolean paused; // send over by server 191 qboolean onground; 192 qboolean inwater; 193 194 int intermission; // don't change view angle, full screen, etc 195 int completed_time; // latched at intermission start 196 197 double mtime[2]; // the timestamp of last two messages 198 double time; // clients view of time, should be between 199 // servertime and oldservertime to generate 200 // a lerp point for other data 201 double oldtime; // previous cl.time, time-oldtime is used 202 // to decay light values and smooth step ups 203 204 205 float last_received_message; // (realtime) for net trouble icon 206 207 // 208 // information that is static for the entire time connected to a server 209 // 210 struct model_s *model_precache[MAX_MODELS]; 211 struct sfx_s *sound_precache[MAX_SOUNDS]; 212 213 char levelname[40]; // for display on solo scoreboard 214 int viewentity; // cl_entitites[cl.viewentity] = player 215 int maxclients; 216 int gametype; 217 218 // refresh related state 219 struct model_s *worldmodel; // cl_entitites[0].model 220 struct efrag_s *free_efrags; 221 int num_entities; // held in cl_entities array 222 int num_statics; // held in cl_staticentities array 223 entity_t viewent; // the gun model 224 225 int cdtrack, looptrack; // cd audio 226 227 // frag scoreboard 228 scoreboard_t *scores; // [cl.maxclients] 229 230 #ifdef QUAKE2 231 // light level at player's position including dlights 232 // this is sent back to the server each frame 233 // architectually ugly but it works 234 int light_level; 235 #endif 236 } client_state_t; 237 238 239 // 240 // cvars 241 // 242 extern cvar_t cl_name; 243 extern cvar_t cl_color; 244 245 extern cvar_t cl_upspeed; 246 extern cvar_t cl_forwardspeed; 247 extern cvar_t cl_backspeed; 248 extern cvar_t cl_sidespeed; 249 250 extern cvar_t cl_movespeedkey; 251 252 extern cvar_t cl_yawspeed; 253 extern cvar_t cl_pitchspeed; 254 255 extern cvar_t cl_anglespeedkey; 256 257 extern cvar_t cl_autofire; 258 259 extern cvar_t cl_shownet; 260 extern cvar_t cl_nolerp; 261 262 extern cvar_t cl_pitchdriftspeed; 263 extern cvar_t lookspring; 264 extern cvar_t lookstrafe; 265 extern cvar_t sensitivity; 266 267 extern cvar_t m_pitch; 268 extern cvar_t m_yaw; 269 extern cvar_t m_forward; 270 extern cvar_t m_side; 271 272 273 #define MAX_TEMP_ENTITIES 64 // lightning bolts, etc 274 #define MAX_STATIC_ENTITIES 128 // torches, etc 275 276 extern client_state_t cl; 277 278 // FIXME, allocate dynamically 279 extern efrag_t cl_efrags[MAX_EFRAGS]; 280 extern entity_t cl_entities[MAX_EDICTS]; 281 extern entity_t cl_static_entities[MAX_STATIC_ENTITIES]; 282 extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; 283 extern dlight_t cl_dlights[MAX_DLIGHTS]; 284 extern entity_t cl_temp_entities[MAX_TEMP_ENTITIES]; 285 extern beam_t cl_beams[MAX_BEAMS]; 286 287 //============================================================================= 288 289 // 290 // cl_main 291 // 292 dlight_t *CL_AllocDlight (int key); 293 void CL_DecayLights (void); 294 295 void CL_Init (void); 296 297 void CL_EstablishConnection (const char *host); 298 void CL_Signon1 (void); 299 void CL_Signon2 (void); 300 void CL_Signon3 (void); 301 void CL_Signon4 (void); 302 303 void CL_Disconnect (void); 304 void CL_Disconnect_f (void); 305 void CL_NextDemo (void); 306 307 #define MAX_VISEDICTS 256 308 extern int cl_numvisedicts; 309 extern entity_t *cl_visedicts[MAX_VISEDICTS]; 310 311 // 312 // cl_input 313 // 314 typedef struct 315 { 316 int down[2]; // key nums holding it down 317 int state; // low bit is down state 318 } kbutton_t; 319 320 extern kbutton_t in_mlook, in_klook; 321 extern kbutton_t in_strafe; 322 extern kbutton_t in_speed; 323 324 void CL_InitInput (void); 325 void CL_SendCmd (void); 326 void CL_SendMove (usercmd_t *cmd); 327 328 void CL_ParseTEnt (void); 329 void CL_UpdateTEnts (void); 330 331 void CL_ClearState (void); 332 333 334 int CL_ReadFromServer (void); 335 void CL_WriteToServer (usercmd_t *cmd); 336 void CL_BaseMove (usercmd_t *cmd); 337 338 339 float CL_KeyState (kbutton_t *key); 340 const char *Key_KeynumToString (int keynum); 341 342 // 343 // cl_demo.c 344 // 345 void CL_StopPlayback (void); 346 int CL_GetMessage (void); 347 348 void CL_Stop_f (void); 349 void CL_Record_f (void); 350 void CL_PlayDemo_f (void); 351 void CL_TimeDemo_f (void); 352 353 // 354 // cl_parse.c 355 // 356 void CL_ParseServerMessage (void); 357 void CL_NewTranslation (int slot); 358 359 // 360 // view 361 // 362 void V_StartPitchDrift (void); 363 void V_StopPitchDrift (void); 364 365 void V_RenderView (void); 366 void V_UpdatePalette (void); 367 void V_Register (void); 368 void V_ParseDamage (void); 369 void V_SetContentsColor (int contents); 370 371 372 // 373 // cl_tent 374 // 375 void CL_InitTEnts (void); 376 void CL_SignonReply (void); 377