Module dpmod: Change committed

havoc at icculus.org havoc at icculus.org
Wed Apr 9 23:24:40 EDT 2003


Commiter   : havoc
CVSROOT    : /cvs/cvsroot/twilight
Module     : dpmod
Commit time: 2003-04-10 03:24:40 UTC

Log message:

weapon tweaks...  I can't remember what I did :P

Modified files:
     qc/casings.qc qc/client.qc qc/grenade.qc qc/havocbot.qc
     qc/m_soldier.qc qc/mine.qc qc/w_dbshotgun.qc qc/w_grenade.qc
     qc/w_info.qc qc/w_nailgun.qc qc/w_pistol.qc qc/w_shotgun.qc
     qc/w_supernailgun.qc

------=MIME.3f5b2475847b61b6eda381a5d2827feb
Content-Type: text/plain; name="dpmod.20030410.032440.havoc.diff"
Content-Disposition: attachment; filename="dpmod.20030410.032440.havoc.diff"
Content-Transfer-Encoding: 8bit

Index: dpmod/qc/casings.qc
diff -u dpmod/qc/casings.qc:1.4 dpmod/qc/casings.qc:1.5
--- dpmod/qc/casings.qc:1.4	Tue Mar 11 14:31:32 2003
+++ dpmod/qc/casings.qc	Wed Apr  9 23:24:30 2003
@@ -58,12 +58,12 @@
 	self.touch = casingtouch;
 };
 
-// orientation is basically v_forward for the direction the casing points
-void(vector org, vector orientation, vector vel, float randomvel, float casingtype) ejectcasing =
+void(vector org, vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype) ejectcasing =
 {
 	local entity e;
 	if (cvar("temp1") & 2048)
 		return;
+
 	e = newdecor();
 	e.isdecor = TRUE;
 	e.alpha = 1;
@@ -71,12 +71,13 @@
 	e.movetype = MOVETYPE_BOUNCE;
 	e.solid = SOLID_TRIGGER;
 	e.velocity = vel + randomvec() * randomvel + self.velocity;
-	e.angles = vectoangles(orientation);
+	e.angles = ang;
+	e.avelocity = avel + randomvec() * randomavel;
 	e.nextthink = time;
 	e.think = casingthink;
 	e.touch = casingtouch;
 	e.knockedloosefunc = casingknockedloosefunc;
-	e.effects = EF_LOWPRECISION;
+	//e.effects = EF_LOWPRECISION;
 	e.createdtime = time;
 	if (casingtype == 1)
 	{
Index: dpmod/qc/client.qc
diff -u dpmod/qc/client.qc:1.5 dpmod/qc/client.qc:1.6
--- dpmod/qc/client.qc:1.5	Thu Feb 20 03:53:35 2003
+++ dpmod/qc/client.qc	Wed Apr  9 23:24:30 2003
@@ -136,7 +136,7 @@
 
 void() SetNewParms =
 {
-	parm1 = IT_WEAPON1 | IT_WEAPON2; // | IT_WEAPON3 | IT_WEAPON4 | IT_WEAPON5 | IT_WEAPON6 | IT_WEAPON7 | IT_WEAPON8 | IT_WEAPON9 | IT_WEAPON10;
+	parm1 = IT_WEAPON1 | IT_WEAPON2 | IT_WEAPON10; // | IT_WEAPON3 | IT_WEAPON4 | IT_WEAPON5 | IT_WEAPON6 | IT_WEAPON7 | IT_WEAPON8 | IT_WEAPON9 | IT_WEAPON10;
 	parm2 = HEALTHMAX; // health
 	parm3 = 0; // armorvalue
 	parm4 = STARTSP_AMMO_SHELLS;
@@ -191,7 +191,7 @@
 	}
 	else if (deathmatch)
 	{
-		self.items = IT_WEAPON1 | IT_WEAPON2 | IT_WEAPON9 | IT_ARMOR1; // | IT_WEAPON3 | IT_WEAPON4 | IT_WEAPON5 | IT_WEAPON6 | IT_WEAPON7 | IT_WEAPON8 | IT_WEAPON9 | IT_WEAPON10;
+		self.items = IT_WEAPON1 | IT_WEAPON2 | IT_WEAPON9 | IT_WEAPON10 | IT_ARMOR1; // | IT_WEAPON3 | IT_WEAPON4 | IT_WEAPON5 | IT_WEAPON6 | IT_WEAPON7 | IT_WEAPON8 | IT_WEAPON9 | IT_WEAPON10;
 		self.health = HEALTHSTART; // health
 		self.max_health = HEALTHMAX;
 		self.armorvalue = 50;
@@ -291,7 +291,7 @@
 		GotoNextMap ();
 		return;
 	}
-	
+
 	intermission_exittime = time + 1;
 	intermission_running = intermission_running + 1;
 
@@ -350,7 +350,7 @@
 
 		GotoNextMap();
 	}
-	
+
 	if (intermission_running == 3)
 	{
 		if (!cvar("registered"))
@@ -359,14 +359,14 @@
 			WriteByte (MSG_ALL, SVC_SELLSCREEN);
 			return;
 		}
-		
+
 		if ( (serverflags&15) == 15)
 		{
 			WriteByte (MSG_ALL, SVC_FINALE);
 			WriteString (MSG_ALL, "Now, you have all four Runes. You sense\ntremendous invisible forces moving to\nunseal ancient barriers. Shub-Niggurath\nhad hoped to use the Runes Herself to\nclear off the Earth, but now instead,\nyou will use them to enter her home and\nconfront her as an avatar of avenging\nEarth-life. If you defeat her, you will\nbe remembered forever as the savior of\nthe planet. If she conquers, it will be\nas if you had never been born.");
 			return;
 		}
-		
+
 	}
 
 	GotoNextMap();
