[nexuiz-commits] r7064 - in trunk/data/qcsrc: client server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Jun 20 17:10:42 EDT 2009


Author: div0
Date: 2009-06-20 17:10:41 -0400 (Sat, 20 Jun 2009)
New Revision: 7064

Modified:
   trunk/data/qcsrc/client/casings.qc
   trunk/data/qcsrc/client/damage.qc
   trunk/data/qcsrc/client/gibs.qc
   trunk/data/qcsrc/client/projectile.qc
   trunk/data/qcsrc/server/cl_player.qc
   trunk/data/qcsrc/server/csqcprojectile.qc
   trunk/data/qcsrc/server/g_casings.qc
   trunk/data/qcsrc/server/g_damage.qc
   trunk/data/qcsrc/server/g_violence.qc
   trunk/data/qcsrc/server/miscfunctions.qc
   trunk/data/qcsrc/server/w_campingrifle.qc
   trunk/data/qcsrc/server/w_common.qc
   trunk/data/qcsrc/server/w_minstanex.qc
   trunk/data/qcsrc/server/w_nex.qc
   trunk/data/qcsrc/server/w_seeker.qc
   trunk/data/qcsrc/server/w_shotgun.qc
   trunk/data/qcsrc/server/w_uzi.qc
Log:
fix bot_sound_monopoly cvar


Modified: trunk/data/qcsrc/client/casings.qc
===================================================================
--- trunk/data/qcsrc/client/casings.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/client/casings.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -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 @@
 		return;
 	}
 
+	if(!self.silent)
 	if(!trace_ent || trace_ent.solid == SOLID_BSP)
 	{
 		if(vlen(self.velocity) > 50)
@@ -74,16 +76,18 @@
 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 @@
 		}
 
 		setsize(casing, '0 0 -1', '0 0 -1');
-	}
-    else
+	}
+    else
         Casing_Delete();
 }
 

Modified: trunk/data/qcsrc/client/damage.qc
===================================================================
--- trunk/data/qcsrc/client/damage.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/client/damage.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -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 @@
 				//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 @@
 			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 @@
 					{
 						// 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 @@
 				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 @@
 			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 @@
 	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");

Modified: trunk/data/qcsrc/client/gibs.qc
===================================================================
--- trunk/data/qcsrc/client/gibs.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/client/gibs.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -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 @@
 		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 @@
 		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();
 
-	//gib = 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.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 @@
 	float amount, type, specnum;
 	vector org, vel;
 	string specstr;
+	float issilent;
 
 	float c, gibfactor, randomvalue;
 
@@ -144,47 +148,49 @@
 
 	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 @@
 			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);

Modified: trunk/data/qcsrc/client/projectile.qc
===================================================================
--- trunk/data/qcsrc/client/projectile.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/client/projectile.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -15,6 +15,7 @@
 .float cnt; // sound index
 .float gravity;
 .float snd_looping;
+.float silent;
 
 void Projectile_DrawTrail(vector to)
 {
@@ -166,6 +167,9 @@
 
 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 @@
 	{
 		self.cnt = ReadByte();
 
+		self.silent = (self.cnt & 0x80);
+		self.cnt = (self.cnt & 0x7F);
+
 		self.scale = 1;
 		switch(self.cnt)
 		{

Modified: trunk/data/qcsrc/server/cl_player.qc
===================================================================
--- trunk/data/qcsrc/server/cl_player.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/cl_player.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -276,7 +276,7 @@
 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 @@
 	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 @@
 		// 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 @@
 		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 @@
 		}
 	}
 	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 @@
 		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 @@
 							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 @@
 		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);

Modified: trunk/data/qcsrc/server/csqcprojectile.qc
===================================================================
--- trunk/data/qcsrc/server/csqcprojectile.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/csqcprojectile.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -59,6 +59,8 @@
 		e.gravity = 0;
 
 	e.csqcprojectile_type = type;
+	if(!sound_allowed(MSG_BROADCAST, e))
+		type |= 0x80;
 }
 
 void UpdateCSQCProjectile(entity e)

Modified: trunk/data/qcsrc/server/g_casings.qc
===================================================================
--- trunk/data/qcsrc/server/g_casings.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/g_casings.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -12,13 +12,16 @@
 	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;

Modified: trunk/data/qcsrc/server/g_damage.qc
===================================================================
--- trunk/data/qcsrc/server/g_damage.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/g_damage.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -17,13 +17,16 @@
 	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 @@
 		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;

Modified: trunk/data/qcsrc/server/g_violence.qc
===================================================================
--- trunk/data/qcsrc/server/g_violence.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/g_violence.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -11,7 +11,7 @@
 }
 
 // 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 @@
 	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 @@
 	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);
 }

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -1127,26 +1127,23 @@
 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 @@
 {
 	pl.soundentity = spawn();
 	pl.soundentity.classname = "soundentity";
+	pl.soundentity.owner = pl;
 	setattachment(pl.soundentity, pl, "");
 	setmodel(pl.soundentity, "null");
 }

Modified: trunk/data/qcsrc/server/w_campingrifle.qc
===================================================================
--- trunk/data/qcsrc/server/w_campingrifle.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_campingrifle.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -67,7 +67,7 @@
 	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;
 }

Modified: trunk/data/qcsrc/server/w_common.qc
===================================================================
--- trunk/data/qcsrc/server/w_common.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_common.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -152,7 +152,7 @@
 	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 @@
 	{
 		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 @@
 	{
 		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
 	}

Modified: trunk/data/qcsrc/server/w_minstanex.qc
===================================================================
--- trunk/data/qcsrc/server/w_minstanex.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_minstanex.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -41,7 +41,7 @@
 	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)
 	{

Modified: trunk/data/qcsrc/server/w_nex.qc
===================================================================
--- trunk/data/qcsrc/server/w_nex.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_nex.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -28,7 +28,7 @@
 	
 	// 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");

Modified: trunk/data/qcsrc/server/w_seeker.qc
===================================================================
--- trunk/data/qcsrc/server/w_seeker.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_seeker.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -255,7 +255,7 @@
 {
 	//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 @@
 	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)
 	{

Modified: trunk/data/qcsrc/server/w_shotgun.qc
===================================================================
--- trunk/data/qcsrc/server/w_shotgun.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_shotgun.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -30,7 +30,7 @@
 	// 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 @@
 	// 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

Modified: trunk/data/qcsrc/server/w_uzi.qc
===================================================================
--- trunk/data/qcsrc/server/w_uzi.qc	2009-06-20 20:33:40 UTC (rev 7063)
+++ trunk/data/qcsrc/server/w_uzi.qc	2009-06-20 21:10:41 UTC (rev 7064)
@@ -52,7 +52,7 @@
 
 	// 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



More information about the nexuiz-commits mailing list