From c0408f2cd3ab3b38175fdf7cd7d43bbc8dede5c2 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 20 Jun 2009 21:10:41 +0000 Subject: [PATCH] fix bot_sound_monopoly cvar git-svn-id: svn://svn.icculus.org/nexuiz/trunk@7064 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/casings.qc | 40 +++---- data/qcsrc/client/damage.qc | 158 ++++++++++++++++++---------- data/qcsrc/client/gibs.qc | 76 +++++++------ data/qcsrc/client/projectile.qc | 7 ++ data/qcsrc/server/cl_player.qc | 50 +++++---- data/qcsrc/server/csqcprojectile.qc | 2 + data/qcsrc/server/g_casings.qc | 5 +- data/qcsrc/server/g_damage.qc | 9 +- data/qcsrc/server/g_violence.qc | 8 +- data/qcsrc/server/miscfunctions.qc | 18 ++-- data/qcsrc/server/w_campingrifle.qc | 2 +- data/qcsrc/server/w_common.qc | 6 +- data/qcsrc/server/w_minstanex.qc | 2 +- data/qcsrc/server/w_nex.qc | 2 +- data/qcsrc/server/w_seeker.qc | 4 +- data/qcsrc/server/w_shotgun.qc | 4 +- data/qcsrc/server/w_uzi.qc | 2 +- 17 files changed, 235 insertions(+), 160 deletions(-) diff --git a/data/qcsrc/client/casings.qc b/data/qcsrc/client/casings.qc index 397520ed4..100be2dbe 100644 --- a/data/qcsrc/client/casings.qc +++ b/data/qcsrc/client/casings.qc @@ -1,12 +1,13 @@ -float casecount; -entity caselist; - -void Casing_Delete() -{ - --casecount; - remove(self); -} - +float casecount; +entity caselist; +.float silent; + +void Casing_Delete() +{ + --casecount; + remove(self); +} + void Casing_Draw() { if(self.move_flags & FL_ONGROUND) @@ -35,6 +36,7 @@ void Casing_Touch() return; } + if(!self.silent) if(!trace_ent || trace_ent.solid == SOLID_BSP) { if(vlen(self.velocity) > 50) @@ -74,16 +76,18 @@ void Casing_Damage(float thisdmg, float hittype, vector org, vector thisforce) void Ent_Casing() { entity casing; - - if not(caselist) - caselist = spawn(); - casing = RubbleNew(caselist); - ++casecount; - if(casecount >= cvar_or("cl_casings_maxcount",100)) - RubbleDrop(caselist,Casing_Delete); + if not(caselist) + caselist = spawn(); + + casing = RubbleNew(caselist); + ++casecount; + if(casecount >= cvar_or("cl_casings_maxcount",100)) + RubbleDrop(caselist,Casing_Delete); casing.state = ReadByte(); + casing.silent = (casing.state & 0x80); + casing.state = (casing.state & 0x7F); casing.origin_x = ReadCoord(); casing.origin_y = ReadCoord(); casing.origin_z = ReadCoord(); @@ -117,8 +121,8 @@ void Ent_Casing() } setsize(casing, '0 0 -1', '0 0 -1'); - } - else + } + else Casing_Delete(); } diff --git a/data/qcsrc/client/damage.qc b/data/qcsrc/client/damage.qc index aa32a5f1f..80df4a26a 100644 --- a/data/qcsrc/client/damage.qc +++ b/data/qcsrc/client/damage.qc @@ -1,12 +1,19 @@ +.float silent; + void Ent_DamageInfo() { float hittype, dmg, rad, edge, thisdmg, forcemul; + float issilent; vector force, org, thisforce; entity oldself; oldself = self; hittype = ReadShort(); + + issilent = (hittype & 0x8000); + hittype = (hittype & 0x7FFF); + org_x = ReadCoord(); org_y = ReadCoord(); org_z = ReadCoord(); @@ -59,6 +66,9 @@ void Ent_DamageInfo() //print("pushed ", ftos(num_for_edict(self)), " loose\n"); } + if(issilent) + self.silent = 1; + if(self.event_damage) self.event_damage(thisdmg, hittype, org, thisforce); } @@ -92,39 +102,46 @@ void Ent_DamageInfo() case WEP_LASER: org2 = org + backoff * 6; pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1); - sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + 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(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); + 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(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); + 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); - sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); + 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); - sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + if(!issilent) + sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); } else { @@ -132,12 +149,14 @@ void Ent_DamageInfo() { // this is sent as "primary bounce" to distinguish it from secondary bounced balls pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); - sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); + 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); - sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + if(!issilent) + sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); } } break; @@ -146,33 +165,40 @@ void Ent_DamageInfo() if(secondary) { pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1); - sound (self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM); + if(!issilent) + sound(self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM); } else { pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1); - sound (self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM); + 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); - sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + 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 (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); + 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); - sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + 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"); @@ -180,67 +206,83 @@ void Ent_DamageInfo() case WEP_MINSTANEX: org2 = org + backoff * 6; pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1); - sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); + 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); - sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM); + 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 (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); + 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 (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); + 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) { - sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM); + if(!issilent) + sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM); } else { pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1); - 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); + 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); - sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + 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(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); + 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; @@ -267,9 +309,9 @@ void DamageInfo_Precache() 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/ric1.wav"); + precache_sound("weapons/ric2.wav"); + precache_sound("weapons/ric3.wav"); precache_sound("weapons/rocket_impact.wav"); precache_sound("weapons/seekerexp1.wav"); precache_sound("weapons/seekerexp2.wav"); diff --git a/data/qcsrc/client/gibs.qc b/data/qcsrc/client/gibs.qc index b665edef4..b020b9dab 100644 --- a/data/qcsrc/client/gibs.qc +++ b/data/qcsrc/client/gibs.qc @@ -1,12 +1,13 @@ -float gibcount; -entity giblist; - -void Gib_Delete() -{ - --gibcount; - remove(self); -} - +float gibcount; +entity giblist; +.float silent; + +void Gib_Delete() +{ + --gibcount; + remove(self); +} + string species_prefix(float specnum) { switch(specnum) @@ -45,7 +46,8 @@ void Gib_Touch() return; } - sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM); + if(!self.silent) + sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM); pointparticles(particleeffectnum(strcat(species_prefix(self.cnt), "blood")), self.origin + '0 0 1', '0 0 30', 10); Gib_Delete(); @@ -74,26 +76,27 @@ void Gib_Draw() R_AddEntity(self); } -void TossGib (string mdlname, vector org, vector vconst, vector vrand, float specnum, float destroyontouch) +void TossGib (string mdlname, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent) { entity gib; - if not(giblist) - giblist = spawn(); - - // TODO remove some gibs according to cl_nogibs - gib = RubbleNew(giblist); - ++gibcount; - if(gibcount >= cvar_or("cl_gibs_maxcount",100)) - RubbleDrop(giblist,Gib_Delete); + if not(giblist) + giblist = spawn(); + + // TODO remove some gibs according to cl_nogibs + gib = RubbleNew(giblist); + ++gibcount; + if(gibcount >= cvar_or("cl_gibs_maxcount",100)) + RubbleDrop(giblist,Gib_Delete); - //gib = spawn(); + //gib = spawn(); gib.classname = "gib"; gib.move_movetype = MOVETYPE_BOUNCE; gib.gravity = 1; gib.solid = SOLID_CORPSE; gib.cnt = specnum; + gib.silent = issilent; setmodel (gib, mdlname); // precision set above gib.skin = specnum; @@ -120,6 +123,7 @@ void Ent_GibSplash() float amount, type, specnum; vector org, vel; string specstr; + float issilent; float c, gibfactor, randomvalue; @@ -144,47 +148,49 @@ void Ent_GibSplash() self.origin = org; // for the sounds - specnum = (type & 0x78) / 8; // blood/gibmodel type: using four bits (0..15, bit indexes 3,4,5,6) + specnum = (type & 0x78) / 8; // blood/gibmodel type: using four bits (0..7, bit indexes 3,4,5) + issilent = (type & 0x40); type = type & 0x87; // remove the species bits: bit 7 = gentle, bit 0,1,2 = kind of gib specstr = species_prefix(specnum); switch(type) { case 0x01: - sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM); + if(!issilent) + sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM); if(prandom() < amount) - TossGib ("models/gibs/eye.md3", org, vel, prandomvec() * 150, specnum, 0); + TossGib ("models/gibs/eye.md3", org, vel, prandomvec() * 150, specnum, 0, issilent); new_te_bloodshower(particleeffectnum(strcat(specstr, "bloodshower")), org, 1200, amount); if(prandom() < amount) - TossGib ("models/gibs/bloodyskull.md3", org, vel, prandomvec() * 100, specnum, 0); + TossGib ("models/gibs/bloodyskull.md3", org, vel, prandomvec() * 100, specnum, 0, issilent); for(c = 0; c < amount; ++c) { randomvalue = amount - c; if(prandom() < randomvalue) - TossGib ("models/gibs/arm.md3", org, vel, prandomvec() * (prandom() * 120 + 90), specnum,0); + TossGib ("models/gibs/arm.md3", org, vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/arm.md3", org, vel, prandomvec() * (prandom() * 120 + 90), specnum,0); + TossGib ("models/gibs/arm.md3", org, vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/chest.md3", org + '0 0 -12', vel, prandomvec() * (prandom() * 120 + 80), specnum,0); + TossGib ("models/gibs/chest.md3", org + '0 0 -12', vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/smallchest.md3", org, vel, prandomvec() * (prandom() * 120 + 80), specnum,0); + TossGib ("models/gibs/smallchest.md3", org, vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/leg1.md3", org + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0); + TossGib ("models/gibs/leg1.md3", org + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/leg2.md3", org + '0 0 -9', vel, prandomvec() * (prandom() * 120 + 85), specnum,0); + TossGib ("models/gibs/leg2.md3", org + '0 0 -9', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent); // these splat on impact if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1); + TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1); + TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1); + TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1, issilent); if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1); + TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * 450, specnum,1, issilent); } break; case 0x02: @@ -192,7 +198,7 @@ void Ent_GibSplash() break; case 0x03: if(prandom() < amount) - TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1); // TODO maybe adjust to more randomization? + TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent); // TODO maybe adjust to more randomization? break; case 0x81: pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount); diff --git a/data/qcsrc/client/projectile.qc b/data/qcsrc/client/projectile.qc index 7a0034c81..055f5c3d7 100644 --- a/data/qcsrc/client/projectile.qc +++ b/data/qcsrc/client/projectile.qc @@ -15,6 +15,7 @@ void SUB_Stop() .float cnt; // sound index .float gravity; .float snd_looping; +.float silent; void Projectile_DrawTrail(vector to) { @@ -166,6 +167,9 @@ void Projectile_Draw() void loopsound(entity e, float ch, string samp, float vol, float attn) { + if(self.silent) + return; + sound(e, ch, samp, vol, attn); e.snd_looping = 1; } @@ -250,6 +254,9 @@ void Ent_Projectile() { self.cnt = ReadByte(); + self.silent = (self.cnt & 0x80); + self.cnt = (self.cnt & 0x7F); + self.scale = 1; switch(self.cnt) { diff --git a/data/qcsrc/server/cl_player.qc b/data/qcsrc/server/cl_player.qc index 85da71282..be9cc2efa 100644 --- a/data/qcsrc/server/cl_player.qc +++ b/data/qcsrc/server/cl_player.qc @@ -276,7 +276,7 @@ void SpawnThrownWeapon (vector org, float w) void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { local float take, save; - Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16); + Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker); // damage resistance (ignore most of the damage from a bullet or similar) damage = max(damage - 5, 1); @@ -284,17 +284,20 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float save = bound(0, damage * cvar("g_balance_armor_blockpercent"), self.armorvalue); take = bound(0, damage - save, damage); - if (save > 10) - sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM); - else if (take > 30) - sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM); - else if (take > 10) - sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); + if(sound_allowed(MSG_BROADCAST, attacker)) + { + if (save > 10) + sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM); + else if (take > 30) + sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM); + else if (take > 10) + sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); + } if (take > 50) - Violence_GibSplash_At(hitloc, force * -0.1, 3, 1); + Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker); if (take > 100) - Violence_GibSplash_At(hitloc, force * -0.2, 3, 1); + Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker); if (!(self.flags & FL_GODMODE)) { @@ -315,7 +318,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float // view just above the floor self.view_ofs = '0 0 4'; - Violence_GibSplash(self, 1, 1); + Violence_GibSplash(self, 1, 1, attacker); self.modelindex = 0; // restore later self.solid = SOLID_NOT; // restore later } @@ -349,8 +352,8 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht d = inflictor.origin - self.origin; f = (d * v_right) / vlen(d); // this is cos of angle of d and v_right! force = v_right * vlen(force); - Violence_GibSplash_At(ear1, force * -1, 2, bound(0, damage, 25) / 2 * (0.5 - 0.5 * f)); - Violence_GibSplash_At(ear2, force, 2, bound(0, damage, 25) / 2 * (0.5 + 0.5 * f)); + Violence_GibSplash_At(ear1, force * -1, 2, bound(0, damage, 25) / 2 * (0.5 - 0.5 * f), self, attacker); + Violence_GibSplash_At(ear2, force, 2, bound(0, damage, 25) / 2 * (0.5 + 0.5 * f), self, attacker); if(f > 0) { hitloc = ear1; @@ -363,7 +366,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht } } else - Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16); + Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker); if(g_arena) if(numspawned < 2) @@ -380,17 +383,20 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht take = damage; } - if (save > 10) - sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM); - else if (take > 30) - sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM); - else if (take > 10) - sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them? + if(sound_allowed(MSG_BROADCAST, attacker)) + { + if (save > 10) + sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM); + else if (take > 30) + sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM); + else if (take > 10) + sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them? + } if (take > 50) - Violence_GibSplash_At(hitloc, force * -0.1, 3, 1); + Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker); if (take > 100) - Violence_GibSplash_At(hitloc, force * -0.2, 3, 1); + Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker); if (time > self.spawnshieldtime) { @@ -414,6 +420,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht setanim(self, self.anim_pain2, FALSE, TRUE, TRUE); } + if(sound_allowed(MSG_BROADCAST, attacker)) if(!DEATH_ISWEAPON(deathtype, WEP_LASER) || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1) // exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two { @@ -467,6 +474,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht defer_ClientKill_Now_TeamChange = FALSE; if(sv_gentle < 1) // TODO make a "gentle" version? + if(sound_allowed(MSG_BROADCAST, attacker)) { if(deathtype == DEATH_DROWN) PlayerSound(playersound_drown, CHAN_PAIN, VOICETYPE_PLAYERSOUND); diff --git a/data/qcsrc/server/csqcprojectile.qc b/data/qcsrc/server/csqcprojectile.qc index bbd2ec5e1..235bce35a 100644 --- a/data/qcsrc/server/csqcprojectile.qc +++ b/data/qcsrc/server/csqcprojectile.qc @@ -59,6 +59,8 @@ void CSQCProjectile(entity e, float clientanimate, float type, float docull) e.gravity = 0; e.csqcprojectile_type = type; + if(!sound_allowed(MSG_BROADCAST, e)) + type |= 0x80; } void UpdateCSQCProjectile(entity e) diff --git a/data/qcsrc/server/g_casings.qc b/data/qcsrc/server/g_casings.qc index 15709fdb5..e49719848 100644 --- a/data/qcsrc/server/g_casings.qc +++ b/data/qcsrc/server/g_casings.qc @@ -12,13 +12,16 @@ float Casing_SendEntity(entity to, float sf) return TRUE; } -void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype) +void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype, entity casingowner) { entity e; vector org; org = self.origin + self.view_ofs + self.weaponentity.spawnorigin_x * v_forward - self.weaponentity.spawnorigin_y * v_right + self.weaponentity.spawnorigin_z * v_up; + if(!sound_allowed(MSG_BROADCAST, casingowner)) + casingtype |= 0x80; + e = spawn(); e.state = casingtype; e.origin = org; diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index 4576b863d..d96ff975f 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -17,13 +17,16 @@ float Damage_DamageInfo_SendEntity(entity to, float sf) return TRUE; } -void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, float deathtype) +void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, float deathtype, entity dmgowner) { // TODO maybe call this from non-edgedamage too? // TODO maybe make the client do the particle effects for the weapons and the impact sounds using this info? entity e; + if(!sound_allowed(MSG_BROADCAST, dmgowner)) + deathtype |= 0x8000; + e = spawn(); setorigin(e, org); e.projectiledeathtype = deathtype; @@ -972,9 +975,9 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e else force = normalize(force); if(forceintensity >= 0) - Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype); + Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype, attacker); else - Damage_DamageInfo(blastorigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype); + Damage_DamageInfo(blastorigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, attacker); } RadiusDamage_EnemyDamageDone = 0; diff --git a/data/qcsrc/server/g_violence.qc b/data/qcsrc/server/g_violence.qc index ce2175d2b..8cecaeae6 100644 --- a/data/qcsrc/server/g_violence.qc +++ b/data/qcsrc/server/g_violence.qc @@ -11,7 +11,7 @@ float Violence_GibSplash_SendEntity(entity to, float sf) } // TODO maybe convert this to a TE? -void Violence_GibSplash_At(vector org, vector dir, float type, float amount) +void Violence_GibSplash_At(vector org, vector dir, float type, float amount, entity gibowner, entity attacker) { entity e; @@ -21,6 +21,8 @@ void Violence_GibSplash_At(vector org, vector dir, float type, float amount) e.state = type; // should stay smaller than 15 if(sv_gentle) e.state |= 0x80; // "force gentle" bit + if(!sound_allowed(MSG_BROADCAST, gibowner) || !sound_allowed(MSG_BROADCAST, attacker)) + e.state |= 0x40; // "silence" bit e.state |= 8 * self.species; // gib type, ranges from 0 to 15 setorigin(e, org); e.velocity = dir; @@ -30,7 +32,7 @@ void Violence_GibSplash_At(vector org, vector dir, float type, float amount) Net_LinkEntity(e, FALSE, 0.2, Violence_GibSplash_SendEntity); } -void Violence_GibSplash(entity source, float type, float amount) +void Violence_GibSplash(entity source, float type, float amount, entity attacker) { - Violence_GibSplash_At(source.origin + source.view_ofs, source.velocity, type, amount); + Violence_GibSplash_At(source.origin + source.view_ofs, source.velocity, type, amount, source, attacker); } diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 1befeff0e..fbc1463fd 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1127,26 +1127,23 @@ float precache_sound_index (string s) = #19; float sound_allowed(float dest, entity e) { // sounds from world may always pass - if(!e) + for(;;) { - return TRUE; + if(e.owner) + e = e.owner; + else if(e.classname == "body") + e = e.enemy; + else + break; } // sounds to self may always pass if(dest == MSG_ONE) - { if(e == msg_entity) return TRUE; - if(e.owner == msg_entity) - return TRUE; - } // sounds by players can be removed if(cvar("bot_sound_monopoly")) - { if(clienttype(e) == CLIENTTYPE_REAL) return FALSE; - if(clienttype(e.owner) == CLIENTTYPE_REAL) - return FALSE; - } // anything else may pass return TRUE; } @@ -2242,6 +2239,7 @@ void SoundEntity_Attach(entity pl) { pl.soundentity = spawn(); pl.soundentity.classname = "soundentity"; + pl.soundentity.owner = pl; setattachment(pl.soundentity, pl, ""); setmodel(pl.soundentity, "null"); } diff --git a/data/qcsrc/server/w_campingrifle.qc b/data/qcsrc/server/w_campingrifle.qc index 7bbe1750e..6db5c8361 100644 --- a/data/qcsrc/server/w_campingrifle.qc +++ b/data/qcsrc/server/w_campingrifle.qc @@ -67,7 +67,7 @@ void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAdde fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant); if (cvar("g_casings") >= 2) - SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3); + SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self); self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1; } diff --git a/data/qcsrc/server/w_common.qc b/data/qcsrc/server/w_common.qc index a0c03de31..2a033de4b 100644 --- a/data/qcsrc/server/w_common.qc +++ b/data/qcsrc/server/w_common.qc @@ -152,7 +152,7 @@ void W_BallisticBullet_Hit (void) f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier if(other.solid == SOLID_BSP) - Damage_DamageInfo(self.origin, self.dmg * f, 0, 0, self.dmg_force * normalize(self.velocity) * f, self.projectiledeathtype); + Damage_DamageInfo(self.origin, self.dmg * f, 0, 0, self.dmg_force * normalize(self.velocity) * f, self.projectiledeathtype, self); if(other && other != self.enemy) { @@ -216,7 +216,7 @@ void W_BallisticBullet_LeaveSolid_think() { 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); + Damage_DamageInfo(self.origin, 0, 0, 0, self.dmg_force * normalize(self.velocity) * -f, self.projectiledeathtype, self); } UpdateCSQCProjectile(self); @@ -461,7 +461,7 @@ void fireBullet (vector start, vector dir, float spread, float damage, float for { pointparticles(particleeffectnum("TE_KNIGHTSPIKE"),end,trace_plane_normal * 2500,1); if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) - Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * force, dtype); + Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * force, dtype, self); Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force); //void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC } diff --git a/data/qcsrc/server/w_minstanex.qc b/data/qcsrc/server/w_minstanex.qc index 24655b005..806123cdf 100644 --- a/data/qcsrc/server/w_minstanex.qc +++ b/data/qcsrc/server/w_minstanex.qc @@ -41,7 +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)) - Damage_DamageInfo(trace_endpos, 10000, 0, 0, 800 * w_shotdir, WEP_MINSTANEX); + Damage_DamageInfo(trace_endpos, 10000, 0, 0, 800 * w_shotdir, WEP_MINSTANEX, self); 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 e8301ab83..b62a87518 100644 --- a/data/qcsrc/server/w_nex.qc +++ b/data/qcsrc/server/w_nex.qc @@ -28,7 +28,7 @@ void W_Nex_Attack (void) // flash and burn the wall if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) - Damage_DamageInfo(trace_endpos, cvar("g_balance_nex_damage"), 0, 0, cvar("g_balance_nex_force") * w_shotdir, WEP_NEX); + Damage_DamageInfo(trace_endpos, cvar("g_balance_nex_damage"), 0, 0, cvar("g_balance_nex_force") * w_shotdir, WEP_NEX, self); if not(self.items & IT_UNLIMITED_WEAPON_AMMO) self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo"); diff --git a/data/qcsrc/server/w_seeker.qc b/data/qcsrc/server/w_seeker.qc index 1e505f5ab..02d1bfd10 100644 --- a/data/qcsrc/server/w_seeker.qc +++ b/data/qcsrc/server/w_seeker.qc @@ -255,7 +255,7 @@ void Seeker_Tag_Explode () { //if(other==self.owner) // return; - Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE); + Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self); remove (self); } @@ -286,7 +286,7 @@ void Seeker_Tag_Touch() te_knightspike(org2); self.event_damage = SUB_Null; - Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT); + Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT, self); if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO) { diff --git a/data/qcsrc/server/w_shotgun.qc b/data/qcsrc/server/w_shotgun.qc index 5f4994831..0fea59dc3 100644 --- a/data/qcsrc/server/w_shotgun.qc +++ b/data/qcsrc/server/w_shotgun.qc @@ -30,7 +30,7 @@ void W_Shotgun_Attack (void) // casing code if (cvar("g_casings") >= 1) for (sc = 0;sc < ammoamount;sc = sc + 1) - SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1); + SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, self); // muzzle flash for 1st person view flash = spawn(); @@ -73,7 +73,7 @@ void W_Shotgun_Attack2 (void) // casing code if (cvar("g_casings") >= 1) for (sc = 0;sc < ammoamount;sc = sc + 1) - SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1); + SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, self); flash = spawn(); setmodel(flash, "models/uziflash.md3"); // precision set below diff --git a/data/qcsrc/server/w_uzi.qc b/data/qcsrc/server/w_uzi.qc index c3eec7855..dd0f18358 100644 --- a/data/qcsrc/server/w_uzi.qc +++ b/data/qcsrc/server/w_uzi.qc @@ -52,7 +52,7 @@ void W_Uzi_Attack (float deathtype) // casing code if (cvar("g_casings") >= 2) - SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3); + SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self); } // weapon frames -- 2.39.2