@@ -386,7 +386,7 @@
 
 	if (!self.button0 && !self.button1 && !self.button2)
 		return;
-	
+
 	ExitIntermission ();
 };
 
@@ -422,7 +422,7 @@
 		other.model = "";
 		setorigin (other, pos.origin);
 		other = other.chain;
-	}	
+	}
 
 	WriteByte (MSG_ALL, SVC_INTERMISSION);
 };
@@ -444,7 +444,7 @@
 		bprint (other.netname);
 		bprint (" exited the level\n");
 	}
-	
+
 	nextmap = self.map;
 
 	SUB_UseTargets ();
@@ -455,7 +455,7 @@
 		GotoNextMap();
 		return;
 	}
-	
+
 	self.touch = SUB_Null;
 
 // we can't move people right now, because touch functions are called
@@ -471,7 +471,7 @@
 {
 	if (!self.map)
 		objerror ("changelevel trigger doesn't have map");
-	
+
 	InitTrigger ();
 	self.touch = changelevel_touch;
 };
@@ -1098,7 +1098,7 @@
 // check for a jump-out-of-water
 	makevectors (self.angles);
 	start = self.origin;
-	start_z = start_z + 8; 
+	start_z = start_z + 8;
 	v_forward_z = 0;
 	normalize(v_forward);
 	end = start + v_forward*24;
@@ -1205,7 +1205,7 @@
 	else
 		self.flags = self.flags | FL_JUMPRELEASED;
 
-	// teleporters can force a non-moving pause time	
+	// teleporters can force a non-moving pause time
 	if (time < self.pausetime)
 		self.velocity = '0 0 0';
 };
@@ -1371,7 +1371,7 @@
 			self.rad_time = 0;
 			self.radsuit_finished = 0;
 		}
-	}	
+	}
 
 // 'glow' armor
 	if (self.armortype == 1.0)
Index: dpmod/qc/grenade.qc
diff -u dpmod/qc/grenade.qc:1.3 dpmod/qc/grenade.qc:1.4
--- dpmod/qc/grenade.qc:1.3	Fri Feb 28 00:13:31 2003
+++ dpmod/qc/grenade.qc	Wed Apr  9 23:24:30 2003
@@ -3,8 +3,11 @@
 float GRENADE_PROXIMITY = 2;
 float GRENADE_IMMUNETODAMAGE = 4;
 float GRENADE_TENWARHEAD = 8;
-float GRENADE_DETONATEONBUTTON3 = 16;
+float GRENADE_DETONATABLE = 16;
+float GRENADE_DETONATEONCREATURE = 32;
 
+.float activemines;
+
 void() GrenadeExplode =
 {
 	local vector v;
@@ -30,6 +33,7 @@
 	}
 	else
 		Explosion(self.origin, self.owner, self.dmg, self.dmg2, self.deathtype, '0 0 0', self.effects & EF_BLUE, self.obitfunc1);
+	self.owner.activemines = self.owner.activemines - 1;
 	remove(self);
 };
 
@@ -43,6 +47,8 @@
 	self.movetype = MOVETYPE_NONE;
 };
 
+.float detonatetimeout;
+
 void() GrenadeThink =
 {
 	local   entity  head;
@@ -52,6 +58,7 @@
 	p = pointcontents(self.origin);
 	if (p == CONTENT_SKY)
 	{
+		self.owner.activemines = self.owner.activemines - 1;
 		remove(self);
 		return;
 	}
@@ -60,11 +67,10 @@
 		self.th_die();
 		return;
 	}
-	if (self.weapon & GRENADE_DETONATEONBUTTON3)
-	if (self.owner.button3)
-	if (self.deathtype == "GRENADE")
+	if (self.weapon & GRENADE_DETONATABLE)
+	if (time < self.owner.detonatetimeout)
 	{
-		GrenadeExplode();
+		self.th_die();
 		return;
 	}
 	if (self.weapon & GRENADE_PROXIMITY)
@@ -118,14 +124,14 @@
 	{
 		v = normalize(self.velocity);
 		setorigin(self, self.origin - v * 16);
-		GrenadeExplode();
+		self.th_die();
 		return;
 	}
-	//if (self.weapon & GRENADE_PROXIMITY)
+	if (self.weapon & GRENADE_DETONATEONCREATURE)
 	if ((other.flags & FL_MONSTER) || other.classname == "player")
 	if (other.team == 0 || other.team != self.owner.team)
 	{
-		GrenadeExplode();
+		self.th_die();
 		return;
 	}
 	self.lefty = TRUE;
@@ -138,6 +144,8 @@
 	local   vector  v;
 	DelayGibComment();      // make him wait before commenting on gibs so it's not drown out by explosions etc
 
+	own.activemines = own.activemines + 1;
+
 	fightdone = time + 1; // delay stuff until fighting is over
 	v = normalize(vel);
 	newmis = spawn ();
@@ -150,7 +158,7 @@
 	newmis.classname = "grenade";
 	// set newmis speed
 	newmis.velocity = vel;
-	newmis.avelocity = '0 0 0';
+	newmis.avelocity = randomvec() * 100;//'0 0 0';
 	newmis.angles = vectoangles(newmis.velocity);
 	newmis.touch = GrenadeTouch;
 	newmis.dmg = damage;
Index: dpmod/qc/havocbot.qc
diff -u dpmod/qc/havocbot.qc:1.5 dpmod/qc/havocbot.qc:1.6
--- dpmod/qc/havocbot.qc:1.5	Sat Feb 22 04:26:44 2003
+++ dpmod/qc/havocbot.qc	Wed Apr  9 23:24:30 2003
@@ -1247,6 +1247,8 @@
 		}
 	}
 
