View difference between Paste ID: ncVjPqWR and UBjFta7h
SHOW: | | - or go back to the newest paste.
1
diff -r 424c0d946ec9 qblood/progs/client.qc
2
--- a/qblood/progs/client.qc	Thu May 09 17:12:34 2013 +0200
3-
+++ b/qblood/progs/client.qc	Fri Jul 26 23:46:44 2013 -0500
3+
+++ b/qblood/progs/client.qc	Sat Jan 10 03:00:19 2015 +0000
4
@@ -712,7 +712,7 @@
5
 		return;
6
 
7
 	bprint3("Kevorkian approves ", self.netname, "!\n");
8
-	sound(self, CHAN_AUTO, "thevoice/vo5.wav", 1, ATTN_NORM);
9
+	self.noise1 = "thevoice/vo5.wav";
10
 	CTF_PlayerDropFlag();
11
 	self.modelindex = modelindex_player;
12
 	self.health = 0;
13
@@ -1168,7 +1168,7 @@
14
 		// Play the obituary sound
15
 		if (self.noise1)
16
 		{
17
-			sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
18
+			sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NONE);
19
 			self.noise1 = string_null;
20
 		}
21
 
22
@@ -1643,7 +1643,7 @@
23
 	}
24
 
25
 	// If we aren't dead, we can play with our stuff
26
-	else
27
+	else if (isAlive)
28
 	{
29
 		// Weapons
30
 		if ((self.impulse >= IMP_PITCHFORK && self.impulse <= IMP_VOODOO_DOLL) ||
31
@@ -1685,12 +1685,11 @@
32
 		// These ones are considered cheats and are only allowed when the "sv_cheats" cvar is set
33
 		else if (cvar("sv_cheats"))
34
 		{
35
-#if !defined(NO_FRIKBOT)
36
+#ifndef NO_FRIKBOT
37
 			if (self.impulse == IMP_BOT_CAM)
38
 				botcam_u();
39
 			else if (self.impulse == IMP_BOT_WAYPT_EDIT)
40
 				bot_way_edit();
41
-			else
42
 #endif
43
 		}
44
 	}
45
@@ -1814,7 +1813,17 @@
46
 	if (self.player_state >= PS_BOD_FALL && self.player_state <= PS_BOD_SWAY)
47
 	{
48
 		if (self.t_length < time)
49
-			Player_LiveAgain();
50
+		{
51
+			self.health = 0;
52
+			self.player_state = PS_BOD_DEATH;
53
+			ClientObituary(self.oldenemy);
54
+			self.takedamage = DAMAGE_NO;
55
+			PlayerDie();
56
+		}
57
+		else if (self.t_length-1 <= time)
58
+			if (self.button4 && !self.oldbutton4)
59
+				if (random() < 0.024)
60
+					Player_LiveAgain();
61
 		ResetIdle(self);
62
 		return;
63
 	}
64
@@ -1851,7 +1860,7 @@
65
 
66
 	bprint2(self.netname, " entered the game\n");
67
 
68
-	sound(self, CHAN_AUTO, "thevoice/vo1.wav", 1, ATTN_NORM); // Let the Bloodbath Begin!
69
+	sound(self, CHAN_AUTO, "thevoice/vo1.wav", 1, ATTN_NONE); // Let the Bloodbath Begin!
70
 	self.do_observer = 1;
71
 
72
 	// Reset the votes
73
@@ -2019,6 +2028,7 @@
74
 			// killed self in a dumb fashion
75
 			Cl_UpdatePlayerFrags(attacker, -1);
76
 
77
+			if (self.noise1 != "thevoice/vo5.wav") { // Kevorkian
78
 			if (rnum < 0.33)
79
 			{
80
 				deathstring = " receives the Darwin Award\n";
81
@@ -2036,6 +2046,7 @@
82
 			}
83
 
84
 			bprint2(self.netname, deathstring);
85
+			}
86
 			return;
87
 		}
88
 		else if (friendlyfire && self.team > 0 && self.team == attacker.team)
89
@@ -2060,14 +2071,14 @@
90
 			Cl_UpdatePlayerFrags(attacker, 1);
91
 			rnum = random()*54;
92
 			if (rnum <= 1) BuildDeathString2(attacker, "thevoice/vo39.wav", " beat ", " like a cur"); // Beaten like a Cur
