From f54d799f3e6e3f31b7d685453156bb7f0e448ce1 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Sun, 6 Jun 2010 14:25:47 +0200 Subject: [PATCH] move projectile explosions including precaching into w_*.qc; client/damage.qc now no longer contains weapon specific code --- qcsrc/client/damage.qc | 297 +++--------------------------- qcsrc/common/constants.qh | 13 ++ qcsrc/server/defs.qh | 12 -- qcsrc/server/w_campingrifle.qc | 21 +++ qcsrc/server/w_crylink.qc | 22 +++ qcsrc/server/w_electro.qc | 32 ++++ qcsrc/server/w_fireball.qc | 20 ++ qcsrc/server/w_grenadelauncher.qc | 12 ++ qcsrc/server/w_hagar.qc | 21 +++ qcsrc/server/w_hlac.qc | 12 ++ qcsrc/server/w_hook.qc | 12 ++ qcsrc/server/w_laser.qc | 12 ++ qcsrc/server/w_minstanex.qc | 12 ++ qcsrc/server/w_nex.qc | 12 ++ qcsrc/server/w_porto.qc | 8 + qcsrc/server/w_rocketlauncher.qc | 12 ++ qcsrc/server/w_seeker.qc | 65 +++++++ qcsrc/server/w_shotgun.qc | 21 +++ qcsrc/server/w_tuba.qc | 8 + qcsrc/server/w_uzi.qc | 19 ++ 20 files changed, 364 insertions(+), 279 deletions(-) diff --git a/qcsrc/client/damage.qc b/qcsrc/client/damage.qc index 9e90bee22..1b0138f36 100644 --- a/qcsrc/client/damage.qc +++ b/qcsrc/client/damage.qc @@ -1,22 +1,23 @@ .float silent; +float w_deathtype, w_issilent, w_random; +vector w_org, w_backoff; + void Ent_DamageInfo(float isNew) { - float hittype, dmg, rad, edge, thisdmg, forcemul; - float issilent; - vector force, org, thisforce; + float dmg, rad, edge, thisdmg, forcemul; + vector force, thisforce; entity oldself; oldself = self; - hittype = ReadShort(); - - issilent = (hittype & 0x8000); - hittype = (hittype & 0x7FFF); + w_deathtype = ReadShort(); + w_issilent = (w_deathtype & 0x8000); + w_deathtype = (w_deathtype & 0x7FFF); - org_x = ReadCoord(); - org_y = ReadCoord(); - org_z = ReadCoord(); + w_org_x = ReadCoord(); + w_org_y = ReadCoord(); + w_org_z = ReadCoord(); dmg = ReadByte(); rad = ReadByte(); @@ -34,22 +35,22 @@ void Ent_DamageInfo(float isNew) else forcemul = 1; - for(self = findradius(org, rad); self; self = self.chain) + for(self = findradius(w_org, rad); self; self = self.chain) { if(rad) { - thisdmg = vlen(self.origin - org) / rad; + thisdmg = vlen(self.origin - w_org) / rad; if(thisdmg >= 1) continue; if(dmg) { thisdmg = dmg + (edge - dmg) * thisdmg; - thisforce = forcemul * vlen(force) * (thisdmg / dmg) * normalize(self.origin - org); + thisforce = forcemul * vlen(force) * (thisdmg / dmg) * normalize(self.origin - w_org); } else { thisdmg = 0; - thisforce = forcemul * vlen(force) * normalize(self.origin - org); + thisforce = forcemul * vlen(force) * normalize(self.origin - w_org); } } else @@ -69,276 +70,38 @@ void Ent_DamageInfo(float isNew) //print("pushed ", ftos(num_for_edict(self)), " loose\n"); } - if(issilent) + if(w_issilent) self.silent = 1; if(self.event_damage) - self.event_damage(thisdmg, hittype, org, thisforce); + self.event_damage(thisdmg, w_deathtype, w_org, thisforce); } self = oldself; - // TODO spawn particle effects and sounds based on hittype + // TODO spawn particle effects and sounds based on w_deathtype - if(!DEATH_ISSPECIAL(hittype)) + if(!DEATH_ISSPECIAL(w_deathtype)) { - float hitwep, secondary, bounce, headshot; - vector org2, backoff; - float r; + float hitwep; - hitwep = DEATH_WEAPONOFWEAPONDEATH(hittype); - secondary = hittype & HITTYPE_SECONDARY; - bounce = hittype & HITTYPE_BOUNCE; - headshot = hittype & HITTYPE_HEADSHOT; - r = prandom(); + hitwep = DEATH_WEAPONOFWEAPONDEATH(w_deathtype); + w_random = prandom(); - traceline(org - normalize(force) * 16, org + normalize(force) * 16, MOVE_NOMONSTERS, world); + traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world); if(trace_fraction < 1 && hitwep != WEP_NEX && hitwep != WEP_MINSTANEX) - backoff = trace_plane_normal; + w_backoff = trace_plane_normal; else - backoff = -1 * normalize(force); - - setorigin(self, org + backoff * 2); // for sound() calls + w_backoff = -1 * normalize(force); + setorigin(self, w_org + w_backoff * 2); // for sound() calls - switch(hitwep) - { - case WEP_LASER: - org2 = org + backoff * 6; - pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_SHOTGUN: - org2 = org + backoff * 2; - pointparticles(particleeffectnum("shotgun_impact"), org2, backoff * 1000, 1); - if(!issilent) - { - if(r < 0.05) - sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM); - else if(r < 0.1) - sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM); - else if(r < 0.2) - sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM); - } - break; - case WEP_UZI: - org2 = org + backoff * 2; - pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1); - if(!issilent) - if(r < 0.05) - sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM); - else if(r < 0.1) - sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM); - else if(r < 0.2) - sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_GRENADE_LAUNCHER: - org2 = org + backoff * 12; - pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_ELECTRO: - org2 = org + backoff * 6; - if(secondary) - { - pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); - } - else - { - if(bounce) - { - // this is sent as "primary bounce" to distinguish it from secondary bounced balls - pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); - } - else - { - pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); - } - } - break; - case WEP_CRYLINK: - org2 = org + backoff * 2; - if(secondary) - { - pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM); - } - else - { - pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM); - } - break; - case WEP_NEX: - org2 = org + backoff * 6; - pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_HAGAR: - org2 = org + backoff * 6; - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - if(!issilent) - { - if (r<0.15) - sound(self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM); - else if (r<0.7) - sound(self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM); - else - sound(self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM); - } - break; - case WEP_ROCKET_LAUNCHER: - org2 = org + backoff * 12; - pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_PORTO: - print("Since when does Porto send DamageInfo?\n"); - break; - case WEP_MINSTANEX: - org2 = org + backoff * 6; - pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_HOOK: - org2 = org + backoff * 2; - pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_SEEKER: - org2 = org + backoff * 6; - if(secondary) - { - pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1); - if(!issilent) - { - if (r<0.15) - sound(self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM); - else if (r<0.7) - sound(self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM); - else - sound(self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM); - } - } - else - { - if(bounce) - { - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - if(!issilent) - { - if (r<0.15) - sound(self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM); - else if (r<0.7) - sound(self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM); - else - sound(self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM); - } - } - else if(headshot) - { - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM); - } - else - { - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - if(!issilent) - { - if (r<0.15) - sound(self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM); - else if (r<0.7) - sound(self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM); - else - sound(self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM); - } - } - } - break; - case WEP_HLAC: - org2 = org + backoff * 6; - pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); - break; - case WEP_CAMPINGRIFLE: - org2 = org + backoff * 2; - pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1); - if(!issilent) - { - if(r < 0.2) - sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM); - else if(r < 0.4) - sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM); - else if(r < 0.5) - sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM); - } - break; - case WEP_TUBA: - break; - case WEP_FIREBALL: - if(secondary) - { - // firemine goes out silently - } - else - { - org2 = org + backoff * 16; - pointparticles(particleeffectnum("fireball_explode"), org2, '0 0 0', 1); - if(!issilent) - sound(self, CHAN_PROJECTILE, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom - } - break; - default: - dprint("Unhandled damage of weapon ", ftos(hitwep), "\n"); - break; - } + (get_weaponinfo(hitwep)).weapon_func(WR_IMPACTEFFECT); } } void DamageInfo_Precache() { - precache_sound("weapons/crylink_impact2.wav"); - precache_sound("weapons/crylink_impact.wav"); - precache_sound("weapons/electro_impact.wav"); - precache_sound("weapons/electro_impact_combo.wav"); - precache_sound("weapons/flacexp1.wav"); - precache_sound("weapons/flacexp2.wav"); - precache_sound("weapons/flacexp3.wav"); - precache_sound("weapons/grenade_impact.wav"); - precache_sound("weapons/hagexp1.wav"); - precache_sound("weapons/hagexp2.wav"); - precache_sound("weapons/hagexp3.wav"); - precache_sound("weapons/flacexp1.wav"); - precache_sound("weapons/flacexp2.wav"); - precache_sound("weapons/flacexp3.wav"); - precache_sound("weapons/hookbomb_impact.wav"); - precache_sound("weapons/laserimpact.wav"); - precache_sound("weapons/neximpact.wav"); - precache_sound("weapons/ric1.wav"); - precache_sound("weapons/ric2.wav"); - precache_sound("weapons/ric3.wav"); - precache_sound("weapons/rocket_impact.wav"); - precache_sound("weapons/fireball_impact.wav"); - precache_sound("weapons/fireball_impact2.wav"); - precache_sound("weapons/seekerexp1.wav"); - precache_sound("weapons/seekerexp2.wav"); - precache_sound("weapons/seekerexp3.wav"); - precache_sound("weapons/tagexp1.wav"); - precache_sound("weapons/tagexp2.wav"); - precache_sound("weapons/tagexp3.wav"); - precache_sound("weapons/tag_impact.wav"); + float i; + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + (get_weaponinfo(i)).weapon_func(WR_PRECACHE); } diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 2fe55b168..240082604 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -512,3 +512,16 @@ float WATERLEVEL_SWIMMING = 2; float WATERLEVEL_SUBMERGED = 3; float MAX_SHOT_DISTANCE = 32768; + +// weapon requests +float WR_SETUP = 1; // (SVQC) setup weapon data +float WR_THINK = 2; // (SVQC) logic to run every frame +float WR_CHECKAMMO1 = 3; // (SVQC) checks ammo for weapon +float WR_CHECKAMMO2 = 4; // (SVQC) checks ammo for weapon +float WR_AIM = 5; // (SVQC) runs bot aiming code for this weapon +float WR_PRECACHE = 6; // (CSQC and SVQC) precaches models/sounds used by this weapon +float WR_SUICIDEMESSAGE = 7; // (SVQC) sets w_deathtypestring or leaves it alone (and may inspect w_deathtype for details) +float WR_KILLMESSAGE = 8; // (SVQC) sets w_deathtypestring or leaves it alone +float WR_RELOAD = 9; // (SVQC) does not need to do anything +float WR_RESETPLAYER = 10; // (SVQC) does not need to do anything +float WR_IMPACTEFFECT = 11; // (CSQC) impact effect diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 4d7017724..74b4ecea8 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -221,18 +221,6 @@ float WS_DROP = 2; // deselecting frame float WS_INUSE = 3; // fire state float WS_READY = 4; // idle frame -// weapon requests -float WR_SETUP = 1; // setup weapon data -float WR_THINK = 2; // logic to run every frame -float WR_CHECKAMMO1 = 3; // checks ammo for weapon -float WR_CHECKAMMO2 = 4; // checks ammo for weapon -float WR_AIM = 5; // runs bot aiming code for this weapon -float WR_PRECACHE = 6; // precaches models/sounds used by this weapon -float WR_SUICIDEMESSAGE = 7; // sets w_deathtypestring or leaves it alone (and may inspect w_deathtype for details) -float WR_KILLMESSAGE = 8; // sets w_deathtypestring or leaves it alone -float WR_RELOAD = 9; // does not need to do anything -float WR_RESETPLAYER = 10; // does not need to do anything - void weapon_defaultspawnfunc(float wpn); string w_deathtypestring; diff --git a/qcsrc/server/w_campingrifle.qc b/qcsrc/server/w_campingrifle.qc index 174b3c400..c3c9d52f9 100644 --- a/qcsrc/server/w_campingrifle.qc +++ b/qcsrc/server/w_campingrifle.qc @@ -298,6 +298,27 @@ float w_campingrifle(float req) #ifdef CSQC float w_campingrifle(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 2; + pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1); + if(!w_issilent) + { + if(w_random < 0.2) + sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM); + else if(w_random < 0.4) + sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM); + else if(w_random < 0.5) + sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM); + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/ric1.wav"); + precache_sound("weapons/ric2.wav"); + precache_sound("weapons/ric3.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_crylink.qc b/qcsrc/server/w_crylink.qc index f5450a63d..7f6062d3f 100644 --- a/qcsrc/server/w_crylink.qc +++ b/qcsrc/server/w_crylink.qc @@ -239,6 +239,28 @@ float w_crylink(float req) #ifdef CSQC float w_crylink(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 2; + if(w_deathtype & HITTYPE_SECONDARY) + { + pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM); + } + else + { + pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM); + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/crylink_impact2.wav"); + precache_sound("weapons/crylink_impact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc index 974626cca..45168cdac 100644 --- a/qcsrc/server/w_electro.qc +++ b/qcsrc/server/w_electro.qc @@ -321,6 +321,38 @@ float w_electro(float req) #ifdef CSQC float w_electro(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + if(w_deathtype & HITTYPE_SECONDARY) + { + pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + } + else + { + if(w_deathtype & HITTYPE_BOUNCE) + { + // this is sent as "primary (w_deathtype & HITTYPE_BOUNCE)" to distinguish it from (w_deathtype & HITTYPE_SECONDARY) bounced balls + pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); + } + else + { + pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + } + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/electro_impact.wav"); + precache_sound("weapons/electro_impact_combo.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_fireball.qc b/qcsrc/server/w_fireball.qc index 0551dbe4c..d5c0b13f9 100644 --- a/qcsrc/server/w_fireball.qc +++ b/qcsrc/server/w_fireball.qc @@ -396,6 +396,26 @@ float w_fireball(float req) #ifdef CSQC float w_fireball(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + if(w_deathtype & HITTYPE_SECONDARY) + { + // firemine goes out silently + } + else + { + org2 = w_org + w_backoff * 16; + pointparticles(particleeffectnum("fireball_explode"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/fireball_impact.wav"); + precache_sound("weapons/fireball_impact2.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_grenadelauncher.qc b/qcsrc/server/w_grenadelauncher.qc index 972c8c249..b340f76c9 100644 --- a/qcsrc/server/w_grenadelauncher.qc +++ b/qcsrc/server/w_grenadelauncher.qc @@ -240,6 +240,18 @@ float w_glauncher(float req) #ifdef CSQC float w_glauncher(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 12; + pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/grenade_impact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_hagar.qc b/qcsrc/server/w_hagar.qc index 83e1cf082..c95a90e5d 100644 --- a/qcsrc/server/w_hagar.qc +++ b/qcsrc/server/w_hagar.qc @@ -166,6 +166,27 @@ float w_hagar(float req) #ifdef CSQC float w_hagar(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); + if(!w_issilent) + { + if (w_random<0.15) + sound(self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM); + else if (w_random<0.7) + sound(self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM); + else + sound(self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM); + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/hagexp1.wav"); + precache_sound("weapons/hagexp2.wav"); + precache_sound("weapons/hagexp3.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_hlac.qc b/qcsrc/server/w_hlac.qc index ebdd0f99e..5fe75ab2c 100644 --- a/qcsrc/server/w_hlac.qc +++ b/qcsrc/server/w_hlac.qc @@ -217,6 +217,18 @@ float w_hlac(float req) #ifdef CSQC float w_hlac(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/laserimpact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_hook.qc b/qcsrc/server/w_hook.qc index 2b6390244..9e5868355 100644 --- a/qcsrc/server/w_hook.qc +++ b/qcsrc/server/w_hook.qc @@ -253,6 +253,18 @@ float w_hook(float req) #ifdef CSQC float w_hook(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 2; + pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/hookbomb_impact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_laser.qc b/qcsrc/server/w_laser.qc index f8f700b4b..a17f2a4c5 100644 --- a/qcsrc/server/w_laser.qc +++ b/qcsrc/server/w_laser.qc @@ -190,6 +190,18 @@ float w_laser(float req) #ifdef CSQC float w_laser(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/laserimpact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_minstanex.qc b/qcsrc/server/w_minstanex.qc index 837d73dca..f28c8581c 100644 --- a/qcsrc/server/w_minstanex.qc +++ b/qcsrc/server/w_minstanex.qc @@ -246,6 +246,18 @@ float w_minstanex(float req) #ifdef CSQC float w_minstanex(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/neximpact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_nex.qc b/qcsrc/server/w_nex.qc index 24c0af537..c23a47b5d 100644 --- a/qcsrc/server/w_nex.qc +++ b/qcsrc/server/w_nex.qc @@ -84,6 +84,18 @@ float w_nex(float req) #ifdef CSQC float w_nex(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/neximpact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_porto.qc b/qcsrc/server/w_porto.qc index 13847920f..1ab117885 100644 --- a/qcsrc/server/w_porto.qc +++ b/qcsrc/server/w_porto.qc @@ -283,6 +283,14 @@ float w_porto(float req) #ifdef CSQC float w_porto(float req) { + if(req == WR_IMPACTEFFECT) + { + print("Since when does Porto send DamageInfo?\n"); + } + else if(req == WR_PRECACHE) + { + // nothing to do + } return TRUE; } #endif diff --git a/qcsrc/server/w_rocketlauncher.qc b/qcsrc/server/w_rocketlauncher.qc index 5dd0b3199..f6975b3b6 100644 --- a/qcsrc/server/w_rocketlauncher.qc +++ b/qcsrc/server/w_rocketlauncher.qc @@ -565,6 +565,18 @@ float w_rlauncher(float req) #ifdef CSQC float w_rlauncher(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 12; + pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/rocket_impact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc index cdb4615c7..3b23c2112 100644 --- a/qcsrc/server/w_seeker.qc +++ b/qcsrc/server/w_seeker.qc @@ -483,6 +483,71 @@ float w_seeker(float req) #ifdef CSQC float w_seeker(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 6; + if(w_deathtype & HITTYPE_SECONDARY) + { + pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1); + if(!w_issilent) + { + if (w_random<0.15) + sound(self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM); + else if (w_random<0.7) + sound(self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM); + else + sound(self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM); + } + } + else + { + if(w_deathtype & HITTYPE_BOUNCE) + { + pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); + if(!w_issilent) + { + if (w_random<0.15) + sound(self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM); + else if (w_random<0.7) + sound(self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM); + else + sound(self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM); + } + } + else if(w_deathtype & HITTYPE_HEADSHOT) + { + if(!w_issilent) + sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM); + } + else + { + pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); + if(!w_issilent) + { + if (w_random<0.15) + sound(self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM); + else if (w_random<0.7) + sound(self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM); + else + sound(self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM); + } + } + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/flacexp1.wav"); + precache_sound("weapons/flacexp2.wav"); + precache_sound("weapons/flacexp3.wav"); + precache_sound("weapons/seekerexp1.wav"); + precache_sound("weapons/seekerexp2.wav"); + precache_sound("weapons/seekerexp3.wav"); + precache_sound("weapons/tagexp1.wav"); + precache_sound("weapons/tagexp2.wav"); + precache_sound("weapons/tagexp3.wav"); + precache_sound("weapons/tag_impact.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_shotgun.qc b/qcsrc/server/w_shotgun.qc index d4352c047..512eb28e8 100644 --- a/qcsrc/server/w_shotgun.qc +++ b/qcsrc/server/w_shotgun.qc @@ -152,6 +152,27 @@ float w_shotgun(float req) #ifdef CSQC float w_shotgun(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 2; + pointparticles(particleeffectnum("shotgun_impact"), org2, w_backoff * 1000, 1); + if(!w_issilent) + { + if(w_random < 0.05) + sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM); + else if(w_random < 0.1) + sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM); + else if(w_random < 0.2) + sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM); + } + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/ric1.wav"); + precache_sound("weapons/ric2.wav"); + precache_sound("weapons/ric3.wav"); + } return TRUE; } #endif diff --git a/qcsrc/server/w_tuba.qc b/qcsrc/server/w_tuba.qc index 295282f47..f3b916491 100644 --- a/qcsrc/server/w_tuba.qc +++ b/qcsrc/server/w_tuba.qc @@ -255,6 +255,14 @@ float w_tuba(float req) #ifdef CSQC float w_tuba(float req) { + if(req == WR_IMPACTEFFECT) + { + // nothing to do here; particles of tuba are handled differently + } + else if(req == WR_PRECACHE) + { + // nothing to do + } return TRUE; } #endif diff --git a/qcsrc/server/w_uzi.qc b/qcsrc/server/w_uzi.qc index d6ea5c35b..5879b00b8 100644 --- a/qcsrc/server/w_uzi.qc +++ b/qcsrc/server/w_uzi.qc @@ -141,6 +141,25 @@ float w_uzi(float req) #ifdef CSQC float w_uzi(float req) { + if(req == WR_IMPACTEFFECT) + { + vector org2; + org2 = w_org + w_backoff * 2; + pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1); + if(!w_issilent) + if(w_random < 0.05) + sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM); + else if(w_random < 0.1) + sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM); + else if(w_random < 0.2) + sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM); + } + else if(req == WR_PRECACHE) + { + precache_sound("weapons/ric1.wav"); + precache_sound("weapons/ric2.wav"); + precache_sound("weapons/ric3.wav"); + } return TRUE; } #endif -- 2.39.2