+	// LordHavoc: todo: deceleration aiming simulation
+
 	ang = vectoangles(aimdir);
 
 	// change to v_angle format
Index: dpmod/qc/m_soldier.qc
diff -u dpmod/qc/m_soldier.qc:1.3 dpmod/qc/m_soldier.qc:1.4
--- dpmod/qc/m_soldier.qc:1.3	Thu Feb 20 03:48:07 2003
+++ dpmod/qc/m_soldier.qc	Wed Apr  9 23:24:30 2003
@@ -8,7 +8,7 @@
 
 $cd id1/models/soldier3
 $origin 0 -6 24
-$base base		
+$base base
 $skin skin
 
 $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8
@@ -150,15 +150,17 @@
 
 void(vector hit) army_pistol =
 {
+	local vector ang;
 	shotdir = normalize (hit - (self.origin + '0 0 12'));
 	shotdir = shotdir * 25 + randomvec();
 	shotdir = normalize(shotdir);
+	ang = vectoangles(shotdir);
 
 	shotorg = self.origin + '0 0 12';
 
 	sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
 	w_muzzleflash (shotorg, 1);
-	ejectcasing (shotorg, shotdir, '0 0 0', 50, 0);
+	ejectcasing (shotorg, '0 0 0', 50, ang, '0 0 0', 150, 0);
 	FireBullets (self, self, 4, 1, DMG_SOLDIER_PISTOL_DAMAGE, DMG_SOLDIER_PISTOL_BDAMAGE, 0, 0, shotdir * 6000, 0.025, self.deathtype, DT_NAIL, Obituary_Generic);
 };
 
@@ -181,15 +183,17 @@
 
 void(vector hit) army_nail =
 {
+	local vector ang;
 	shotdir = normalize (hit - (self.origin + '0 0 12'));
 	shotdir = shotdir * 25 + randomvec();
 	shotdir = normalize(shotdir);
+	ang = vectoangles(shotdir);
 
 	shotorg = self.origin + '0 0 12';
 
 	sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
 	w_muzzleflash (shotorg, 1);
-	ejectcasing (shotorg, shotdir, '0 0 0', 50, 0);
+	ejectcasing (shotorg, '0 0 0', 50, ang, '0 0 0', 150, 0);
 	FireBullets (self, self, 4, 1, DMG_SOLDIER_MACHINEGUN_DAMAGE, DMG_SOLDIER_MACHINEGUN_BDAMAGE, 0, 0, shotdir * 5000, 0.05, self.deathtype, DT_NAIL, Obituary_Generic);
 };
 
@@ -215,15 +219,17 @@
 
 void(vector hit) army_shotgun =
 {
+	local vector ang;
 	shotdir = normalize (hit - (self.origin + '0 0 12'));
 	shotdir = shotdir * 35 + randomvec();
 	shotdir = normalize(shotdir);
+	ang = vectoangles(shotdir);
 
 	shotorg = self.origin + '0 0 12';
 
 	sound (self, CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM);
 	w_muzzleflash (shotorg, 2);
-	ejectcasing (shotorg, shotdir, '0 0 0', 50, 1);
+	ejectcasing (shotorg, '0 0 0', 50, ang, '0 0 0', 150, 1);
 	FireBullets (self, self, 1, DMG_SOLDIER_SHOTGUN_PELLETS, DMG_SOLDIER_SHOTGUN_DAMAGE, DMG_SOLDIER_SHOTGUN_BDAMAGE, 0, 0, shotdir * 4000, 0.1, self.deathtype, DT_SHOTGUN, Obituary_Generic);
 };
 
@@ -338,7 +344,7 @@
 void(entity attacker, float damage)	army_pain =
 {
 	local float r;
-	
+
         if (self.pain_finished > time || random() < 0.75)
 		return;
 
Index: dpmod/qc/mine.qc
diff -u dpmod/qc/mine.qc:1.6 dpmod/qc/mine.qc:1.7
--- dpmod/qc/mine.qc:1.6	Fri Feb 28 00:15:12 2003
+++ dpmod/qc/mine.qc	Wed Apr  9 23:24:30 2003
@@ -3,7 +3,9 @@
 float MINE_PROXIMITY = 2;
 float MINE_IMMUNETODAMAGE = 4;
 float MINE_TENWARHEAD = 8;
+float MINE_FIVEWARHEAD = 64;
 float MINE_DETONATABLE = 16;
+float MINE_HOP = 32;
 
 .float activemines;
 void() MineExplode =
@@ -13,19 +15,29 @@
 	self.owner.activemines = self.owner.activemines - 1;
 	if (self.weapon & MINE_TENWARHEAD)
 	{
-		basevel = '0 0 250' + '0 0 0.2' * cvar("sv_gravity");
-		t = /*GRENADE_IMPACT + */GRENADE_IMMUNETODAMAGE;
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
-		v = randomvec() * 250 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 0.5, self.deathtype, self.obitfunc1);
+		basevel = '0 0 0.5' * cvar("sv_gravity");
+		t = GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE;
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
 	}