93
-			else if (rnum <= 2) BuildDeathString(attacker, "thevoice/vo31.wav", " bobbettized "); // Bobbettized!
94
+			else if (rnum <= 2) BuildDeathString(attacker, "thevoice/vo31.wav", " bobbittized "); // Bobbettized!
95
 			else if (rnum <= 3) BuildDeathString(attacker, "thevoice/vo24.wav", " destroyed "); // Destroyed!
96
 			else if (rnum <= 4) BuildDeathString2(attacker, "thevoice/vo36.wav", " butchered ", " into dog meat"); // Dog meat
97
 			else if (rnum <= 5) BuildDeathString(attacker, "thevoice/vo44.wav", " showed his excellence to "); // Excellent!
98
 			else if (rnum <= 6) BuildDeathString(attacker, "thevoice/vo22.wav", " made fine work of "); // Fine work
99
 			else if (rnum <= 7) BuildDeathString2(attacker, "thevoice/vo20.wav", " showed ", " how good he is"); // Good one
100
 			else if (rnum <= 8) BuildDeathString(attacker, "thevoice/vo33.wav", " scored on "); // He shoots! He scores!
101
-			else if (rnum <= 8) BuildDeathString(attacker, "thevoice/vo25.wav", " hosed "); // Hosed!
102
+			else if (rnum <= 9) BuildDeathString(attacker, "thevoice/vo25.wav", " hosed "); // Hosed!
103
 			else if (rnum <= 10) BuildDeathString(attacker, "thevoice/vo26.wav", " humiliated "); // Humiliated!
104
 			else if (rnum <= 11) BuildDeathString(attacker, "thevoice/vo21.wav", " made lunch meat with "); // Lunch meat!
105
 			else if (rnum <= 12) BuildDeathString(attacker, "thevoice/vo29.wav", " passed the chili to "); // Pass the chili!
106
@@ -2075,7 +2086,7 @@
107
 			else if (rnum <= 14) BuildDeathString(attacker, "thevoice/vo38.wav", " ripped "); // Ripped 'em loose
108
 			else if (rnum <= 15) BuildDeathString2(attacker, "thevoice/vo28.wav", " sent ", " to hell!"); // Sent to HELL!
109
 			else if (rnum <= 16) BuildDeathString(attacker, "thevoice/vo41.wav", " snuffed "); // Snuffed!
110
-			else if (rnum <= 17) BuildDeathString2(attacker, "thevoice/vo34.wav", " split ", "'s blood"); // Spillage!
111
+			else if (rnum <= 17) BuildDeathString2(attacker, "thevoice/vo34.wav", " spilt ", "'s blood"); // Spillage!
112
 			else if (rnum <= 18) BuildDeathString(attacker, "thevoice/vo35.wav", " sprayed "); // Sprayed!
113
 			else if (rnum <= 19) BuildDeathString(attacker, "thevoice/vo32.wav", " stiffed "); // Stiffed!
114
 			else if (rnum <= 20) BuildDeathString2(attacker, "thevoice/vo19.wav", " dazzled ", " with his talent"); // Talented!
115
@@ -2083,21 +2094,21 @@
116
 			else if (rnum <= 22) BuildDeathString(attacker, "thevoice/vo43.wav", " vaporized "); // Vaporized!
117
 			else if (rnum <= 23) BuildDeathString(attacker, "thevoice/vo23.wav", " did well with "); // Well done!
118
 			else if (rnum <= 24) BuildDeathString(attacker, "thevoice/vo40.wav", " whipped and creamed "); // Whipped and creamed!
119
-			else if (rnum <= 25) BuildDeathString2(attacker, "thevoice/vo9.wav", " made ", " suffer scrotum seperation"); // Scrotum separation
120
+			else if (rnum <= 25) BuildDeathString2(attacker, "thevoice/vo9.wav", " made ", " suffer scrotum separation"); // Scrotum separation
121
 			else if (rnum <= 26) BuildDeathString2(attacker, "thevoice/vo7.wav", " turned ", " into excrement"); // Excrement
122
 			else if (rnum <= 27) BuildDeathString2(attacker, "thevoice/vo8.wav", " turned ", " into hamburger"); // Hamburger
123
 			else if (rnum <= 28) BuildDeathString2(attacker, "thevoice/vo42.wav", " vented ", "'s spleen"); //Vented spleen
124
 			else if (rnum <= 29) BuildDeathString(attacker, "thevoice/vo10.wav", " body bagged "); //Boddy bagged
125
 			else if (rnum <= 30) BuildDeathString2(attacker, "thevoice/boned.wav", " boned ", " like a fish!"); //Boned
