// cl_fx.c -- entity effects parsing and management #include <u.h>#include <libc.h>#include <stdio.h>#include "dat.h"#include "fns.h" void CL_LogoutEffect (vec3_t org, int type);void CL_ItemRespawnParticles (vec3_t org); static vec3_t avelocities [NUMVERTEXNORMALS]; extern model_t *cl_mod_smoke;extern model_t *cl_mod_flash; /*============================================================== LIGHT STYLE MANAGEMENT ==============================================================*/ typedef struct{ int length; float value[3]; float map[MAX_QPATH];} clightstyle_t; clightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];int lastofs; /*================CL_ClearLightStyles================*/void CL_ClearLightStyles (void){ memset (cl_lightstyle, 0, sizeof(cl_lightstyle)); lastofs = -1;} /*================CL_RunLightStyles================*/void CL_RunLightStyles (void){ int ofs; int i; clightstyle_t *ls; ofs = cl.time / 100; if (ofs == lastofs) return; lastofs = ofs; for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++) { if (!ls->length) { ls->value[0] = ls->value[1] = ls->value[2] = 1.0; continue; } if (ls->length == 1) ls->value[0] = ls->value[1] = ls->value[2] = ls->map[0]; else ls->value[0] = ls->value[1] = ls->value[2] = ls->map[ofs%ls->length]; }} void CL_SetLightstyle (int i){ char *s; int j, k; s = cl.configstrings[i+CS_LIGHTS]; j = strlen (s); if (j >= MAX_QPATH) Com_Error (ERR_DROP, "svc_lightstyle length=%i", j); cl_lightstyle[i].length = j; for (k=0 ; k<j ; k++) cl_lightstyle[i].map[k] = (float)(s[k]-'a')/(float)('m'-'a');} /*================CL_AddLightStyles================*/void CL_AddLightStyles (void){ int i; clightstyle_t *ls; for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++) V_AddLightStyle (i, ls->value[0], ls->value[1], ls->value[2]);} /*============================================================== DLIGHT MANAGEMENT ==============================================================*/ cdlight_t cl_dlights[MAX_DLIGHTS]; /*================CL_ClearDlights================*/void CL_ClearDlights (void){ memset (cl_dlights, 0, sizeof(cl_dlights));} /*===============CL_AllocDlight ===============*/cdlight_t *CL_AllocDlight (int key){ int i; cdlight_t *dl; // first look for an exact key match if (key) { dl = cl_dlights; for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) { if (dl->key == key) { memset (dl, 0, sizeof(*dl)); dl->key = key; return dl; } } } // then look for anything else dl = cl_dlights; for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) { if (dl->die < cl.time) { memset (dl, 0, sizeof(*dl)); dl->key = key; return dl; } } dl = &cl_dlights[0]; memset (dl, 0, sizeof(*dl)); dl->key = key; return dl;} /*===============CL_NewDlight===============*/void CL_NewDlight (int key, float x, float y, float z, float radius, float time){ cdlight_t *dl; dl = CL_AllocDlight (key); dl->origin[0] = x; dl->origin[1] = y; dl->origin[2] = z; dl->radius = radius; dl->die = cl.time + time;} /*===============CL_RunDLights ===============*/void CL_RunDLights (void){ int i; cdlight_t *dl; dl = cl_dlights; for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) { if (!dl->radius) continue; if (dl->die < cl.time) { dl->radius = 0; return; } dl->radius -= cls.frametime*dl->decay; if (dl->radius < 0) dl->radius = 0; }} /*==============CL_ParseMuzzleFlash==============*/void CL_ParseMuzzleFlash (void){ vec3_t fv, rv; cdlight_t *dl; int i, weapon; centity_t *pl; int silenced; float volume; char soundname[64]; i = MSG_ReadShort (&net_message); if (i < 1 || i >= MAX_EDICTS) Com_Error (ERR_DROP, "CL_ParseMuzzleFlash: bad entity"); weapon = MSG_ReadByte (&net_message); silenced = weapon & MZ_SILENCED; weapon &= ~MZ_SILENCED; pl = &cl_entities[i]; dl = CL_AllocDlight (i); VectorCopy (pl->current.origin, dl->origin); AngleVectors (pl->current.angles, fv, rv, NULL); VectorMA (dl->origin, 18, fv, dl->origin); VectorMA (dl->origin, 16, rv, dl->origin); if (silenced) dl->radius = 100 + (rand()&31); else dl->radius = 200 + (rand()&31); dl->minlight = 32; dl->die = cl.time; // + 0.1; if (silenced) volume = 0.2; else volume = 1; switch (weapon) { case MZ_BLASTER: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_BLUEHYPERBLASTER: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_HYPERBLASTER: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_MACHINEGUN: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); break; case MZ_SHOTGUN: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotgf1b.wav"), volume, ATTN_NORM, 0); S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/shotgr1b.wav"), volume, ATTN_NORM, 0.1); break; case MZ_SSHOTGUN: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/sshotf1b.wav"), volume, ATTN_NORM, 0); break; case MZ_CHAINGUN1: dl->radius = 200 + (rand()&31); dl->color[0] = 1;dl->color[1] = 0.25;dl->color[2] = 0; Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); break; case MZ_CHAINGUN2: dl->radius = 225 + (rand()&31); dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; dl->die = cl.time + 0.1; // long delay Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.05); break; case MZ_CHAINGUN3: dl->radius = 250 + (rand()&31); dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; dl->die = cl.time + 0.1; // long delay Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.033); Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.066); break; case MZ_RAILGUN: dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/railgf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_ROCKET: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rocklf1a.wav"), volume, ATTN_NORM, 0); S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/rocklr1b.wav"), volume, ATTN_NORM, 0.1); break; case MZ_GRENADE: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), volume, ATTN_NORM, 0); S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/grenlr1b.wav"), volume, ATTN_NORM, 0.1); break; case MZ_BFG: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__f1y.wav"), volume, ATTN_NORM, 0); break; case MZ_LOGIN: dl->color[0] = 0;dl->color[1] = 1; dl->color[2] = 0; dl->die = cl.time + 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); CL_LogoutEffect (pl->current.origin, weapon); break; case MZ_LOGOUT: dl->color[0] = 1;dl->color[1] = 0; dl->color[2] = 0; dl->die = cl.time + 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); CL_LogoutEffect (pl->current.origin, weapon); break; case MZ_RESPAWN: dl->color[0] = 1;dl->color[1] = 1; dl->color[2] = 0; dl->die = cl.time + 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); CL_LogoutEffect (pl->current.origin, weapon); break; // RAFAEL case MZ_PHALANX: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/plasshot.wav"), volume, ATTN_NORM, 0); break; // RAFAEL case MZ_IONRIPPER: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rippfire.wav"), volume, ATTN_NORM, 0); break; // ======================// PGM case MZ_ETF_RIFLE: dl->color[0] = 0.9;dl->color[1] = 0.7;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/nail1.wav"), volume, ATTN_NORM, 0); break; case MZ_SHOTGUN2: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotg2.wav"), volume, ATTN_NORM, 0); break; case MZ_HEATBEAM: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; dl->die = cl.time + 100;// S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__l1a.wav"), volume, ATTN_NORM, 0); break; case MZ_BLASTER2: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; // FIXME - different sound for blaster2 ?? S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_TRACKER: // negative flashes handled the same in gl/soft until CL_AddDLights dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), volume, ATTN_NORM, 0); break; case MZ_NUKE1: dl->color[0] = 1;dl->color[1] = 0;dl->color[2] = 0; dl->die = cl.time + 100; break; case MZ_NUKE2: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; dl->die = cl.time + 100; break; case MZ_NUKE4: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1; dl->die = cl.time + 100; break; case MZ_NUKE8: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 1; dl->die = cl.time + 100; break;// PGM// ====================== }} /*==============CL_ParseMuzzleFlash2==============*/void CL_ParseMuzzleFlash2 (void) { int ent; vec3_t origin; int flash_number; cdlight_t *dl; vec3_t forward, right; char soundname[64]; ent = MSG_ReadShort (&net_message); if (ent < 1 || ent >= MAX_EDICTS) Com_Error (ERR_DROP, "CL_ParseMuzzleFlash2: bad entity"); flash_number = MSG_ReadByte (&net_message); // locate the origin AngleVectors (cl_entities[ent].current.angles, forward, right, NULL); origin[0] = cl_entities[ent].current.origin[0] + forward[0] * monster_flash_offset[flash_number][0] + right[0] * monster_flash_offset[flash_number][1]; origin[1] = cl_entities[ent].current.origin[1] + forward[1] * monster_flash_offset[flash_number][0] + right[1] * monster_flash_offset[flash_number][1]; 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]; dl = CL_AllocDlight (ent); VectorCopy (origin, dl->origin); dl->radius = 200 + (rand()&31); dl->minlight = 32; dl->die = cl.time; // + 0.1; switch (flash_number) { case MZ2_INFANTRY_MACHINEGUN_1: case MZ2_INFANTRY_MACHINEGUN_2: case MZ2_INFANTRY_MACHINEGUN_3: case MZ2_INFANTRY_MACHINEGUN_4: case MZ2_INFANTRY_MACHINEGUN_5: case MZ2_INFANTRY_MACHINEGUN_6: case MZ2_INFANTRY_MACHINEGUN_7: case MZ2_INFANTRY_MACHINEGUN_8: case MZ2_INFANTRY_MACHINEGUN_9: case MZ2_INFANTRY_MACHINEGUN_10: case MZ2_INFANTRY_MACHINEGUN_11: case MZ2_INFANTRY_MACHINEGUN_12: case MZ2_INFANTRY_MACHINEGUN_13: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0); break; case MZ2_SOLDIER_MACHINEGUN_1: case MZ2_SOLDIER_MACHINEGUN_2: case MZ2_SOLDIER_MACHINEGUN_3: case MZ2_SOLDIER_MACHINEGUN_4: case MZ2_SOLDIER_MACHINEGUN_5: case MZ2_SOLDIER_MACHINEGUN_6: case MZ2_SOLDIER_MACHINEGUN_7: case MZ2_SOLDIER_MACHINEGUN_8: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck3.wav"), 1, ATTN_NORM, 0); break; case MZ2_GUNNER_MACHINEGUN_1: case MZ2_GUNNER_MACHINEGUN_2: case MZ2_GUNNER_MACHINEGUN_3: case MZ2_GUNNER_MACHINEGUN_4: case MZ2_GUNNER_MACHINEGUN_5: case MZ2_GUNNER_MACHINEGUN_6: case MZ2_GUNNER_MACHINEGUN_7: case MZ2_GUNNER_MACHINEGUN_8: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck2.wav"), 1, ATTN_NORM, 0); break; case MZ2_ACTOR_MACHINEGUN_1: case MZ2_SUPERTANK_MACHINEGUN_1: case MZ2_SUPERTANK_MACHINEGUN_2: case MZ2_SUPERTANK_MACHINEGUN_3: case MZ2_SUPERTANK_MACHINEGUN_4: case MZ2_SUPERTANK_MACHINEGUN_5: case MZ2_SUPERTANK_MACHINEGUN_6: case MZ2_TURRET_MACHINEGUN: // PGM dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40);Lines 1–500 of 2266. Load more
// cl_fx.c -- entity effects parsing and management #include <u.h> #include <libc.h> #include <stdio.h> #include "dat.h" #include "fns.h" void CL_LogoutEffect (vec3_t org, int type); void CL_ItemRespawnParticles (vec3_t org); static vec3_t avelocities [NUMVERTEXNORMALS]; extern model_t *cl_mod_smoke; extern model_t *cl_mod_flash; /* ============================================================== LIGHT STYLE MANAGEMENT ============================================================== */ typedef struct { int length; float value[3]; float map[MAX_QPATH]; } clightstyle_t; clightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; int lastofs; /* ================ CL_ClearLightStyles ================ */ void CL_ClearLightStyles (void) { memset (cl_lightstyle, 0, sizeof(cl_lightstyle)); lastofs = -1; } /* ================ CL_RunLightStyles ================ */ void CL_RunLightStyles (void) { int ofs; int i; clightstyle_t *ls; ofs = cl.time / 100; if (ofs == lastofs) return; lastofs = ofs; for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++) { if (!ls->length) { ls->value[0] = ls->value[1] = ls->value[2] = 1.0; continue; } if (ls->length == 1) ls->value[0] = ls->value[1] = ls->value[2] = ls->map[0]; else ls->value[0] = ls->value[1] = ls->value[2] = ls->map[ofs%ls->length]; } } void CL_SetLightstyle (int i) { char *s; int j, k; s = cl.configstrings[i+CS_LIGHTS]; j = strlen (s); if (j >= MAX_QPATH) Com_Error (ERR_DROP, "svc_lightstyle length=%i", j); cl_lightstyle[i].length = j; for (k=0 ; k<j ; k++) cl_lightstyle[i].map[k] = (float)(s[k]-'a')/(float)('m'-'a'); } /* ================ CL_AddLightStyles ================ */ void CL_AddLightStyles (void) { int i; clightstyle_t *ls; for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++) V_AddLightStyle (i, ls->value[0], ls->value[1], ls->value[2]); } /* ============================================================== DLIGHT MANAGEMENT ============================================================== */ cdlight_t cl_dlights[MAX_DLIGHTS]; /* ================ CL_ClearDlights ================ */ void CL_ClearDlights (void) { memset (cl_dlights, 0, sizeof(cl_dlights)); } /* =============== CL_AllocDlight =============== */ cdlight_t *CL_AllocDlight (int key) { int i; cdlight_t *dl; // first look for an exact key match if (key) { dl = cl_dlights; for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) { if (dl->key == key) { memset (dl, 0, sizeof(*dl)); dl->key = key; return dl; } } } // then look for anything else dl = cl_dlights; for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) { if (dl->die < cl.time) { memset (dl, 0, sizeof(*dl)); dl->key = key; return dl; } } dl = &cl_dlights[0]; memset (dl, 0, sizeof(*dl)); dl->key = key; return dl; } /* =============== CL_NewDlight =============== */ void CL_NewDlight (int key, float x, float y, float z, float radius, float time) { cdlight_t *dl; dl = CL_AllocDlight (key); dl->origin[0] = x; dl->origin[1] = y; dl->origin[2] = z; dl->radius = radius; dl->die = cl.time + time; } /* =============== CL_RunDLights =============== */ void CL_RunDLights (void) { int i; cdlight_t *dl; dl = cl_dlights; for (i=0 ; i<MAX_DLIGHTS ; i++, dl++) { if (!dl->radius) continue; if (dl->die < cl.time) { dl->radius = 0; return; } dl->radius -= cls.frametime*dl->decay; if (dl->radius < 0) dl->radius = 0; } } /* ============== CL_ParseMuzzleFlash ============== */ void CL_ParseMuzzleFlash (void) { vec3_t fv, rv; cdlight_t *dl; int i, weapon; centity_t *pl; int silenced; float volume; char soundname[64]; i = MSG_ReadShort (&net_message); if (i < 1 || i >= MAX_EDICTS) Com_Error (ERR_DROP, "CL_ParseMuzzleFlash: bad entity"); weapon = MSG_ReadByte (&net_message); silenced = weapon & MZ_SILENCED; weapon &= ~MZ_SILENCED; pl = &cl_entities[i]; dl = CL_AllocDlight (i); VectorCopy (pl->current.origin, dl->origin); AngleVectors (pl->current.angles, fv, rv, NULL); VectorMA (dl->origin, 18, fv, dl->origin); VectorMA (dl->origin, 16, rv, dl->origin); if (silenced) dl->radius = 100 + (rand()&31); else dl->radius = 200 + (rand()&31); dl->minlight = 32; dl->die = cl.time; // + 0.1; if (silenced) volume = 0.2; else volume = 1; switch (weapon) { case MZ_BLASTER: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_BLUEHYPERBLASTER: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_HYPERBLASTER: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_MACHINEGUN: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); break; case MZ_SHOTGUN: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotgf1b.wav"), volume, ATTN_NORM, 0); S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/shotgr1b.wav"), volume, ATTN_NORM, 0.1); break; case MZ_SSHOTGUN: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/sshotf1b.wav"), volume, ATTN_NORM, 0); break; case MZ_CHAINGUN1: dl->radius = 200 + (rand()&31); dl->color[0] = 1;dl->color[1] = 0.25;dl->color[2] = 0; Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); break; case MZ_CHAINGUN2: dl->radius = 225 + (rand()&31); dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; dl->die = cl.time + 0.1; // long delay Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.05); break; case MZ_CHAINGUN3: dl->radius = 250 + (rand()&31); dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; dl->die = cl.time + 0.1; // long delay Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0); Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.033); Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.066); break; case MZ_RAILGUN: dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/railgf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_ROCKET: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rocklf1a.wav"), volume, ATTN_NORM, 0); S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/rocklr1b.wav"), volume, ATTN_NORM, 0.1); break; case MZ_GRENADE: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), volume, ATTN_NORM, 0); S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/grenlr1b.wav"), volume, ATTN_NORM, 0.1); break; case MZ_BFG: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__f1y.wav"), volume, ATTN_NORM, 0); break; case MZ_LOGIN: dl->color[0] = 0;dl->color[1] = 1; dl->color[2] = 0; dl->die = cl.time + 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); CL_LogoutEffect (pl->current.origin, weapon); break; case MZ_LOGOUT: dl->color[0] = 1;dl->color[1] = 0; dl->color[2] = 0; dl->die = cl.time + 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); CL_LogoutEffect (pl->current.origin, weapon); break; case MZ_RESPAWN: dl->color[0] = 1;dl->color[1] = 1; dl->color[2] = 0; dl->die = cl.time + 1.0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0); CL_LogoutEffect (pl->current.origin, weapon); break; // RAFAEL case MZ_PHALANX: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/plasshot.wav"), volume, ATTN_NORM, 0); break; // RAFAEL case MZ_IONRIPPER: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rippfire.wav"), volume, ATTN_NORM, 0); break; // ====================== // PGM case MZ_ETF_RIFLE: dl->color[0] = 0.9;dl->color[1] = 0.7;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/nail1.wav"), volume, ATTN_NORM, 0); break; case MZ_SHOTGUN2: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotg2.wav"), volume, ATTN_NORM, 0); break; case MZ_HEATBEAM: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; dl->die = cl.time + 100; // S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__l1a.wav"), volume, ATTN_NORM, 0); break; case MZ_BLASTER2: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0; // FIXME - different sound for blaster2 ?? S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0); break; case MZ_TRACKER: // negative flashes handled the same in gl/soft until CL_AddDLights dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1; S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), volume, ATTN_NORM, 0); break; case MZ_NUKE1: dl->color[0] = 1;dl->color[1] = 0;dl->color[2] = 0; dl->die = cl.time + 100; break; case MZ_NUKE2: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; dl->die = cl.time + 100; break; case MZ_NUKE4: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1; dl->die = cl.time + 100; break; case MZ_NUKE8: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 1; dl->die = cl.time + 100; break; // PGM // ====================== } } /* ============== CL_ParseMuzzleFlash2 ============== */ void CL_ParseMuzzleFlash2 (void) { int ent; vec3_t origin; int flash_number; cdlight_t *dl; vec3_t forward, right; char soundname[64]; ent = MSG_ReadShort (&net_message); if (ent < 1 || ent >= MAX_EDICTS) Com_Error (ERR_DROP, "CL_ParseMuzzleFlash2: bad entity"); flash_number = MSG_ReadByte (&net_message); // locate the origin AngleVectors (cl_entities[ent].current.angles, forward, right, NULL); origin[0] = cl_entities[ent].current.origin[0] + forward[0] * monster_flash_offset[flash_number][0] + right[0] * monster_flash_offset[flash_number][1]; origin[1] = cl_entities[ent].current.origin[1] + forward[1] * monster_flash_offset[flash_number][0] + right[1] * monster_flash_offset[flash_number][1]; 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]; dl = CL_AllocDlight (ent); VectorCopy (origin, dl->origin); dl->radius = 200 + (rand()&31); dl->minlight = 32; dl->die = cl.time; // + 0.1; switch (flash_number) { case MZ2_INFANTRY_MACHINEGUN_1: case MZ2_INFANTRY_MACHINEGUN_2: case MZ2_INFANTRY_MACHINEGUN_3: case MZ2_INFANTRY_MACHINEGUN_4: case MZ2_INFANTRY_MACHINEGUN_5: case MZ2_INFANTRY_MACHINEGUN_6: case MZ2_INFANTRY_MACHINEGUN_7: case MZ2_INFANTRY_MACHINEGUN_8: case MZ2_INFANTRY_MACHINEGUN_9: case MZ2_INFANTRY_MACHINEGUN_10: case MZ2_INFANTRY_MACHINEGUN_11: case MZ2_INFANTRY_MACHINEGUN_12: case MZ2_INFANTRY_MACHINEGUN_13: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0); break; case MZ2_SOLDIER_MACHINEGUN_1: case MZ2_SOLDIER_MACHINEGUN_2: case MZ2_SOLDIER_MACHINEGUN_3: case MZ2_SOLDIER_MACHINEGUN_4: case MZ2_SOLDIER_MACHINEGUN_5: case MZ2_SOLDIER_MACHINEGUN_6: case MZ2_SOLDIER_MACHINEGUN_7: case MZ2_SOLDIER_MACHINEGUN_8: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck3.wav"), 1, ATTN_NORM, 0); break; case MZ2_GUNNER_MACHINEGUN_1: case MZ2_GUNNER_MACHINEGUN_2: case MZ2_GUNNER_MACHINEGUN_3: case MZ2_GUNNER_MACHINEGUN_4: case MZ2_GUNNER_MACHINEGUN_5: case MZ2_GUNNER_MACHINEGUN_6: case MZ2_GUNNER_MACHINEGUN_7: case MZ2_GUNNER_MACHINEGUN_8: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck2.wav"), 1, ATTN_NORM, 0); break; case MZ2_ACTOR_MACHINEGUN_1: case MZ2_SUPERTANK_MACHINEGUN_1: case MZ2_SUPERTANK_MACHINEGUN_2: case MZ2_SUPERTANK_MACHINEGUN_3: case MZ2_SUPERTANK_MACHINEGUN_4: case MZ2_SUPERTANK_MACHINEGUN_5: case MZ2_SUPERTANK_MACHINEGUN_6: case MZ2_TURRET_MACHINEGUN: // PGM dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; CL_ParticleEffect (origin, vec3_origin, 0, 40);