+	else if (self.weapon & MINE_FIVEWARHEAD)
+	{
+		basevel = '0 0 0.5' * cvar("sv_gravity");
+		t = GRENADE_IMPACT + GRENADE_IMMUNETODAMAGE;
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+		v = randomvec() * 500 + basevel;LaunchGrenade(self.origin, v, self.owner, self.dmg, self.dmg2, t, 1, self.deathtype, self.obitfunc1);
+	}
 	else if (self.lefty == 2)
 	{
 		v = self.angles;
@@ -47,12 +59,22 @@
 
 void() MineDet =
 {
-	self.think = MineExplode;
-	self.nextthink = time;
-	self.solid = SOLID_NOT;
 	self.takedamage = DAMAGE_NO;
+	self.think = MineExplode;
+	if (self.weapon & MINE_HOP)
+	{
+		self.nextthink = time + 0.3;
+		self.movetype = MOVETYPE_BOUNCE;
+		self.velocity = '0 0 500';
+	}
+	else
+	{
+		self.nextthink = time;
+		self.movetype = MOVETYPE_NONE;
+		self.solid = SOLID_NOT;
+	}
+	self.flags = self.flags - (self.flags & FL_ONGROUND);
 	setsize(self, '0 0 0', '0 0 0');
-	self.movetype = MOVETYPE_NONE;
 };
 
 .float detonatetimeout;
Index: dpmod/qc/w_dbshotgun.qc
diff -u dpmod/qc/w_dbshotgun.qc:1.7 dpmod/qc/w_dbshotgun.qc:1.8
--- dpmod/qc/w_dbshotgun.qc:1.7	Tue Mar 11 14:17:24 2003
+++ dpmod/qc/w_dbshotgun.qc	Wed Apr  9 23:24:30 2003
@@ -1,29 +1,32 @@
 
-void(entity targ, entity attacker, string dmsg, float dtype) Obituary_DBShotgunSingle =
+void(entity targ, entity attacker, string dmsg, float dtype) Obituary_DBShotgunSingle_Buckshot =
 {
 	if (dtype == DTYPE_PLAYER)
 	{
-		if (dmsg == "SHOTGUNEXPLOSIVESLUG")
+		deathstring1 = targ.netname;
+		deathstring2 = " was blown away by ";
+		deathstring3 = attacker.netname;
+		deathstring4 = "";
+	}
+	else
+		Obituary_Fallback(targ, attacker, dmsg, dtype);
+};
+
+void(entity targ, entity attacker, string dmsg, float dtype) Obituary_DBShotgunSingle_Explosive =
+{
+	if (dtype == DTYPE_PLAYER)
+	{
+		if (targ.bodyhealth < 1)
 		{
-			if (targ.bodyhealth < 1)
-			{
-				deathstring1 = targ.netname;
-				deathstring2 = " was blown apart by an explosive slug from ";
-				deathstring3 = attacker.netname;
-				deathstring4 = "";
-			}
-			else
-			{
-				deathstring1 = targ.netname;
-				deathstring2 = " met an explosive slug from ";
-				deathstring3 = attacker.netname;
-				deathstring4 = "";
-			}
+			deathstring1 = targ.netname;
+			deathstring2 = " was blown apart by an explosive slug from ";
+			deathstring3 = attacker.netname;
+			deathstring4 = "";
 		}
 		else
 		{
 			deathstring1 = targ.netname;
-			deathstring2 = " was blown away by ";
+			deathstring2 = " met an explosive slug from ";
 			deathstring3 = attacker.netname;
 			deathstring4 = "";
 		}
@@ -31,32 +34,35 @@
 	else
 		Obituary_Fallback(targ, attacker, dmsg, dtype);
 };
+
+void(entity targ, entity attacker, string dmsg, float dtype) Obituary_DBShotgunDouble_Buckshot =
+{
+	if (dtype == DTYPE_PLAYER)
+	{
+		deathstring1 = targ.netname;
+		deathstring2 = " took both barrels from ";
+		deathstring3 = attacker.netname;
+		deathstring4 = "";
+	}
+	else
+		Obituary_Fallback(targ, attacker, dmsg, dtype);
+};
 
-void(entity targ, entity attacker, string dmsg, float dtype) Obituary_DBShotgunDouble =
+void(entity targ, entity attacker, string dmsg, float dtype) Obituary_DBShotgunDouble_Explosive =
 {
 	if (dtype == DTYPE_PLAYER)
 	{
-		if (dmsg == "SHOTGUNEXPLOSIVESLUG")
+		if (targ.bodyhealth < 1)
 		{
-			if (targ.bodyhealth < 1)
-			{
-				deathstring1 = targ.netname;
-				deathstring2 = " was blown apart by two explosive slugs from ";
-				deathstring3 = attacker.netname;
-				deathstring4 = "";
-			}
-			else
-			{
-				deathstring1 = targ.netname;
-				deathstring2 = " took two explosive slugs from ";
-				deathstring3 = attacker.netname;
-				deathstring4 = "";
-			}
+			deathstring1 = targ.netname;
+			deathstring2 = " was blown apart by two explosive slugs from ";
+			deathstring3 = attacker.netname;
+			deathstring4 = "";
 		}
 		else
 		{
 			deathstring1 = targ.netname;
-			deathstring2 = " took both barrels from ";
+			deathstring2 = " took two explosive slugs from ";
 			deathstring3 = attacker.netname;
 			deathstring4 = "";
 		}
@@ -65,11 +71,11 @@
 		Obituary_Fallback(targ, attacker, dmsg, dtype);
 };
 
-//float DBSHOTGUNBUCKSHOT = 80;
+float DBSHOTGUNBUCKSHOT = 50;
 float DBSHOTGUNEXPLOSIVESLUG = 50;
 
 .float shotgunmode, shotgunshells;
-void(void(entity t, entity a, string m, float dtyp) obitfunc, float spreadboost) W_DBShotgunFireShell =
+void(void(entity t, entity a, string m, float dtyp) obitfunc, float spreadboost, float explosive) W_DBShotgunFireShell =
 {
 	local vector v;
 
@@ -93,34 +99,84 @@
 		self.currentammo = self.ammo_shells = self.ammo_shells - 1;
 	self.wfiretime = time;
 	w_muzzleflash(v, 4);
-	//if (self.shotgunmode)
+	if (explosive)
 		FireBullets(self, self, 1, 1, 0, 0, DBSHOTGUNEXPLOSIVESLUG * damagescale, 80, shotdir * 5000, spreadboost, "SHOTGUNEXPLOSIVESLUG", DT_SHOTGUN, obitfunc);
-	/*
 	else
 	{
 		FireBullets(self, self, 1, 5, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, spreadboost + 0.03, "SHOTGUN", DT_SHOTGUN, obitfunc);
 		FireBullets(self, self, 0, 5, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, spreadboost + 0.03, "SHOTGUN", DT_SHOTGUN, obitfunc);
 	}
-	*/
 	shotorg = v;
 };
+
+void() W_DBShotgunSingleFireCode_Buckshot =
+{
+	W_DBShotgunFireShell(Obituary_DBShotgunSingle_Buckshot, 0, FALSE);
+};
 
-void() W_DBShotgunSingleFireCode =
+void() W_DBShotgunSingleFireCode_Explosive =
 {
-	W_DBShotgunFireShell(Obituary_DBShotgunSingle, 0);
+	W_DBShotgunFireShell(Obituary_DBShotgunSingle_Explosive, 0, TRUE);
 };
 
-void() W_DBShotgunDoubleFireCode =
+void() W_DBShotgunDoubleFireCode_Buckshot =
 {
-	if (self.wload > 1)
+	while (self.wload > 0)
+		W_DBShotgunFireShell(Obituary_DBShotgunDouble_Buckshot, 0, FALSE);
+};
+
+void() W_DBShotgunDoubleFireCode_Explosive =
+{
+	while (self.wload > 0)
+		W_DBShotgunFireShell(Obituary_DBShotgunDouble_Explosive, 0, TRUE);
+};
+
+void(void(entity t, entity a, string m, float dtyp) obitfunc, float spreadboost, float explosive) W_DBShotgunGatlingFireShell =
+{
+	local vector v;
+
+	v = shotorg;
+	if (self.wload)
 	{
-		while (self.wload > 0)
-			W_DBShotgunFireShell(Obituary_DBShotgunDouble, 0);
+		self.wload = 0;
+		self.shotgunshells = self.shotgunshells + 1;
+		shotorg = shotorg - v_right;
 	}
+	else
+	{
+		self.wload = 1;
+		self.shotgunshells = self.shotgunshells + 2;
+		shotorg = shotorg + v_right;
+	}
+	/*
+	if (self.shotgunmode)
+		self.currentammo = self.ammo_xshells = self.ammo_xshells - 1;
 	else
-		W_DBShotgunSingleFireCode();
+	*/
+		self.currentammo = self.ammo_shells = self.ammo_shells - 1;
+	self.wfiretime = time;
+	w_muzzleflash(v, 4);
+	if (explosive)
+		FireBullets(self, self, 1, 1, 0, 0, DBSHOTGUNEXPLOSIVESLUG * damagescale, 80, shotdir * 5000, spreadboost, "SHOTGUNEXPLOSIVESLUG", DT_SHOTGUN, obitfunc);
+	else
+	{
+		FireBullets(self, self, 1, 5, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, spreadboost + 0.03, "SHOTGUN", DT_SHOTGUN, obitfunc);
+		FireBullets(self, self, 0, 5, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, DBSHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, spreadboost + 0.03, "SHOTGUN", DT_SHOTGUN, obitfunc);
+	}
+	shotorg = v;
+};
+
+void() W_DBShotgunGatlingFireCode_Buckshot =
+{
+	W_DBShotgunGatlingFireShell(Obituary_DBShotgunSingle_Buckshot, 0, FALSE);
 };
 
+void() W_DBShotgunGatlingFireCode_Explosive =
+{
+	W_DBShotgunGatlingFireShell(Obituary_DBShotgunSingle_Explosive, 0, TRUE);
+};
+
+
 void() w_dbshotgundrop1;
 void() w_dbshotgundrop2;
 void() w_dbshotgunraise1;
@@ -128,7 +184,7 @@
 void() w_dbshotgun =
 {
 	//local float swapmode, otherammo;
-	local vector v;
+	local vector v, ang;
 
 	if (widle(w_dbshotgundrop1))
 		return;
@@ -160,12 +216,37 @@
 	}
 	*/
 
+	if (time > self.attack_finished)
+	{
+		if (self.shotgunshells)
+		{
+			sound(self, CHAN_AUTO, "weapons/bsgload.wav", 1, ATTN_STATIC);
+			v = shotorg + v_forward * -8;
+			ang = self.v_angle;ang_x = 0 - ang_x;
+			if (self.shotgunshells & 1) ejectcasing (v + v_right *  1, '0 0 0', 30, ang, '0 0 0', 150, 1);
+			if (self.shotgunshells & 2) ejectcasing (v + v_right * -1, '0 0 0', 30, ang, '0 0 0', 150, 1);
+			self.shotgunshells = 0;
+		}
+		if (self.ammo_shells > 0)
+		{
+			if (self.button0)
+				W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunGatlingFireCode_Buckshot);
+			else if (self.button3)
+				W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunGatlingFireCode_Explosive);
+		}
+	}
+
+	/*
 	if (self.wload > 0)
 	{
 		if (self.button0)
-			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunSingleFireCode);
+			//W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunSingleFireCode_Buckshot);
+			//W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunDoubleFireCode_Buckshot);
+			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunSingleFireCode_Buckshot);
 		else if (self.button3)
-			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunDoubleFireCode);
+			//W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunDoubleFireCode_Buckshot);
+			//W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunDoubleFireCode_Explosive);
+			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.2, W_DBShotgunSingleFireCode_Explosive);
 	}
 	else
 	{
@@ -176,12 +257,14 @@
 				self.attack_finished = time + 0.4;
 				sound(self, CHAN_AUTO, "weapons/bsgload.wav", 1, ATTN_STATIC);
 				v = shotorg + v_forward * -8;
-				if (self.shotgunshells & 1) ejectcasing (v + v_right *  1, shotdir, '0 0 0', 30, 1);
-				if (self.shotgunshells & 2) ejectcasing (v + v_right * -1, shotdir, '0 0 0', 30, 1);
+				ang = self.v_angle;ang_x = 0 - ang_x;
+				if (self.shotgunshells & 1) ejectcasing (v + v_right *  1, '0 0 0', 30, ang, '0 0 0', 150, 1);
+				if (self.shotgunshells & 2) ejectcasing (v + v_right * -1, '0 0 0', 30, ang, '0 0 0', 150, 1);
 				self.shotgunshells = 0;
 			}
 			else
 			{
+	*/
 				/*
 				if (self.shotgunmode)
 				{
@@ -194,6 +277,7 @@
 				}
 				else
 				*/
+	/*
 				{
 					if (self.ammo_shells >= 1)
 					{
@@ -205,6 +289,7 @@
 			}
 		}
 	}
+	*/
 
 	if (self.wfiretime)
 	{
Index: dpmod/qc/w_grenade.qc
diff -u dpmod/qc/w_grenade.qc:1.6 dpmod/qc/w_grenade.qc:1.7
--- dpmod/qc/w_grenade.qc:1.6	Tue Mar 11 14:25:48 2003
+++ dpmod/qc/w_grenade.qc	Wed Apr  9 23:24:30 2003
@@ -48,6 +48,7 @@
 		Obituary_Fallback(targ, attacker, dmsg, dtype);
 };
 
+/*
 .float grenademode;
 
 void() W_GrenadeFireImpact =
@@ -58,6 +59,15 @@
 	//LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200 + self.velocity, self, 150 * damagescale, 200, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade);
 	LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, 150 * damagescale, 120, GRENADE_IMPACT | GRENADE_IMMUNETODAMAGE, 25, "GRENADE", Obituary_Grenade);
 };
+*/
+
+void() W_GrenadeFirePipebomb =
+{
+	self.wfiretime = time;
+	self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
+	w_muzzleflash(shotorg, 3);
+	LaunchGrenade(shotorg, shotdir * 1000 + v_up * 200, self, 150 * damagescale, 120, GRENADE_DETONATABLE | GRENADE_DETONATEONCREATURE, 60, "PIPEBOMB", Obituary_Grenade);
+};
 
 /*
 void() W_GrenadeFireProximity =
@@ -69,6 +79,7 @@
 };
 */
 
+/*
 void() W_GrenadeFireSticky =
 {
 	self.wfiretime = time;
@@ -76,9 +87,10 @@
 	w_muzzleflash(shotorg, 3);
 	LaunchMine(shotorg, shotdir * 1000 + v_up * 200, self, 120 * damagescale, 120, 50 * damagescale, 20 * damagescale, MINE_DETONATABLE, 60, "STICKYGRENADE", Obituary_Grenade);
 };
+*/
 
 .float activemines;
-.float oldbutton3;
+//.float oldbutton3;
 void() w_grenadedrop1;
 void() w_grenadedrop2;
 void() w_grenaderaise1;
@@ -89,6 +101,69 @@
 	if (widle(w_grenadedrop1))
 		return;
 
+	if (time > self.detonatetimeout)
+	if (time > self.attack_finished)
+	{
+		if (self.button0)
+		{
+			if (self.activemines < 20)
+			{
+				if (self.ammo_rockets >= 1)
+					W_GenericSlowFireCode("weapons/grenade.wav", 0.3, W_GrenadeFirePipebomb);
+				else
+					self.switchweapon = W_BestWeapon(TRUE);
+			}
+			else
+			{
+				self.attack_finished = time + 0.3;
+				sprint(self, "only 20 remote explosives allowed, you must detonate some before placing more\n");
+			}
+		}
+		if (self.button3)
+		if (self.activemines > 0)
+		{
+			self.attack_finished = time + 0.3;
+			sound(self, CHAN_WEAPON, "weapons/bomb/trigger.wav", 1, ATTN_STATIC);
+			self.detonatetimeout = time + 0.1;
+		}
+	}
+
+	/*
+	if (time > self.attack_finished)
+	{
+		if (self.button3)
+		{
+			if (self.activemines < 20)
+			{
+				if (self.ammo_rockets >= 1)
+					W_GenericSlowFireCode("weapons/grenade.wav", 0.6, W_GrenadeFirePipebomb);
+			}
+			else
+			{
+				if (time > self.attack_finished)
+				{
+					self.attack_finished = time + 0.5;
+					sprint(self, "only 20 remote explosives allowed, you must detonate some before placing more\n");
+				}
+			}
+		}
+		else if (self.button0)
+		{
+			if (self.activemines > 0)
+			{
+				self.attack_finished = time + 0.2;
+				sound(self, CHAN_WEAPON, "weapons/bomb/trigger.wav", 1, ATTN_STATIC);
+				self.detonatetimeout = time + 0.1;
+			}
+			else if (self.ammo_rockets >= 1)
+				W_GenericSlowFireCode("weapons/grenade.wav", 0.6, W_GrenadeFireImpact);
+			else
+				self.switchweapon = W_BestWeapon(TRUE);
+		}
+	}
+	*/
+
+	/*
 	if (time > self.attack_finished)
 	{
 		if ((self.button3 && !self.oldbutton3) || (self.activemines < 1 && self.grenademode == 2))
@@ -106,9 +181,9 @@
 				if (self.grenademode >= 2)
 					self.grenademode = 0;
 				if (self.grenademode == 0)
-					sprint(self, "mode: impact explosives\n");
+					sprint(self, "mode: impact grenades\n");
 				else if (self.grenademode == 1)
-					sprint(self, "mode: remote explosives\n");
+					sprint(self, "mode: pipebombs\n");
 			}
 		}
 		else if (self.button0)
@@ -120,7 +195,7 @@
 				else if (self.grenademode == 1)
 				{
 					if (self.activemines < 20)
-						W_GenericSlowFireCode("weapons/grenade.wav", 0.8, W_GrenadeFireSticky);
+						W_GenericSlowFireCode("weapons/grenade.wav", 0.6, W_GrenadeFirePipebomb);
 					else
 					{
 						if (time > self.attack_finished)
@@ -136,6 +211,7 @@
 		}
 	}
 	self.oldbutton3 = self.button3;
+	*/
 	/*
 	if (self.button0)
 	{
Index: dpmod/qc/w_info.qc
diff -u dpmod/qc/w_info.qc:1.1.1.1 dpmod/qc/w_info.qc:1.2
--- dpmod/qc/w_info.qc:1.1.1.1	Thu Sep 19 15:07:40 2002
+++ dpmod/qc/w_info.qc	Wed Apr  9 23:24:30 2003
@@ -261,7 +261,6 @@
 	while (1)
 	{
 		     if (w == IT_WEAPON10) w = IT_WEAPON1;
-		//     if (w == IT_WEAPON9) w = IT_WEAPON1;
 		else if (w == IT_WEAPON1) w = IT_WEAPON2;
 		else if (w == IT_WEAPON2) w = IT_WEAPON3;
 		else if (w == IT_WEAPON3) w = IT_WEAPON4;
@@ -306,7 +305,6 @@
 		else if (w == IT_WEAPON3) w = IT_WEAPON2;
 		else if (w == IT_WEAPON2) w = IT_WEAPON1;
 		else if (w == IT_WEAPON1) w = IT_WEAPON10;
-		//else if (w == IT_WEAPON1) w = IT_WEAPON9;
 		if (setweapon(w, WR_SELECTABLE))
 		{
 			self.switchweapon = w;
Index: dpmod/qc/w_nailgun.qc
diff -u dpmod/qc/w_nailgun.qc:1.5 dpmod/qc/w_nailgun.qc:1.6
--- dpmod/qc/w_nailgun.qc:1.5	Thu Feb 20 03:58:15 2003
+++ dpmod/qc/w_nailgun.qc	Wed Apr  9 23:24:30 2003
@@ -14,7 +14,7 @@
 
 void() W_NailgunFireCode =
 {
-	local vector v, casingdir;
+	local vector v, casingdir, ang;
 	if (self.ammo_nails < 1) {stopfiring = TRUE;return;}
 	self.wfiretime = time;
 	self.currentammo = self.ammo_nails = self.ammo_nails - 1;
@@ -25,15 +25,16 @@
 	self.punchangle_x = -2;
 
 	v = shotorg;
+	ang = self.v_angle;ang_x = 0 - ang_x;
 	if (self.wframe & 1)
 	{
 		shotorg = shotorg + v_right * 2;
-		//ejectcasing(shotorg, shotdir, v_right *  200 + v_up * 50, 50, 0);
+		ejectcasing(shotorg, v_right * 200 + v_up * 50, 50, ang, '0 250 0', 100, 0);
 	}
 	else
 	{
 		shotorg = shotorg - v_right * 2;
-		//ejectcasing(shotorg, shotdir, v_right * -200 + v_up * 50, 50, 0);
+		ejectcasing(shotorg, v_right * -200 + v_up * 50, 50, ang, '0 -250 0', 100, 0);
 	}
 
 	w_muzzleflash(shotorg, 1);
Index: dpmod/qc/w_pistol.qc
diff -u dpmod/qc/w_pistol.qc:1.6 dpmod/qc/w_pistol.qc:1.7
--- dpmod/qc/w_pistol.qc:1.6	Tue Mar 11 14:24:43 2003
+++ dpmod/qc/w_pistol.qc	Wed Apr  9 23:24:30 2003
@@ -14,9 +14,11 @@
 
 void() W_PistolFireCode =
 {
+	local vector ang;
 	self.wfiretime = time;
 	w_muzzleflash(shotorg, 1);
-	ejectcasing(shotorg, shotdir, v_right * 150 + v_up * 50, 50, 0);
+	ang = self.v_angle;ang_x = 0 - ang_x;
+	ejectcasing(shotorg, v_right * 150 + v_up * 50, 50, ang, '0 250 0', 100, 0);
 	FireBullets(self, self, 4, 1, 35 * damagescale, 35 * damagescale, 0, 0, shotdir * 7000, 0, "PISTOL", DT_NAIL, Obituary_Pistol);
 };
 
Index: dpmod/qc/w_shotgun.qc
diff -u dpmod/qc/w_shotgun.qc:1.6 dpmod/qc/w_shotgun.qc:1.7
--- dpmod/qc/w_shotgun.qc:1.6	Tue Mar 11 14:17:24 2003
+++ dpmod/qc/w_shotgun.qc	Wed Apr  9 23:24:30 2003
@@ -12,24 +12,26 @@
 		Obituary_Fallback(targ, attacker, dmsg, dtype);
 };
 
-//float SHOTGUNBUCKSHOT = 75;
+float SHOTGUNBUCKSHOT = 50;
 float SHOTGUNEXPLOSIVESLUG = 50;
 
 .float shotgunmode;
-void() W_SingleShotgunFireCode =
+void() W_SingleShotgunFireCode_Buckshot =
 {
 	self.wfiretime = time;
 	self.currentammo = self.ammo_shells = self.ammo_shells - 1;
 	w_muzzleflash(shotorg, 2);
-	//if (self.shotgunmode)
-		FireBullets(self, self, 1, 1, SHOTGUNEXPLOSIVESLUG * 0.2 * damagescale, SHOTGUNEXPLOSIVESLUG * 0.2 * damagescale, SHOTGUNEXPLOSIVESLUG * 0.8 * damagescale, 80, shotdir * 5000, 0, "SHOTGUNEXPLOSIVESLUG", DT_SHOTGUN, Obituary_Shotgun);
-	/*
-	else
-	{
-		FireBullets(self, self, 1, 5, SHOTGUNBUCKSHOT * 0.1 * damagescale, SHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, 0.05, "SHOTGUN", DT_SHOTGUN, Obituary_Shotgun);
-		FireBullets(self, self, 0, 5, SHOTGUNBUCKSHOT * 0.1 * damagescale, SHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, 0.05, "SHOTGUN", DT_SHOTGUN, Obituary_Shotgun);
-	}
-	*/
+	FireBullets(self, self, 1, 5, SHOTGUNBUCKSHOT * 0.1 * damagescale, SHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, 0.05, "SHOTGUN", DT_SHOTGUN, Obituary_Shotgun);
+	FireBullets(self, self, 0, 5, SHOTGUNBUCKSHOT * 0.1 * damagescale, SHOTGUNBUCKSHOT * 0.1 * damagescale, 0, 0, shotdir * 6000, 0.05, "SHOTGUN", DT_SHOTGUN, Obituary_Shotgun);
+	self.wload = -1;
+};
+
+void() W_SingleShotgunFireCode_Explosive =
+{
+	self.wfiretime = time;
+	self.currentammo = self.ammo_shells = self.ammo_shells - 1;
+	w_muzzleflash(shotorg, 2);
+	FireBullets(self, self, 1, 1, SHOTGUNEXPLOSIVESLUG * 0.2 * damagescale, SHOTGUNEXPLOSIVESLUG * 0.2 * damagescale, SHOTGUNEXPLOSIVESLUG * 0.8 * damagescale, 80, shotdir * 5000, 0, "SHOTGUNEXPLOSIVESLUG", DT_SHOTGUN, Obituary_Shotgun);
 	self.wload = -1;
 };
 