126
 			else if (rnum <= 31) BuildDeathString2(attacker, "thevoice/justice.wav", " gave ", " Anal Justice!"); //Anal Justice
127
-			else if (rnum <= 32) BuildDeathString2(attacker, string_null, " hurt ", " real bad!"); //Hurt them real bad
128
+			else if (rnum <= 32) BuildDeathString2(attacker, "thevoice/vo6.wav", " hurt ", " real bad!"); //Hurt them real bad
129
 			else if (rnum <= 33) BuildDeathString2(attacker, "thevoice/ripped.wav", " ripped ", " a new orifice!"); //Ripped
130
 			else if (rnum <= 34) BuildDeathString(attacker, "thevoice/castra.wav", " castrated "); //Castrated
131
 			else if (rnum <= 35) BuildDeathString(attacker, "thevoice/creamed.wav", " creamed "); //Creamed
132
 			else if (rnum <= 36) BuildDeathString(attacker, "thevoice/decimat.wav", " decimated "); //Decimated
133
 			else if (rnum <= 37) BuildDeathString(attacker, "thevoice/destro.wav", " destroyed "); //Destroyed
134
 			else if (rnum <= 38) BuildDeathString(attacker, "thevoice/diced.wav", " diced "); //Diced
135
-			else if (rnum <= 39) BuildDeathString(attacker, "thevoice/disembo.wav", " disembowled "); //Disembowled
136
+			else if (rnum <= 39) BuildDeathString(attacker, "thevoice/disembo.wav", " disemboweled "); //Disembowled
137
 			else if (rnum <= 40) BuildDeathString(attacker, "thevoice/flatte.wav", " flattened "); //Flattened
138
 			else if (rnum <= 41) BuildDeathString(attacker, "thevoice/killed.wav", " killed "); //Killed
139
 			else if (rnum <= 42) BuildDeathString(attacker, "thevoice/madness.wav", " gave AnAl MaDnEsS to "); //Anal madness
140
@@ -2107,7 +2118,7 @@
141
 			else if (rnum <= 46) BuildDeathString(attacker, "thevoice/reamed.wav", " reamed "); //Reamed
142
 			else if (rnum <= 47) BuildDeathString(attacker, "thevoice/vo14.wav", " shat upon "); //Shat upon
143
 			else if (rnum <= 48) BuildDeathString(attacker, "thevoice/slaught.wav", " slaughtered "); //Slaughtered
144
-			else if (rnum <= 49) BuildDeathString(attacker, "thevoice/cliced.wav", " sliced "); //Sliced
145
+			else if (rnum <= 49) BuildDeathString(attacker, "thevoice/sliced.wav", " sliced "); //Sliced
146
 			else if (rnum <= 50) BuildDeathString(attacker, "thevoice/smashed.wav", " smashed "); //Smashed
147
 			else if (rnum <= 51) BuildDeathString(attacker, "thevoice/sodomiz.wav", " sodomized "); //Sodomized
148
 			else if (rnum <= 52) BuildDeathString(attacker, "thevoice/splatt.wav", " splattered "); //Splattered
149
diff -r 424c0d946ec9 qblood/progs/combat.qc
150
--- a/qblood/progs/combat.qc	Thu May 09 17:12:34 2013 +0200
151-
+++ b/qblood/progs/combat.qc	Fri Jul 26 23:46:44 2013 -0500
151+
+++ b/qblood/progs/combat.qc	Sat Jan 10 03:00:19 2015 +0000
152
@@ -78,8 +78,10 @@
153
 	oself = self;
154
 	self = targ;
155
 
156
+#if 0
157
 	if (self.health < 0)
158
 		self.health = 0;      // Blood had no negative sign, so nothing below 0
159
+#endif
160
 
161
 #ifndef NO_FRIKBOT
162
 
163
@@ -185,6 +187,7 @@
164
 	local   float   save;
165
 	local   float   take;
166
 	local   float   protected;  // PM:  Boolean for invulnerability.
167
+	local   float   bodhealth;
168
 
169
 	if (!targ.takedamage)
170
 		return;
171
@@ -471,8 +474,12 @@
172
 	// Do the damage.
173
 	targ.health = targ.health - take;
174
 
