|
|
1.1.1.4 ! root 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: */ 1.1 root 20: // cl_fx.c -- entity effects parsing and management 1.1.1.2 root 21: 1.1 root 22: #include "client.h" 1.1.1.2 root 23: 1.1 root 24: void CL_LogoutEffect (vec3_t org, int type); 25: void CL_ItemRespawnParticles (vec3_t org); 1.1.1.2 root 26: 1.1 root 27: static vec3_t avelocities [NUMVERTEXNORMALS]; 28: 29: extern struct model_s *cl_mod_smoke; 30: extern struct model_s *cl_mod_flash; 1.1.1.2 root 31: 1.1 root 32: /* 33: ============================================================== 1.1.1.2 root 34: 1.1 root 35: LIGHT STYLE MANAGEMENT 1.1.1.2 root 36: 1.1 root 37: ============================================================== 38: */ 1.1.1.2 root 39: 1.1 root 40: typedef struct 41: { 42: int length; 43: float value[3]; 44: float map[MAX_QPATH]; 45: } clightstyle_t; 1.1.1.2 root 46: 1.1 root 47: clightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; 48: int lastofs; 1.1.1.2 root 49: 1.1 root 50: /* 51: ================ 52: CL_ClearLightStyles 53: ================ 54: */ 55: void CL_ClearLightStyles (void) 56: { 57: memset (cl_lightstyle, 0, sizeof(cl_lightstyle)); 58: lastofs = -1; 59: } 1.1.1.2 root 60: 1.1 root 61: /* 62: ================ 63: CL_RunLightStyles 64: ================ 65: */ 66: void CL_RunLightStyles (void) 67: { 68: int ofs; 69: int i; 70: clightstyle_t *ls; 1.1.1.2 root 71: 1.1 root 72: ofs = cl.time / 100; 73: if (ofs == lastofs) 74: return; 75: lastofs = ofs; 1.1.1.2 root 76: 1.1 root 77: for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++) 78: { 79: if (!ls->length) 80: { 81: ls->value[0] = ls->value[1] = ls->value[2] = 1.0; 82: continue; 83: } 84: if (ls->length == 1) 85: ls->value[0] = ls->value[1] = ls->value[2] = ls->map[0]; 86: else 87: ls->value[0] = ls->value[1] = ls->value[2] = ls->map[ofs%ls->length]; 88: } 89: } 1.1.1.2 root 90: 91: 1.1 root 92: void CL_SetLightstyle (int i) 93: { 94: char *s; 95: int j, k; 1.1.1.2 root 96: 1.1 root 97: s = cl.configstrings[i+CS_LIGHTS]; 1.1.1.2 root 98: 1.1 root 99: j = strlen (s); 100: if (j >= MAX_QPATH) 101: Com_Error (ERR_DROP, "svc_lightstyle length=%i", j); 1.1.1.2 root 102: 1.1 root 103: cl_lightstyle[i].length = j; 1.1.1.2 root 104: 1.1 root 105: for (k=0 ; k<j ; k++) 106: cl_lightstyle[i].map[k] = (float)(s[k]-'a')/(float)('m'-'a'); 107: } 1.1.1.2 root 108: 1.1 root 109: /* 110: ================ 111: CL_AddLightStyles 112: ================ 113: */ 114: void CL_AddLightStyles (void) 115: { 116: int i; 117: clightstyle_t *ls; 1.1.1.2 root 118: 1.1 root 119: for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++) 120: V_AddLightStyle (i, ls->value[0], ls->value[1], ls->value[2]); 121: } 1.1.1.2 root 122: 1.1 root 123: /* 124: ============================================================== 1.1.1.2 root 125: 1.1 root 126: DLIGHT MANAGEMENT 1.1.1.2 root 127: 1.1 root 128: ============================================================== 129: */ 1.1.1.2 root 130: 1.1 root 131: cdlight_t cl_dlights[MAX_DLIGHTS]; 1.1.1.2 root 132: 1.1 root 133: /* 134: ================ 135: CL_ClearDlights 136: ================ 137: */ 138: void CL_ClearDlights (void) 139: { 140: memset (cl_dlights, 0, sizeof(cl_dlights)); 141: } 1.1.1.2 root 142: 1.1 root 143: /* 144: =============== 145: CL_AllocDlight 1.1.1.2 root 146: 1.1 root 147: =============== 148: */ 149: cdlight_t *CL_AllocDlight (int key) 150: { 151: int i; 152: cdlight_t *dl; 1.1.1.2 root 153: 1.1 root 154: // first look for an exact key match 155: if (key) 156: { 157: dl = cl_dlights; 158: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) 159: { 160: if (dl->key == key) 161: { 162: memset (dl, 0, sizeof(*dl)); 163: dl->key = key; 164: return dl; 165: } 166: } 167: } 1.1.1.2 root 168: 1.1 root 169: // then look for anything else 170: dl = cl_dlights; 171: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) 172: { 173: if (dl->die < cl.time) 174: { 175: memset (dl, 0, sizeof(*dl)); 176: dl->key = key; 177: return dl; 178: } 179: } 1.1.1.2 root 180: 1.1 root 181: dl = &cl_dlights[0]; 182: memset (dl, 0, sizeof(*dl)); 183: dl->key = key; 184: return dl; 185: } 1.1.1.2 root 186: 1.1 root 187: /* 188: =============== 189: CL_NewDlight 190: =============== 191: */ 192: void CL_NewDlight (int key, float x, float y, float z, float radius, float time) 193: { 194: cdlight_t *dl; 1.1.1.2 root 195: 1.1 root 196: dl = CL_AllocDlight (key); 197: dl->origin[0] = x; 198: dl->origin[1] = y; 199: dl->origin[2] = z; 200: dl->radius = radius; 201: dl->die = cl.time + time; 202: } 1.1.1.2 root 203: 204: 1.1 root 205: /* 206: =============== 207: CL_RunDLights 1.1.1.2 root 208: 1.1 root 209: =============== 210: */ 211: void CL_RunDLights (void) 212: { 213: int i; 214: cdlight_t *dl; 1.1.1.2 root 215: 1.1 root 216: dl = cl_dlights; 217: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) 218: { 219: if (!dl->radius) 220: continue; 221: 222: if (dl->die < cl.time) 223: { 224: dl->radius = 0; 225: return; 226: } 227: dl->radius -= cls.frametime*dl->decay; 228: if (dl->radius < 0) 229: dl->radius = 0; 230: } 231: } 1.1.1.2 root 232: 1.1 root 233: /* 234: ============== 235: CL_ParseMuzzleFlash 236: ============== 237: */ 238: void CL_ParseMuzzleFlash (void) 239: { 240: vec3_t fv, rv; 241: cdlight_t *dl; 242: int i, weapon; 243: centity_t *pl; 244: int silenced; 245: float volume; 246: char soundname[64]; 1.1.1.2 root 247: 1.1 root 248: i = MSG_ReadShort (&net_message); 249: if (i < 1 || i >= MAX_EDICTS) 250: Com_Error (ERR_DROP, "CL_ParseMuzzleFlash: bad entity"); 251: 252: weapon = MSG_ReadByte (&net_message); 253: silenced = weapon & MZ_SILENCED; 254: weapon &= ~MZ_SILENCED; 1.1.1.2 root 255: 1.1 root 256: pl = &cl_entities[i]; 1.1.1.2 root 257: 1.1 root 258: dl = CL_AllocDlight (i); 259: VectorCopy (pl->current.origin, dl->origin); 260: AngleVectors (pl->current.angles, fv, rv, NULL); 261: VectorMA (dl->origin, 18, fv, dl->origin); 262: VectorMA (dl->origin, 16, rv, dl->origin); 263: if (silenced) 264: dl->radius = 100 + (rand()&31); 265: else 266: dl->radius = 200 + (rand()&31); 267: dl->minlight = 32; 268: dl->die = cl.time; // + 0.1; 1.1.1.2 root 269: 1.1 root 270: if (silenced) 271: volume = 0.2; 272: else 273: volume = 1; 1.1.1.2 root 274: 1.1 root 275: switch (weapon) 276: { 277: case MZ_BLASTER: 278: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 279: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0); 280: break; 1.1.1.2 root 281: case MZ_BLUEHYPERBLASTER: 282: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1; 283: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0); 284: break; 1.1 root 285: case MZ_HYPERBLASTER: 286: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 287: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0); 288: break; 289: case MZ_MACHINEGUN: 290: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 291: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 292: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); 293: break; 294: case MZ_SHOTGUN: 295: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 296: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotgf1b.wav"), volume, ATTN_NORM, 0); 297: S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/shotgr1b.wav"), volume, ATTN_NORM, 0.1); 298: break; 299: case MZ_SSHOTGUN: 300: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 301: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/sshotf1b.wav"), volume, ATTN_NORM, 0); 302: break; 303: case MZ_CHAINGUN1: 304: dl->radius = 200 + (rand()&31); 305: dl->color[0] = 1;dl->color[1] = 0.25;dl->color[2] = 0; 306: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 307: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); 308: break; 309: case MZ_CHAINGUN2: 310: dl->radius = 225 + (rand()&31); 311: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; 312: dl->die = cl.time + 0.1; // long delay 313: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 314: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); 315: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 316: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.05); 317: break; 318: case MZ_CHAINGUN3: 319: dl->radius = 250 + (rand()&31); 320: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 321: dl->die = cl.time + 0.1; // long delay 322: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 323: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); 324: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 325: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.033); 326: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); 327: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.066); 328: break; 329: case MZ_RAILGUN: 330: dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0; 331: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/railgf1a.wav"), volume, ATTN_NORM, 0); 332: break; 333: case MZ_ROCKET: 334: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2; 335: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rocklf1a.wav"), volume, ATTN_NORM, 0); 336: S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/rocklr1b.wav"), volume, ATTN_NORM, 0.1); 337: break; 338: case MZ_GRENADE: 339: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; 340: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), volume, ATTN_NORM, 0); 341: S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/grenlr1b.wav"), volume, ATTN_NORM, 0.1); 342: break; 343: case MZ_BFG: 344: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; 345: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__f1y.wav"), volume, ATTN_NORM, 0); 346: break; 1.1.1.2 root 347: 1.1 root 348: case MZ_LOGIN: 349: dl->color[0] = 0;dl->color[1] = 1; dl->color[2] = 0; 350: dl->die = cl.time + 1.0; 351: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); 352: CL_LogoutEffect (pl->current.origin, weapon); 353: break; 354: case MZ_LOGOUT: 355: dl->color[0] = 1;dl->color[1] = 0; dl->color[2] = 0; 356: dl->die = cl.time + 1.0; 357: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); 358: CL_LogoutEffect (pl->current.origin, weapon); 359: break; 360: case MZ_RESPAWN: 361: dl->color[0] = 1;dl->color[1] = 1; dl->color[2] = 0; 362: dl->die = cl.time + 1.0; 363: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); 364: CL_LogoutEffect (pl->current.origin, weapon); 365: break; 1.1.1.2 root 366: // RAFAEL 367: case MZ_PHALANX: 368: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5; 369: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/plasshot.wav"), volume, ATTN_NORM, 0); 370: break; 371: // RAFAEL 372: case MZ_IONRIPPER: 373: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5; 374: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rippfire.wav"), volume, ATTN_NORM, 0); 375: break; 1.1.1.3 root 376: 377: // ====================== 378: // PGM 379: case MZ_ETF_RIFLE: 380: dl->color[0] = 0.9;dl->color[1] = 0.7;dl->color[2] = 0; 381: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/nail1.wav"), volume, ATTN_NORM, 0); 382: break; 383: case MZ_SHOTGUN2: 384: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 385: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotg2.wav"), volume, ATTN_NORM, 0); 386: break; 387: case MZ_HEATBEAM: 388: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 389: dl->die = cl.time + 100; 390: // S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__l1a.wav"), volume, ATTN_NORM, 0); 391: break; 392: case MZ_BLASTER2: 393: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; 394: // FIXME - different sound for blaster2 ?? 395: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0); 396: break; 397: case MZ_TRACKER: 398: // negative flashes handled the same in gl/soft until CL_AddDLights 399: dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1; 400: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), volume, ATTN_NORM, 0); 401: break; 402: case MZ_NUKE1: 403: dl->color[0] = 1;dl->color[1] = 0;dl->color[2] = 0; 404: dl->die = cl.time + 100; 405: break; 406: case MZ_NUKE2: 407: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 408: dl->die = cl.time + 100; 409: break; 410: case MZ_NUKE4: 411: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1; 412: dl->die = cl.time + 100; 413: break; 414: case MZ_NUKE8: 415: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 1; 416: dl->die = cl.time + 100; 417: break; 418: // PGM 419: // ====================== 1.1 root 420: } 421: } 1.1.1.2 root 422: 423: 1.1 root 424: /* 425: ============== 426: CL_ParseMuzzleFlash2 427: ============== 428: */ 1.1.1.3 root 429: void CL_ParseMuzzleFlash2 (void) 1.1 root 430: { 431: int ent; 432: vec3_t origin; 433: int flash_number; 434: cdlight_t *dl; 435: vec3_t forward, right; 436: char soundname[64]; 1.1.1.2 root 437: 1.1 root 438: ent = MSG_ReadShort (&net_message); 439: if (ent < 1 || ent >= MAX_EDICTS) 440: Com_Error (ERR_DROP, "CL_ParseMuzzleFlash2: bad entity"); 1.1.1.2 root 441: 1.1 root 442: flash_number = MSG_ReadByte (&net_message); 1.1.1.2 root 443: 1.1 root 444: // locate the origin 445: AngleVectors (cl_entities[ent].current.angles, forward, right, NULL); 446: origin[0] = cl_entities[ent].current.origin[0] + forward[0] * monster_flash_offset[flash_number][0] + right[0] * monster_flash_offset[flash_number][1]; 447: origin[1] = cl_entities[ent].current.origin[1] + forward[1] * monster_flash_offset[flash_number][0] + right[1] * monster_flash_offset[flash_number][1]; 448: origin[2] = cl_entities[ent].current.origin[2] + forward[2] * monster_flash_offset[flash_number][0] + right[2] * monster_flash_offset[flash_number][1] + monster_flash_offset[flash_number][2]; 1.1.1.2 root 449: 1.1 root 450: dl = CL_AllocDlight (ent); 451: VectorCopy (origin, dl->origin); 452: dl->radius = 200 + (rand()&31); 453: dl->minlight = 32; 454: dl->die = cl.time; // + 0.1; 1.1.1.2 root 455: 1.1 root 456: switch (flash_number) 457: { 458: case MZ2_INFANTRY_MACHINEGUN_1: 459: case MZ2_INFANTRY_MACHINEGUN_2: 460: case MZ2_INFANTRY_MACHINEGUN_3: 461: case MZ2_INFANTRY_MACHINEGUN_4: 462: case MZ2_INFANTRY_MACHINEGUN_5: 463: case MZ2_INFANTRY_MACHINEGUN_6: 464: case MZ2_INFANTRY_MACHINEGUN_7: 465: case MZ2_INFANTRY_MACHINEGUN_8: 466: case MZ2_INFANTRY_MACHINEGUN_9: 467: case MZ2_INFANTRY_MACHINEGUN_10: 468: case MZ2_INFANTRY_MACHINEGUN_11: 469: case MZ2_INFANTRY_MACHINEGUN_12: 470: case MZ2_INFANTRY_MACHINEGUN_13: 471: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 472: CL_ParticleEffect (origin, vec3_origin, 0, 40); 473: CL_SmokeAndFlash(origin); 474: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0); 475: break; 1.1.1.2 root 476: 1.1 root 477: case MZ2_SOLDIER_MACHINEGUN_1: 478: case MZ2_SOLDIER_MACHINEGUN_2: 479: case MZ2_SOLDIER_MACHINEGUN_3: 480: case MZ2_SOLDIER_MACHINEGUN_4: 481: case MZ2_SOLDIER_MACHINEGUN_5: 482: case MZ2_SOLDIER_MACHINEGUN_6: 483: case MZ2_SOLDIER_MACHINEGUN_7: 484: case MZ2_SOLDIER_MACHINEGUN_8: 485: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 486: CL_ParticleEffect (origin, vec3_origin, 0, 40); 487: CL_SmokeAndFlash(origin); 488: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck3.wav"), 1, ATTN_NORM, 0); 489: break; 1.1.1.2 root 490: 1.1 root 491: case MZ2_GUNNER_MACHINEGUN_1: 492: case MZ2_GUNNER_MACHINEGUN_2: 493: case MZ2_GUNNER_MACHINEGUN_3: 494: case MZ2_GUNNER_MACHINEGUN_4: 495: case MZ2_GUNNER_MACHINEGUN_5: 496: case MZ2_GUNNER_MACHINEGUN_6: 497: case MZ2_GUNNER_MACHINEGUN_7: 498: case MZ2_GUNNER_MACHINEGUN_8: 499: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 500: CL_ParticleEffect (origin, vec3_origin, 0, 40); 501: CL_SmokeAndFlash(origin); 502: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck2.wav"), 1, ATTN_NORM, 0); 503: break; 1.1.1.2 root 504: 1.1 root 505: case MZ2_ACTOR_MACHINEGUN_1: 506: case MZ2_SUPERTANK_MACHINEGUN_1: 507: case MZ2_SUPERTANK_MACHINEGUN_2: 508: case MZ2_SUPERTANK_MACHINEGUN_3: 509: case MZ2_SUPERTANK_MACHINEGUN_4: 510: case MZ2_SUPERTANK_MACHINEGUN_5: 511: case MZ2_SUPERTANK_MACHINEGUN_6: 1.1.1.3 root 512: case MZ2_TURRET_MACHINEGUN: // PGM 1.1 root 513: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 514: 515: CL_ParticleEffect (origin, vec3_origin, 0, 40); 516: CL_SmokeAndFlash(origin); 517: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0); 518: break; 519: 520: case MZ2_BOSS2_MACHINEGUN_L1: 521: case MZ2_BOSS2_MACHINEGUN_L2: 522: case MZ2_BOSS2_MACHINEGUN_L3: 523: case MZ2_BOSS2_MACHINEGUN_L4: 524: case MZ2_BOSS2_MACHINEGUN_L5: 1.1.1.3 root 525: case MZ2_CARRIER_MACHINEGUN_L1: // PMM 526: case MZ2_CARRIER_MACHINEGUN_L2: // PMM 1.1 root 527: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 1.1.1.2 root 528: 1.1 root 529: CL_ParticleEffect (origin, vec3_origin, 0, 40); 530: CL_SmokeAndFlash(origin); 531: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NONE, 0); 532: break; 1.1.1.2 root 533: 1.1 root 534: case MZ2_SOLDIER_BLASTER_1: 535: case MZ2_SOLDIER_BLASTER_2: 536: case MZ2_SOLDIER_BLASTER_3: 537: case MZ2_SOLDIER_BLASTER_4: 538: case MZ2_SOLDIER_BLASTER_5: 539: case MZ2_SOLDIER_BLASTER_6: 540: case MZ2_SOLDIER_BLASTER_7: 541: case MZ2_SOLDIER_BLASTER_8: 1.1.1.3 root 542: case MZ2_TURRET_BLASTER: // PGM 1.1 root 543: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 544: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck2.wav"), 1, ATTN_NORM, 0); 545: break; 1.1.1.2 root 546: 1.1 root 547: case MZ2_FLYER_BLASTER_1: 548: case MZ2_FLYER_BLASTER_2: 549: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 550: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("flyer/flyatck3.wav"), 1, ATTN_NORM, 0); 551: break; 1.1.1.2 root 552: 1.1 root 553: case MZ2_MEDIC_BLASTER_1: 554: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 555: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("medic/medatck1.wav"), 1, ATTN_NORM, 0); 556: break; 557: 558: case MZ2_HOVER_BLASTER_1: 559: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 560: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("hover/hovatck1.wav"), 1, ATTN_NORM, 0); 561: break; 562: 563: case MZ2_FLOAT_BLASTER_1: 564: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 565: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("floater/fltatck1.wav"), 1, ATTN_NORM, 0); 566: break; 1.1.1.2 root 567: 1.1 root 568: case MZ2_SOLDIER_SHOTGUN_1: 569: case MZ2_SOLDIER_SHOTGUN_2: 570: case MZ2_SOLDIER_SHOTGUN_3: 571: case MZ2_SOLDIER_SHOTGUN_4: 572: case MZ2_SOLDIER_SHOTGUN_5: 573: case MZ2_SOLDIER_SHOTGUN_6: 574: case MZ2_SOLDIER_SHOTGUN_7: 575: case MZ2_SOLDIER_SHOTGUN_8: 576: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 577: CL_SmokeAndFlash(origin); 578: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck1.wav"), 1, ATTN_NORM, 0); 579: break; 1.1.1.2 root 580: 1.1 root 581: case MZ2_TANK_BLASTER_1: 582: case MZ2_TANK_BLASTER_2: 583: case MZ2_TANK_BLASTER_3: 584: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 585: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck3.wav"), 1, ATTN_NORM, 0); 586: break; 1.1.1.2 root 587: 1.1 root 588: case MZ2_TANK_MACHINEGUN_1: 589: case MZ2_TANK_MACHINEGUN_2: 590: case MZ2_TANK_MACHINEGUN_3: 591: case MZ2_TANK_MACHINEGUN_4: 592: case MZ2_TANK_MACHINEGUN_5: 593: case MZ2_TANK_MACHINEGUN_6: 594: case MZ2_TANK_MACHINEGUN_7: 595: case MZ2_TANK_MACHINEGUN_8: 596: case MZ2_TANK_MACHINEGUN_9: 597: case MZ2_TANK_MACHINEGUN_10: 598: case MZ2_TANK_MACHINEGUN_11: 599: case MZ2_TANK_MACHINEGUN_12: 600: case MZ2_TANK_MACHINEGUN_13: 601: case MZ2_TANK_MACHINEGUN_14: 602: case MZ2_TANK_MACHINEGUN_15: 603: case MZ2_TANK_MACHINEGUN_16: 604: case MZ2_TANK_MACHINEGUN_17: 605: case MZ2_TANK_MACHINEGUN_18: 606: case MZ2_TANK_MACHINEGUN_19: 607: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 608: CL_ParticleEffect (origin, vec3_origin, 0, 40); 609: CL_SmokeAndFlash(origin); 610: Com_sprintf(soundname, sizeof(soundname), "tank/tnkatk2%c.wav", 'a' + rand() % 5); 611: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound(soundname), 1, ATTN_NORM, 0); 612: break; 1.1.1.2 root 613: 1.1 root 614: case MZ2_CHICK_ROCKET_1: 1.1.1.3 root 615: case MZ2_TURRET_ROCKET: // PGM 1.1 root 616: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2; 617: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("chick/chkatck2.wav"), 1, ATTN_NORM, 0); 618: break; 1.1.1.2 root 619: 1.1 root 620: case MZ2_TANK_ROCKET_1: 621: case MZ2_TANK_ROCKET_2: 622: case MZ2_TANK_ROCKET_3: 623: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2; 624: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck1.wav"), 1, ATTN_NORM, 0); 625: break; 1.1.1.2 root 626: 1.1 root 627: case MZ2_SUPERTANK_ROCKET_1: 628: case MZ2_SUPERTANK_ROCKET_2: 629: case MZ2_SUPERTANK_ROCKET_3: 630: case MZ2_BOSS2_ROCKET_1: 631: case MZ2_BOSS2_ROCKET_2: 632: case MZ2_BOSS2_ROCKET_3: 633: case MZ2_BOSS2_ROCKET_4: 1.1.1.3 root 634: case MZ2_CARRIER_ROCKET_1: 635: // case MZ2_CARRIER_ROCKET_2: 636: // case MZ2_CARRIER_ROCKET_3: 637: // case MZ2_CARRIER_ROCKET_4: 1.1 root 638: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2; 639: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/rocket.wav"), 1, ATTN_NORM, 0); 640: break; 1.1.1.2 root 641: 1.1 root 642: case MZ2_GUNNER_GRENADE_1: 643: case MZ2_GUNNER_GRENADE_2: 644: case MZ2_GUNNER_GRENADE_3: 645: case MZ2_GUNNER_GRENADE_4: 646: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; 647: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck3.wav"), 1, ATTN_NORM, 0); 648: break; 1.1.1.2 root 649: 1.1 root 650: case MZ2_GLADIATOR_RAILGUN_1: 1.1.1.3 root 651: // PMM 652: case MZ2_CARRIER_RAILGUN: 653: case MZ2_WIDOW_RAIL: 654: // pmm 1.1 root 655: dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0; 656: break; 657: 658: // --- Xian's shit starts --- 659: case MZ2_MAKRON_BFG: 660: dl->color[0] = 0.5;dl->color[1] = 1 ;dl->color[2] = 0.5; 661: //S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("makron/bfg_fire.wav"), 1, ATTN_NORM, 0); 662: break; 663: 664: case MZ2_MAKRON_BLASTER_1: 665: case MZ2_MAKRON_BLASTER_2: 666: case MZ2_MAKRON_BLASTER_3: 667: case MZ2_MAKRON_BLASTER_4: 668: case MZ2_MAKRON_BLASTER_5: 669: case MZ2_MAKRON_BLASTER_6: 670: case MZ2_MAKRON_BLASTER_7: 671: case MZ2_MAKRON_BLASTER_8: 672: case MZ2_MAKRON_BLASTER_9: 673: case MZ2_MAKRON_BLASTER_10: 674: case MZ2_MAKRON_BLASTER_11: 675: case MZ2_MAKRON_BLASTER_12: 676: case MZ2_MAKRON_BLASTER_13: 677: case MZ2_MAKRON_BLASTER_14: 678: case MZ2_MAKRON_BLASTER_15: 679: case MZ2_MAKRON_BLASTER_16: 680: case MZ2_MAKRON_BLASTER_17: 681: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 682: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("makron/blaster.wav"), 1, ATTN_NORM, 0); 683: break; 684: 685: case MZ2_JORG_MACHINEGUN_L1: 686: case MZ2_JORG_MACHINEGUN_L2: 687: case MZ2_JORG_MACHINEGUN_L3: 688: case MZ2_JORG_MACHINEGUN_L4: 689: case MZ2_JORG_MACHINEGUN_L5: 690: case MZ2_JORG_MACHINEGUN_L6: 691: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 692: CL_ParticleEffect (origin, vec3_origin, 0, 40); 693: CL_SmokeAndFlash(origin); 694: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("boss3/xfire.wav"), 1, ATTN_NORM, 0); 695: break; 696: 697: case MZ2_JORG_MACHINEGUN_R1: 698: case MZ2_JORG_MACHINEGUN_R2: 699: case MZ2_JORG_MACHINEGUN_R3: 700: case MZ2_JORG_MACHINEGUN_R4: 701: case MZ2_JORG_MACHINEGUN_R5: 702: case MZ2_JORG_MACHINEGUN_R6: 703: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 704: CL_ParticleEffect (origin, vec3_origin, 0, 40); 705: CL_SmokeAndFlash(origin); 706: break; 707: 708: case MZ2_JORG_BFG_1: 709: dl->color[0] = 0.5;dl->color[1] = 1 ;dl->color[2] = 0.5; 710: break; 711: 712: case MZ2_BOSS2_MACHINEGUN_R1: 713: case MZ2_BOSS2_MACHINEGUN_R2: 714: case MZ2_BOSS2_MACHINEGUN_R3: 715: case MZ2_BOSS2_MACHINEGUN_R4: 716: case MZ2_BOSS2_MACHINEGUN_R5: 1.1.1.3 root 717: case MZ2_CARRIER_MACHINEGUN_R1: // PMM 718: case MZ2_CARRIER_MACHINEGUN_R2: // PMM 719: 1.1 root 720: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 721: 722: CL_ParticleEffect (origin, vec3_origin, 0, 40); 723: CL_SmokeAndFlash(origin); 724: break; 725: 1.1.1.3 root 726: // ====== 727: // ROGUE 728: case MZ2_STALKER_BLASTER: 729: case MZ2_DAEDALUS_BLASTER: 730: case MZ2_MEDIC_BLASTER_2: 731: case MZ2_WIDOW_BLASTER: 732: case MZ2_WIDOW_BLASTER_SWEEP1: 733: case MZ2_WIDOW_BLASTER_SWEEP2: 734: case MZ2_WIDOW_BLASTER_SWEEP3: 735: case MZ2_WIDOW_BLASTER_SWEEP4: 736: case MZ2_WIDOW_BLASTER_SWEEP5: 737: case MZ2_WIDOW_BLASTER_SWEEP6: 738: case MZ2_WIDOW_BLASTER_SWEEP7: 739: case MZ2_WIDOW_BLASTER_SWEEP8: 740: case MZ2_WIDOW_BLASTER_SWEEP9: 741: case MZ2_WIDOW_BLASTER_100: 742: case MZ2_WIDOW_BLASTER_90: 743: case MZ2_WIDOW_BLASTER_80: 744: case MZ2_WIDOW_BLASTER_70: 745: case MZ2_WIDOW_BLASTER_60: 746: case MZ2_WIDOW_BLASTER_50: 747: case MZ2_WIDOW_BLASTER_40: 748: case MZ2_WIDOW_BLASTER_30: 749: case MZ2_WIDOW_BLASTER_20: 750: case MZ2_WIDOW_BLASTER_10: 751: case MZ2_WIDOW_BLASTER_0: 752: case MZ2_WIDOW_BLASTER_10L: 753: case MZ2_WIDOW_BLASTER_20L: 754: case MZ2_WIDOW_BLASTER_30L: 755: case MZ2_WIDOW_BLASTER_40L: 756: case MZ2_WIDOW_BLASTER_50L: 757: case MZ2_WIDOW_BLASTER_60L: 758: case MZ2_WIDOW_BLASTER_70L: 759: case MZ2_WIDOW_RUN_1: 760: case MZ2_WIDOW_RUN_2: 761: case MZ2_WIDOW_RUN_3: 762: case MZ2_WIDOW_RUN_4: 763: case MZ2_WIDOW_RUN_5: 764: case MZ2_WIDOW_RUN_6: 765: case MZ2_WIDOW_RUN_7: 766: case MZ2_WIDOW_RUN_8: 767: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; 768: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck3.wav"), 1, ATTN_NORM, 0); 769: break; 1.1 root 770: 1.1.1.3 root 771: case MZ2_WIDOW_DISRUPTOR: 772: dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1; 773: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), 1, ATTN_NORM, 0); 774: break; 775: 776: case MZ2_WIDOW_PLASMABEAM: 777: case MZ2_WIDOW2_BEAMER_1: 778: case MZ2_WIDOW2_BEAMER_2: 779: case MZ2_WIDOW2_BEAMER_3: 780: case MZ2_WIDOW2_BEAMER_4: 781: case MZ2_WIDOW2_BEAMER_5: 782: case MZ2_WIDOW2_BEAM_SWEEP_1: 783: case MZ2_WIDOW2_BEAM_SWEEP_2: 784: case MZ2_WIDOW2_BEAM_SWEEP_3: 785: case MZ2_WIDOW2_BEAM_SWEEP_4: 786: case MZ2_WIDOW2_BEAM_SWEEP_5: 787: case MZ2_WIDOW2_BEAM_SWEEP_6: 788: case MZ2_WIDOW2_BEAM_SWEEP_7: 789: case MZ2_WIDOW2_BEAM_SWEEP_8: 790: case MZ2_WIDOW2_BEAM_SWEEP_9: 791: case MZ2_WIDOW2_BEAM_SWEEP_10: 792: case MZ2_WIDOW2_BEAM_SWEEP_11: 793: dl->radius = 300 + (rand()&100); 794: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 795: dl->die = cl.time + 200; 796: break; 797: // ROGUE 798: // ====== 1.1 root 799: 800: // --- Xian's shit ends --- 1.1.1.2 root 801: 1.1 root 802: } 803: } 1.1.1.2 root 804: 805: 1.1 root 806: /* 807: =============== 808: CL_AddDLights 1.1.1.2 root 809: 1.1 root 810: =============== 811: */ 812: void CL_AddDLights (void) 813: { 814: int i; 815: cdlight_t *dl; 1.1.1.2 root 816: 1.1 root 817: dl = cl_dlights; 1.1.1.3 root 818: 819: //===== 820: //PGM 821: if(vidref_val == VIDREF_GL) 822: { 823: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) 824: { 825: if (!dl->radius) 826: continue; 827: V_AddLight (dl->origin, dl->radius, 828: dl->color[0], dl->color[1], dl->color[2]); 829: } 830: } 831: else 1.1 root 832: { 1.1.1.3 root 833: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) 834: { 835: if (!dl->radius) 836: continue; 837: 838: // negative light in software. only black allowed 839: if ((dl->color[0] < 0) || (dl->color[1] < 0) || (dl->color[2] < 0)) 840: { 841: dl->radius = -(dl->radius); 842: dl->color[0] = 1; 843: dl->color[1] = 1; 844: dl->color[2] = 1; 845: } 846: V_AddLight (dl->origin, dl->radius, 847: dl->color[0], dl->color[1], dl->color[2]); 848: } 1.1 root 849: } 1.1.1.3 root 850: //PGM 851: //===== 1.1 root 852: } 1.1.1.2 root 853: 854: 855: 1.1 root 856: /* 857: ============================================================== 1.1.1.2 root 858: 1.1 root 859: PARTICLE MANAGEMENT 1.1.1.2 root 860: 1.1 root 861: ============================================================== 862: */ 1.1.1.2 root 863: 1.1.1.3 root 864: /* 865: // THIS HAS BEEN RELOCATED TO CLIENT.H 1.1 root 866: typedef struct particle_s 867: { 868: struct particle_s *next; 1.1.1.2 root 869: 1.1 root 870: float time; 1.1.1.2 root 871: 1.1 root 872: vec3_t org; 873: vec3_t vel; 874: vec3_t accel; 875: float color; 876: float colorvel; 877: float alpha; 878: float alphavel; 879: } cparticle_t; 1.1.1.2 root 880: 881: 1.1 root 882: #define PARTICLE_GRAVITY 40 1.1.1.3 root 883: */ 1.1.1.2 root 884: 1.1 root 885: cparticle_t *active_particles, *free_particles; 1.1.1.2 root 886: 1.1 root 887: cparticle_t particles[MAX_PARTICLES]; 888: int cl_numparticles = MAX_PARTICLES; 1.1.1.2 root 889: 890: 1.1 root 891: /* 892: =============== 893: CL_ClearParticles 894: =============== 895: */ 896: void CL_ClearParticles (void) 897: { 898: int i; 899: 900: free_particles = &particles[0]; 901: active_particles = NULL; 1.1.1.2 root 902: 1.1 root 903: for (i=0 ;i<cl_numparticles ; i++) 904: particles[i].next = &particles[i+1]; 905: particles[cl_numparticles-1].next = NULL; 906: } 1.1.1.2 root 907: 908: 1.1 root 909: /* 910: =============== 911: CL_ParticleEffect 1.1.1.2 root 912: 1.1 root 913: Wall impact puffs 914: =============== 915: */ 916: void CL_ParticleEffect (vec3_t org, vec3_t dir, int color, int count) 917: { 918: int i, j; 919: cparticle_t *p; 920: float d; 1.1.1.2 root 921: 1.1 root 922: for (i=0 ; i<count ; i++) 923: { 924: if (!free_particles) 925: return; 926: p = free_particles; 927: free_particles = p->next; 928: p->next = active_particles; 929: active_particles = p; 1.1.1.2 root 930: 1.1 root 931: p->time = cl.time; 932: p->color = color + (rand()&7); 1.1.1.2 root 933: 1.1 root 934: d = rand()&31; 935: for (j=0 ; j<3 ; j++) 936: { 937: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j]; 938: p->vel[j] = crand()*20; 939: } 1.1.1.2 root 940: 1.1 root 941: p->accel[0] = p->accel[1] = 0; 942: p->accel[2] = -PARTICLE_GRAVITY; 943: p->alpha = 1.0; 1.1.1.2 root 944: 1.1 root 945: p->alphavel = -1.0 / (0.5 + frand()*0.3); 946: } 947: } 1.1.1.2 root 948: 949: 1.1 root 950: /* 951: =============== 952: CL_ParticleEffect2 953: =============== 954: */ 955: void CL_ParticleEffect2 (vec3_t org, vec3_t dir, int color, int count) 956: { 957: int i, j; 958: cparticle_t *p; 959: float d; 960: 961: for (i=0 ; i<count ; i++) 962: { 963: if (!free_particles) 964: return; 965: p = free_particles; 966: free_particles = p->next; 967: p->next = active_particles; 968: active_particles = p; 969: 970: p->time = cl.time; 971: p->color = color; 972: 973: d = rand()&7; 974: for (j=0 ; j<3 ; j++) 975: { 976: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j]; 977: p->vel[j] = crand()*20; 978: } 979: 980: p->accel[0] = p->accel[1] = 0; 981: p->accel[2] = -PARTICLE_GRAVITY; 982: p->alpha = 1.0; 983: 984: p->alphavel = -1.0 / (0.5 + frand()*0.3); 985: } 986: } 987: 1.1.1.2 root 988: 989: // RAFAEL 990: /* 991: =============== 992: CL_ParticleEffect3 993: =============== 994: */ 995: void CL_ParticleEffect3 (vec3_t org, vec3_t dir, int color, int count) 996: { 997: int i, j; 998: cparticle_t *p; 999: float d; 1000: 1001: for (i=0 ; i<count ; i++) 1002: { 1003: if (!free_particles) 1004: return; 1005: p = free_particles; 1006: free_particles = p->next; 1007: p->next = active_particles; 1008: active_particles = p; 1009: 1010: p->time = cl.time; 1011: p->color = color; 1012: 1013: d = rand()&7; 1014: for (j=0 ; j<3 ; j++) 1015: { 1016: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j]; 1017: p->vel[j] = crand()*20; 1018: } 1019: 1020: p->accel[0] = p->accel[1] = 0; 1021: p->accel[2] = PARTICLE_GRAVITY; 1022: p->alpha = 1.0; 1023: 1024: p->alphavel = -1.0 / (0.5 + frand()*0.3); 1025: } 1026: } 1027: 1.1 root 1028: /* 1029: =============== 1030: CL_TeleporterParticles 1031: =============== 1032: */ 1033: void CL_TeleporterParticles (entity_state_t *ent) 1034: { 1035: int i, j; 1036: cparticle_t *p; 1037: 1038: for (i=0 ; i<8 ; i++) 1039: { 1040: if (!free_particles) 1041: return; 1042: p = free_particles; 1043: free_particles = p->next; 1044: p->next = active_particles; 1045: active_particles = p; 1046: 1047: p->time = cl.time; 1048: p->color = 0xdb; 1049: 1050: for (j=0 ; j<2 ; j++) 1051: { 1052: p->org[j] = ent->origin[j] - 16 + (rand()&31); 1053: p->vel[j] = crand()*14; 1054: } 1055: 1056: p->org[2] = ent->origin[2] - 8 + (rand()&7); 1057: p->vel[2] = 80 + (rand()&7); 1058: 1059: p->accel[0] = p->accel[1] = 0; 1060: p->accel[2] = -PARTICLE_GRAVITY; 1061: p->alpha = 1.0; 1062: 1063: p->alphavel = -0.5; 1064: } 1065: } 1066: 1.1.1.2 root 1067: 1.1 root 1068: /* 1069: =============== 1070: CL_LogoutEffect 1.1.1.2 root 1071: 1.1 root 1072: =============== 1073: */ 1074: void CL_LogoutEffect (vec3_t org, int type) 1075: { 1076: int i, j; 1077: cparticle_t *p; 1.1.1.2 root 1078: 1.1 root 1079: for (i=0 ; i<500 ; i++) 1080: { 1081: if (!free_particles) 1082: return; 1083: p = free_particles; 1084: free_particles = p->next; 1085: p->next = active_particles; 1086: active_particles = p; 1.1.1.2 root 1087: 1.1 root 1088: p->time = cl.time; 1.1.1.2 root 1089: 1.1 root 1090: if (type == MZ_LOGIN) 1091: p->color = 0xd0 + (rand()&7); // green 1092: else if (type == MZ_LOGOUT) 1093: p->color = 0x40 + (rand()&7); // red 1094: else 1095: p->color = 0xe0 + (rand()&7); // yellow 1.1.1.2 root 1096: 1.1 root 1097: p->org[0] = org[0] - 16 + frand()*32; 1098: p->org[1] = org[1] - 16 + frand()*32; 1099: p->org[2] = org[2] - 24 + frand()*56; 1.1.1.2 root 1100: 1.1 root 1101: for (j=0 ; j<3 ; j++) 1102: p->vel[j] = crand()*20; 1.1.1.2 root 1103: 1.1 root 1104: p->accel[0] = p->accel[1] = 0; 1105: p->accel[2] = -PARTICLE_GRAVITY; 1106: p->alpha = 1.0; 1.1.1.2 root 1107: 1.1 root 1108: p->alphavel = -1.0 / (1.0 + frand()*0.3); 1109: } 1110: } 1.1.1.2 root 1111: 1112: 1.1 root 1113: /* 1114: =============== 1115: CL_ItemRespawnParticles 1.1.1.2 root 1116: 1.1 root 1117: =============== 1118: */ 1119: void CL_ItemRespawnParticles (vec3_t org) 1120: { 1121: int i, j; 1122: cparticle_t *p; 1.1.1.2 root 1123: 1.1 root 1124: for (i=0 ; i<64 ; i++) 1125: { 1126: if (!free_particles) 1127: return; 1128: p = free_particles; 1129: free_particles = p->next; 1130: p->next = active_particles; 1131: active_particles = p; 1.1.1.2 root 1132: 1.1 root 1133: p->time = cl.time; 1.1.1.2 root 1134: 1.1 root 1135: p->color = 0xd4 + (rand()&3); // green 1.1.1.2 root 1136: 1.1 root 1137: p->org[0] = org[0] + crand()*8; 1138: p->org[1] = org[1] + crand()*8; 1139: p->org[2] = org[2] + crand()*8; 1.1.1.2 root 1140: 1.1 root 1141: for (j=0 ; j<3 ; j++) 1142: p->vel[j] = crand()*8; 1.1.1.2 root 1143: 1.1 root 1144: p->accel[0] = p->accel[1] = 0; 1145: p->accel[2] = -PARTICLE_GRAVITY*0.2; 1146: p->alpha = 1.0; 1.1.1.2 root 1147: 1.1 root 1148: p->alphavel = -1.0 / (1.0 + frand()*0.3); 1149: } 1150: } 1.1.1.2 root 1151: 1152: 1.1 root 1153: /* 1154: =============== 1155: CL_ExplosionParticles 1156: =============== 1157: */ 1158: void CL_ExplosionParticles (vec3_t org) 1159: { 1160: int i, j; 1161: cparticle_t *p; 1162: 1163: for (i=0 ; i<256 ; i++) 1164: { 1165: if (!free_particles) 1166: return; 1167: p = free_particles; 1168: free_particles = p->next; 1169: p->next = active_particles; 1170: active_particles = p; 1171: 1172: p->time = cl.time; 1173: p->color = 0xe0 + (rand()&7); 1174: 1175: for (j=0 ; j<3 ; j++) 1176: { 1177: p->org[j] = org[j] + ((rand()%32)-16); 1178: p->vel[j] = (rand()%384)-192; 1179: } 1180: 1181: p->accel[0] = p->accel[1] = 0; 1182: p->accel[2] = -PARTICLE_GRAVITY; 1183: p->alpha = 1.0; 1184: 1185: p->alphavel = -0.8 / (0.5 + frand()*0.3); 1186: } 1187: } 1188: 1189: 1190: /* 1191: =============== 1192: CL_BigTeleportParticles 1193: =============== 1194: */ 1195: void CL_BigTeleportParticles (vec3_t org) 1196: { 1197: int i; 1198: cparticle_t *p; 1199: float angle, dist; 1200: static int colortable[4] = {2*8,13*8,21*8,18*8}; 1201: 1202: for (i=0 ; i<4096 ; i++) 1203: { 1204: if (!free_particles) 1205: return; 1206: p = free_particles; 1207: free_particles = p->next; 1208: p->next = active_particles; 1209: active_particles = p; 1210: 1211: p->time = cl.time; 1212: 1213: p->color = colortable[rand()&3]; 1214: 1215: angle = M_PI*2*(rand()&1023)/1023.0; 1216: dist = rand()&31; 1217: p->org[0] = org[0] + cos(angle)*dist; 1218: p->vel[0] = cos(angle)*(70+(rand()&63)); 1219: p->accel[0] = -cos(angle)*100; 1220: 1221: p->org[1] = org[1] + sin(angle)*dist; 1222: p->vel[1] = sin(angle)*(70+(rand()&63)); 1223: p->accel[1] = -sin(angle)*100; 1224: 1225: p->org[2] = org[2] + 8 + (rand()%90); 1226: p->vel[2] = -100 + (rand()&31); 1227: p->accel[2] = PARTICLE_GRAVITY*4; 1228: p->alpha = 1.0; 1229: 1230: p->alphavel = -0.3 / (0.5 + frand()*0.3); 1231: } 1232: } 1233: 1234: 1235: /* 1236: =============== 1237: CL_BlasterParticles 1.1.1.2 root 1238: 1.1 root 1239: Wall impact puffs 1240: =============== 1241: */ 1242: void CL_BlasterParticles (vec3_t org, vec3_t dir) 1243: { 1244: int i, j; 1245: cparticle_t *p; 1246: float d; 1247: int count; 1.1.1.2 root 1248: 1.1 root 1249: count = 40; 1250: for (i=0 ; i<count ; i++) 1251: { 1252: if (!free_particles) 1253: return; 1254: p = free_particles; 1255: free_particles = p->next; 1256: p->next = active_particles; 1257: active_particles = p; 1.1.1.2 root 1258: 1.1 root 1259: p->time = cl.time; 1260: p->color = 0xe0 + (rand()&7); 1.1.1.2 root 1261: 1.1 root 1262: d = rand()&15; 1263: for (j=0 ; j<3 ; j++) 1264: { 1265: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j]; 1266: p->vel[j] = dir[j] * 30 + crand()*40; 1267: } 1.1.1.2 root 1268: 1.1 root 1269: p->accel[0] = p->accel[1] = 0; 1270: p->accel[2] = -PARTICLE_GRAVITY; 1271: p->alpha = 1.0; 1.1.1.2 root 1272: 1.1 root 1273: p->alphavel = -1.0 / (0.5 + frand()*0.3); 1274: } 1275: } 1.1.1.2 root 1276: 1277: 1.1 root 1278: /* 1279: =============== 1280: CL_BlasterTrail 1.1.1.2 root 1281: 1.1 root 1282: =============== 1283: */ 1284: void CL_BlasterTrail (vec3_t start, vec3_t end) 1285: { 1286: vec3_t move; 1287: vec3_t vec; 1288: float len; 1289: int j; 1290: cparticle_t *p; 1291: int dec; 1.1.1.2 root 1292: 1.1 root 1293: VectorCopy (start, move); 1294: VectorSubtract (end, start, vec); 1295: len = VectorNormalize (vec); 1.1.1.2 root 1296: 1.1 root 1297: dec = 5; 1298: VectorScale (vec, 5, vec); 1.1.1.2 root 1299: 1.1 root 1300: // FIXME: this is a really silly way to have a loop 1301: while (len > 0) 1302: { 1303: len -= dec; 1.1.1.2 root 1304: 1.1 root 1305: if (!free_particles) 1306: return; 1307: p = free_particles; 1308: free_particles = p->next; 1309: p->next = active_particles; 1310: active_particles = p; 1311: VectorClear (p->accel); 1312: 1313: p->time = cl.time; 1.1.1.2 root 1314: 1.1 root 1315: p->alpha = 1.0; 1316: p->alphavel = -1.0 / (0.3+frand()*0.2); 1317: p->color = 0xe0; 1318: for (j=0 ; j<3 ; j++) 1319: { 1320: p->org[j] = move[j] + crand(); 1321: p->vel[j] = crand()*5; 1322: p->accel[j] = 0; 1323: } 1.1.1.2 root 1324: 1.1 root 1325: VectorAdd (move, vec, move); 1326: } 1327: } 1.1.1.2 root 1328: 1.1 root 1329: /* 1330: =============== 1331: CL_QuadTrail 1332: 1333: =============== 1334: */ 1335: void CL_QuadTrail (vec3_t start, vec3_t end) 1336: { 1337: vec3_t move; 1338: vec3_t vec; 1339: float len; 1340: int j; 1341: cparticle_t *p; 1342: int dec; 1343: 1344: VectorCopy (start, move); 1345: VectorSubtract (end, start, vec); 1346: len = VectorNormalize (vec); 1347: 1348: dec = 5; 1349: VectorScale (vec, 5, vec); 1350: 1351: while (len > 0) 1352: { 1353: len -= dec; 1354: 1355: if (!free_particles) 1356: return; 1357: p = free_particles; 1358: free_particles = p->next; 1359: p->next = active_particles; 1360: active_particles = p; 1361: VectorClear (p->accel); 1362: 1363: p->time = cl.time; 1364: 1365: p->alpha = 1.0; 1366: p->alphavel = -1.0 / (0.8+frand()*0.2); 1367: p->color = 115; 1368: for (j=0 ; j<3 ; j++) 1369: { 1370: p->org[j] = move[j] + crand()*16; 1371: p->vel[j] = crand()*5; 1372: p->accel[j] = 0; 1373: } 1374: 1375: VectorAdd (move, vec, move); 1376: } 1377: } 1378: 1379: /* 1380: =============== 1381: CL_FlagTrail 1382: 1383: =============== 1384: */ 1385: void CL_FlagTrail (vec3_t start, vec3_t end, float color) 1386: { 1387: vec3_t move; 1388: vec3_t vec; 1389: float len; 1390: int j; 1391: cparticle_t *p; 1392: int dec; 1393: 1394: VectorCopy (start, move); 1395: VectorSubtract (end, start, vec); 1396: len = VectorNormalize (vec); 1397: 1398: dec = 5; 1399: VectorScale (vec, 5, vec); 1400: 1401: while (len > 0) 1402: { 1403: len -= dec; 1404: 1405: if (!free_particles) 1406: return; 1407: p = free_particles; 1408: free_particles = p->next; 1409: p->next = active_particles; 1410: active_particles = p; 1411: VectorClear (p->accel); 1412: 1413: p->time = cl.time; 1414: 1415: p->alpha = 1.0; 1416: p->alphavel = -1.0 / (0.8+frand()*0.2); 1417: p->color = color; 1418: for (j=0 ; j<3 ; j++) 1419: { 1420: p->org[j] = move[j] + crand()*16; 1421: p->vel[j] = crand()*5; 1422: p->accel[j] = 0; 1423: } 1424: 1425: VectorAdd (move, vec, move); 1426: } 1427: } 1428: 1429: /* 1430: =============== 1431: CL_DiminishingTrail 1.1.1.2 root 1432: 1.1 root 1433: =============== 1434: */ 1435: void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags) 1436: { 1437: vec3_t move; 1438: vec3_t vec; 1439: float len; 1440: int j; 1441: cparticle_t *p; 1442: float dec; 1443: float orgscale; 1444: float velscale; 1.1.1.2 root 1445: 1.1 root 1446: VectorCopy (start, move); 1447: VectorSubtract (end, start, vec); 1448: len = VectorNormalize (vec); 1.1.1.2 root 1449: 1.1 root 1450: dec = 0.5; 1451: VectorScale (vec, dec, vec); 1.1.1.2 root 1452: 1.1 root 1453: if (old->trailcount > 900) 1454: { 1455: orgscale = 4; 1456: velscale = 15; 1457: } 1458: else if (old->trailcount > 800) 1459: { 1460: orgscale = 2; 1461: velscale = 10; 1462: } 1463: else 1464: { 1465: orgscale = 1; 1466: velscale = 5; 1467: } 1.1.1.2 root 1468: 1.1 root 1469: while (len > 0) 1470: { 1471: len -= dec; 1.1.1.2 root 1472: 1.1 root 1473: if (!free_particles) 1474: return; 1.1.1.2 root 1475: 1.1 root 1476: // drop less particles as it flies 1477: if ((rand()&1023) < old->trailcount) 1478: { 1479: p = free_particles; 1480: free_particles = p->next; 1481: p->next = active_particles; 1482: active_particles = p; 1483: VectorClear (p->accel); 1484: 1485: p->time = cl.time; 1.1.1.2 root 1486: 1.1 root 1487: if (flags & EF_GIB) 1488: { 1489: p->alpha = 1.0; 1490: p->alphavel = -1.0 / (1+frand()*0.4); 1491: p->color = 0xe8 + (rand()&7); 1492: for (j=0 ; j<3 ; j++) 1493: { 1494: p->org[j] = move[j] + crand()*orgscale; 1495: p->vel[j] = crand()*velscale; 1496: p->accel[j] = 0; 1497: } 1498: p->vel[2] -= PARTICLE_GRAVITY; 1499: } 1500: else if (flags & EF_GREENGIB) 1501: { 1502: p->alpha = 1.0; 1503: p->alphavel = -1.0 / (1+frand()*0.4); 1.1.1.2 root 1504: p->color = 0xdb + (rand()&7); 1.1 root 1505: for (j=0; j< 3; j++) 1506: { 1507: p->org[j] = move[j] + crand()*orgscale; 1508: p->vel[j] = crand()*velscale; 1509: p->accel[j] = 0; 1510: } 1511: p->vel[2] -= PARTICLE_GRAVITY; 1512: } 1513: else 1514: { 1515: p->alpha = 1.0; 1516: p->alphavel = -1.0 / (1+frand()*0.2); 1517: p->color = 4 + (rand()&7); 1518: for (j=0 ; j<3 ; j++) 1519: { 1520: p->org[j] = move[j] + crand()*orgscale; 1521: p->vel[j] = crand()*velscale; 1522: } 1523: p->accel[2] = 20; 1524: } 1525: } 1.1.1.2 root 1526: 1.1 root 1527: old->trailcount -= 5; 1528: if (old->trailcount < 100) 1529: old->trailcount = 100; 1530: VectorAdd (move, vec, move); 1531: } 1532: } 1.1.1.2 root 1533: 1.1 root 1534: void MakeNormalVectors (vec3_t forward, vec3_t right, vec3_t up) 1535: { 1536: float d; 1.1.1.2 root 1537: 1.1 root 1538: // this rotate and negat guarantees a vector 1539: // not colinear with the original 1540: right[1] = -forward[0]; 1541: right[2] = forward[1]; 1542: right[0] = forward[2]; 1.1.1.2 root 1543: 1.1 root 1544: d = DotProduct (right, forward); 1545: VectorMA (right, -d, forward, right); 1546: VectorNormalize (right); 1547: CrossProduct (right, forward, up); 1548: } 1.1.1.2 root 1549: 1.1 root 1550: /* 1551: =============== 1552: CL_RocketTrail 1.1.1.2 root 1553: 1.1 root 1554: =============== 1555: */ 1556: void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old) 1557: { 1558: vec3_t move; 1559: vec3_t vec; 1560: float len; 1561: int j; 1562: cparticle_t *p; 1563: float dec; 1.1.1.2 root 1564: 1.1 root 1565: // smoke 1566: CL_DiminishingTrail (start, end, old, EF_ROCKET); 1.1.1.2 root 1567: 1.1 root 1568: // fire 1569: VectorCopy (start, move); 1570: VectorSubtract (end, start, vec); 1571: len = VectorNormalize (vec); 1.1.1.2 root 1572: 1.1 root 1573: dec = 1; 1574: VectorScale (vec, dec, vec); 1.1.1.2 root 1575: 1.1 root 1576: while (len > 0) 1577: { 1578: len -= dec; 1.1.1.2 root 1579: 1.1 root 1580: if (!free_particles) 1581: return; 1.1.1.2 root 1582: 1.1 root 1583: if ( (rand()&7) == 0) 1584: { 1585: p = free_particles; 1586: free_particles = p->next; 1587: p->next = active_particles; 1588: active_particles = p; 1589: 1590: VectorClear (p->accel); 1591: p->time = cl.time; 1.1.1.2 root 1592: 1.1 root 1593: p->alpha = 1.0; 1594: p->alphavel = -1.0 / (1+frand()*0.2); 1595: p->color = 0xdc + (rand()&3); 1596: for (j=0 ; j<3 ; j++) 1597: { 1598: p->org[j] = move[j] + crand()*5; 1599: p->vel[j] = crand()*20; 1600: } 1601: p->accel[2] = -PARTICLE_GRAVITY; 1602: } 1603: VectorAdd (move, vec, move); 1604: } 1605: } 1.1.1.2 root 1606: 1.1 root 1607: /* 1608: =============== 1609: CL_RailTrail 1.1.1.2 root 1610: 1.1 root 1611: =============== 1612: */ 1613: void CL_RailTrail (vec3_t start, vec3_t end) 1614: { 1615: vec3_t move; 1616: vec3_t vec; 1617: float len; 1618: int j; 1619: cparticle_t *p; 1620: float dec; 1621: vec3_t right, up; 1622: int i; 1623: float d, c, s; 1624: vec3_t dir; 1.1.1.2 root 1625: byte clr = 0x74; 1626: 1.1 root 1627: VectorCopy (start, move); 1628: VectorSubtract (end, start, vec); 1629: len = VectorNormalize (vec); 1.1.1.2 root 1630: 1.1 root 1631: MakeNormalVectors (vec, right, up); 1.1.1.2 root 1632: 1.1 root 1633: for (i=0 ; i<len ; i++) 1634: { 1635: if (!free_particles) 1636: return; 1.1.1.2 root 1637: 1.1 root 1638: p = free_particles; 1639: free_particles = p->next; 1640: p->next = active_particles; 1641: active_particles = p; 1642: 1643: p->time = cl.time; 1644: VectorClear (p->accel); 1.1.1.2 root 1645: 1.1 root 1646: d = i * 0.1; 1647: c = cos(d); 1648: s = sin(d); 1.1.1.2 root 1649: 1.1 root 1650: VectorScale (right, c, dir); 1651: VectorMA (dir, s, up, dir); 1.1.1.2 root 1652: 1.1 root 1653: p->alpha = 1.0; 1654: p->alphavel = -1.0 / (1+frand()*0.2); 1.1.1.2 root 1655: p->color = clr + (rand()&7); 1.1 root 1656: for (j=0 ; j<3 ; j++) 1657: { 1658: p->org[j] = move[j] + dir[j]*3; 1659: p->vel[j] = dir[j]*6; 1660: } 1.1.1.2 root 1661: 1.1 root 1662: VectorAdd (move, vec, move); 1663: } 1.1.1.2 root 1664: 1.1 root 1665: dec = 0.75; 1666: VectorScale (vec, dec, vec); 1667: VectorCopy (start, move); 1.1.1.2 root 1668: 1.1 root 1669: while (len > 0) 1670: { 1671: len -= dec; 1.1.1.2 root 1672: 1.1 root 1673: if (!free_particles) 1674: return; 1675: p = free_particles; 1676: free_particles = p->next; 1677: p->next = active_particles; 1678: active_particles = p; 1.1.1.2 root 1679: 1.1 root 1680: p->time = cl.time; 1681: VectorClear (p->accel); 1.1.1.2 root 1682: 1.1 root 1683: p->alpha = 1.0; 1684: p->alphavel = -1.0 / (0.6+frand()*0.2); 1685: p->color = 0x0 + rand()&15; 1.1.1.2 root 1686: 1.1 root 1687: for (j=0 ; j<3 ; j++) 1688: { 1689: p->org[j] = move[j] + crand()*3; 1690: p->vel[j] = crand()*3; 1691: p->accel[j] = 0; 1692: } 1693: 1694: VectorAdd (move, vec, move); 1695: } 1696: } 1697: 1.1.1.2 root 1698: // RAFAEL 1.1 root 1699: /* 1700: =============== 1.1.1.2 root 1701: CL_IonripperTrail 1.1 root 1702: =============== 1703: */ 1.1.1.2 root 1704: void CL_IonripperTrail (vec3_t start, vec3_t ent) 1.1 root 1705: { 1706: vec3_t move; 1707: vec3_t vec; 1708: float len; 1709: int j; 1710: cparticle_t *p; 1711: int dec; 1712: int left = 0; 1713: 1714: VectorCopy (start, move); 1.1.1.2 root 1715: VectorSubtract (ent, start, vec); 1.1 root 1716: len = VectorNormalize (vec); 1717: 1718: dec = 5; 1719: VectorScale (vec, 5, vec); 1720: 1721: while (len > 0) 1722: { 1723: len -= dec; 1724: 1725: if (!free_particles) 1726: return; 1727: p = free_particles; 1728: free_particles = p->next; 1729: p->next = active_particles; 1730: active_particles = p; 1731: VectorClear (p->accel); 1732: 1733: p->time = cl.time; 1734: p->alpha = 0.5; 1.1.1.2 root 1735: p->alphavel = -1.0 / (0.3 + frand() * 0.2); 1.1 root 1736: p->color = 0xe4 + (rand()&3); 1.1.1.2 root 1737: 1.1 root 1738: for (j=0; j<3; j++) 1739: { 1740: p->org[j] = move[j]; 1741: p->accel[j] = 0; 1742: } 1743: if (left) 1744: { 1745: left = 0; 1746: p->vel[0] = 10; 1747: } 1748: else 1749: { 1750: left = 1; 1751: p->vel[0] = -10; 1752: } 1753: 1.1.1.2 root 1754: p->vel[1] = 0; 1755: p->vel[2] = 0; 1.1 root 1756: 1757: VectorAdd (move, vec, move); 1758: } 1759: } 1760: 1.1.1.2 root 1761: 1.1 root 1762: /* 1763: =============== 1764: CL_BubbleTrail 1.1.1.2 root 1765: 1.1 root 1766: =============== 1767: */ 1768: void CL_BubbleTrail (vec3_t start, vec3_t end) 1769: { 1770: vec3_t move; 1771: vec3_t vec; 1772: float len; 1773: int i, j; 1774: cparticle_t *p; 1775: float dec; 1.1.1.2 root 1776: 1.1 root 1777: VectorCopy (start, move); 1778: VectorSubtract (end, start, vec); 1779: len = VectorNormalize (vec); 1.1.1.2 root 1780: 1.1 root 1781: dec = 32; 1782: VectorScale (vec, dec, vec); 1.1.1.2 root 1783: 1.1 root 1784: for (i=0 ; i<len ; i+=dec) 1785: { 1786: if (!free_particles) 1787: return; 1.1.1.2 root 1788: 1.1 root 1789: p = free_particles; 1790: free_particles = p->next; 1791: p->next = active_particles; 1792: active_particles = p; 1.1.1.2 root 1793: 1.1 root 1794: VectorClear (p->accel); 1795: p->time = cl.time; 1.1.1.2 root 1796: 1.1 root 1797: p->alpha = 1.0; 1798: p->alphavel = -1.0 / (1+frand()*0.2); 1799: p->color = 4 + (rand()&7); 1800: for (j=0 ; j<3 ; j++) 1801: { 1802: p->org[j] = move[j] + crand()*2; 1803: p->vel[j] = crand()*5; 1804: } 1805: p->vel[2] += 6; 1.1.1.2 root 1806: 1.1 root 1807: VectorAdd (move, vec, move); 1808: } 1809: } 1.1.1.2 root 1810: 1811: 1.1 root 1812: /* 1813: =============== 1814: CL_FlyParticles 1815: =============== 1816: */ 1.1.1.2 root 1817: 1.1 root 1818: #define BEAMLENGTH 16 1819: void CL_FlyParticles (vec3_t origin, int count) 1820: { 1821: int i; 1822: cparticle_t *p; 1823: float angle; 1824: float sr, sp, sy, cr, cp, cy; 1825: vec3_t forward; 1826: float dist = 64; 1827: float ltime; 1828: 1.1.1.2 root 1829: 1.1 root 1830: if (count > NUMVERTEXNORMALS) 1831: count = NUMVERTEXNORMALS; 1.1.1.2 root 1832: 1.1 root 1833: if (!avelocities[0][0]) 1834: { 1835: for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++) 1836: avelocities[0][i] = (rand()&255) * 0.01; 1837: } 1.1.1.2 root 1838: 1839: 1.1 root 1840: ltime = (float)cl.time / 1000.0; 1841: for (i=0 ; i<count ; i+=2) 1842: { 1843: angle = ltime * avelocities[i][0]; 1844: sy = sin(angle); 1845: cy = cos(angle); 1846: angle = ltime * avelocities[i][1]; 1847: sp = sin(angle); 1848: cp = cos(angle); 1849: angle = ltime * avelocities[i][2]; 1850: sr = sin(angle); 1851: cr = cos(angle); 1852: 1853: forward[0] = cp*cy; 1854: forward[1] = cp*sy; 1855: forward[2] = -sp; 1.1.1.2 root 1856: 1.1 root 1857: if (!free_particles) 1858: return; 1859: p = free_particles; 1860: free_particles = p->next; 1861: p->next = active_particles; 1862: active_particles = p; 1.1.1.2 root 1863: 1.1 root 1864: p->time = cl.time; 1.1.1.2 root 1865: 1.1 root 1866: dist = sin(ltime + i)*64; 1867: p->org[0] = origin[0] + bytedirs[i][0]*dist + forward[0]*BEAMLENGTH; 1868: p->org[1] = origin[1] + bytedirs[i][1]*dist + forward[1]*BEAMLENGTH; 1869: p->org[2] = origin[2] + bytedirs[i][2]*dist + forward[2]*BEAMLENGTH; 1.1.1.2 root 1870: 1.1 root 1871: VectorClear (p->vel); 1872: VectorClear (p->accel); 1.1.1.2 root 1873: 1.1 root 1874: p->color = 0; 1875: p->colorvel = 0; 1.1.1.2 root 1876: 1.1 root 1877: p->alpha = 1; 1878: p->alphavel = -100; 1879: } 1880: } 1.1.1.2 root 1881: 1.1 root 1882: void CL_FlyEffect (centity_t *ent, vec3_t origin) 1883: { 1884: int n; 1885: int count; 1886: int starttime; 1887: 1888: if (ent->fly_stoptime < cl.time) 1889: { 1890: starttime = cl.time; 1891: ent->fly_stoptime = cl.time + 60000; 1892: } 1893: else 1894: { 1895: starttime = ent->fly_stoptime - 60000; 1896: } 1897: 1898: n = cl.time - starttime; 1899: if (n < 20000) 1900: count = n * 162 / 20000.0; 1901: else 1902: { 1903: n = ent->fly_stoptime - cl.time; 1904: if (n < 20000) 1905: count = n * 162 / 20000.0; 1906: else 1907: count = 162; 1908: } 1909: 1910: CL_FlyParticles (origin, count); 1911: } 1.1.1.2 root 1912: 1913: 1.1 root 1914: /* 1915: =============== 1916: CL_BfgParticles 1917: =============== 1918: */ 1.1.1.2 root 1919: 1.1 root 1920: #define BEAMLENGTH 16 1921: void CL_BfgParticles (entity_t *ent) 1922: { 1923: int i; 1924: cparticle_t *p; 1925: float angle; 1926: float sr, sp, sy, cr, cp, cy; 1927: vec3_t forward; 1928: float dist = 64; 1929: vec3_t v; 1930: float ltime; 1931: 1932: if (!avelocities[0][0]) 1933: { 1934: for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++) 1935: avelocities[0][i] = (rand()&255) * 0.01; 1936: } 1.1.1.2 root 1937: 1938: 1.1 root 1939: ltime = (float)cl.time / 1000.0; 1940: for (i=0 ; i<NUMVERTEXNORMALS ; i++) 1941: { 1942: angle = ltime * avelocities[i][0]; 1943: sy = sin(angle); 1944: cy = cos(angle); 1945: angle = ltime * avelocities[i][1]; 1946: sp = sin(angle); 1947: cp = cos(angle); 1948: angle = ltime * avelocities[i][2]; 1949: sr = sin(angle); 1950: cr = cos(angle); 1951: 1952: forward[0] = cp*cy; 1953: forward[1] = cp*sy; 1954: forward[2] = -sp; 1.1.1.2 root 1955: 1.1 root 1956: if (!free_particles) 1957: return; 1958: p = free_particles; 1959: free_particles = p->next; 1960: p->next = active_particles; 1961: active_particles = p; 1.1.1.2 root 1962: 1.1 root 1963: p->time = cl.time; 1.1.1.2 root 1964: 1.1 root 1965: dist = sin(ltime + i)*64; 1966: p->org[0] = ent->origin[0] + bytedirs[i][0]*dist + forward[0]*BEAMLENGTH; 1967: p->org[1] = ent->origin[1] + bytedirs[i][1]*dist + forward[1]*BEAMLENGTH; 1968: p->org[2] = ent->origin[2] + bytedirs[i][2]*dist + forward[2]*BEAMLENGTH; 1.1.1.2 root 1969: 1.1 root 1970: VectorClear (p->vel); 1971: VectorClear (p->accel); 1.1.1.2 root 1972: 1.1 root 1973: VectorSubtract (p->org, ent->origin, v); 1974: dist = VectorLength(v) / 90.0; 1975: p->color = floor (0xd0 + dist * 7); 1976: p->colorvel = 0; 1.1.1.2 root 1977: 1.1 root 1978: p->alpha = 1.0 - dist; 1979: p->alphavel = -100; 1980: } 1981: } 1.1.1.2 root 1982: 1983: 1984: /* 1985: =============== 1986: CL_TrapParticles 1987: =============== 1988: */ 1989: // RAFAEL 1990: void CL_TrapParticles (entity_t *ent) 1991: { 1992: vec3_t move; 1993: vec3_t vec; 1994: vec3_t start, end; 1995: float len; 1996: int j; 1997: cparticle_t *p; 1998: int dec; 1999: 2000: ent->origin[2]-=14; 2001: VectorCopy (ent->origin, start); 2002: VectorCopy (ent->origin, end); 2003: end[2]+=64; 2004: 2005: VectorCopy (start, move); 2006: VectorSubtract (end, start, vec); 2007: len = VectorNormalize (vec); 2008: 2009: dec = 5; 2010: VectorScale (vec, 5, vec); 2011: 2012: // FIXME: this is a really silly way to have a loop 2013: while (len > 0) 2014: { 2015: len -= dec; 2016: 2017: if (!free_particles) 2018: return; 2019: p = free_particles; 2020: free_particles = p->next; 2021: p->next = active_particles; 2022: active_particles = p; 2023: VectorClear (p->accel); 2024: 2025: p->time = cl.time; 2026: 2027: p->alpha = 1.0; 2028: p->alphavel = -1.0 / (0.3+frand()*0.2); 2029: p->color = 0xe0; 2030: for (j=0 ; j<3 ; j++) 2031: { 2032: p->org[j] = move[j] + crand(); 2033: p->vel[j] = crand()*15; 2034: p->accel[j] = 0; 2035: } 2036: p->accel[2] = PARTICLE_GRAVITY; 2037: 2038: VectorAdd (move, vec, move); 2039: } 2040: 2041: { 2042: 2043: 2044: int i, j, k; 2045: cparticle_t *p; 2046: float vel; 2047: vec3_t dir; 2048: vec3_t org; 2049: 2050: 2051: ent->origin[2]+=14; 2052: VectorCopy (ent->origin, org); 2053: 2054: 2055: for (i=-2 ; i<=2 ; i+=4) 2056: for (j=-2 ; j<=2 ; j+=4) 2057: for (k=-2 ; k<=4 ; k+=4) 2058: { 2059: if (!free_particles) 2060: return; 2061: p = free_particles; 2062: free_particles = p->next; 2063: p->next = active_particles; 2064: active_particles = p; 2065: 2066: p->time = cl.time; 2067: p->color = 0xe0 + (rand()&3); 2068: 2069: p->alpha = 1.0; 2070: p->alphavel = -1.0 / (0.3 + (rand()&7) * 0.02); 2071: 2072: p->org[0] = org[0] + i + ((rand()&23) * crand()); 2073: p->org[1] = org[1] + j + ((rand()&23) * crand()); 2074: p->org[2] = org[2] + k + ((rand()&23) * crand()); 2075: 2076: dir[0] = j * 8; 2077: dir[1] = i * 8; 2078: dir[2] = k * 8; 2079: 2080: VectorNormalize (dir); 2081: vel = 50 + rand()&63; 2082: VectorScale (dir, vel, p->vel); 2083: 2084: p->accel[0] = p->accel[1] = 0; 2085: p->accel[2] = -PARTICLE_GRAVITY; 2086: } 2087: } 2088: } 2089: 2090: 1.1 root 2091: /* 2092: =============== 2093: CL_BFGExplosionParticles 2094: =============== 2095: */ 2096: //FIXME combined with CL_ExplosionParticles 2097: void CL_BFGExplosionParticles (vec3_t org) 2098: { 2099: int i, j; 2100: cparticle_t *p; 2101: 2102: for (i=0 ; i<256 ; i++) 2103: { 2104: if (!free_particles) 2105: return; 2106: p = free_particles; 2107: free_particles = p->next; 2108: p->next = active_particles; 2109: active_particles = p; 2110: 2111: p->time = cl.time; 2112: p->color = 0xd0 + (rand()&7); 2113: 2114: for (j=0 ; j<3 ; j++) 2115: { 2116: p->org[j] = org[j] + ((rand()%32)-16); 2117: p->vel[j] = (rand()%384)-192; 2118: } 2119: 2120: p->accel[0] = p->accel[1] = 0; 2121: p->accel[2] = -PARTICLE_GRAVITY; 2122: p->alpha = 1.0; 2123: 2124: p->alphavel = -0.8 / (0.5 + frand()*0.3); 2125: } 2126: } 2127: 1.1.1.2 root 2128: 1.1 root 2129: /* 2130: =============== 2131: CL_TeleportParticles 2132: 2133: =============== 2134: */ 2135: void CL_TeleportParticles (vec3_t org) 2136: { 2137: int i, j, k; 2138: cparticle_t *p; 2139: float vel; 2140: vec3_t dir; 2141: 2142: for (i=-16 ; i<=16 ; i+=4) 2143: for (j=-16 ; j<=16 ; j+=4) 2144: for (k=-16 ; k<=32 ; k+=4) 2145: { 2146: if (!free_particles) 2147: return; 2148: p = free_particles; 2149: free_particles = p->next; 2150: p->next = active_particles; 2151: active_particles = p; 2152: 2153: p->time = cl.time; 2154: p->color = 7 + (rand()&7); 2155: 2156: p->alpha = 1.0; 2157: p->alphavel = -1.0 / (0.3 + (rand()&7) * 0.02); 2158: 2159: p->org[0] = org[0] + i + (rand()&3); 2160: p->org[1] = org[1] + j + (rand()&3); 2161: p->org[2] = org[2] + k + (rand()&3); 2162: 2163: dir[0] = j*8; 2164: dir[1] = i*8; 2165: dir[2] = k*8; 2166: 2167: VectorNormalize (dir); 2168: vel = 50 + (rand()&63); 2169: VectorScale (dir, vel, p->vel); 2170: 2171: p->accel[0] = p->accel[1] = 0; 2172: p->accel[2] = -PARTICLE_GRAVITY; 2173: } 2174: } 2175: 1.1.1.2 root 2176: 1.1 root 2177: /* 2178: =============== 2179: CL_AddParticles 2180: =============== 2181: */ 2182: void CL_AddParticles (void) 2183: { 2184: cparticle_t *p, *next; 2185: float alpha; 2186: float time, time2; 2187: vec3_t org; 2188: int color; 2189: cparticle_t *active, *tail; 1.1.1.2 root 2190: 1.1 root 2191: active = NULL; 2192: tail = NULL; 1.1.1.2 root 2193: 1.1 root 2194: for (p=active_particles ; p ; p=next) 2195: { 2196: next = p->next; 1.1.1.2 root 2197: 1.1.1.3 root 2198: // PMM - added INSTANT_PARTICLE handling for heat beam 2199: if (p->alphavel != INSTANT_PARTICLE) 2200: { 2201: time = (cl.time - p->time)*0.001; 2202: alpha = p->alpha + time*p->alphavel; 2203: if (alpha <= 0) 2204: { // faded out 2205: p->next = free_particles; 2206: free_particles = p; 2207: continue; 2208: } 2209: } 2210: else 2211: { 2212: alpha = p->alpha; 1.1 root 2213: } 1.1.1.2 root 2214: 1.1 root 2215: p->next = NULL; 2216: if (!tail) 2217: active = tail = p; 2218: else 2219: { 2220: tail->next = p; 2221: tail = p; 2222: } 1.1.1.2 root 2223: 1.1 root 2224: if (alpha > 1.0) 2225: alpha = 1; 2226: color = p->color; 1.1.1.2 root 2227: 1.1 root 2228: time2 = time*time; 1.1.1.2 root 2229: 1.1 root 2230: org[0] = p->org[0] + p->vel[0]*time + p->accel[0]*time2; 2231: org[1] = p->org[1] + p->vel[1]*time + p->accel[1]*time2; 2232: org[2] = p->org[2] + p->vel[2]*time + p->accel[2]*time2; 1.1.1.2 root 2233: 1.1 root 2234: V_AddParticle (org, color, alpha); 1.1.1.3 root 2235: // PMM 2236: if (p->alphavel == INSTANT_PARTICLE) 2237: { 2238: p->alphavel = 0.0; 2239: p->alpha = 0.0; 2240: } 1.1 root 2241: } 1.1.1.2 root 2242: 1.1 root 2243: active_particles = active; 2244: } 2245: 2246: 2247: /* 2248: ============== 2249: CL_EntityEvent 2250: 2251: An entity has just been parsed that has an event value 2252: 2253: the female events are there for backwards compatability 2254: ============== 2255: */ 2256: extern struct sfx_s *cl_sfx_footsteps[4]; 2257: 2258: void CL_EntityEvent (entity_state_t *ent) 2259: { 2260: switch (ent->event) 2261: { 2262: case EV_ITEM_RESPAWN: 2263: S_StartSound (NULL, ent->number, CHAN_WEAPON, S_RegisterSound("items/respawn1.wav"), 1, ATTN_IDLE, 0); 2264: CL_ItemRespawnParticles (ent->origin); 2265: break; 2266: case EV_PLAYER_TELEPORT: 2267: S_StartSound (NULL, ent->number, CHAN_WEAPON, S_RegisterSound("misc/tele1.wav"), 1, ATTN_IDLE, 0); 2268: CL_TeleportParticles (ent->origin); 2269: break; 2270: case EV_FOOTSTEP: 2271: if (cl_footsteps->value) 2272: S_StartSound (NULL, ent->number, CHAN_BODY, cl_sfx_footsteps[rand()&3], 1, ATTN_NORM, 0); 2273: break; 2274: case EV_FALLSHORT: 2275: S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("player/land1.wav"), 1, ATTN_NORM, 0); 2276: break; 2277: case EV_FALL: 2278: S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("*fall2.wav"), 1, ATTN_NORM, 0); 2279: break; 2280: case EV_FALLFAR: 2281: S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("*fall1.wav"), 1, ATTN_NORM, 0); 2282: break; 2283: } 2284: } 2285: 2286: 2287: /* 2288: ============== 2289: CL_ClearEffects 2290: 2291: ============== 2292: */ 2293: void CL_ClearEffects (void) 2294: { 2295: CL_ClearParticles (); 2296: CL_ClearDlights (); 2297: CL_ClearLightStyles (); 2298: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.