@@ -39,7 +41,7 @@
 void() w_shotgunraise2;
 void() w_shotgun =
 {
-	local vector v;
+	local vector v, ang;
 	if (widle(w_shotgundrop1))
 		return;
 
@@ -62,11 +64,14 @@
 
 	if (self.button0)
 	{
+		if (self.wload >= 1) // is it loaded?
+			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.3, W_SingleShotgunFireCode_Buckshot);
+	}
+	else if (self.button3)
+	{
 		if (self.wload >= 1) // is it loaded?
-			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.3, W_SingleShotgunFireCode);
+			W_GenericSlowFireCode("weapons/shotgn2.wav", 0.3, W_SingleShotgunFireCode_Explosive);
 	}
-	else
-		self.notfiring = TRUE;
 
 	if (self.wload < 1 && time > self.attack_finished)
 	{
@@ -75,7 +80,8 @@
 			self.attack_finished = time + 0.2;
 			sound(self, CHAN_AUTO, "weapons/bsgload.wav", 1, ATTN_STATIC);
 			v = shotorg + v_forward * -5;
-			ejectcasing (v, v_forward, (v_right * 100) + v_up * 40, 30, 1);
+			ang = self.v_angle;ang_x = 0 - ang_x;
+			ejectcasing(v, v_right * 100 + v_up * 40, 30, ang, '0 250 0', 100, 1);
 			self.wload = 0;
 		}
 		else if (self.ammo_shells >= 1)