175
+	if (cvar("g_instabrink"))
176
+		bodhealth = 99;
177
+	else
178
+		bodhealth = 1;
179
 	if (targ.health >= -1					&& // If a player reaches between -1 and 1 HP (Brink Of Death)
180
-		targ.health <= 1					&&
181
+		targ.health <= bodhealth			&&
182
 		targ.classname == "player"			&& // BOD can only be done player to player
183
 		attacker.classname == "player"		&&
184
 		targ.player_state != PS_BOD_FALL	&& // If he wasn't already on the Brink Of Death
185
diff -r 424c0d946ec9 qblood/progs/defs.qc
186
--- a/qblood/progs/defs.qc	Thu May 09 17:12:34 2013 +0200
187-
+++ b/qblood/progs/defs.qc	Fri Jul 26 23:46:44 2013 -0500
187+
+++ b/qblood/progs/defs.qc	Sat Jan 10 03:00:19 2015 +0000
188
@@ -352,6 +352,7 @@
189
 .float      charge;
190
 .float      tnt_time;
191
 .float      tnt_type;
192
+.float      remote_type;
193
 
194
 .float      idle_time;
195
 .float      idle_done;
196
diff -r 424c0d946ec9 qblood/progs/items.qc
197
--- a/qblood/progs/items.qc	Thu May 09 17:12:34 2013 +0200
198-
+++ b/qblood/progs/items.qc	Fri Jul 26 23:46:44 2013 -0500
198+
+++ b/qblood/progs/items.qc	Sat Jan 10 03:00:19 2015 +0000
199
@@ -1439,6 +1439,7 @@
200
 
201
 void() precache_flaregun =
202
 {
203
+	precache_model("models/weapons/objects/muzzle_flare.spr32");
204
 	precache_model("models/weapons/v_flare.psk");
205
 	precache_model("models/weapons/g_flare.md3");
206
 	precache_model("models/weapons/ga_flare.psk");  // akimbo model
207
@@ -1659,6 +1660,7 @@
208
 
209
 void() precache_napalmlauncher =
210
 {
211
+	precache_model("models/weapons/objects/muzzle_napalm_2.spr32");
212
 	precache_model("models/weapons/v_napalm.psk");
213
 	precache_model("models/weapons/ga_napalm.psk");
214
 	precache_model("models/weapons/g_napalm.md3");
215
diff -r 424c0d946ec9 qblood/progs/player.qc
216
--- a/qblood/progs/player.qc	Thu May 09 17:12:34 2013 +0200
217-
+++ b/qblood/progs/player.qc	Fri Jul 26 23:46:44 2013 -0500
217+
+++ b/qblood/progs/player.qc	Sat Jan 10 03:00:19 2015 +0000
218
@@ -25,6 +25,8 @@
219
 void(float cloneCorpse) respawn;
220
 void(entity ent) CloneCorpse;
221
 void() Player_Idle;
222
+void() GibPlayerCorpse;
223
+void() FadeAway;
224
 
225
 /*
226
 ==============================================================================
227
@@ -60,9 +62,10 @@
228
 	// so that attackers will have the time to stop firing
229
 	player.takedamage = DAMAGE_NO;
230
 
231
-	player.t_length = time + 15;  // the effect will last 15 sec
232
+	player.t_length = time + 5;  // the effect will last 5 sec
233
 	sound(player, CHAN_VOICE, "thevoice/vo15.wav", 1, ATTN_NONE);
234
 	centerprint(player, "YOU ARE ON THE BRINK OF DEATH!!");
235
+	player.oldenemy = attacker;
236
 	// If there's a real attacker (not a BOD triggered by cheat code)
237
 	if (attacker != world)
238
 		centerprint(attacker, "FINISH HIM!!");
239
@@ -70,6 +73,7 @@
240
 
241
 void() Player_LiveAgain =
242
 {
243
+	self.takedamage = DAMAGE_AIM;
244
 	sound(self, CHAN_VOICE, "player/taunts/t1010.wav", 1, ATTN_NORM);  // I live ... again!
245
 	Player_Idle();
246
 	W_DrawWeapon(self.weapon);
247
@@ -477,6 +481,7 @@
248
 	{
249
 		self.nextthink = -1;
250
 		GibPlayer();
251
+		self.health = 0;
252
 		return;
253
 	}
254
 
255
@@ -488,33 +493,47 @@
256
 	// If the player was on the Brink Of Death
257
 	if (self.player_state >= PS_BOD_FALL && self.player_state <= PS_BOD_SWAY)
258
 	{
259
+#if 0
260
 		// If the head is removed in the process
261
 		if (self.health < -10)
262
 		{
263
+#endif
264
 			// The player entity will be the head, so we must
265
 			// create a new entity for the corpse
266
 			player_head = self;
267
 			self = spawn();
268
 			setmodel(self, player_head.model);
269
 			setorigin(self, player_head.origin);
270
-			setsize(self, player_head.mins, player_head.maxs);
271
+			setsize(self, '-16 -16 -20', '16 16 -15');
272
 			self.angles = player_head.angles;
273
 			self.frame = player_head.frame;
274
 			self.skin = player_head.skin;
275
 			self.colormap = player_head.colormap;
276
-			self.movetype = player_head.movetype;
277
+			self.movetype = MOVETYPE_TOSS;
278
 			self.velocity = player_head.velocity;
279
 			self.player_state = PS_HEADLESS_DEATH;
280
+			self.classname = "corpse";
281
+			self.health = 100;
282
+			self.th_die = GibPlayerCorpse;
283
+			self.solid = SOLID_BBOX;
284
+			self.takedamage = DAMAGE_AIM;
285
+			self.reset = SUB_Remove;
286
+			self.think = player_head.think;
287
+			self.nextthink = player_head.nextthink;
288
 
289
 			self = player_head;
290
 			self.deadflag = DEAD_DEAD;
291
 			ThrowHead("progs/h_player.mdl", self.health);
292
+#if 0
293
 		}
294
 		else
295
 			self.player_state = PS_BOD_DEATH;
296
+#endif
297
 	}
298
 	else
299
 		self.player_state = PS_DEATH;
300
+	if (self.health < 0)
301
+		self.health = 0;
302
 };
303
 
304
 // used by kill command and disconnect command
305
@@ -714,7 +733,9 @@
306
 	{
307
 		if (self.frame == PLAYER_DEATH_HEADLESS_END)
308
 		{
309
-			self.think = SUB_Remove;
310
+			self.nextthink = time + 30;
311
+			self.think = FadeAway;
312
+			self.oldorigin = self.origin;
313
 			return;
314
 		}
315
 
316
diff -r 424c0d946ec9 qblood/progs/w_bomb.qc
317
--- a/qblood/progs/w_bomb.qc	Thu May 09 17:12:34 2013 +0200
318-
+++ b/qblood/progs/w_bomb.qc	Fri Jul 26 23:46:44 2013 -0500
318+
+++ b/qblood/progs/w_bomb.qc	Sat Jan 10 03:00:19 2015 +0000
319
@@ -113,6 +113,8 @@
320
 	// Don't let grenade explode twice.
321
 	self.takedamage = DAMAGE_NO;
322
 
323
+	self.owner = self.enemy;
324
+
325
 	if (self.netname == "Napalm Ball")
326
 	{
327
 		local   float   radius, damage, burn;
328
diff -r 424c0d946ec9 qblood/progs/w_napalm.qc
329
--- a/qblood/progs/w_napalm.qc	Thu May 09 17:12:34 2013 +0200
330-
+++ b/qblood/progs/w_napalm.qc	Fri Jul 26 23:46:44 2013 -0500
330+
+++ b/qblood/progs/w_napalm.qc	Sat Jan 10 03:00:19 2015 +0000
331
@@ -242,6 +242,8 @@
332
 		newmis.reset = SUB_Remove;
333
 	}
334
 	muzzleflash(RIGHT);
335
+	if (self.owner.items & IT_GUNS_AKIMBO)
336
+		muzzleflash(LEFT);
337
 	if (!(self.owner.flags & FL_INFINATE_AMMO))
338
 		self.owner.currentammo = self.owner.ammo_rockets;
339
 	setorigin(newmis, W_Origin() + v_forward * 18 + v_right * 3 + v_up * -8);
340
diff -r 424c0d946ec9 qblood/progs/w_remote_tnt.qc
341
--- a/qblood/progs/w_remote_tnt.qc	Thu May 09 17:12:34 2013 +0200
342-
+++ b/qblood/progs/w_remote_tnt.qc	Fri Jul 26 23:46:44 2013 -0500
342+
+++ b/qblood/progs/w_remote_tnt.qc	Sat Jan 10 03:00:19 2015 +0000
343
@@ -60,7 +60,7 @@
344
 {
345
 	if (self.button0)
346
 	{
347
-		if (self.weaponentity.tnt_type) // We only have the remote
348
+		if (self.weaponentity.remote_type) // We only have the remote
349
 		{
350
 			self.button0 = 0;
351
 			sound(self, CHAN_WEAPON, "weapons/tnt/remfire.wav", 1, ATTN_NORM);
352
@@ -85,9 +85,9 @@
353
 			ShowThrowMeter();
354
 		}
355
 	}
356
-	else if (self.button3)// Altfire
357
+	else if (self.button3 && self.currentammo > 0)// Altfire
358
 	{
359
-		if (self.weaponentity.tnt_type) // If we only have a remote, draw another bomb
360
+		if (self.weaponentity.remote_type) // If we only have a remote, draw another bomb
361
 		{
362
 			self.weaponentity.anim_type = HALF_DRAW;
363
 			self.weaponentity.attack_finished = time + REMOTE_DRAW_TIME;
364
@@ -98,7 +98,7 @@
365
 			self.weaponentity.charge = 0;
366
 			self.weaponentity.attack_finished = time + REMOTE_DROP_TIME;
367
 			self.weaponentity.anim_type = IDLE_WITH_REMOTE;
368
-			self.weaponentity.tnt_type = REMOTE_ONLY;
369
+			self.weaponentity.remote_type = REMOTE_ONLY;
370
 			self.player_state = PS_FIRE;
371
 			Bomb_Fire();
372
 			Bomb_Uncharge();
373
@@ -122,9 +122,16 @@
374
 	Remote_UpdateView();
375
 	self.weaponentity.attack_finished = time + REMOTE_DRAW_TIME;
376
 	self.player_state = PS_DRAW;
377
-	self.weaponentity.tnt_type = REMOTE_AND_BOMB;
378
-	self.weaponentity.anim_type = DRAW;
379
-	self.weaponentity.frame = REMOTE_DRAW_START;
380
+	if (self.weaponentity.remote_type)
381
+	{
382
+		self.weaponentity.anim_type = IDLE_WITH_REMOTE;
383
+		self.weaponentity.frame = REMOTE_THROW_END;
384
+	}
385
+	else
386
+	{
387
+		self.weaponentity.anim_type = DRAW;
388
+		self.weaponentity.frame = REMOTE_DRAW_START;
389
+	}
390
 	self.weaponentity.skin = 1;
391
 	self.weaponentity.nextthink = time;
392
 	self.weaponentity.think = remote_animate;
393
@@ -140,7 +147,7 @@
394
 void() Remote_Holster =
395
 {
396
 	self.weaponentity.attack_finished = time + REMOTE_HOLSTER_TIME;
397
-	if (self.weaponentity.tnt_type) //Only holding a remote
398
+	if (self.weaponentity.remote_type) //Only holding a remote
399
 		self.weaponentity.anim_type = HALF_HOLSTER;
400
 	else
401
 		self.weaponentity.anim_type = HOLSTER;
402
@@ -173,7 +180,7 @@
403
 
404
 	//self.weaponentity.attack_finished = time + 0.5; // don't throw instantly after detonating.
405
 	self.owner.button0 = 0;
406
-	self.weaponentity.tnt_type = REMOTE_AND_BOMB;
407
+	self.weaponentity.remote_type = REMOTE_AND_BOMB;
408
 	self.weaponentity.charge = 0;
409
 
410
 	self.weaponentity.nextthink = time;
411
@@ -306,13 +313,13 @@
412
 	else // ammo_in_chamber == 1
413
 		self.weaponentity.skin = self.weaponentity.skin - 1;
414
 
415
-	if (self.owner.button0 && !self.weaponentity.tnt_type) // we have a bomb in hand and holding fire
416
+	if (self.owner.button0 && !self.weaponentity.remote_type) // we have a bomb in hand and holding fire
417
 	{
418
 		if (self.weaponentity.charge < 20)
419
 			self.weaponentity.charge = self.weaponentity.charge + 1;
420
 		ShowThrowMeter();
421
 	}
422
-	else if (self.weaponentity.charge && !self.weaponentity.tnt_type)
423
+	else if (self.weaponentity.charge && !self.weaponentity.remote_type)
424
 	{
425
 		self.weaponentity.anim_type = THROW;
426
 		self.weaponentity.attack_finished = time + REMOTE_THROW_TIME - 0.4; //- 0.4 so we can det it nearly quickly.
427
@@ -326,7 +333,7 @@
428
 		{
429
 			Bomb_Fire();
430
 			Bomb_Uncharge();
431
-			self.weaponentity.tnt_type = REMOTE_ONLY;
432
+			self.weaponentity.remote_type = REMOTE_ONLY;
433
 		}
434
 		else if (self.weaponentity.frame == REMOTE_THROW_END)
435
 			self.weaponentity.anim_type = IDLE_WITH_REMOTE;
436
diff -r 424c0d946ec9 qblood/progs/w_shotgun.qc
437
--- a/qblood/progs/w_shotgun.qc	Thu May 09 17:12:34 2013 +0200
438-
+++ b/qblood/progs/w_shotgun.qc	Fri Jul 26 23:46:44 2013 -0500
438+
+++ b/qblood/progs/w_shotgun.qc	Sat Jan 10 03:00:19 2015 +0000
439
@@ -436,12 +436,12 @@
440
 	{
441
 		if (self.weaponentity.frame == SHOTGUN_AKIMBO_FIRE_START)
442
 		{
443
-			muzzleflash(LEFT);
444
+			muzzleflash(RIGHT);
445
 			Shotgun_Fire();
446
 		}
447
 		else if (self.weaponentity.frame == SHOTGUN_AKIMBO_FIRE_START + 2)
448
 		{
449
-			muzzleflash(RIGHT);
450
+			muzzleflash(LEFT);
451
 			Shotgun_Fire();
452
 		}
453
 		else if (self.weaponentity.frame == SHOTGUN_AKIMBO_FIRE_END)
454
@@ -472,7 +472,9 @@
455
 	{
456
 		if (self.weaponentity.frame == SHOTGUN_AKIMBO_ALTFIRE_START)
457
 		{
458
+			muzzleflash(RIGHT);
459
 			Shotgun_Fire();
460
+			muzzleflash(LEFT);
461
 			Shotgun_Fire();
462
 		}
463
 		else if (self.weaponentity.frame == SHOTGUN_AKIMBO_ALTFIRE_END)
464
diff -r 424c0d946ec9 qblood/progs/weapons.qc
465
--- a/qblood/progs/weapons.qc	Thu May 09 17:12:34 2013 +0200
466-
+++ b/qblood/progs/weapons.qc	Fri Jul 26 23:46:44 2013 -0500
466+
+++ b/qblood/progs/weapons.qc	Sat Jan 10 03:00:19 2015 +0000
467
@@ -103,14 +103,40 @@
468
 
469
 	local string sprite;
470
 
471
+	makevectors(self.v_angle);
472
 	if (self.owner.weapon == IT_FLAREGUN)
473
 	{
474
 
475
+		sprite = "models/weapons/objects/muzzle_flare.spr32";
476
+		setmodel(muzzle, sprite);
477
+		muzzle.alpha = 0.7;
478
+		if (has_akimbo)
479
+		{
480
+			muzzle.scale = 0.4;
481
+			if (hand == RIGHT)
482
+				setorigin(muzzle, self.weaponentity.origin + v_up * -15);
483
+		}
484
+		else
485
+		{
486
+			muzzle.scale = 0.6;
487
+			setorigin(muzzle, self.weaponentity.origin + v_up * -15);
488
+		}
489
+		muzzle.frame = 0;
490
+		muzzle.nextthink = time + 0.1;
491
+		muzzle.think = muzzle_animate;
492
+		muzzle.th_die = muzzle_remove;
493
 	}
494
 	else if (self.owner.weapon == IT_SAWED_OFF)
495
 	{
496
 		if (has_akimbo)
497
 		{
498
+			if (hand == LEFT)
499
+				setattachment(muzzle, self.weaponentity, "Muzzle_L");
500
+			else
501
+				setattachment(muzzle, self.weaponentity, "Muzzle_R");
502
+			setorigin(muzzle, self.weaponentity.origin + v_right * -13 + v_up * -4);
503
+			muzzle.scale = 0.65;
504
+#if 0
505
 			sprite = "models/weapons/objects/muzzle_shotgun.spr32";
506
 			setmodel(muzzle, sprite);
507
 			muzzle.scale = 0.45;
508
@@ -119,6 +145,7 @@
509
 			muzzle.nextthink = time + 0.1;
510
 			muzzle.think = muzzle_animate;
511
 			muzzle.th_die = muzzle_remove;
512
+#endif
513
 		}
514
 		else
515
 		{
516
@@ -133,18 +160,19 @@
517
 				if (self.weaponentity.ammo_in_chamber == 2)
518
 				{
519
 					setattachment(muzzle, self.weaponentity, "Muzzle_L");
520
-					setorigin(muzzle, '0 0 0' + v_right * -10.6);
521
+					setorigin(muzzle, self.weaponentity.origin + v_right * -10.6);
522
 				}
523
 				else
524
 				{
525
 					setattachment(muzzle, self.weaponentity, "Muzzle_R");
526
-					setorigin(muzzle, '0 0 0' + v_right * -10.4);
527
+					setorigin(muzzle, self.weaponentity.origin + v_right * -10.4);
528
 				}
529
 				muzzle.scale = 0.45;
530
 			}
531
 		}
532
 		sprite = "models/weapons/objects/muzzle_shotgun.spr32";
533
 		setmodel(muzzle, sprite);
534
+		muzzle.alpha = 0.6;
535
 		muzzle.frame = 0;
536
 		muzzle.anim_end = 1;
537
 		muzzle.nextthink = time + 0.1;
538-
@@ -845,6 +873,7 @@
538+
@@ -175,6 +203,7 @@
539
 		muzzle.think = muzzle_animate;
540
 		muzzle.th_die = muzzle_remove;
541
 	}
542
+	else remove(muzzle);
543
 	//FIXME - add other weapons, and fix shotgun
544
 };
545
 
546-
@@ -1065,6 +1094,13 @@
546+
@@ -845,6 +874,7 @@
547
 
548
 	/* if you only have a pitchfork drawn, you can draw the Napalm Launcher
549
 		otherwise it won't draw if you run out of ammo of any other weapon */
550
+	if (self.ammo_rockets >= 1)
551
 	if (self.weapon == IT_PITCHFORK && it & IT_NAPALM_LAUNCHER)
552
 		return IT_NAPALM_LAUNCHER;
553
 
554
@@ -1065,6 +1095,13 @@
555
 {
556
 	local float am, newWeapon;
557
 
558
+	if (!self.weapon)
559
+	{
560-
@@ -1201,7 +1237,7 @@
560+
561
+		W_DrawWeapon(IT_PITCHFORK);
562
+		return;
563
+	}
564
+
565
 	newWeapon = self.weapon;
566
 
567
 	// Don't let player change weapons while holding lit dynamite.
568
@@ -1201,7 +1238,7 @@
569
 
570
 	if (!W_AmmoAvailable() && self.weapon) //self.weapon is a check for dropping your weapons such as TNT self-explosion.
571-
+++ b/qblood/progs/world.qc	Fri Jul 26 23:46:44 2013 -0500
571+
572
-		if ((self.player_state != PS_HOLD_FIRE) && (self.weaponentity.tnt_type != REMOTE_ONLY))
573
+		if ((self.player_state != PS_HOLD_FIRE) && (self.weapon != IT_REMOTE_DETONATOR))
574
 		{
575
 			W_SwitchToWeapon(W_BestWeapon());
576
 			return;
577
diff -r 424c0d946ec9 qblood/progs/world.qc
578
--- a/qblood/progs/world.qc	Thu May 09 17:12:34 2013 +0200
579
+++ b/qblood/progs/world.qc	Sat Jan 10 03:00:19 2015 +0000
580
@@ -54,6 +54,12 @@
581
 	precache_model("models/objects/m_leg.md3");
582
 	precache_model("models/objects/m_eyeball.md3");
583
 	precache_model("models/objects/m_hand.md3");
584
+	precache_model("models/objects/glass1.md3");
585
+	precache_model("models/objects/glass2.md3");
586
+	precache_model("models/objects/glass3.md3");
587
+	precache_model("models/objects/rubble1.md3");
588
+	precache_model("models/objects/rubble2.md3");
589
+	precache_model("models/objects/rubble3.md3");
590
 
591
 	precache_model("progs/s_explod.spr");  // napalm sprite explosion
592
 };
593
@@ -167,6 +173,7 @@
594
 	precache_sound("thevoice/vo42.wav");
595
 	precache_sound("thevoice/vo43.wav");
596
 	precache_sound("thevoice/vo44.wav");
597
+	precache_sound("thevoice/vo6.wav");
598
 	precache_sound("thevoice/vo7.wav");
599
 	precache_sound("thevoice/vo8.wav");  // Hamburger
600
 	precache_sound("thevoice/vo9.wav");
601
@@ -295,6 +302,7 @@
602
 
603
 	// Create our own cvars as soon as possible
604
 	registercvar("g_flashyEffects", "0");
605
+	registercvar("g_instabrink", "0");
606
 	registercvar("g_lockTeams", "0");
607
 	registercvar("g_warmup", "0");
608
 	registercvar("g_weaponStay", "0");