From 6079ac5158e627018100b58efcee5c9cc36156a4 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 17 Jan 2009 21:29:16 +0000 Subject: [PATCH] now all projectile hit effects are clientside git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5597 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/damage.qc | 187 ++++++++++++++++++++++++- data/qcsrc/client/projectile.qc | 5 + data/qcsrc/common/constants.qh | 1 + data/qcsrc/server/g_damage.qc | 11 +- data/qcsrc/server/g_subs.qc | 5 +- data/qcsrc/server/w_common.qc | 28 ++-- data/qcsrc/server/w_electro.qc | 12 -- data/qcsrc/server/w_grenadelauncher.qc | 16 +-- data/qcsrc/server/w_hagar.qc | 24 ---- data/qcsrc/server/w_hlac.qc | 24 +--- data/qcsrc/server/w_hook.qc | 6 - data/qcsrc/server/w_laser.qc | 5 - data/qcsrc/server/w_minstanex.qc | 4 +- data/qcsrc/server/w_nex.qc | 6 +- data/qcsrc/server/w_rocketlauncher.qc | 7 - data/qcsrc/server/w_seeker.qc | 42 +----- 16 files changed, 222 insertions(+), 161 deletions(-) diff --git a/data/qcsrc/client/damage.qc b/data/qcsrc/client/damage.qc index 191089d7d..18d19dd4d 100644 --- a/data/qcsrc/client/damage.qc +++ b/data/qcsrc/client/damage.qc @@ -1,3 +1,53 @@ +/* +================== +findbetterlocation + +Returns a point at least 12 units away from walls +(useful for explosion animations, although the blast is performed where it really happened) +Ripped from DPMod +================== +*/ +vector findbetterlocation (vector org, float mindist) +{ + vector loc, norm, norm2; + vector vec; + float c; + float h; + + norm = '0 0 1'; + + vec = mindist * '1 0 0'; + c = 0; + while (c < 6) + { + traceline (org, org + vec, MOVE_WORLDONLY, world); + vec = vec * -1; + if (trace_fraction < 1) + { + loc = trace_endpos; + norm2 = trace_plane_normal; + traceline (loc, loc + vec, MOVE_WORLDONLY, world); + if (trace_fraction >= 1) + { + org = loc + vec; + norm = norm2; + } + } + if (c & 1) + { + h = vec_y; + vec_y = vec_x; + vec_x = vec_z; + vec_z = h; + } + c = c + 1; + } + + trace_plane_normal = norm; + + return org; +} + void Ent_DamageInfo() { float hittype, dmg, rad, edge, thisdmg; @@ -18,16 +68,13 @@ void Ent_DamageInfo() for(self = findradius(org, rad); self; self = self.chain) { - print("findradius found something\n"); - if(rad) { thisdmg = vlen(self.origin - org) / rad; - print("thisdmg = ", ftos(thisdmg), "\n"); if(thisdmg >= 1) continue; thisdmg = dmg + (edge - dmg) * thisdmg; - thisforce = force_z * normalize(self.origin - org); + thisforce = vlen(force) * normalize(self.origin - org); } else { @@ -48,16 +95,63 @@ void Ent_DamageInfo() self = oldself; + setorigin(self, org); // for sound() calls + // TODO spawn particle effects and sounds based on hittype if(!DEATH_ISSPECIAL(hittype)) { - float hitwep, secondary; + float hitwep, secondary, bounce, headshot; + vector org2; + float r; + hitwep = DEATH_WEAPONOFWEAPONDEATH(hittype); secondary = hittype & HITTYPE_SECONDARY; + bounce = hittype & HITTYPE_BOUNCE; + headshot = hittype & HITTYPE_HEADSHOT; + r = random(); switch(hitwep) { + case WEP_LASER: + org2 = findbetterlocation (org, 8); + pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1); + sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + break; + case WEP_SHOTGUN: + org2 = findbetterlocation (org, 2); + pointparticles(particleeffectnum("shotgun_impact"), org2, trace_plane_normal * 1000, 1); + break; + case WEP_UZI: + org2 = findbetterlocation (org, 2); + pointparticles(particleeffectnum("machinegun_impact"), org2, trace_plane_normal * 1000, 1); + break; + case WEP_GRENADE_LAUNCHER: + org2 = findbetterlocation (org, 12); + pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1); + sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); + break; + case WEP_ELECTRO: + org2 = findbetterlocation (org, 8); + if(secondary) + { + sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); + } + else + { + if(bounce) + { + // this is sent as "primary bounce" to distinguish it from secondary bounced balls + sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); + } + else + { + sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); + } + } case WEP_CRYLINK: if(secondary) { @@ -70,6 +164,89 @@ void Ent_DamageInfo() pointparticles(particleeffectnum("crylink_impactbig"), org, '0 0 0', 1); } break; + case WEP_NEX: + sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1); + break; + case WEP_HAGAR: + org2 = findbetterlocation (org, 12); + 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); + pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); + break; + case WEP_ROCKET_LAUNCHER: + org2 = findbetterlocation (org, 16); + sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); + break; + case WEP_PORTO: + print("Since when does Porto send DamageInfo?\n"); + break; + case WEP_MINSTANEX: + sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1); + break; + case WEP_HOOK: + org2 = findbetterlocation (org, 12); + sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1); + break; + case WEP_SEEKER: + org2 = findbetterlocation (org, 12); + if(secondary) + { + 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); + pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1); + } + else + { + if(bounce) + { + 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); + pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); + } + else if(headshot) + { + sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM); + } + else + { + 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); + pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); + } + } + break; + case WEP_HLAC: + org2 = findbetterlocation (org, 12); + sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1); + break; + case WEP_CAMPINGRIFLE: + org2 = findbetterlocation (org, 2); + pointparticles(particleeffectnum("machinegun_impact"), org, trace_plane_normal * 1000, 1); + break; + default: + dprint("Unhandled damage of weapon ", ftos(hitwep), "\n"); + break; } } } diff --git a/data/qcsrc/client/projectile.qc b/data/qcsrc/client/projectile.qc index ae4697150..29021f0ed 100644 --- a/data/qcsrc/client/projectile.qc +++ b/data/qcsrc/client/projectile.qc @@ -73,6 +73,9 @@ void Projectile_Draw() case PROJECTILE_HAGAR_BOUNCING: trailparticles(self, particleeffectnum("TR_GRENADE"), oldorg, self.origin); break; + case PROJECTILE_BULLET_GLOWING: + R_AddDynamicLight(self.origin, 50, '1 1 0'); + break; default: break; } @@ -159,6 +162,7 @@ void Ent_Projectile() case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3"); break; case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); break; case PROJECTILE_BULLET: setmodel(self, "models/tracer.mdl"); break; + case PROJECTILE_BULLET_GLOWING: setmodel(self, "models/tracer.mdl"); break; case PROJECTILE_CRYLINK: setmodel(self, "models/plasmatrail.mdl"); break; case PROJECTILE_ELECTRO_BEAM: setmodel(self, "models/elaser.mdl"); break; case PROJECTILE_GRENADE: setmodel(self, "models/grenademodel.md3"); break; @@ -255,6 +259,7 @@ void Projectile_Precache() precache_model("models/rocket.md3"); precache_model("models/laser.mdl"); precache_model("models/tracer.mdl"); + precache_model("models/tracer.mdl"); precache_model("models/plasmatrail.mdl"); precache_model("models/elaser.mdl"); precache_model("models/grenademodel.md3"); diff --git a/data/qcsrc/common/constants.qh b/data/qcsrc/common/constants.qh index 41a33c692..51f340460 100644 --- a/data/qcsrc/common/constants.qh +++ b/data/qcsrc/common/constants.qh @@ -373,6 +373,7 @@ float PROJECTILE_PORTO_BLUE = 14; float PROJECTILE_HOOKBOMB = 15; float PROJECTILE_HAGAR = 16; float PROJECTILE_HAGAR_BOUNCING = 17; +float PROJECTILE_BULLET_GLOWING = 18; // Deathtypes (weapon deathtypes are the IT_* constants below) // NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too. diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index c354cbd08..f8dd481f2 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -24,6 +24,8 @@ void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad entity e; + org = findbetterlocation(org, 1); + e = spawn(); e.classname = "damageinfo"; setorigin(e, org); @@ -949,7 +951,14 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e total_damage_to_creatures = 0; if(deathtype != (WEP_HOOK | HITTYPE_SECONDARY | HITTYPE_BOUNCE)) // only send gravity bomb damage once - Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * '0 0 1', deathtype); + { + force = inflictor.velocity; + if(vlen(force) == 0) + force = '0 0 1'; + else + force = normalize(force) * forceintensity; + Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype); + } targ = findradius (blastorigin, rad); while (targ) diff --git a/data/qcsrc/server/g_subs.qc b/data/qcsrc/server/g_subs.qc index 20e5c59ae..eda6e02e6 100644 --- a/data/qcsrc/server/g_subs.qc +++ b/data/qcsrc/server/g_subs.qc @@ -425,7 +425,7 @@ vector findbetterlocation (vector org, float mindist) { vector loc; vector vec; - float c; + float c, h; vec = mindist * '1 0 0'; c = 0; @@ -442,9 +442,10 @@ vector findbetterlocation (vector org, float mindist) } if (c & 1) { - vec_z = vec_y; + h = vec_y; vec_y = vec_x; vec_x = vec_z; + vec_z = h; } c = c + 1; } diff --git a/data/qcsrc/server/w_common.qc b/data/qcsrc/server/w_common.qc index 7177c198e..e51b53969 100644 --- a/data/qcsrc/server/w_common.qc +++ b/data/qcsrc/server/w_common.qc @@ -118,17 +118,14 @@ void W_BallisticBullet_Hit (void) { float f; - if (DEATH_ISWEAPON(self.projectiledeathtype, WEP_SHOTGUN)) - pointparticles(particleeffectnum("shotgun_impact"), self.origin, normalize(self.velocity) * 1000, 1); - else - pointparticles(particleeffectnum("machinegun_impact"), self.origin, normalize(self.velocity) * 1000, 1); + f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier + + Damage_DamageInfo(self.origin, self.dmg * f, 0, 0, self.dmg_force * normalize(self.velocity) * f, self.projectiledeathtype); if(other && other != self.enemy) { self.enemy = other; // don't hit the same player twice with the same bullet - f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier - headshot = 0; yoda = 0; damage_headshotbonus = self.dmg_edge; @@ -166,10 +163,9 @@ void W_BallisticBullet_LeaveSolid_think() self.flags &~= FL_ONGROUND; self.effects &~= EF_NODRAW; - if (DEATH_ISWEAPON(self.projectiledeathtype, WEP_SHOTGUN)) - pointparticles(particleeffectnum("shotgun_impact"), self.origin, normalize(self.velocity) * 1000, 1); - else - pointparticles(particleeffectnum("machinegun_impact"), self.origin, normalize(self.velocity) * 1000, 1); + float f; + f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier + Damage_DamageInfo(self.origin, 0, 0, 0, self.dmg_force * normalize(self.velocity) * f, self.projectiledeathtype); UpdateCSQCProjectile(self); } @@ -294,7 +290,10 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f proj.oldvelocity = proj.velocity; - CSQCProjectile(proj, TRUE, PROJECTILE_BULLET); + if(DEATH_WEAPONOF(dtype) == WEP_CAMPINGRIFLE) + CSQCProjectile(proj, TRUE, PROJECTILE_BULLET_GLOWING); + else + CSQCProjectile(proj, TRUE, PROJECTILE_BULLET); } void fireBullet (vector start, vector dir, float spread, float damage, float force, float dtype, float tracer) @@ -341,12 +340,9 @@ void fireBullet (vector start, vector dir, float spread, float damage, float for { if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) { - if (DEATH_ISWEAPON(dtype, WEP_SHOTGUN)) - pointparticles(particleeffectnum("shotgun_impact"), trace_endpos, trace_plane_normal * 1000, 1); - else - pointparticles(particleeffectnum("machinegun_impact"), trace_endpos, trace_plane_normal * 1000, 1); + Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * force, dtype); + Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force); } - Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force); } } diff --git a/data/qcsrc/server/w_electro.qc b/data/qcsrc/server/w_electro.qc index 875c3bdb4..d2fcc62b2 100644 --- a/data/qcsrc/server/w_electro.qc +++ b/data/qcsrc/server/w_electro.qc @@ -2,7 +2,6 @@ void W_Plasma_Explode (void) { vector org2; - org2 = findbetterlocation (self.origin, 8); if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") @@ -13,28 +12,17 @@ void W_Plasma_Explode (void) self.event_damage = SUB_Null; if (self.movetype == MOVETYPE_BOUNCE) { - pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); RadiusDamage (self, self.owner, cvar("g_balance_electro_secondary_damage"), cvar("g_balance_electro_secondary_edgedamage"), cvar("g_balance_electro_secondary_radius"), world, cvar("g_balance_electro_secondary_force"), self.projectiledeathtype, other); } else { - pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); RadiusDamage (self, self.owner, cvar("g_balance_electro_primary_damage"), cvar("g_balance_electro_primary_edgedamage"), cvar("g_balance_electro_primary_radius"), world, cvar("g_balance_electro_primary_force"), self.projectiledeathtype, other); } - sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); - remove (self); } void W_Plasma_Explode_Combo (void) { - vector org2; - - org2 = findbetterlocation (self.origin, 8); - pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); - - sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); - self.event_damage = SUB_Null; RadiusDamage (self, self.owner, cvar("g_balance_electro_combo_damage"), cvar("g_balance_electro_combo_edgedamage"), cvar("g_balance_electro_combo_radius"), world, cvar("g_balance_electro_combo_force"), WEP_ELECTRO | HITTYPE_BOUNCE, other); // use THIS type for a combo because primary can't bounce remove (self); diff --git a/data/qcsrc/server/w_grenadelauncher.qc b/data/qcsrc/server/w_grenadelauncher.qc index e282ee81b..3782b965a 100644 --- a/data/qcsrc/server/w_grenadelauncher.qc +++ b/data/qcsrc/server/w_grenadelauncher.qc @@ -1,10 +1,5 @@ void W_Grenade_Explode (void) { - vector org2; - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1); - sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); - if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") if(IsDifferentTeam(self.owner, other)) @@ -19,20 +14,15 @@ void W_Grenade_Explode (void) void W_Grenade_Explode2 (void) { - vector org2; - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1); - sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), self.projectiledeathtype, other); - if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") if(IsDifferentTeam(self.owner, other)) if(IsFlying(other)) announce(self.owner, "announcer/male/airshot.wav"); + self.event_damage = SUB_Null; + RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), self.projectiledeathtype, other); + remove (self); } diff --git a/data/qcsrc/server/w_hagar.qc b/data/qcsrc/server/w_hagar.qc index 74cbff2a9..51bdb2523 100644 --- a/data/qcsrc/server/w_hagar.qc +++ b/data/qcsrc/server/w_hagar.qc @@ -1,17 +1,5 @@ void W_Hagar_Explode (void) { - vector org2; - float b; - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - b = crandom(); - if (b<-0.7) - sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM); - else if (b<0.4) - sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM); - else if (b<1) - sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM); - self.event_damage = SUB_Null; RadiusDamage (self, self.realowner, cvar("g_balance_hagar_primary_damage"), cvar("g_balance_hagar_primary_edgedamage"), cvar("g_balance_hagar_primary_radius"), world, cvar("g_balance_hagar_primary_force"), self.projectiledeathtype, other); @@ -20,18 +8,6 @@ void W_Hagar_Explode (void) void W_Hagar_Explode2 (void) { - vector org2; - float b; - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - b = crandom(); - if (b<-0.7) - sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM); - else if (b<0.4) - sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM); - else if (b<1) - sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM); - self.event_damage = SUB_Null; RadiusDamage (self, self.realowner, cvar("g_balance_hagar_secondary_damage"), cvar("g_balance_hagar_secondary_edgedamage"), cvar("g_balance_hagar_secondary_radius"), world, cvar("g_balance_hagar_secondary_force"), self.projectiledeathtype, other); diff --git a/data/qcsrc/server/w_hlac.qc b/data/qcsrc/server/w_hlac.qc index f49ab854d..369ed5510 100644 --- a/data/qcsrc/server/w_hlac.qc +++ b/data/qcsrc/server/w_hlac.qc @@ -1,44 +1,22 @@ .float HLAC_bulletcounter; void W_HLAC_Touch (void) { - vector dir; - vector org2; - vector normal; - PROJECTILE_TOUCH; - normal = trace_plane_normal; - dir = normalize (self.owner.origin - self.origin); - org2 = findbetterlocation (self.origin, 8); - - pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1); - self.event_damage = SUB_Null; RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other); - sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); remove (self); } void W_HLAC_Touch2 (void) { - vector dir; - vector org2; - vector normal; - PROJECTILE_TOUCH; - normal = trace_plane_normal; - dir = normalize (self.owner.origin - self.origin); - org2 = findbetterlocation (self.origin, 8); - - pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1); - - //self.event_damage = SUB_Null; + self.event_damage = SUB_Null; RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other); - sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); remove (self); } diff --git a/data/qcsrc/server/w_hook.qc b/data/qcsrc/server/w_hook.qc index 129e6d778..355dcfeb7 100644 --- a/data/qcsrc/server/w_hook.qc +++ b/data/qcsrc/server/w_hook.qc @@ -31,12 +31,6 @@ void W_Hook_ExplodeThink (void) void W_Hook_Explode2 (void) { - vector org2; - - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1); - sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM); - self.event_damage = SUB_Null; self.touch = SUB_Null; diff --git a/data/qcsrc/server/w_laser.qc b/data/qcsrc/server/w_laser.qc index b31bdc0e4..3c2b4fa08 100644 --- a/data/qcsrc/server/w_laser.qc +++ b/data/qcsrc/server/w_laser.qc @@ -10,17 +10,12 @@ void W_Laser_Touch (void) normal = trace_plane_normal; dir = normalize (self.owner.origin - self.origin); - org2 = findbetterlocation (self.origin, 8); - - pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1); - self.event_damage = SUB_Null; if (self.dmg) RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_secondary_edgedamage"), cvar("g_balance_laser_secondary_radius"), world, cvar("g_balance_laser_secondary_force"), self.projectiledeathtype, other); else RadiusDamage (self, self.owner, cvar("g_balance_laser_primary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius"), world, cvar("g_balance_laser_primary_force"), self.projectiledeathtype, other); - sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); remove (self); } diff --git a/data/qcsrc/server/w_minstanex.qc b/data/qcsrc/server/w_minstanex.qc index 96f951d11..5e9115654 100644 --- a/data/qcsrc/server/w_minstanex.qc +++ b/data/qcsrc/server/w_minstanex.qc @@ -41,9 +41,7 @@ void W_MinstaNex_Attack (void) trailparticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, trace_endpos); // flash and burn the wall if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) - pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1); - // play a sound - soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + Damage_DamageInfo(trace_endpos, 10000, 0, 0, 800 * w_shotdir, WEP_MINSTANEX); if not(self.items & IT_UNLIMITED_WEAPON_AMMO) { diff --git a/data/qcsrc/server/w_nex.qc b/data/qcsrc/server/w_nex.qc index f01f38f09..31d0e0c08 100644 --- a/data/qcsrc/server/w_nex.qc +++ b/data/qcsrc/server/w_nex.qc @@ -17,14 +17,10 @@ void W_Nex_Attack (void) trailparticles(world, particleeffectnum("nex_beam"), w_shotorg, trace_endpos); // flash and burn the wall if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) - pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1); - // play a sound - soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + Damage_DamageInfo(trace_endpos, cvar("g_balance_nex_damage"), 0, 0, cvar("g_balance_nex_force") * w_shotdir, WEP_NEX); if not(self.items & IT_UNLIMITED_WEAPON_AMMO) - { self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo"); - } } void spawnfunc_weapon_nex (void); // defined in t_items.qc diff --git a/data/qcsrc/server/w_rocketlauncher.qc b/data/qcsrc/server/w_rocketlauncher.qc index 76cda0d36..7d4eded03 100644 --- a/data/qcsrc/server/w_rocketlauncher.qc +++ b/data/qcsrc/server/w_rocketlauncher.qc @@ -3,13 +3,6 @@ void W_Rocket_Explode (void) { - vector org2; - sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); - org2 = findbetterlocation (self.origin, 16); - - pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); - - //effect (org2, "models/sprites/rockexpl.spr", 0, 12, 35); self.event_damage = SUB_Null; RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), self.projectiledeathtype, other); diff --git a/data/qcsrc/server/w_seeker.qc b/data/qcsrc/server/w_seeker.qc index 62178befe..a6ad2aa3e 100644 --- a/data/qcsrc/server/w_seeker.qc +++ b/data/qcsrc/server/w_seeker.qc @@ -4,19 +4,6 @@ void Seeker_Missile_Explode () { - vector org2; - float b; - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - - b = crandom(); - if (b<-0.7) - sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM); - else if (b<0.4) - sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM); - else if (b<1) - sound (self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM); - self.event_damage = SUB_Null; RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other); @@ -278,17 +265,7 @@ void Seeker_Tag_Explode () //if(other==self.owner) // return; - - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - - b = crandom(); - if (b<-0.7) - sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM); - else if (b<0.4) - sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM); - else if (b<1) - sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM); + Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE); remove (self); } @@ -310,7 +287,7 @@ void Seeker_Tag_Touch() te_knightspike(org2); self.event_damage = SUB_Null; - sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM); + Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT); if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO) { @@ -379,19 +356,6 @@ void Seeker_Fire_Tag() void Seeker_Flac_Explode () { - vector org2; - float b; - org2 = findbetterlocation (self.origin, 12); - pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1); - - b = crandom(); - if (b<-0.7) - sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM); - else if (b<0.4) - sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM); - else if (b<1) - sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM); - self.event_damage = SUB_Null; RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other); @@ -434,7 +398,7 @@ void Seeker_Fire_Flac() } W_SetupShot (self, f_org, FALSE, 2, "weapons/flac_fire.wav"); - pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); + pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); missile = spawn (); missile.owner = missile.realowner = self; -- 2.39.2