Index: dpmod/qc/w_supernailgun.qc
diff -u dpmod/qc/w_supernailgun.qc:1.5 dpmod/qc/w_supernailgun.qc:1.6
--- dpmod/qc/w_supernailgun.qc:1.5	Thu Feb 20 03:58:15 2003
+++ dpmod/qc/w_supernailgun.qc	Wed Apr  9 23:24:30 2003
@@ -14,7 +14,7 @@
 
 void() W_SuperNailgunFireCode =
 {
-	local vector v;
+	local vector v, ang;
 	self.currentammo = self.ammo_nails = self.ammo_nails - 1;
 	self.wframe = self.wframe + 0.5; // 10fps animation
 	if (self.wframe >= 9)
@@ -24,7 +24,8 @@
 	v = shotorg;
 	shotorg = shotorg + v_up * 2;
 	w_muzzleflash(shotorg, 1);
-	ejectcasing(shotorg, shotdir, v_right * 200 + v_up * 50, 50, 2);
+	ang = self.v_angle;ang_x = 0 - ang_x;
+	ejectcasing(shotorg, v_right * 200 + v_up * 50, 50, ang, '0 50 0', 100, 0);
 	FireBullets(self, self, 4, 1, 15 * damagescale, 15 * damagescale, 0, 0, shotdir * 7000, 0.05, "SUPERNAILGUN", DT_NAIL, Obituary_SuperNailgun);
 	shotorg = v;
 


More information about the twilight-commits mailing list