diff --git a/autoexec/chaos-esque_mod.cfg b/autoexec/chaos-esque_mod.cfg
new file mode 100644
index 0000000..9d0e038
--- /dev/null
+++ b/autoexec/chaos-esque_mod.cfg
@@ -0,0 +1,41 @@
+//CHAOS-ESQUE mod for Xonotic
+//by MikeeUSA
+//(C) License: (same as Xonotic): Gnu GPL v2 or later 
+set g_showweaponspawns 1
+
+set g_antilag_bullets 0
+set g_ballistics_force 1
+set g_casings 2
+
+exec vehicle_spiderbot.cfg
+exec vehicle_racer.cfg
+exec vehicle_raptor.cfg
+
+//Main setting config for this mod
+exec fastweap.cfg
+
+//Looks like we're aming from the sholder, all tacticool,
+// also can see all the details on the sides of the guns, which is nice
+// also can shoot crouched from behind cover without hitting the cover
+exec shootfromrightshoulder.cfg
+
+// When you die, you are dead on the floor
+set g_respawn_ghosts 0
+
+set g_projectiles_newton_style 2
+set g_projectiles_newton_style_2_maxfactor 1000000
+//0.01 causes nades to shoot many of it's projectiles downward
+set g_projectiles_newton_style_2_minfactor 0.8
+
+//So we may use the new weapons:
+set g_weaponreplace_uzi "uzi uzi shotgunautomat uzi uzi hmg"
+set g_weaponreplace_nex "nex nex rifle"
+set g_weaponreplace_rifle "rifle rifle minstanex"
+set g_weaponreplace_hagar "hagar hagar minelayer"
+set g_weaponreplace_minelayer "minelayer minelayer porto"
+set g_weaponreplace_electro "electro electro fireball"
+set g_weaponreplace_rocketlauncher "rocketlauncher rocketlauncher seeker"
+set g_weaponreplace_hlac "hlac hlac mg"
+
+//Give everyone a pistol at start too
+set g_start_weapon_pistol 1
diff --git a/bots.txt b/bots.txt
index fc8082f..16f014d 100644
--- a/bots.txt
+++ b/bots.txt
@@ -1,4 +1,4 @@
-//bot configuration: name	model	skin	shirt	pants	team	keyboard use	moving	dodging	ping	weapon use	aggressivity	range	aiming	calmhand	mouse	fightthink	aithink
+//bot configuration: name	model	skin	shirt	pants	team	keyboard use	moving	dodging	ping	weapon use	aggressivity	range	aiming	calmhand	.mouse	fightthink	aithink
 //default team values (team-override): 1 = red, 2 = blue, 3 = yellow, 4 = pink																	
 //use -1 for shirt-color or pants-color to get random colors																	
 Hellfire	ignis	0	4	0	0	0	0	-0.5	-1	1	1	-0.5	-1	-1	2	0.5	-1
@@ -19,3 +19,22 @@ Lion	ignismasked	0	0	4	0	1	1.5	2	-1	-1	-1	1	0	1	-0.5	-1	-1
 Sensible	seraphina	0	9	9	0	0	0	0.5	-1	0	-1	0	-1	2.5	-1.5	1	0.5
 Shadow	seraphinamasked	0	4	8	0	-0.5	2	1	0	0	-1	0	-1	0	1	-1	-0.5
 Resurrection	umbra	0	1	1	0	0	-0.5	-0.5	0	2	-1	-1	-1	0	-1	1	1
+StormHitler	megaerebus	0	4	4	1	7	7	7	0	1	9.5	-2.5	7	2	2	2	2
+Desu	suiseiseki.zym	0	-1	-1	0	1	1	0	1	-1	-3	3	5	2	0	-1	-1
+Quark	crash.zym	0	6	5	0	5	1.5	-2	-1	0	-1	1	10	0	2	10	10
+Xolar	xonos.dpm	0	12	1	0	0	2	2	0	2	2	1	0.5	-1	1	-1	-1
+NR-5	xonos.dpm	1	0	0	0	2	2	-2	0	-1	0	-1	2	1	-1	1	1
+QR-S	crash.zym	0	0	0	0	7	2	2	-1	2	-1	0	10	0	5	10	10
+QR-B	crash.zym	0	11	11	0	2	1	0	-1	0	2	1	10	0	0	10	10
+Reptile	lurk.zym	0	3	3	0	0	1	2	0.5	2	0.5	-0.5	1	0	0	2	2
+Lurk	lurk.zym	0	12	7	0	0	-1	-1	-1	0	2	0	1	0	2	-1	-1
+Velic	lurk.zym	0	7	2	0	0	0	0	-0.5	-1	1	0.5	0.5	-0.5	1	0.5	1
+Mulder	nexus.zym	1	4	0	0	7	7	7	0	1	2	-1	5	2	3	2	2
+
+
+//name	model		skin	shirt	pants	team	keyb	moving	dodging	ping	wepuse	aggrs	range	aiming	cahnd	.mouse	fightthink	aithink
+//bot configuration: 
+
+//default team values (team-override): 1 = red, 2 = blue, 3 = yellow, 4 = pink																	
+//use -1 for shirt-color or pants-color to get random colors
+
diff --git a/fastweap.cfg b/fastweap.cfg
new file mode 100644
index 0000000..6eca91e
--- /dev/null
+++ b/fastweap.cfg
@@ -0,0 +1,541 @@
+//  ______       _____ _________          ________          _____   ____  _   _  _____ 
+// |  ____/\    / ____|__   __\ \        / /  ____|   /\   |  __ \ / __ \| \ | |/ ____|
+// | |__ /  \  | (___    | |   \ \  /\  / /| |__     /  \  | |__) | |  | |  \| | (___  
+// |  __/ /\ \  \___ \   | |    \ \/  \/ / |  __|   / /\ \ |  ___/| |  | | . ` |\___ \ 
+// | | / ____ \ ____) |  | |     \  /\  /  | |____ / ____ \| |    | |__| | |\  |____) |
+// |_|/_/    \_\_____/   |_|      \/  \/   |______/_/    \_\_|     \____/|_| \_|_____/ 
+//
+// Config.
+
+////Here is the config for the "weapons_deadly" command
+////on CAEthaver2's Nexuiz server. (AKA: fastweapons config)
+//
+//Nexuiz: First we exec the nexuiz 2.5 config.
+//exec default25.cfg
+//Xonotic: First we exec the xonotic balance
+exec balanceXonotic.cfg
+exec vehicle_spiderbot.cfg
+exec vehicle_raptor.cfg
+exec vehicle_racer.cfg
+exec vehicle_spiderbot_ballistics.cfg
+exec vehicle_climbjet.cfg
+exec vehicle_forklift.cfg
+//exec vehicles.cfg
+
+//
+////The reason this setting was created was to have the weapons feel
+////"real": This is the damage they would do if they were actual weapons.
+////Most of them can kill in 1 or 2 shots. The diffrences in the weapons
+////are how they kill 
+//
+////You can do whatever you want with this file.
+////No restrictions (I don't think this is even a copyrightable "work")
+////--MikeeUSA--
+//
+////Below, commented out, is the stuff you need to put in your server.cfg
+////to have the weapons_deadly and weapons_normal commands working, also 
+////directly below is some sample g_weaponreplace code, you don't need to
+////do anything with it by default (it exists so if you have weaponreplace on
+////you will know you have to add your settings there as when the weapons
+////commands run they exec weapons.cfg first and that clears all ////weapreplacements aswell)
+//
+//alias nexnexnex "g_weaponreplace_nex \"nex nex nex\""
+//alias standardweapreplace nexnexnex
+//alias weapons_normal "exec weapons.cfg; set g_ballistics_force_uzi_bulletconstant 115; set g_ballistics_force_shotgun_bulletconstant 50; set g_balance_crylink_primary_bounces 1; set g_balance_crylink_secondary_bounces 0; set g_balance_crylink_secondary_shots 7; set g_balance_crylink_primary_shots 4; standardweapreplace;"
+//alias weapons_deadly "exec weapons.cfg; set g_balance_crylink_primary_bounces 1; set g_balance_crylink_secondary_bounces 0; set g_balance_crylink_secondary_shots 7; set g_balance_crylink_primary_shots 4; set g_ballistics_force_uzi_bulletconstant 115; set g_ballistics_force_shotgun_bulletconstant 50; exec fastweap.cfg; standardweapreplace;"
+//
+////OK That is it, the rest is the settings :)
+
+set g_balance_laser_primary_force "165"
+
+//Energy weapons don't need reload (their strength)
+
+set g_balance_hlac_reload_ammo 0
+set g_balance_minstanex_reload_ammo 0
+set g_balance_nex_reload_ammo 0 
+set g_balance_crylink_reload_ammo 0
+set g_balance_electro_reload_ammo 0 
+
+
+//What should gib and what should not
+set g_balance_tuba_nogibs 1
+set g_balance_laser_nogibs 1
+set g_balance_nex_nogibs 1
+set g_balance_minstanex_nogibs 1
+set g_balance_crylink_nogibs 1  // I don't think the crylink has enough elec to destroy a body
+set g_balance_electro_nogibs 1
+set g_balance_hlac_nogibs 1
+set g_balance_shotgun_nogibs 0
+set g_balance_rifle_nogibs 1    // The bullet goes through, it doesn't explode inside the person
+set g_balance_uzi_nogibs 1      // Ditto
+set g_balance_rocketlauncher_nogibs 0
+set g_balance_grenadelauncher_nogibs 0
+set g_balance_hagar_nogibs 0
+set g_balance_seeker_nogibs 0
+set g_balance_minelayer_nogibs 0
+set g_balance_fireball_nogibs 1
+set g_balance_hmg_nogibs 1 
+set g_balance_mg_nogibs 1 
+	
+set g_balance_shotgunautomat_nogibs 0
+set g_balance_nukelayer_nogibs 0
+set g_balance_pistol_nogibs 1
+
+set sv_gibhealth_weapon_nogib_add 999
+
+//How reliable are munitions?
+//C13 failure rate 1.0% to 1.7%, Will set to 5%
+set g_balance_grenadelauncher_primary_failurerate "0.07"
+set g_balance_grenadelauncher_secondary_failurerate "0.05"
+
+//Going to set similar to Hellfire
+set g_balance_rocketlauncher_primary_failurerate "0.09"
+set g_balance_rocketlauncher_secondary_failurerate "0.09"
+set g_balance_rocketlauncher_commlink_failurerate "0.12"
+
+//40mm's have 3-8% failure rate, ours have more
+set g_balance_hagar_primary_failurerate "0.16"
+set g_balance_hagar_secondary_failurerate "0.16"
+
+//Complex toys...
+set g_balance_seeker_missile_failurerate "0.175"
+
+//I'll keep these reliable for now
+set g_balance_minelayer_primary_failurerate "0.01"
+set g_balance_minelayer_secondary_failurerate "0.01"
+
+set g_balance_uzi_jamrate "0.005"
+set g_balance_uzi_clearjam_time "3.5"
+
+set g_balance_mg_jamrate "0.0025"
+set g_balance_mg_clearjam_time "3.5"
+
+//This family of shotgun is somewhat complex, thus takes longer to unjam
+//(notice the three barrels)
+set g_balance_shotgunautomat_jamrate "0.002"
+set g_balance_shotgunautomat_clearjam_time "4"
+
+set g_balance_shotgun_jamrate "0.0017"
+set g_balance_shotgun_clearjam_time "4"
+
+set g_balance_pistol_jamrate "0.00115"
+set g_balance_pistol_clearjam_time "2"
+
+//Uzi, The machinegun. Shoots through sheetrock walls with ease.
+set g_balance_uzi_speed 18000
+set g_balance_uzi_sustained_refire "0.05"
+set g_balance_uzi_first_refire "0.1"
+set g_balance_uzi_sustained_damage "25"
+set g_balance_uzi_first_damage "25"
+set g_balance_uzi_first_spread "0.007"
+set g_balance_uzi_spread_add "0.001"
+set g_balance_uzi_spread_min "0.018"
+set g_balance_uzi_spread_max "0.14"
+set g_balance_uzi_bulletconstant "115"
+set g_balance_uzi_reload_ammo "30"
+set g_balance_uzi_burst_refire "0.01"
+set g_balance_uzi_sustained_headshotaddeddamage 80
+set g_balance_uzi_first_headshotaddeddamage 80
+
+//Assault Rifle
+set g_balance_mg_mode 1 				// Activates varible spread for sustained & burst mode secondary
+set g_balance_mg_spread_add 0.001
+set g_balance_mg_spread_min 0.006
+set g_balance_mg_spread_max 0.05
+
+set g_balance_mg_burst 3				// # of bullets in a burst (if set to 2 or more)
+set g_balance_mg_burst_animtime 0.3
+set g_balance_mg_burst_refire 0.1		// refire between burst bullets
+set g_balance_mg_burst_refire2 0.01	// refire after burst
+set g_balance_mg_burst_spread 0.006
+	
+set g_balance_mg_burst_force 20
+set g_balance_mg_burst_ammo 6
+
+set g_balance_mg_first 1
+set g_balance_mg_first_headshotaddeddamage 90
+set g_balance_mg_first_force 5
+set g_balance_mg_first_spread 0.006
+set g_balance_mg_first_refire 0.2
+set g_balance_mg_first_ammo 2 // Between rifle and uzi
+
+set g_balance_mg_sustained_headshotaddeddamage 90
+set g_balance_mg_sustained_force 5
+set g_balance_mg_sustained_spread 0.03
+set g_balance_mg_sustained_refire 0.1
+set g_balance_mg_sustained_ammo 2 // Between rifle and uzi
+
+set g_balance_mg_speed 24000
+set g_balance_mg_bulletconstant 117 // Between rifle and uzi
+set g_balance_mg_reload_ammo 48 //2 ammo cost * 24 shots
+set g_balance_mg_reload_time 2  // Norm
+
+set g_balance_mg_burst_damage 47
+set g_balance_mg_sustained_damage 47
+set g_balance_mg_first_damage 47
+
+
+seta crosshair_mg ""	"crosshair to display when wielding the machinegun"
+seta crosshair_mg_color "1 0.9 0.55"	"crosshair color to display when wielding the machinegun"
+seta crosshair_mg_alpha 0.9	"crosshair alpha value to display when wielding the machinegun"
+seta crosshair_mg_size 0.6	"crosshair size when wielding the machinegun"
+
+
+//Shotgun. Will shoot through a door, a window, or a thin wall.
+set g_balance_shotgun_primary_speed 12000
+set g_balance_shotgun_primary_bullets "22"
+set g_balance_shotgun_primary_bulletconstant "100"
+set g_balance_shotgun_primary_damage "12"
+set g_balance_shotgun_primary_force "90"
+set g_balance_shotgun_secondary_bullets "22"
+set g_balance_shotgun_primary_spread "0.06"
+set g_balance_shotgun_secondary_spread "0.14"
+set g_balance_shotgun_primary_force "90"
+set g_balance_shotgun_reload_ammo "5"
+
+exec pumpshotgun.cfg
+
+exec shotgunautomat.cfg
+//ShotgunAutomat. Will shoot through a door, a window, or a thin wall... Quickly.
+set g_balance_shotgunautomat_primary_refire 0.13
+set g_balance_shotgunautomat_primary_animtime 0.1
+set g_balance_shotgunautomat_primary_speed 12000
+set g_balance_shotgunautomat_primary_bullets "22"
+set g_balance_shotgunautomat_primary_bulletconstant "100"
+set g_balance_shotgunautomat_primary_ammo "1"
+set g_balance_shotgunautomat_primary_damage "12"
+set g_balance_shotgunautomat_primary_force "90"
+set g_balance_shotgunautomat_primary_spread "0.06"
+set g_balance_shotgunautomat_secondary_refire 0.8
+set g_balance_shotgunautomat_secondary_animtime 0.2
+set g_balance_shotgunautomat_secondary_speed 12000
+set g_balance_shotgunautomat_secondary_bullets "66"
+set g_balance_shotgunautomat_secondary_bulletconstant "100"
+set g_balance_shotgunautomat_secondary_ammo "3"
+set g_balance_shotgunautomat_secondary_damage "12"
+set g_balance_shotgunautomat_secondary_force "90"
+set g_balance_shotgunautomat_secondary_spread "0.14"
+set g_balance_shotgunautomat_reload_ammo "9"
+
+exec nukelayer.cfg
+set g_balance_nukelayer_limit 1
+set g_balance_nukelayer_reload_ammo 0 //Since we only allow one, no point to having this set.
+
+set g_balance_rocketlauncher_health 28
+set g_balance_rocketlauncher_speed 2200
+set g_balance_rocketlauncher_speedaccel 1800
+set g_balance_rocketlauncher_speedstart 800
+set g_balance_rocketlauncher_radius "253"
+set g_balance_rocketlauncher_damage "300"
+set g_balance_rocketlauncher_edgedamage "125"
+set g_balance_rocketlauncher_force 500
+set g_balance_rocketlauncher_remote_radius "221" //0.875 * primary, rounded down
+set g_balance_rocketlauncher_remote_damage "262" //0.875 * primary, rounded down
+set g_balance_rocketlauncher_remote_edgedamage "109" //0.875 * primary, rounded down
+set g_balance_rocketlauncher_remote_force 500
+set g_balance_rocketlauncher_ammo 4
+set g_balance_rocketlauncher_reload_ammo 20 //Looks like there's 5 in the rotary, plus possibly 6 in the other side maybe. X by 4
+set g_balance_rocketlauncher_reload_time 2
+
+set g_balance_grenadelauncher_primary_damage "100"
+set g_balance_grenadelauncher_primary_edgedamage "60"
+set g_balance_grenadelauncher_primary_radius 140
+set g_balance_grenadelauncher_primary_health 30
+set g_balance_grenadelauncher_secondary_health 30
+set g_balance_grenadelauncher_secondary_damage "100"
+set g_balance_grenadelauncher_secondary_edgedamage "60"
+set g_balance_grenadelauncher_secondary_radius 140
+set g_balance_grenadelauncher_primary_ammo 2
+set g_balance_grenadelauncher_secondary_ammo 2
+set g_balance_grenadelauncher_reload_ammo 12 //default: 12 //fast shooter
+set g_balance_grenadelauncher_reload_time 0.8 //quick reload
+
+set g_balance_grenadelauncher_secondary_fragments 500
+set g_balance_grenadelauncher_secondary_fragment_damage 40
+set g_balance_grenadelauncher_secondary_fragment_speed 700 
+set g_balance_grenadelauncher_secondary_fragment_bulletconstant 1000 //1000 bulletconstant * 500speed = goes through thin wall
+set g_balance_grenadelauncher_secondary_fragment_headshotbonus 40
+set g_balance_grenadelauncher_secondary_fragment_force 15
+set g_balance_grenadelauncher_secondary_fragment_tracer 0
+set g_balance_grenadelauncher_secondary_fragment_gravity 1
+
+set g_balance_grenadelauncher_primary_fragments 100
+set g_balance_grenadelauncher_primary_fragment_damage 80
+set g_balance_grenadelauncher_primary_fragment_speed 700
+set g_balance_grenadelauncher_primary_fragment_bulletconstant 1500
+set g_balance_grenadelauncher_primary_fragment_headshotbonus 60
+set g_balance_grenadelauncher_primary_fragment_force 30
+set g_balance_grenadelauncher_primary_fragment_tracer 1
+set g_balance_grenadelauncher_primary_fragment_gravity 1
+
+set g_balance_nex_damage "150" // Nexuiz
+set g_balance_nex_primary_damage "150" // Xonotic
+set g_balance_nex_primary_force "0" //So it won't gib via force//Default was 400
+
+set g_balance_hagar_primary_damage "70"
+set g_balance_hagar_secondary_damage "70"
+set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_secondary_load_max 6
+set g_balance_hagar_secondary_load_hold "-1"
+set g_balance_hagar_secondary_load_releasedeath 1
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_reload_ammo 100 //100 round belt of 'nades
+set g_balance_hagar_reload_time 3 //Takes awhile to get the next 'nade belt hooked up
+
+set g_balance_crylink_primary_force -55
+set g_balance_crylink_primary_damage 18
+set g_balance_crylink_primary_bounces "7"
+set g_balance_crylink_primary_shots "6"
+set g_balance_crylink_secondary_force -40
+set g_balance_crylink_secondary_damage 18
+set g_balance_crylink_secondary_shots "11"
+set g_balance_crylink_secondary_refire "0.3"
+
+// set g_balance_electro_primary_damage "110" // Nexuiz
+//set g_balance_electro_primary_damage "220"  // Old Xonotic where electro was like a lightning gun
+set g_balance_electro_primary_damage "90"
+set g_balance_electro_secondary_damage "80"
+set g_balance_electro_secondary_count "100"
+set g_balance_electro_primary_force 200
+set g_balance_electro_secondary_force 200
+set g_balance_electro_combo_force 120
+
+set g_balance_seeker_reload_time 3.5
+set g_balance_seeker_reload_ammo 16
+set g_balance_seeker_missile_delay 0.11
+set g_balance_seeker_missile_count 8
+set g_balance_seeker_missile_health 1
+set g_balance_seeker_missile_damage       90
+set g_balance_seeker_missile_edgedamage   30
+set g_balance_seeker_missile_radius       90
+set g_balance_seeker_flac_damage       25
+set g_balance_seeker_flac_edgedamage   20
+set g_balance_seeker_type 0
+set g_balance_seeker_tag_speed 10000
+
+
+set g_balance_hlac_primary_damage 55
+set g_balance_hlac_primary_refire 0.1
+set g_balance_hlac_secondary_damage 55
+
+//Fires same bullets as Rifle
+set g_balance_hmg_spread_min 0.003 //Less than uzi
+set g_balance_hmg_spread_max 0.03  //Less than uzi
+set g_balance_hmg_spread_add 0.0005
+set g_balance_hmg_sustained_damage 95
+set g_balance_hmg_sustained_headshotaddeddamage 130 //less speed less trauma?
+set g_balance_hmg_sustained_force 10 // Same as Rifle
+set g_balance_hmg_sustained_spread 0.03
+set g_balance_hmg_sustained_refire 0.09
+set g_balance_hmg_sustained_ammo 3
+set g_balance_hmg_speed 30000 //Shorter barrel(s) than Rifle
+set g_balance_hmg_bulletconstant 119 // Same as Rifle
+set g_balance_hmg_reload_ammo 360 //120(amnt of bullets in belt)*3(cost of each)
+set g_balance_hmg_reload_time 3 //Got to load belt
+
+seta crosshair_hmg ""	"crosshair to display when wielding the machinegun"
+seta crosshair_hmg_color "0.9 0.4 0.35"	"crosshair color to display when wielding the machinegun"
+seta crosshair_hmg_alpha 0.9	"crosshair alpha value to display when wielding the machinegun"
+seta crosshair_hmg_size 0.6	"crosshair size when wielding the machinegun"
+
+
+//Sniper Rifle. Will shoot through concrete, has long range.
+//##Nexuiz sniper/camping rifle:
+set g_balance_campingrifle_primary_damage 95
+set g_balance_campingrifle_primary_headshotaddeddamage 260
+set g_balance_campingrifle_secondary_force 10
+set g_balance_campingrifle_secondary_burstcost 0
+set g_balance_campingrifle_primary_speed 55000 // Old 40000
+set g_balance_campingrifle_primary_bulletconstant 119 // Old 480
+set g_balance_campingrifle_secondary_refire 0.06
+set g_balance_campingrifle_secondary_animtime 0.06
+set g_balance_campingrifle_secondary_speed 30000
+set g_balance_campingrifle_magazinecapacity 30
+//set g_ballistics_force_shotgun_bulletconstant 130 //OLD
+//set g_ballistics_force_uzi_bulletconstant 245 //OLD
+set g_balance_campingrifle_secondary_ammo 3
+set g_balance_campingrifle_primary_ammo 3
+set g_balance_campingrifle_secondary_tracer 1
+set g_balance_campingrifle_primary_tracer 0
+//##Old Xonotic sniper/camping rifle
+set g_balance_sniperrifle_primary_damage 95
+set g_balance_sniperrifle_primary_headshotaddeddamage 260
+set g_balance_sniperrifle_secondary_force 10
+set g_balance_sniperrifle_secondary_burstcost 0
+set g_balance_sniperrifle_primary_speed 55000 
+set g_balance_sniperrifle_primary_bulletconstant 119
+set g_balance_sniperrifle_primary_refire "0.5"
+set g_balance_sniperrifle_secondary_refire 0.06
+set g_balance_sniperrifle_secondary_animtime 0.06
+set g_balance_sniperrifle_secondary_speed 30000
+set g_balance_sniperrifle_magazinecapacity 30
+set g_balance_sniperrifle_secondary_ammo 3
+set g_balance_sniperrifle_primary_ammo 3
+set g_balance_sniperrifle_secondary_tracer 1
+set g_balance_sniperrifle_primary_tracer 0
+//##Newer Xonotic
+set g_balance_rifle_primary_damage 95
+set g_balance_rifle_primary_headshotaddeddamage 260
+set g_balance_rifle_secondary_force 10
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_primary_speed 55000 
+set g_balance_rifle_primary_bulletconstant 119
+set g_balance_rifle_primary_refire "0.5"
+set g_balance_rifle_secondary_refire 0.06
+set g_balance_rifle_secondary_animtime 0.06
+set g_balance_rifle_secondary_speed 30000
+set g_balance_rifle_reload_ammo 18
+set g_balance_rifle_secondary_ammo 9
+set g_balance_rifle_secondary_shots 3
+set g_balance_rifle_primary_ammo 3
+set g_balance_rifle_secondary_tracer 1
+set g_balance_rifle_primary_tracer 0
+set g_balance_rifle_secondary_damage 30
+set g_balance_rifle_secondary_headshotaddeddamage 20
+
+set g_balance_minelayer_health 15
+set g_balance_minelayer_limit 100
+set g_balance_minelayer_lifetime 99999
+set g_balance_minelayer_damage 250
+set g_balance_minelayer_edgedamage 20
+set g_balance_minelayer_remotedamage 120
+set g_balance_minelayer_ammo 4
+set g_balance_minelayer_reload_ammo 0 // 40 if one wants to reload after 10
+set g_balance_minelayer_reload_time 1.25
+set g_balance_minelayer_persistent 1
+
+set g_balance_fireball_primary_damagetime 9
+set g_balance_fireball_primary_lifetime 10
+set g_balance_fireball_primary_refire 0.5
+set g_balance_fireball_primary_laserradius 256
+set g_balance_fireball_secondary_edgedamage 20
+set g_balance_fireball_secondary_damage 120
+set g_balance_fireball_secondary_laserradius 192
+set g_balance_fireball_secondary_lifetime 30
+set g_balance_fireball_secondary_refire 0.9
+
+//##Mod, pistol
+// {{{ pistol
+exec pistol.cfg
+set g_balance_pistol_bursttime 0
+set g_balance_pistol_primary_tracer 0 //bullet too slow for tracer
+set g_balance_pistol_primary_shots 1
+set g_balance_pistol_primary_damage 25 //same as uzi, same ammo
+set g_balance_pistol_primary_headshotaddeddamage 80
+set g_balance_pistol_primary_spread 0.02
+set g_balance_pistol_primary_force 20
+set g_balance_pistol_primary_speed 16000 //reduced from uzi due to shorter barrel
+set g_balance_pistol_primary_lifetime 5
+set g_balance_pistol_primary_refire 0.2
+set g_balance_pistol_primary_animtime 0.2
+set g_balance_pistol_primary_ammo 1
+set g_balance_pistol_primary_bulletconstant 115
+set g_balance_pistol_primary_burstcost 0
+set g_balance_pistol_primary_bullethail 0 // empty magazine on shot
+set g_balance_pistol_secondary 1
+set g_balance_pistol_secondary_reload 0
+set g_balance_pistol_secondary_tracer 0
+set g_balance_pistol_secondary_shots 1
+set g_balance_pistol_secondary_damage 10
+set g_balance_pistol_secondary_headshotaddeddamage 80
+set g_balance_pistol_secondary_spread 0.06
+set g_balance_pistol_secondary_force 20
+set g_balance_pistol_secondary_speed 16000
+set g_balance_pistol_secondary_lifetime 5
+set g_balance_pistol_secondary_refire 0.05
+set g_balance_pistol_secondary_animtime 0.05
+set g_balance_pistol_secondary_ammo 1
+set g_balance_pistol_secondary_bulletconstant 115
+set g_balance_pistol_secondary_burstcost 0
+set g_balance_pistol_secondary_bullethail 0 // empty magazine on shot
+set g_balance_pistol_reload_ammo 10 //default: 10
+set g_balance_pistol_reload_time 1.2
+// }}}
+
+//1 q-unit
+//set g_ballistics_mindistance 1
+//0 q-unit
+set g_ballistics_mindistance 0
+
+//set g_casings 2
+set g_antilag_bullets 0
+
+////Vehicle stuff
+
+//Spiderbot: Anti armor 20 mm gatling gun cannons, Anti-personell rockets.
+set g_vehicle_spiderbot_health            10600
+set g_vehicle_spiderbot_rocket_damage     250
+set g_vehicle_spiderbot_rocket_edgedamage 150
+set g_vehicle_spiderbot_rocket_force      200
+set g_vehicle_spiderbot_rocket_radius     300
+set g_vehicle_spiderbot_rocket_speed      1800
+set g_vehicle_spiderbot_crush_dmg         100
+set g_vehicle_spiderbot_health_regen              20
+
+set g_vehicle_spiderbot_minigun_refire    0.01
+set g_vehicle_spiderbot_minigun_damage    100          // 20mm shells do damage.
+
+set g_vehicle_spiderbot_minigun_expelbulletcasings 1
+set g_vehicle_spiderbot_minigun_enableballistics 1
+set g_vehicle_spiderbot_minigun_speed 48000 
+set g_vehicle_spiderbot_minigun_force 4
+set g_vehicle_spiderbot_minigun_bulletconstant 470    // 20mm shells are good penetrators.
+
+//Raptor flying vehicle: good for destroying ground troops (energy cannon) and spiderbot formations (bomblets)
+set g_vehicle_raptor_bomblets           66
+set g_vehicle_raptor_bomblet_alt        2200
+set g_vehicle_raptor_bomblet_time       0.1
+set g_vehicle_raptor_bomblet_spread     0.65
+set g_vehicle_raptor_bomblet_damage     300
+set g_vehicle_raptor_bomblet_edgedamage 150
+set g_vehicle_raptor_bomblet_radius     600
+set g_vehicle_raptor_bomblet_force      300
+set g_vehicle_raptor_bombs_refire       6
+
+set g_vehicle_raptor_cannon_cost     6
+set g_vehicle_raptor_cannon_damage   60
+set g_vehicle_raptor_cannon_radius   45
+set g_vehicle_raptor_cannon_refire   0.0025
+set g_vehicle_raptor_cannon_speed    9000
+set g_vehicle_raptor_cannon_spread   0.0125
+
+set g_vehicle_raptor_energy             840
+set g_vehicle_raptor_energy_regen       40
+set g_vehicle_raptor_energy_regen_pause 1
+
+set g_vehicle_raptor_health             800
+set g_vehicle_raptor_health_regen       0
+set g_vehicle_raptor_health_regen_pause 0
+
+//Raptor misc
+set g_vehicle_raptor_guns_turnspeed 90
+set g_vehicle_raptor_guns_turnlimit 20
+set g_vehicle_raptor_guns_pitchlimit_up   12
+set g_vehicle_raptor_guns_pitchlimit_down 32
+
+set g_vehicle_raptor_movestyle 1
+
+set g_vehicle_raptor_turnroll 0.1
+
+set g_vehicle_raptor_turnspeed 70
+set g_vehicle_raptor_pitchspeed 30
+set g_vehicle_raptor_pitchlimit 35
+
+set g_vehicle_raptor_speed_forward 1000
+set g_vehicle_raptor_speed_strafe 750
+set g_vehicle_raptor_speed_up 600
+set g_vehicle_raptor_speed_down 900
+set g_vehicle_raptor_friction 0.7
+
+set g_vehicle_raptor_cannon_locktarget 1
+set g_vehicle_raptor_cannon_locking_time 0.5
+set g_vehicle_raptor_cannon_locking_releasetime 0.5
+set g_vehicle_raptor_cannon_locked_time 1
+set g_vehicle_raptor_cannon_predicttarget 1
+
+set g_vehicle_racer_laser_refire 0.065
+set g_vehicle_racer_laser_damage 30
+
+set g_balance_rocketlauncher_enableshockwave 1
+set g_vehicle_raptor_bomblet_explode_enableshockwave 1
+
diff --git a/gfx/crosshairhmg.tga b/gfx/crosshairhmg.tga
new file mode 100644
index 0000000..1f7e969
Binary files /dev/null and b/gfx/crosshairhmg.tga differ
diff --git a/gfx/crosshairmg.tga b/gfx/crosshairmg.tga
new file mode 100644
index 0000000..1f7e969
Binary files /dev/null and b/gfx/crosshairmg.tga differ
diff --git a/gfx/crosshairnukelayer.tga b/gfx/crosshairnukelayer.tga
new file mode 100644
index 0000000..e869ab5
Binary files /dev/null and b/gfx/crosshairnukelayer.tga differ
diff --git a/gfx/crosshairpistol.tga b/gfx/crosshairpistol.tga
new file mode 100644
index 0000000..1f7e969
Binary files /dev/null and b/gfx/crosshairpistol.tga differ
diff --git a/gfx/crosshairpumpshotgun.tga b/gfx/crosshairpumpshotgun.tga
new file mode 100644
index 0000000..b30f946
Binary files /dev/null and b/gfx/crosshairpumpshotgun.tga differ
diff --git a/gfx/crosshairrifle.tga b/gfx/crosshairrifle.tga
index 67a2c85..8597e9b 100644
Binary files a/gfx/crosshairrifle.tga and b/gfx/crosshairrifle.tga differ
diff --git a/gfx/crosshairshotgunautomat.tga b/gfx/crosshairshotgunautomat.tga
new file mode 100644
index 0000000..aca3211
Binary files /dev/null and b/gfx/crosshairshotgunautomat.tga differ
diff --git a/gfx/hud/default/weaponshotgunautomat.tga b/gfx/hud/default/weaponshotgunautomat.tga
new file mode 100644
index 0000000..438b121
Binary files /dev/null and b/gfx/hud/default/weaponshotgunautomat.tga differ
diff --git a/gfx/hud/luminos/weaponshotgunautomat.tga b/gfx/hud/luminos/weaponshotgunautomat.tga
new file mode 100644
index 0000000..438b121
Binary files /dev/null and b/gfx/hud/luminos/weaponshotgunautomat.tga differ
diff --git a/gfx/hud/old/weaponshotgunautomat.tga b/gfx/hud/old/weaponshotgunautomat.tga
new file mode 100644
index 0000000..32f8e20
Binary files /dev/null and b/gfx/hud/old/weaponshotgunautomat.tga differ
diff --git a/grenadelauncherfragmentation.cfg b/grenadelauncherfragmentation.cfg
new file mode 100644
index 0000000..691c1aa
--- /dev/null
+++ b/grenadelauncherfragmentation.cfg
@@ -0,0 +1,17 @@
+set g_balance_grenadelauncher_secondary_fragments 300
+set g_balance_grenadelauncher_secondary_fragment_damage 20
+set g_balance_grenadelauncher_secondary_fragment_speed 700 
+set g_balance_grenadelauncher_secondary_fragment_bulletconstant 1000
+set g_balance_grenadelauncher_secondary_fragment_headshotbonus 20
+set g_balance_grenadelauncher_secondary_fragment_force 15
+set g_balance_grenadelauncher_secondary_fragment_tracer 0
+set g_balance_grenadelauncher_secondary_fragment_gravity 1
+
+set g_balance_grenadelauncher_primary_fragments 100
+set g_balance_grenadelauncher_primary_fragment_damage 40
+set g_balance_grenadelauncher_primary_fragment_speed 700
+set g_balance_grenadelauncher_primary_fragment_bulletconstant 1000
+set g_balance_grenadelauncher_primary_fragment_headshotbonus 40
+set g_balance_grenadelauncher_primary_fragment_force 25
+set g_balance_grenadelauncher_primary_fragment_tracer 1
+set g_balance_grenadelauncher_primary_fragment_gravity 1
diff --git a/make-chaos-esque-mod-serverpackage-pk3.sh b/make-chaos-esque-mod-serverpackage-pk3.sh
new file mode 100644
index 0000000..e708a57
--- /dev/null
+++ b/make-chaos-esque-mod-serverpackage-pk3.sh
@@ -0,0 +1,5 @@
+git diff origin/master > xmod-chaos-esque-xonotic-binaries_1.serverpackage;
+git diff origin/master | grep Binary | cut -d " " -f 5- | cut -c 3- | cut -d " " -f 1 | zip -q xmod-chaos-esque-xonotic-binaries.pk3 -@ xmod-chaos-esque-xonotic-*.serverpackage;
+rm ./xmod-chaos-esque-xonotic-*.serverpackage;
+mv ./xmod-chaos-esque-xonotic-binaries.pk3 /var/www/xonoticmaps/
+
diff --git a/make-diff-xonotic-mod-binaries-pk3.sh b/make-diff-xonotic-mod-binaries-pk3.sh
new file mode 100644
index 0000000..9c6938a
--- /dev/null
+++ b/make-diff-xonotic-mod-binaries-pk3.sh
@@ -0,0 +1 @@
+git diff origin/master | grep Binary | cut -d " " -f 5- | cut -c 3- | cut -d " " -f 1 | zip -q diff-xonotic-mod-binaries.pk3 -@
diff --git a/models/nukemine.md3 b/models/nukemine.md3
new file mode 100644
index 0000000..afcfbe9
Binary files /dev/null and b/models/nukemine.md3 differ
diff --git a/models/sphere/sphexp.md3 b/models/sphere/sphexp.md3
new file mode 100644
index 0000000..e242a44
Binary files /dev/null and b/models/sphere/sphexp.md3 differ
diff --git a/models/sphere/sphexp.tga b/models/sphere/sphexp.tga
new file mode 100644
index 0000000..9996e38
Binary files /dev/null and b/models/sphere/sphexp.tga differ
diff --git a/models/sphere/sphexp_glow.tga b/models/sphere/sphexp_glow.tga
new file mode 100644
index 0000000..9eb7fab
Binary files /dev/null and b/models/sphere/sphexp_glow.tga differ
diff --git a/models/sphere/sphexp_norm.tga b/models/sphere/sphexp_norm.tga
new file mode 100644
index 0000000..f7da9f9
Binary files /dev/null and b/models/sphere/sphexp_norm.tga differ
diff --git a/models/weapons/g_nukelayer.md3 b/models/weapons/g_nukelayer.md3
new file mode 100644
index 0000000..5d37631
Binary files /dev/null and b/models/weapons/g_nukelayer.md3 differ
diff --git a/models/weapons/g_pistol.md3 b/models/weapons/g_pistol.md3
new file mode 100644
index 0000000..cdc5d8d
Binary files /dev/null and b/models/weapons/g_pistol.md3 differ
diff --git a/models/weapons/g_shotgunautomat.md3 b/models/weapons/g_shotgunautomat.md3
new file mode 100644
index 0000000..691e7eb
Binary files /dev/null and b/models/weapons/g_shotgunautomat.md3 differ
diff --git a/models/weapons/h_nukelayer.iqm b/models/weapons/h_nukelayer.iqm
new file mode 100644
index 0000000..0246e23
Binary files /dev/null and b/models/weapons/h_nukelayer.iqm differ
diff --git a/models/weapons/h_nukelayer.iqm.framegroups b/models/weapons/h_nukelayer.iqm.framegroups
new file mode 100644
index 0000000..0a59625
--- /dev/null
+++ b/models/weapons/h_nukelayer.iqm.framegroups
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_pistol.dpm b/models/weapons/h_pistol.dpm
new file mode 100644
index 0000000..0184e66
Binary files /dev/null and b/models/weapons/h_pistol.dpm differ
diff --git a/models/weapons/h_pistol.dpm.framegroups b/models/weapons/h_pistol.dpm.framegroups
new file mode 100644
index 0000000..474f093
--- /dev/null
+++ b/models/weapons/h_pistol.dpm.framegroups
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 39 20 0 // reload
diff --git a/models/weapons/h_pistol.iqm b/models/weapons/h_pistol.iqm
new file mode 100644
index 0000000..523ef99
Binary files /dev/null and b/models/weapons/h_pistol.iqm differ
diff --git a/models/weapons/h_pistol.iqm.framegroups b/models/weapons/h_pistol.iqm.framegroups
new file mode 100644
index 0000000..0a59625
--- /dev/null
+++ b/models/weapons/h_pistol.iqm.framegroups
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_pumpshotgun.iqm.framegroups b/models/weapons/h_pumpshotgun.iqm.framegroups
new file mode 100644
index 0000000..1bd5d5d
--- /dev/null
+++ b/models/weapons/h_pumpshotgun.iqm.framegroups
@@ -0,0 +1,17 @@
+/*
+Generated framegroups file for h_pumpshotgun
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 22 30 0 // h_pumpshotgun sghmesh_fire
+300 15 30 0 // h_pumpshotgun sghmesh_fire2
+54 201 5 1 // h_pumpshotgun sghmesh_idle
+255 61 22 1 // h_pumpshotgun sghmesh_reload
+
+/*
+//Orig:
+//1 22 30 0 // h_shotgun sghmesh_fire
+//23 31 30 0 // h_shotgun sghmesh_fire2
+//54 201 5 1 // h_shotgun sghmesh_idle
+//255 61 30 1 // h_shotgun sghmesh_reload
+*/
diff --git a/models/weapons/h_shotgunautomat.iqm b/models/weapons/h_shotgunautomat.iqm
new file mode 100644
index 0000000..9c4a29d
Binary files /dev/null and b/models/weapons/h_shotgunautomat.iqm differ
diff --git a/models/weapons/h_shotgunautomat.iqm.framegroups b/models/weapons/h_shotgunautomat.iqm.framegroups
new file mode 100644
index 0000000..1c95207
--- /dev/null
+++ b/models/weapons/h_shotgunautomat.iqm.framegroups
@@ -0,0 +1,6 @@
+1 8 20 0 // fire
+9 23 20 0 // fire2
+32 200 20 1 // idle
+232 40 20 0 // reload
+// compile opts used in the iqm exporter (apparently needed to prevent insane ram usage):
+// fire:1:8, fire2:1:23, idle:1:200, reload:1:40
diff --git a/models/weapons/v_nukelayer.md3 b/models/weapons/v_nukelayer.md3
new file mode 100644
index 0000000..6eb1968
Binary files /dev/null and b/models/weapons/v_nukelayer.md3 differ
diff --git a/models/weapons/v_pistol.md3 b/models/weapons/v_pistol.md3
new file mode 100644
index 0000000..79a65b8
Binary files /dev/null and b/models/weapons/v_pistol.md3 differ
diff --git a/models/weapons/v_shotgunautomat.md3 b/models/weapons/v_shotgunautomat.md3
new file mode 100644
index 0000000..40e3bc9
Binary files /dev/null and b/models/weapons/v_shotgunautomat.md3 differ
diff --git a/models/weapons/w_shotgunautomat.zym b/models/weapons/w_shotgunautomat.zym
new file mode 100644
index 0000000..cccaabf
Binary files /dev/null and b/models/weapons/w_shotgunautomat.zym differ
diff --git a/nukelayer.cfg b/nukelayer.cfg
new file mode 100644
index 0000000..a224e4e
--- /dev/null
+++ b/nukelayer.cfg
@@ -0,0 +1,63 @@
+// {{{ nukelayer
+set g_balance_nukelayer_damage 20000
+set g_balance_nukelayer_edgedamage 1000
+set g_balance_nukelayer_force 2500
+set g_balance_nukelayer_radius 8191
+set g_balance_nukelayer_proximityradius 0
+set g_balance_nukelayer_speed 1000
+set g_balance_nukelayer_lifetime 99999999
+set g_balance_nukelayer_lifetime_countdown 0.5
+set g_balance_nukelayer_refire 1.5
+set g_balance_nukelayer_animtime 0.4
+set g_balance_nukelayer_ammo 400
+set g_balance_nukelayer_health 15
+set g_balance_nukelayer_limit 1 // 0 disables the limit
+set g_balance_nukelayer_protection 0 // don't explode if the nuke would hurt the owner or a team mate
+set g_balance_nukelayer_damageforcescale 0
+set g_balance_nukelayer_detonatedelay 10 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_nukelayer_time 0.5
+set g_balance_nukelayer_remote_damage 20000
+set g_balance_nukelayer_remote_edgedamage 1000
+set g_balance_nukelayer_remote_radius 8191
+set g_balance_nukelayer_remote_force 3000
+set g_balance_nukelayer_reload_ammo 400 //default: 15
+set g_balance_nukelayer_reload_time 10
+set g_balance_nukelayer_enableshockwave 1
+//Cumulative:
+set g_balance_nukelayer_fire0_damage 90
+set g_balance_nukelayer_fire0_burntime 90
+set g_balance_nukelayer_fire0_radius 1.2
+
+set g_balance_nukelayer_fire1_damage 70
+set g_balance_nukelayer_fire1_burntime 60
+set g_balance_nukelayer_fire1_radius 1.4
+
+set g_balance_nukelayer_fire2_damage 60
+set g_balance_nukelayer_fire2_burntime 30
+set g_balance_nukelayer_fire2_radius 1.6
+
+set g_balance_nukelayer_fire3_damage 50
+set g_balance_nukelayer_fire3_burntime 10
+set g_balance_nukelayer_fire3_radius 1.8
+
+set g_balance_nukelayer_fire4_damage 40
+set g_balance_nukelayer_fire4_burntime 8
+set g_balance_nukelayer_fire4_radius 2
+
+set g_balance_nukelayer_fire5_damage 30
+set g_balance_nukelayer_fire5_burntime 5
+set g_balance_nukelayer_fire5_radius 3
+// }}}
+
+
+
+seta crosshair_nukelayer ""	"crosshair to display when wielding the nukelayer"
+seta crosshair_nukelayer_color "1.00 0.50 0.15"	"crosshair color to display when wielding the nukelayer"
+seta crosshair_nukelayer_alpha 1.15	"crosshair alpha value to display when wielding the nukelayer"
+seta crosshair_nukelayer_size 0.9 "crosshair size when wielding the nukelayer"
+
+seta crosshair_ring_nukelayer 1
+seta crosshair_ring_nukelayer_alpha 0.15
+
+
+set g_start_weapon_nukelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
diff --git a/pistol.cfg b/pistol.cfg
new file mode 100644
index 0000000..9019bbf
--- /dev/null
+++ b/pistol.cfg
@@ -0,0 +1,42 @@
+// {{{ pistol
+set g_balance_pistol_bursttime 0
+set g_balance_pistol_primary_tracer 1
+set g_balance_pistol_primary_shots 1
+set g_balance_pistol_primary_damage 14
+set g_balance_pistol_primary_headshotaddeddamage 0
+set g_balance_pistol_primary_spread 0.04
+set g_balance_pistol_primary_force 20
+set g_balance_pistol_primary_speed 18000
+set g_balance_pistol_primary_lifetime 5
+set g_balance_pistol_primary_refire 0.2
+set g_balance_pistol_primary_animtime 0.2
+set g_balance_pistol_primary_ammo 1
+set g_balance_pistol_primary_bulletconstant 115
+set g_balance_pistol_primary_burstcost 0
+set g_balance_pistol_primary_bullethail 0 // empty magazine on shot
+set g_balance_pistol_secondary 1
+set g_balance_pistol_secondary_reload 0
+set g_balance_pistol_secondary_tracer 1
+set g_balance_pistol_secondary_shots 1
+set g_balance_pistol_secondary_damage 10
+set g_balance_pistol_secondary_headshotaddeddamage 0
+set g_balance_pistol_secondary_spread 0.06
+set g_balance_pistol_secondary_force 20
+set g_balance_pistol_secondary_speed 18000
+set g_balance_pistol_secondary_lifetime 5
+set g_balance_pistol_secondary_refire 0.1
+set g_balance_pistol_secondary_animtime 0.1
+set g_balance_pistol_secondary_ammo 1
+set g_balance_pistol_secondary_bulletconstant 115
+set g_balance_pistol_secondary_burstcost 0
+set g_balance_pistol_secondary_bullethail 0 // empty magazine on shot
+set g_balance_pistol_reload_ammo 10 //default: 10
+set g_balance_pistol_reload_time 2
+// }}}
+
+seta crosshair_pistol ""	"crosshair to display when wielding the pistol"
+seta crosshair_pistol_color "0.5 0.5 0.1"	"crosshair color to display when wielding the pistol"
+seta crosshair_pistol_alpha 0.7	"crosshair alpha value to display when wielding the pistol"
+seta crosshair_pistol_size 0.3	"crosshair size when wielding the pistol"
+
+set g_start_weapon_pistol -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
diff --git a/pumpshotgun.cfg b/pumpshotgun.cfg
new file mode 100644
index 0000000..011232c
--- /dev/null
+++ b/pumpshotgun.cfg
@@ -0,0 +1,31 @@
+
+set g_balance_pumpshotgun_primary_bullets 22
+set g_balance_pumpshotgun_primary_damage 12
+set g_balance_pumpshotgun_primary_force 90
+set g_balance_pumpshotgun_primary_spread 0.03
+set g_balance_pumpshotgun_primary_refire 0.75
+set g_balance_pumpshotgun_primary_animtime 0.2
+set g_balance_pumpshotgun_primary_ammo 1
+set g_balance_pumpshotgun_primary_speed 14000 //Slightly longer barrel
+set g_balance_pumpshotgun_primary_bulletconstant 100 
+set g_balance_pumpshotgun_secondary 1
+set g_balance_pumpshotgun_secondary_melee_delay 0.05 // 0.35 was too slow
+set g_balance_pumpshotgun_secondary_melee_range 120
+set g_balance_pumpshotgun_secondary_melee_swing_side 120
+set g_balance_pumpshotgun_secondary_melee_swing_up 30
+set g_balance_pumpshotgun_secondary_melee_time 0.15
+set g_balance_pumpshotgun_secondary_melee_traces 10
+set g_balance_pumpshotgun_secondary_melee_no_doubleslap 1
+set g_balance_pumpshotgun_secondary_melee_nonplayerdamage 40
+set g_balance_pumpshotgun_secondary_melee_multihit 1
+set g_balance_pumpshotgun_secondary_damage 70
+set g_balance_pumpshotgun_secondary_force 200
+set g_balance_pumpshotgun_secondary_refire 0.25
+set g_balance_pumpshotgun_secondary_animtime 0.5
+set g_balance_pumpshotgun_reload_ammo 4 //Tube mag
+set g_balance_pumpshotgun_reload_time 2.5 //Takes longer to reload
+
+seta crosshair_pumpshotgun ""	"crosshair to display when wielding the pumpshotgun"
+seta crosshair_pumpshotgun_color "0.8 0.8 0.7"	"crosshair color to display when wielding the pumpshotgun"
+seta crosshair_pumpshotgun_alpha 1.1	"crosshair alpha value to display when wielding the pumpshotgun"
+seta crosshair_pumpshotgun_size 0.65	"crosshair size when wielding the pumpshotgun"
diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc
index 86b4976..e435765 100644
--- a/qcsrc/client/hud.qc
+++ b/qcsrc/client/hud.qc
@@ -425,6 +425,9 @@ float GetAmmoTypeForWep(float i)
 		case WEP_SEEKER: return 2;
 		case WEP_FIREBALL: return 4;
 		case WEP_HOOK: return 3;
+		case WEP_SHOTGUNAUTOMAT: return 0;
+		case WEP_PISTOL: return 1;
+		case WEP_NUKE_LAYER: return 2;
 		default: return -1;
 	}
 }
diff --git a/qcsrc/client/waypointsprites.qc b/qcsrc/client/waypointsprites.qc
index 6d9b0ee..1cb93ea 100644
--- a/qcsrc/client/waypointsprites.qc
+++ b/qcsrc/client/waypointsprites.qc
@@ -243,7 +243,12 @@ vector spritelookupcolor(string s, vector def)
 		case "wpn-fireball":      return '1 0.5 0';
 		case "wpn-hlac":          return '0 1 0';
 		case "wpn-campingrifle":  return '0.5 1 0';
+		case "wpn-hmg":		  return '1 0.8 0';
+		case "wpn-mg":		  return '0.8 1 0';
 		case "wpn-minelayer":     return '0.75 1 0';
+		case "wpn-shotgunautomat":       return '1 0.30 0';
+		case "wpn-nukelayer":       return '1 1 0.20';
+		case "wpn-uzi":           return '1 0.5 0';
 		default:                  return def;
 	}
 }
@@ -302,7 +307,11 @@ string spritelookuptext(string s)
 		case "wpn-fireball": return _("Fireball");
 		case "wpn-hlac": return _("HLAC");
 		case "wpn-campingrifle": return _("Rifle");
+		case "wpn-hmg": return _("Heavy Machine Gun");
+		case "wpn-mg": return _("Assault Rifle");
 		case "wpn-minelayer": return _("Mine Layer");
+		case "wpn-shotgunautomat": return _("ShotgunAutomat");
+		case "wpn-nukelayer": return _("Nuke Layer");
 		case "dom-neut": return _("Control point");
 		case "dom-red": return _("Control point");
 		case "dom-blue": return _("Control point");
diff --git a/qcsrc/menu/xonotic/playermodel.c b/qcsrc/menu/xonotic/playermodel.c
index ef02224..9fdb73f 100644
--- a/qcsrc/menu/xonotic/playermodel.c
+++ b/qcsrc/menu/xonotic/playermodel.c
@@ -10,6 +10,7 @@ CLASS(XonoticPlayerModelSelector) EXTENDS(XonoticImage)
 	ATTRIB(XonoticPlayerModelSelector, currentModelImage, string, string_null)
 	ATTRIB(XonoticPlayerModelSelector, currentModelTitle, string, string_null)
 	ATTRIB(XonoticPlayerModelSelector, currentModelDescription, string, string_null)
+	ATTRIB(XonoticPlayerModelSelector, currentModelSpecies, float, 0)
 	METHOD(XonoticPlayerModelSelector, go, void(entity, float))
 	METHOD(XonoticPlayerModelSelector, destroy, void(entity))
 	ATTRIB(XonoticPlayerModelSelector, origin, vector, '0 0 0')
@@ -40,7 +41,8 @@ entity makeXonoticPlayerModelSelector()
 #define BUFMODELS_MODEL 2
 #define BUFMODELS_SKIN 3
 #define BUFMODELS_DESC 4
-#define BUFMODELS_COUNT 5
+#define BUFMODELS_SPECIES 5
+#define BUFMODELS_COUNT 6
 
 void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
 {
@@ -75,6 +77,7 @@ void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
 		bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_IMAGE, strcat("/", substring(get_model_datafilename(get_model_parameters_modelname, get_model_parameters_modelskin, "tga"), 0, -5)));
 		bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL, get_model_parameters_modelname);
 		bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
+		bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SPECIES, ftos(get_model_parameters_species));
 		get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
 		if(get_model_parameters_sex)
 			get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nSex: %s", get_model_parameters_sex));
@@ -135,6 +138,7 @@ void XonoticPlayerModelSelector_go(entity me, float d)
 	me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
 	me.currentModel = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
 	me.currentModelDescription = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
+	me.currentModelSpecies = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SPECIES));
 
 	// fix the image
 	me.src = me.currentModelImage;
@@ -162,6 +166,25 @@ void XonoticPlayerModelSelector_saveCvars(entity me)
 	// we can't immediately apply here because of flood control
 	cvar_set("_cl_playermodel", me.currentModel);
 	cvar_set("_cl_playerskin", ftos(me.currentSkin));
+	
+	// client side variables are fine to change here however
+	if (me.currentModelSpecies == SPECIES_HUMAN) {
+		cvar_set("hud_damage_color", "1 0 0");
+	} else if (me.currentModelSpecies == SPECIES_ROBOT_SOLID) {
+		cvar_set("hud_damage_color", "0.2 0.1 0.4");
+	} else if  (me.currentModelSpecies == SPECIES_ALIEN) {
+		cvar_set("hud_damage_color", "0.12 0.25 0.06");
+	} else if  (me.currentModelSpecies == SPECIES_ANIMAL) {
+		cvar_set("hud_damage_color", "1 0 0");	
+	} else if  (me.currentModelSpecies == SPECIES_ROBOT_RUSTY) {
+		cvar_set("hud_damage_color", "0.2 0.1 0.4");
+	} else if  (me.currentModelSpecies == SPECIES_ROBOT_SHINY) {
+		cvar_set("hud_damage_color", "0.2 0.1 0.4");
+	} else if  (me.currentModelSpecies == SPECIES_RESERVED) {
+		cvar_set("hud_damage_color", "1 0 0");		
+	} else {
+		cvar_set("hud_damage_color", "1 0 0");
+	}
 }
 
 void XonoticPlayerModelSelector_draw(entity me)
diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh
index c6c2981..9623a1e 100644
--- a/qcsrc/server/autocvars.qh
+++ b/qcsrc/server/autocvars.qh
@@ -1187,7 +1187,265 @@ float autocvar_welcome_message_time;
 float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
 float autocvar_g_trueaim_minrange;
 float autocvar_g_debug_defaultsounds;
+
+float autocvar_g_balance_shotgunautomat_primary_ammo;
+float autocvar_g_balance_shotgunautomat_primary_animtime;
+float autocvar_g_balance_shotgunautomat_primary_bulletconstant;
+float autocvar_g_balance_shotgunautomat_primary_bullets;
+float autocvar_g_balance_shotgunautomat_primary_damage;
+float autocvar_g_balance_shotgunautomat_primary_force;
+float autocvar_g_balance_shotgunautomat_primary_refire;
+float autocvar_g_balance_shotgunautomat_primary_speed;
+float autocvar_g_balance_shotgunautomat_primary_spread;
+
+float autocvar_g_balance_shotgunautomat_secondary_ammo;
+float autocvar_g_balance_shotgunautomat_secondary_animtime;
+float autocvar_g_balance_shotgunautomat_secondary_bulletconstant;
+float autocvar_g_balance_shotgunautomat_secondary_bullets;
+float autocvar_g_balance_shotgunautomat_secondary_damage;
+float autocvar_g_balance_shotgunautomat_secondary_force;
+float autocvar_g_balance_shotgunautomat_secondary_refire;
+float autocvar_g_balance_shotgunautomat_secondary_speed;
+float autocvar_g_balance_shotgunautomat_secondary_spread;
+
+float autocvar_g_balance_shotgunautomat_secondary;
+float autocvar_g_balance_shotgunautomat_secondary_melee_delay;
+float autocvar_g_balance_shotgunautomat_secondary_melee_range;
+float autocvar_g_balance_shotgunautomat_secondary_melee_swing;
+float autocvar_g_balance_shotgunautomat_secondary_melee_time;
+float autocvar_g_balance_shotgunautomat_secondary_melee_no_doubleslap;
+float autocvar_g_balance_shotgunautomat_reload_ammo;
+float autocvar_g_balance_shotgunautomat_reload_time;
+
+float autocvar_g_balance_nukelayer_ammo;
+float autocvar_g_balance_nukelayer_animtime;
+float autocvar_g_balance_nukelayer_damage;
+float autocvar_g_balance_nukelayer_damageforcescale;
+float autocvar_g_balance_nukelayer_detonatedelay;
+float autocvar_g_balance_nukelayer_edgedamage;
+float autocvar_g_balance_nukelayer_force;
+float autocvar_g_balance_nukelayer_health;
+float autocvar_g_balance_nukelayer_lifetime;
+float autocvar_g_balance_nukelayer_lifetime_countdown;
+float autocvar_g_balance_nukelayer_limit;
+float autocvar_g_balance_nukelayer_protection;
+float autocvar_g_balance_nukelayer_proximityradius;
+float autocvar_g_balance_nukelayer_radius;
+float autocvar_g_balance_nukelayer_refire;
+float autocvar_g_balance_nukelayer_remote_damage;
+float autocvar_g_balance_nukelayer_remote_edgedamage;
+float autocvar_g_balance_nukelayer_remote_force;
+float autocvar_g_balance_nukelayer_remote_radius;
+float autocvar_g_balance_nukelayer_speed;
+float autocvar_g_balance_nukelayer_time;
+float autocvar_g_balance_nukelayer_reload_ammo;
+float autocvar_g_balance_nukelayer_reload_time;
+float autocvar_g_balance_nukelayer_enableshockwave;
+float autocvar_g_balance_nukelayer_fire0_damage;
+float autocvar_g_balance_nukelayer_fire0_burntime;
+float autocvar_g_balance_nukelayer_fire0_radius;
+float autocvar_g_balance_nukelayer_fire1_damage;
+float autocvar_g_balance_nukelayer_fire1_burntime;
+float autocvar_g_balance_nukelayer_fire1_radius;
+float autocvar_g_balance_nukelayer_fire2_damage;
+float autocvar_g_balance_nukelayer_fire2_burntime;
+float autocvar_g_balance_nukelayer_fire2_radius;
+float autocvar_g_balance_nukelayer_fire3_damage;
+float autocvar_g_balance_nukelayer_fire3_burntime;
+float autocvar_g_balance_nukelayer_fire3_radius;
+float autocvar_g_balance_nukelayer_fire4_damage;
+float autocvar_g_balance_nukelayer_fire4_burntime;
+float autocvar_g_balance_nukelayer_fire4_radius;
+float autocvar_g_balance_nukelayer_fire5_damage;
+float autocvar_g_balance_nukelayer_fire5_burntime;
+float autocvar_g_balance_nukelayer_fire5_radius;
+
+float autocvar_g_balance_rocketlauncher_enableshockwave;
+
+float autocvar_g_balance_grenadelauncher_primary_fragments;
+float autocvar_g_balance_grenadelauncher_primary_fragment_damage;
+float autocvar_g_balance_grenadelauncher_primary_fragment_speed;
+float autocvar_g_balance_grenadelauncher_primary_fragment_bulletconstant;
+float autocvar_g_balance_grenadelauncher_primary_fragment_headshotbonus;
+float autocvar_g_balance_grenadelauncher_primary_fragment_force;
+float autocvar_g_balance_grenadelauncher_primary_fragment_tracer;
+float autocvar_g_balance_grenadelauncher_primary_fragment_gravity;
+
+float autocvar_g_balance_grenadelauncher_secondary_fragments;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_damage;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_speed;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_bulletconstant;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_headshotbonus;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_force;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_tracer;
+float autocvar_g_balance_grenadelauncher_secondary_fragment_gravity;
+
+float autocvar_g_balance_tuba_nogibs;
+float autocvar_g_balance_laser_nogibs;
+float autocvar_g_balance_nex_nogibs;
+float autocvar_g_balance_minstanex_nogibs;
+float autocvar_g_balance_crylink_nogibs;
+float autocvar_g_balance_electro_nogibs;
+float autocvar_g_balance_hlac_nogibs;
+float autocvar_g_balance_shotgun_nogibs;
+float autocvar_g_balance_pumpshotgun_nogibs;
+float autocvar_g_balance_rifle_nogibs;
+float autocvar_g_balance_uzi_nogibs;
+float autocvar_g_balance_hmg_nogibs;
+float autocvar_g_balance_mg_nogibs;
+float autocvar_g_balance_rocketlauncher_nogibs;
+float autocvar_g_balance_grenadelauncher_nogibs;
+float autocvar_g_balance_hagar_nogibs;
+float autocvar_g_balance_minelayer_nogibs;
+float autocvar_g_balance_seeker_nogibs;
+float autocvar_g_balance_fireball_nogibs;
+	
+float autocvar_g_balance_shotgunautomat_nogibs;
+float autocvar_g_balance_nukelayer_nogibs;
+float autocvar_g_balance_pistol_nogibs;
+	
+float autocvar_sv_gibhealth_weapon_nogib_add;
+
+float autocvar_g_balance_pistol_bursttime;
+float autocvar_g_balance_pistol_primary_ammo;
+float autocvar_g_balance_pistol_primary_animtime;
+float autocvar_g_balance_pistol_primary_bulletconstant;
+float autocvar_g_balance_pistol_primary_bullethail;
+float autocvar_g_balance_pistol_primary_burstcost;
+float autocvar_g_balance_pistol_primary_damage;
+float autocvar_g_balance_pistol_primary_force;
+float autocvar_g_balance_pistol_primary_headshotaddeddamage;
+float autocvar_g_balance_pistol_primary_lifetime;
+float autocvar_g_balance_pistol_primary_refire;
+float autocvar_g_balance_pistol_primary_shots;
+float autocvar_g_balance_pistol_primary_speed;
+float autocvar_g_balance_pistol_primary_spread;
+float autocvar_g_balance_pistol_primary_tracer;
+float autocvar_g_balance_pistol_secondary;
+float autocvar_g_balance_pistol_secondary_ammo;
+float autocvar_g_balance_pistol_secondary_animtime;
+float autocvar_g_balance_pistol_secondary_bulletconstant;
+float autocvar_g_balance_pistol_secondary_bullethail;
+float autocvar_g_balance_pistol_secondary_burstcost;
+float autocvar_g_balance_pistol_secondary_damage;
+float autocvar_g_balance_pistol_secondary_force;
+float autocvar_g_balance_pistol_secondary_headshotaddeddamage;
+float autocvar_g_balance_pistol_secondary_lifetime;
+float autocvar_g_balance_pistol_secondary_reload;
+float autocvar_g_balance_pistol_secondary_refire;
+float autocvar_g_balance_pistol_secondary_shots;
+float autocvar_g_balance_pistol_secondary_speed;
+float autocvar_g_balance_pistol_secondary_spread;
+float autocvar_g_balance_pistol_secondary_tracer;
+float autocvar_g_balance_pistol_reload_ammo;
+float autocvar_g_balance_pistol_reload_time;
+
+float autocvar_g_balance_uzi_sustained_headshotaddeddamage;
+float autocvar_g_balance_uzi_first_headshotaddeddamage;
+
+
+float autocvar_g_balance_hmg_bulletconstant;
+float autocvar_g_balance_hmg_speed;
+float autocvar_g_balance_hmg_spread_add;
+float autocvar_g_balance_hmg_spread_max;
+float autocvar_g_balance_hmg_spread_min;
+float autocvar_g_balance_hmg_sustained_ammo;
+float autocvar_g_balance_hmg_sustained_damage;
+float autocvar_g_balance_hmg_sustained_headshotaddeddamage;
+float autocvar_g_balance_hmg_sustained_force;
+float autocvar_g_balance_hmg_sustained_refire;
+//float autocvar_g_balance_hmg_sustained_spread;
+float autocvar_g_balance_hmg_reload_ammo;
+float autocvar_g_balance_hmg_reload_time;
+
+float autocvar_g_balance_mg_bulletconstant;
+float autocvar_g_balance_mg_burst;
+float autocvar_g_balance_mg_burst_ammo;
+float autocvar_g_balance_mg_burst_animtime;
+float autocvar_g_balance_mg_burst_refire;
+float autocvar_g_balance_mg_burst_refire2;
+float autocvar_g_balance_mg_burst_spread;
+float autocvar_g_balance_mg_first;
+float autocvar_g_balance_mg_first_ammo;
+float autocvar_g_balance_mg_first_damage;
+float autocvar_g_balance_mg_first_headshotaddeddamage;
+float autocvar_g_balance_mg_first_force;
+float autocvar_g_balance_mg_first_refire;
+float autocvar_g_balance_mg_first_spread;
+float autocvar_g_balance_mg_mode;
+float autocvar_g_balance_mg_speed;
+float autocvar_g_balance_mg_spread_add;
+float autocvar_g_balance_mg_spread_max;
+float autocvar_g_balance_mg_spread_min;
+float autocvar_g_balance_mg_sustained_ammo;
+float autocvar_g_balance_mg_sustained_damage;
+float autocvar_g_balance_mg_sustained_headshotaddeddamage;
+float autocvar_g_balance_mg_sustained_force;
+float autocvar_g_balance_mg_sustained_refire;
+float autocvar_g_balance_mg_sustained_spread;
+float autocvar_g_balance_mg_reload_ammo;
+float autocvar_g_balance_mg_reload_time;
+
+float autocvar_g_balance_pumpshotgun_primary_ammo;
+float autocvar_g_balance_pumpshotgun_primary_animtime;
+float autocvar_g_balance_pumpshotgun_primary_bulletconstant;
+float autocvar_g_balance_pumpshotgun_primary_bullets;
+float autocvar_g_balance_pumpshotgun_primary_damage;
+float autocvar_g_balance_pumpshotgun_primary_force;
+float autocvar_g_balance_pumpshotgun_primary_refire;
+float autocvar_g_balance_pumpshotgun_primary_speed;
+float autocvar_g_balance_pumpshotgun_primary_spread;
+float autocvar_g_balance_pumpshotgun_secondary;
+float autocvar_g_balance_pumpshotgun_secondary_animtime;
+float autocvar_g_balance_pumpshotgun_secondary_damage;
+float autocvar_g_balance_pumpshotgun_secondary_force;
+float autocvar_g_balance_pumpshotgun_secondary_melee_delay;
+float autocvar_g_balance_pumpshotgun_secondary_melee_range;
+float autocvar_g_balance_pumpshotgun_secondary_melee_swing_side;
+float autocvar_g_balance_pumpshotgun_secondary_melee_swing_up;
+float autocvar_g_balance_pumpshotgun_secondary_melee_time;
+float autocvar_g_balance_pumpshotgun_secondary_melee_traces;
+float autocvar_g_balance_pumpshotgun_secondary_melee_no_doubleslap;
+float autocvar_g_balance_pumpshotgun_secondary_melee_nonplayerdamage;
+float autocvar_g_balance_pumpshotgun_secondary_melee_multihit;
+float autocvar_g_balance_pumpshotgun_secondary_refire;
+float autocvar_g_balance_pumpshotgun_reload_ammo;
+float autocvar_g_balance_pumpshotgun_reload_time;
+
+float autocvar_g_balance_grenadelauncher_primary_failurerate;
+float autocvar_g_balance_grenadelauncher_secondary_failurerate;
+
+float autocvar_g_balance_rocketlauncher_primary_failurerate;
+float autocvar_g_balance_rocketlauncher_secondary_failurerate;
+float autocvar_g_balance_rocketlauncher_commlink_failurerate;
+
+float autocvar_g_balance_seeker_missile_failurerate;
+
+float autocvar_g_balance_hagar_primary_failurerate;
+float autocvar_g_balance_hagar_secondary_failurerate;
+
+float autocvar_g_balance_minelayer_primary_failurerate;
+float autocvar_g_balance_minelayer_secondary_failurerate;
+
+float autocvar_g_balance_uzi_jamrate;
+float autocvar_g_balance_uzi_clearjam_time;
+
+float autocvar_g_balance_mg_jamrate;
+float autocvar_g_balance_mg_clearjam_time;
+
+float autocvar_g_balance_shotgunautomat_jamrate;
+float autocvar_g_balance_shotgunautomat_clearjam_time;
+
+float autocvar_g_balance_shotgun_jamrate;
+float autocvar_g_balance_shotgun_clearjam_time;
+
+float autocvar_g_balance_pistol_jamrate;
+float autocvar_g_balance_pistol_clearjam_time;
+
 float autocvar_g_loituma;
+
+float autocvar_g_balance_minelayer_persistent;
+
 float autocvar_g_grab_range;
 float autocvar_g_sandbox_info;
 float autocvar_g_sandbox_readonly;
diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc
index d34a0c2..4a8d2c4 100644
--- a/qcsrc/server/cl_client.qc
+++ b/qcsrc/server/cl_client.qc
@@ -2133,6 +2133,7 @@ void SpectateCopy(entity spectatee) {
 	self.nex_chargepool_ammo = spectatee.nex_chargepool_ammo;
 	self.hagar_load = spectatee.hagar_load;
 	self.minelayer_mines = spectatee.minelayer_mines;
+	self.nukelayer_nukes = spectatee.nukelayer_nukes;
 	self.punchangle = spectatee.punchangle;
 	self.view_ofs = spectatee.view_ofs;
 	self.v_angle = spectatee.v_angle;
diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc
index 8ff9fe7..c3a5056 100644
--- a/qcsrc/server/cl_player.qc
+++ b/qcsrc/server/cl_player.qc
@@ -400,7 +400,49 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
 	self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
 	self.dmg_inflictor = inflictor;
 
-	if (self.health <= -autocvar_sv_gibhealth && self.modelindex != 0)
+	//print(sprintf("Gib Health: %v\n", self.health));
+	//This code allows the server to set which weapons can gib and which never gib.
+	//I grouped the weapons mostly by ammo type, leaving one group for my own weapons.
+	//The last weapon is the fireball so that one can easily delete references to my weapons if desired.
+	//Turning off gibbing on the shotgun doesn't work, it seems the last pellet or so are not tracked properly.
+	//This is perhaps a bug in the ballistic bullet code, but perhaps not as uzi and rifle work fine, however they
+	//are much slower in spawing ballisticbullets than the shotgun (which spawns many almost all at once).
+	//Crylink can also eventually gib, but it takes many many shots, with this off it gibs quickly, I'm guessing
+	//that there is a race condition between DEATH_ISWEAPON and the dmg code, I'm not sure.
+	//The RocketLauncher and GrenadeLauncher seem to gib regardless.
+	//I suggest turning off gibbing on the uzi and rifle, perhaps on the crylink and other energy weapons
+	//This way gibbing is special for powerful weapons that provide the needed shearing force (Explosives, etc)
+	if (
+	(self.health <= -autocvar_sv_gibhealth && self.modelindex != 0) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_TUBA) && autocvar_g_balance_tuba_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_LASER) && autocvar_g_balance_laser_nogibs) &&
+	
+	!( DEATH_ISWEAPON(deathtype, WEP_NEX) && autocvar_g_balance_nex_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_MINSTANEX) && autocvar_g_balance_minstanex_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_CRYLINK) && autocvar_g_balance_crylink_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_ELECTRO) && autocvar_g_balance_electro_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_HLAC) && autocvar_g_balance_hlac_nogibs) &&
+	
+	!( DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && autocvar_g_balance_shotgun_nogibs) &&
+	
+	//!( DEATH_ISWEAPON(deathtype, WEP_PUMPSHOTGUN) && autocvar_g_balance_pumpshotgun_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_RIFLE) && autocvar_g_balance_rifle_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_UZI) && autocvar_g_balance_uzi_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_HMG) && autocvar_g_balance_hmg_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_MG) && autocvar_g_balance_mg_nogibs) &&
+	
+	!( DEATH_ISWEAPON(deathtype, WEP_ROCKET_LAUNCHER) && autocvar_g_balance_rocketlauncher_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_GRENADE_LAUNCHER) && autocvar_g_balance_grenadelauncher_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_HAGAR) && autocvar_g_balance_hagar_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_SEEKER) && autocvar_g_balance_seeker_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_MINE_LAYER) && autocvar_g_balance_minelayer_nogibs) &&
+	
+	!( DEATH_ISWEAPON(deathtype, WEP_SHOTGUNAUTOMAT) && autocvar_g_balance_shotgunautomat_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_NUKE_LAYER) && autocvar_g_balance_nukelayer_nogibs) &&
+	!( DEATH_ISWEAPON(deathtype, WEP_PISTOL) && autocvar_g_balance_pistol_nogibs) &&
+	
+	!( DEATH_ISWEAPON(deathtype, WEP_FIREBALL) && autocvar_g_balance_fireball_nogibs)
+	)
 	{
 		// don't use any animations as a gib
 		self.frame = 0;
@@ -411,6 +453,17 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
 		Violence_GibSplash(self, 1, 1, attacker);
 		self.modelindex = 0; // restore later
 		self.solid = SOLID_NOT; // restore later
+	} else if (self.health <= -autocvar_sv_gibhealth && self.modelindex != 0) {
+		//print("No Gib tripped\n");
+		//If we failed the first test due solely to the weapon being used on the corpse 
+		//being set to nogib, but for all other reasons gibbing should occur
+		//Let us give health back to the gib to make sure that it does not gib due to
+		//the nogib weapon pushing it against a wall.
+		self.health = -1;
+		
+		//We will allow the server admin to set how much health to add to such a gib, to make it resilient
+		//so that it will not be easily destroyed. By default, nothing.
+		self.health = self.health + autocvar_sv_gibhealth_weapon_nogib_add;
 	}
 }
 
diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh
index 0c06958..d1f58db 100644
--- a/qcsrc/server/defs.qh
+++ b/qcsrc/server/defs.qh
@@ -615,6 +615,7 @@ float client_cefc_accumulatortime;
 .float old_clip_load;
 .float clip_size;
 .float minelayer_mines;
+.float nukelayer_nukes;
 
 .float grab; // 0 = can't grab, 1 = owner can grab, 2 = owner and team mates can grab, 3 = anyone can grab
 
diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc
index 9e80f18..8d305e9 100644
--- a/qcsrc/server/vehicles/raptor.qc
+++ b/qcsrc/server/vehicles/raptor.qc
@@ -24,6 +24,7 @@ float autocvar_g_vehicle_raptor_bomblet_edgedamage;
 float autocvar_g_vehicle_raptor_bomblet_radius;
 float autocvar_g_vehicle_raptor_bomblet_force;
 float autocvar_g_vehicle_raptor_bomblet_explode_delay;
+float autocvar_g_vehicle_raptor_bomblet_explode_enableshockwave;
 float autocvar_g_vehicle_raptor_bombs_refire;
 
 float autocvar_g_vehicle_raptor_cannon_turnspeed;
@@ -77,6 +78,13 @@ float raptor_altitude(float amax)
 
 void raptor_bomblet_boom()
 {
+
+    if (autocvar_g_vehicle_raptor_bomblet_explode_enableshockwave == 1) {
+    modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_vehicle_raptor_bomblet_radius, 0.2, 0.05, 0.25);
+    
+    modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_vehicle_raptor_bomblet_radius, 0.30, 0.05, 1.1);
+    }
+
     RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage,
                                     autocvar_g_vehicle_raptor_bomblet_edgedamage,
                                     autocvar_g_vehicle_raptor_bomblet_radius, world,
@@ -745,6 +753,8 @@ void spawnfunc_vehicle_raptor()
     //precache_model ("models/vehicles/clusterbomb.md3");
     precache_model ("models/vehicles/clusterbomb_folded.md3");
     precache_model ("models/vehicles/raptor_body.dpm");
+    precache_model ("models/sphere/sphere.md3");
+    precache_model ("models/sphere/sphexp.md3");
     
     precache_sound ("vehicles/raptor_fly.wav");
     precache_sound ("vehicles/raptor_speed.wav");
diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc
index f1cb575..61ef53d 100644
--- a/qcsrc/server/vehicles/spiderbot.qc
+++ b/qcsrc/server/vehicles/spiderbot.qc
@@ -32,6 +32,14 @@ float autocvar_g_vehicle_spiderbot_shield;
 float autocvar_g_vehicle_spiderbot_shield_regen;
 float autocvar_g_vehicle_spiderbot_shield_regen_pause;
 
+// Start Ballistic bullet cvars
+float autocvar_g_vehicle_spiderbot_minigun_expelbulletcasings;
+float autocvar_g_vehicle_spiderbot_minigun_enableballistics;
+float autocvar_g_vehicle_spiderbot_minigun_speed;
+float autocvar_g_vehicle_spiderbot_minigun_force;
+float autocvar_g_vehicle_spiderbot_minigun_bulletconstant;
+// End ballistic bullet cvars
+
 float autocvar_g_vehicle_spiderbot_minigun_damage;
 float autocvar_g_vehicle_spiderbot_minigun_refire;
 float autocvar_g_vehicle_spiderbot_minigun_spread;
@@ -342,12 +350,38 @@ float spiderbot_frame()
             v_forward = normalize(v_forward);
             v += v_forward * 50;
 
+	if (autocvar_g_vehicle_spiderbot_minigun_enableballistics == 1) {
+  	 // Start Ballistic bullet
+	 
+   	  fireBallisticBullet(v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_speed, 5, autocvar_g_vehicle_spiderbot_minigun_damage, 0, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_SBMINIGUN, 1, 1, autocvar_g_vehicle_spiderbot_minigun_bulletconstant);
+    	 endFireBallisticBullet();
+	 
+	 
+	 sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+
+	// End Ballistic bullet 
+   } else {
+   
             fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
                 autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
-
-            sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+		
+		sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
             trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
+		
+	}
+		
+
+            
             pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), v, v_forward * 2500, 1);
+	    
+   if (autocvar_g_vehicle_spiderbot_minigun_expelbulletcasings == 1) {
+  	if (autocvar_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, self);
+	}
+   }
 
             self = spider;
 
diff --git a/qcsrc/server/vehicles/vehicles.qh b/qcsrc/server/vehicles/vehicles.qh
index 79fc9cb..1360005 100644
--- a/qcsrc/server/vehicles/vehicles.qh
+++ b/qcsrc/server/vehicles/vehicles.qh
@@ -5,4 +5,5 @@
 #include "spiderbot.qc"
 #include "raptor.qc"
 //#include "bumblebee.qc"
+//#include "forklift.qc"
 #endif
diff --git a/qcsrc/server/w_all.qc b/qcsrc/server/w_all.qc
index ac4ef47..49cf40f 100644
--- a/qcsrc/server/w_all.qc
+++ b/qcsrc/server/w_all.qc
@@ -19,3 +19,9 @@
 #include "w_rifle.qc"
 #include "w_fireball.qc"
 #include "w_seeker.qc"
+#include "w_shotgunautomat.qc"
+#include "w_nukelayer.qc"
+#include "w_pistol.qc"
+#include "w_hmg.qc"
+#include "w_mg.qc"
+//#include "w_pumpshotgun.qc"
diff --git a/qcsrc/server/w_grenadelauncher.qc b/qcsrc/server/w_grenadelauncher.qc
index 352ce88..16a18b6 100644
--- a/qcsrc/server/w_grenadelauncher.qc
+++ b/qcsrc/server/w_grenadelauncher.qc
@@ -7,6 +7,12 @@ REGISTER_WEAPON(GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS, 4, WEP_FLAG_NORMAL |
 
 void W_Grenade_Explode (void)
 {
+	if(autocvar_g_balance_grenadelauncher_primary_failurerate &&
+ 	(autocvar_g_balance_grenadelauncher_primary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your grenade was a dud\n");
+	} else {
+	
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.realowner, other))
@@ -22,11 +28,36 @@ void W_Grenade_Explode (void)
 
 	RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
 
+	//Start Grenade Fragmentation
+	float	sc;
+	for (sc = 0;sc < autocvar_g_balance_grenadelauncher_primary_fragments;sc = sc + 1) {
+	
+		fireBallisticBullet(self.origin,randomvec() * 10 * random(), 1,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_speed, 5,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_damage,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_headshotbonus,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_force,
+		 WEP_SHOTGUN,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_tracer,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_gravity,
+		 autocvar_g_balance_grenadelauncher_primary_fragment_bulletconstant);
+		 
+		endFireBallisticBullet();
+	}
+	//Finish Grenade Fragmentation
+	
+	}
 	remove (self);
 }
 
 void W_Grenade_Explode2 (void)
 {
+	if(autocvar_g_balance_grenadelauncher_secondary_failurerate &&
+ 	(autocvar_g_balance_grenadelauncher_secondary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your grenade failed to detonate\n");
+	} else {
+	
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.realowner, other))
@@ -42,6 +73,25 @@ void W_Grenade_Explode2 (void)
 
 	RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
 
+	//Start Grenade Fragmentation
+	float	sc;
+	for (sc = 0;sc < autocvar_g_balance_grenadelauncher_secondary_fragments;sc = sc + 1) {
+	
+		fireBallisticBullet(self.origin,randomvec() * 10 * random(), 1,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_speed, 5,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_damage,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_headshotbonus,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_force,
+		 WEP_SHOTGUN,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_tracer,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_gravity,
+		 autocvar_g_balance_grenadelauncher_secondary_fragment_bulletconstant);
+		 
+		endFireBallisticBullet();
+	}
+	//Finish Grenade Fragmentation
+
+	}
 	remove (self);
 }
 
diff --git a/qcsrc/server/w_hagar.qc b/qcsrc/server/w_hagar.qc
index 76103f3..8f90af8 100644
--- a/qcsrc/server/w_hagar.qc
+++ b/qcsrc/server/w_hagar.qc
@@ -6,17 +6,33 @@ REGISTER_WEAPON(HAGAR, w_hagar, IT_ROCKETS, 8, WEP_FLAG_NORMAL | WEP_FLAG_RELOAD
 
 void W_Hagar_Explode (void)
 {
+	if(autocvar_g_balance_hagar_primary_failurerate &&
+ 	(autocvar_g_balance_hagar_primary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your grenade was a dud\n");
+	} else {
+	
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, autocvar_g_balance_hagar_primary_damage, autocvar_g_balance_hagar_primary_edgedamage, autocvar_g_balance_hagar_primary_radius, world, autocvar_g_balance_hagar_primary_force, self.projectiledeathtype, other);
-
+	
+	} //End To Dud or not to dud.
+	
 	remove (self);
 }
 
 void W_Hagar_Explode2 (void)
 {
+	if(autocvar_g_balance_hagar_secondary_failurerate &&
+ 	(autocvar_g_balance_hagar_secondary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your grenade failed to explode\n");
+	} else {
+
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, autocvar_g_balance_hagar_secondary_damage, autocvar_g_balance_hagar_secondary_edgedamage, autocvar_g_balance_hagar_secondary_radius, world, autocvar_g_balance_hagar_secondary_force, self.projectiledeathtype, other);
 
+	} //End To Dud or not to dud.
+	
 	remove (self);
 }
 
diff --git a/qcsrc/server/w_hmg.qc b/qcsrc/server/w_hmg.qc
new file mode 100644
index 0000000..ce560f4
--- /dev/null
+++ b/qcsrc/server/w_hmg.qc
@@ -0,0 +1,174 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(HMG, w_hmg, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "hmg", "hmg", _("Heavy Machine Gun"))
+#else
+#ifdef SVQC
+
+
+// weapon frames
+
+void hmg_fire_auto()
+{
+	float hmg_spread;
+
+	if (!self.BUTTON_ATCK)
+	{
+		w_ready();
+		return;
+	}
+
+	if (!weapon_action(self.weapon, WR_CHECKAMMO1))
+	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+	{
+		W_SwitchWeapon_Force(self, w_getbestweapon(self));
+		w_ready();
+		return;
+	}
+
+	W_DecreaseAmmo(ammo_nails, autocvar_g_balance_hmg_sustained_ammo, autocvar_g_balance_hmg_reload_ammo);
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_hmg_speed >= autocvar_g_antilag_bullets, 0, "weapons/campingrifle_fire2.wav", CH_WEAPON_A, autocvar_g_balance_hmg_sustained_damage);
+	if (!g_norecoil)
+	{
+		self.punchangle_x = random () - 0.5;
+		self.punchangle_y = random () - 0.5;
+	}
+
+	hmg_spread = bound(autocvar_g_balance_hmg_spread_min, autocvar_g_balance_hmg_spread_min + (autocvar_g_balance_hmg_spread_add * self.misc_bulletcounter), autocvar_g_balance_hmg_spread_max);
+	fireBallisticBullet(w_shotorg, w_shotdir, hmg_spread, autocvar_g_balance_hmg_speed, 5, autocvar_g_balance_hmg_sustained_damage, autocvar_g_balance_hmg_sustained_headshotaddeddamage, autocvar_g_balance_hmg_sustained_force, WEP_HMG, 0, 1, autocvar_g_balance_hmg_bulletconstant);
+	endFireBallisticBullet();
+
+	self.misc_bulletcounter = self.misc_bulletcounter + 1;
+
+	pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	UziFlash();
+	W_AttachToShotorg(self.muzzle_flash, '5 0 0');
+
+	if (autocvar_g_casings >= 2) // casing code
+		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);
+
+	ATTACK_FINISHED(self) = time + autocvar_g_balance_hmg_sustained_refire * W_WeaponRateFactor();
+	weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hmg_sustained_refire, hmg_fire_auto);
+}
+
+void spawnfunc_weapon_hmg()
+{    
+	weapon_defaultspawnfunc(WEP_HMG);
+}
+
+float w_hmg(float req)
+{
+	float ammo_amount;
+	if (req == WR_AIM)
+		if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
+			self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+		else
+		{
+			self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
+		}
+	else if (req == WR_THINK)
+	{
+		if(autocvar_g_balance_hmg_reload_ammo && self.clip_load < autocvar_g_balance_hmg_sustained_ammo) // forced reload
+			weapon_action(self.weapon, WR_RELOAD);		
+		else
+		{
+			if (self.BUTTON_ATCK)
+			if (weapon_prepareattack(0, 0))
+			{
+				self.misc_bulletcounter = 0;
+				hmg_fire_auto();
+			}
+
+			/*
+			if(self.BUTTON_ATCK2)
+			if(weapon_prepareattack(1, 0))
+			{
+				if (!weapon_action(self.weapon, WR_CHECKAMMO2))
+				if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+				{
+					W_SwitchWeapon_Force(self, w_getbestweapon(self));
+					w_ready();
+					return FALSE;
+				}
+
+				W_DecreaseAmmo(ammo_nails, autocvar_g_balance_hmg_burst_ammo, autocvar_g_balance_hmg_reload_ammo);
+
+				self.misc_bulletcounter = autocvar_g_balance_hmg_burst * -1;
+				uzi_mode1_fire_burst();
+			}
+			*/
+		}
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/uziflash.md3");
+		precache_model ("models/weapons/g_hmg.md3");
+		precache_model ("models/weapons/v_hmg.md3");
+		precache_model ("models/weapons/h_hmg.iqm");
+		precache_sound ("weapons/campingrifle_fire2.wav");		
+	}
+	else if (req == WR_SETUP)
+	{
+		weapon_setup(WEP_HMG);
+		self.current_ammo = ammo_nails;
+	}
+	else if (req == WR_CHECKAMMO1)
+	{
+        ammo_amount = self.ammo_nails >= autocvar_g_balance_hmg_sustained_ammo;
+
+		if(autocvar_g_balance_hmg_reload_ammo)		
+            ammo_amount += self.(weapon_load[WEP_HMG]) >= autocvar_g_balance_hmg_sustained_ammo;
+		
+		return ammo_amount;
+	}
+	else if (req == WR_CHECKAMMO2)
+	{
+        ammo_amount = self.ammo_nails >= autocvar_g_balance_hmg_sustained_ammo;
+
+		if(autocvar_g_balance_hmg_reload_ammo)
+            ammo_amount += self.(weapon_load[WEP_HMG]) >= autocvar_g_balance_hmg_sustained_ammo;
+		
+		return ammo_amount;
+	}
+	else if (req == WR_RELOAD)
+	{
+		W_Reload(autocvar_g_balance_hmg_sustained_ammo, autocvar_g_balance_hmg_reload_ammo, autocvar_g_balance_hmg_reload_time, "weapons/reload.wav");
+	}
+	return TRUE;
+}
+#endif
+#ifdef CSQC
+float w_hmg(float req)
+{
+	if(req == WR_IMPACTEFFECT)
+	{
+		vector org2;
+		org2 = w_org + w_backoff * 2;
+		pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
+		if(!w_issilent)
+			if(w_random < 0.05)
+				sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.1)
+				sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.2)
+				sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+	}
+	else if(req == WR_PRECACHE)
+	{
+		precache_sound("weapons/ric1.wav");
+		precache_sound("weapons/ric2.wav");
+		precache_sound("weapons/ric3.wav");
+	}
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = _("%s is now thinking with portals");
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+			w_deathtypestring = _("%s was sniped by %s's heavy machine gun");
+		else
+			w_deathtypestring = _("%s torn to bits by %s's heavy machine gun");
+	}
+	return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_mg.qc b/qcsrc/server/w_mg.qc
new file mode 100644
index 0000000..a87b132
--- /dev/null
+++ b/qcsrc/server/w_mg.qc
@@ -0,0 +1,375 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(MG, w_mg, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "mg", "mg", _("Assault Rifle"))
+#else
+#ifdef SVQC
+.float mg_release;
+.float mg_jammed;
+
+// leilei's fancy muzzleflash stuff
+void MG_Flash_Go()
+{
+	self.frame = self.frame + 2;
+	self.scale = self.scale * 0.5;
+	self.alpha = self.alpha - 0.25;
+	self.nextthink = time + 0.05;
+
+	if (self.alpha <= 0)
+	{
+		self.think = SUB_Remove;
+		self.nextthink = time;
+		self.realowner.muzzle_flash = world;
+		return;
+	}
+
+}
+
+void MgFlash()
+{
+	if (self.muzzle_flash == world)
+		self.muzzle_flash = spawn();
+
+	// muzzle flash for 1st person view
+	setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
+
+	self.muzzle_flash.scale = 0.75;
+	self.muzzle_flash.think = MG_Flash_Go;
+	self.muzzle_flash.nextthink = time + 0.02;
+	self.muzzle_flash.frame = 2;
+	self.muzzle_flash.alpha = 0.75;
+	self.muzzle_flash.angles_z = random() * 180;
+	self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+	self.muzzle_flash.owner = self.muzzle_flash.realowner = self;
+}
+
+void W_MG_Attack (float deathtype)
+{
+	if (autocvar_g_balance_mg_jamrate &&
+ 	(autocvar_g_balance_mg_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your rifle jammed\n");
+		self.mg_jammed = 1;
+	} else { //Start Not Jammed
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_mg_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_mg_first_damage : autocvar_g_balance_mg_sustained_damage));
+	if (!g_norecoil)
+	{
+		self.punchangle_x = random () - 0.5;
+		self.punchangle_y = random () - 0.5;
+	}
+
+	// this attack_finished just enforces a cooldown at the end of a burst
+	ATTACK_FINISHED(self) = time + autocvar_g_balance_mg_first_refire * W_WeaponRateFactor();
+
+	if (self.misc_bulletcounter == 1)
+		fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_mg_first_spread, autocvar_g_balance_mg_speed, 5, autocvar_g_balance_mg_first_damage, autocvar_g_balance_mg_first_headshotaddeddamage, autocvar_g_balance_mg_first_force, deathtype, 0, 1, autocvar_g_balance_mg_bulletconstant);
+	else
+		fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_mg_sustained_spread, autocvar_g_balance_mg_speed, 5, autocvar_g_balance_mg_sustained_damage, autocvar_g_balance_mg_sustained_headshotaddeddamage, autocvar_g_balance_mg_sustained_force, deathtype, 0, 1, autocvar_g_balance_mg_bulletconstant);
+	endFireBallisticBullet();
+
+	pointparticles(particleeffectnum("mg_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	MgFlash();
+	W_AttachToShotorg(self.muzzle_flash, '5 0 0');
+
+	// casing code
+	if (autocvar_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, self);
+
+	} //End Not Jammed
+
+	if (self.misc_bulletcounter == 1)
+		W_DecreaseAmmo(ammo_nails, autocvar_g_balance_mg_first_ammo, autocvar_g_balance_mg_reload_ammo);
+	else
+		W_DecreaseAmmo(ammo_nails, autocvar_g_balance_mg_sustained_ammo, autocvar_g_balance_mg_reload_ammo);
+}
+
+// weapon frames
+void mg_fire1_02()
+{
+	if(self.weapon != self.switchweapon) // abort immediately if switching
+	{
+		w_ready();
+		return;
+	}
+	
+	if (self.mg_jammed)
+	{
+		w_ready();
+		return;
+	}
+	
+	if (self.BUTTON_ATCK)
+	if (self.mg_jammed != 1)
+	{
+		if (!weapon_action(self.weapon, WR_CHECKAMMO2))
+		if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+		{
+			W_SwitchWeapon_Force(self, w_getbestweapon(self));
+			w_ready();
+			return;
+		}
+		self.misc_bulletcounter = self.misc_bulletcounter + 1;
+		W_MG_Attack(WEP_MG);
+		weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_mg_sustained_refire, mg_fire1_02);
+	}
+	else
+		weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_mg_sustained_refire, w_ready);
+}
+
+
+void mg_mode1_fire_auto()
+{
+	float mg_spread;
+
+	if (self.mg_jammed)
+	{
+		w_ready();
+		return;
+	}
+
+	if (!self.BUTTON_ATCK2)
+	{
+		w_ready();
+		return;
+	}
+
+	if (!weapon_action(self.weapon, WR_CHECKAMMO1))
+	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+	{
+		W_SwitchWeapon_Force(self, w_getbestweapon(self));
+		w_ready();
+		return;
+	}
+
+	W_DecreaseAmmo(ammo_nails, autocvar_g_balance_mg_sustained_ammo, autocvar_g_balance_mg_reload_ammo);
+
+	if(autocvar_g_balance_mg_jamrate &&
+ 	(autocvar_g_balance_mg_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your rifle jammed\n");
+		self.mg_jammed = 1;
+	} else { //Start Not Jammed
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_mg_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_mg_sustained_damage);
+	if (!g_norecoil)
+	{
+		self.punchangle_x = random () - 0.5;
+		self.punchangle_y = random () - 0.5;
+	}
+
+	mg_spread = bound(autocvar_g_balance_mg_spread_min, autocvar_g_balance_mg_spread_min + (autocvar_g_balance_mg_spread_add * self.misc_bulletcounter), autocvar_g_balance_mg_spread_max);
+	fireBallisticBullet(w_shotorg, w_shotdir, mg_spread, autocvar_g_balance_mg_speed, 5, autocvar_g_balance_mg_sustained_damage, autocvar_g_balance_mg_sustained_headshotaddeddamage, autocvar_g_balance_mg_sustained_force, WEP_MG, 0, 1, autocvar_g_balance_mg_bulletconstant);
+	endFireBallisticBullet();
+
+	self.misc_bulletcounter = self.misc_bulletcounter + 1;
+
+	pointparticles(particleeffectnum("mg_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	MgFlash();
+	W_AttachToShotorg(self.muzzle_flash, '5 0 0');
+
+	if (autocvar_g_casings >= 2) // casing code
+		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);
+
+	} //End Not Jammed
+
+	ATTACK_FINISHED(self) = time + autocvar_g_balance_mg_first_refire * W_WeaponRateFactor();
+	weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_mg_sustained_refire, mg_mode1_fire_auto);
+}
+
+void mg_mode1_fire_burst()
+{
+
+	if (self.mg_jammed)
+	{
+		w_ready();
+		return;
+	}
+	
+	if(autocvar_g_balance_mg_jamrate &&
+ 	(autocvar_g_balance_mg_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your rifle jammed\n");
+		self.mg_jammed = 1;
+	} else { //Start Not Jammed
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_mg_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_mg_sustained_damage);
+	if (!g_norecoil)
+	{
+		self.punchangle_x = random () - 0.5;
+		self.punchangle_y = random () - 0.5;
+	}
+
+	fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_mg_burst_spread, autocvar_g_balance_mg_speed, 5, autocvar_g_balance_mg_sustained_damage, autocvar_g_balance_mg_sustained_headshotaddeddamage, autocvar_g_balance_mg_sustained_force, WEP_MG, 0, 1, autocvar_g_balance_mg_bulletconstant);
+	endFireBallisticBullet();
+
+
+	pointparticles(particleeffectnum("mg_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	MgFlash();
+	W_AttachToShotorg(self.muzzle_flash, '5 0 0');
+
+	if (autocvar_g_casings >= 2) // casing code
+		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);
+
+	} //End Not Jammed
+
+	self.misc_bulletcounter = self.misc_bulletcounter + 1;
+	if (self.misc_bulletcounter == 0)
+	{
+		ATTACK_FINISHED(self) = time + autocvar_g_balance_mg_burst_refire2 * W_WeaponRateFactor();
+		weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_mg_burst_animtime, w_ready);
+	}
+	else
+	{
+		weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_mg_burst_refire, mg_mode1_fire_burst);
+	}
+
+}
+
+void spawnfunc_weapon_machinegun(); // defined in t_items.qc
+
+float w_mg(float req)
+{
+	float ammo_amount;
+	if (req == WR_AIM)
+		if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
+			self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+		else
+		{
+			self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
+		}
+	else if (req == WR_THINK)
+	{
+		if(autocvar_g_balance_mg_reload_ammo && self.clip_load < min(max(autocvar_g_balance_mg_sustained_ammo, autocvar_g_balance_mg_first_ammo), autocvar_g_balance_mg_burst_ammo)) // forced reload
+			weapon_action(self.weapon, WR_RELOAD);
+		else
+		{
+			if (self.BUTTON_ATCK)
+			if (self.mg_release)
+			if (self.mg_jammed != 1)
+			if (weapon_prepareattack(0, 0))
+			{
+				if (!weapon_action(self.weapon, WR_CHECKAMMO2))
+				if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+				{
+					W_SwitchWeapon_Force(self, w_getbestweapon(self));
+					w_ready();
+					return FALSE;
+				}
+
+				W_DecreaseAmmo(ammo_nails, autocvar_g_balance_mg_burst_ammo, autocvar_g_balance_mg_reload_ammo);
+
+				self.misc_bulletcounter = autocvar_g_balance_mg_burst * -1;
+				mg_mode1_fire_burst();
+				self.mg_release = 0;
+			}
+
+			if(self.BUTTON_ATCK2)
+			if (self.mg_release)
+			if (self.mg_jammed != 1)
+			if(weapon_prepareattack(1, 0))
+			{
+				self.misc_bulletcounter = 0;
+				mg_mode1_fire_auto();
+				self.mg_release = 0;
+			}
+			if not(self.BUTTON_ATCK || self.BUTTON_ATCK2)
+				self.mg_release = 1;
+		}
+		
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/uziflash.md3");
+		precache_model ("models/weapons/g_mg.md3");
+		precache_model ("models/weapons/v_mg.md3");
+		precache_model ("models/weapons/h_mg.iqm");
+		precache_sound ("weapons/uzi_fire.wav");
+		//precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
+	}
+	else if (req == WR_SETUP)
+	{
+		weapon_setup(WEP_MG);
+		self.current_ammo = ammo_nails;
+	}
+	else if (req == WR_CHECKAMMO1)
+	{
+		if(autocvar_g_balance_mg_mode == 1)
+			ammo_amount = self.ammo_nails >= autocvar_g_balance_mg_sustained_ammo;
+		else
+			ammo_amount = self.ammo_nails >= autocvar_g_balance_mg_first_ammo;
+
+		if(autocvar_g_balance_mg_reload_ammo)
+		{
+			if(autocvar_g_balance_mg_mode == 1)
+				ammo_amount += self.(weapon_load[WEP_MG]) >= autocvar_g_balance_mg_sustained_ammo;
+			else
+				ammo_amount += self.(weapon_load[WEP_MG]) >= autocvar_g_balance_mg_first_ammo;
+		}
+		return ammo_amount;
+	}
+	else if (req == WR_CHECKAMMO2)
+	{
+		if(autocvar_g_balance_mg_mode == 1)
+			ammo_amount = self.ammo_nails >= autocvar_g_balance_mg_burst_ammo;
+		else
+			ammo_amount = self.ammo_nails >= autocvar_g_balance_mg_first_ammo;
+
+		if(autocvar_g_balance_mg_reload_ammo)
+		{
+			if(autocvar_g_balance_mg_mode == 1)
+				ammo_amount += self.(weapon_load[WEP_MG]) >= autocvar_g_balance_mg_burst_ammo;
+			else
+				ammo_amount += self.(weapon_load[WEP_MG]) >= autocvar_g_balance_mg_first_ammo;
+		}
+		return ammo_amount;
+	}
+	else if (req == WR_RELOAD)
+	{
+		if (self.mg_jammed) {
+			weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_mg_clearjam_time, w_ready);
+			self.mg_jammed = 0;
+			sprint(self.owner, "You cleared the jam\n");
+		} else {
+			W_Reload(min(max(autocvar_g_balance_mg_sustained_ammo, autocvar_g_balance_mg_first_ammo), autocvar_g_balance_mg_burst_ammo), autocvar_g_balance_mg_reload_ammo, autocvar_g_balance_mg_reload_time, "weapons/reload.wav");
+		}
+	}
+	return TRUE;
+}
+#endif
+#ifdef CSQC
+float w_mg(float req)
+{
+	if(req == WR_IMPACTEFFECT)
+	{
+		vector org2;
+		org2 = w_org + w_backoff * 2;
+		pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
+		if(!w_issilent)
+			if(w_random < 0.05)
+				sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.1)
+				sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.2)
+				sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+	}
+	else if(req == WR_PRECACHE)
+	{
+		precache_sound("weapons/ric1.wav");
+		precache_sound("weapons/ric2.wav");
+		precache_sound("weapons/ric3.wav");
+	}
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = _("%s is now thinking with portals");
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+			w_deathtypestring = _("%s was sniped by %s's machine gun");
+		else
+			w_deathtypestring = _("%s was riddled full of holes by %s's machine gun");
+	}
+	return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc
index afe37b5..9f1f45c 100644
--- a/qcsrc/server/w_minelayer.qc
+++ b/qcsrc/server/w_minelayer.qc
@@ -60,6 +60,12 @@ void W_Mine_Stick (entity to)
 
 void W_Mine_Explode ()
 {
+	if(autocvar_g_balance_minelayer_primary_failurerate &&
+ 	(autocvar_g_balance_minelayer_primary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "A mine of yours failed to detonate\n");
+	} else {
+
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.realowner, other))
@@ -72,6 +78,8 @@ void W_Mine_Explode ()
 
 	RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
 
+	} //End To Dud or not to dud.
+
 	if (self.realowner.weapon == WEP_MINE_LAYER)
 	{
 		entity oldself;
@@ -91,6 +99,12 @@ void W_Mine_Explode ()
 
 void W_Mine_DoRemoteExplode ()
 {
+	if(autocvar_g_balance_minelayer_secondary_failurerate &&
+ 	(autocvar_g_balance_minelayer_secondary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "A mine of yours failed to explode\n");
+	} else {
+	
 	self.event_damage = SUB_Null;
 	self.takedamage = DAMAGE_NO;
 
@@ -99,6 +113,8 @@ void W_Mine_DoRemoteExplode ()
 
 	RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
 
+	} //End To Dud or not to dud.
+
 	if (self.realowner.weapon == WEP_MINE_LAYER)
 	{
 		entity oldself;
@@ -184,7 +200,8 @@ void W_Mine_Think (void)
 
 	// a player's mines shall explode if he disconnects or dies
 	// TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams?
-	if(self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO)
+	if((self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO)
+		&& autocvar_g_balance_minelayer_persistent != 1)
 	{
 		other = world;
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
diff --git a/qcsrc/server/w_nukelayer.qc b/qcsrc/server/w_nukelayer.qc
new file mode 100644
index 0000000..a2caa3f
--- /dev/null
+++ b/qcsrc/server/w_nukelayer.qc
@@ -0,0 +1,797 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(NUKE_LAYER, w_nukelayer, IT_ROCKETS, 4, WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "nukelayer", "nukelayer", _("Nuke Layer"))
+#else
+#ifdef SVQC
+void W_Nuke_Think (void);
+.float nukelayer_detonate, nuke_explodeanyway;
+.float nuke_time;
+
+void spawnfunc_weapon_nukelayer (void)
+{
+	weapon_defaultspawnfunc(WEP_NUKE_LAYER);
+}
+
+void W_Nuke_Stick (entity to)
+{
+	spamsound (self, CH_SHOTS, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
+
+	// in order for nukes to face properly when sticking to the ground, they must be a server side entity rather than a csqc projectile
+
+	entity newnuke;
+	newnuke = spawn();
+	newnuke.classname = self.classname;
+
+	newnuke.bot_dodge = self.bot_dodge;
+	newnuke.bot_dodgerating = self.bot_dodgerating;
+
+	newnuke.owner = self.owner;
+	newnuke.realowner = self.realowner;
+	setsize(newnuke, '-4 -4 -4', '4 4 4');
+	setorigin(newnuke, self.origin);
+	setmodel(newnuke, "models/nukemine.md3");
+	newnuke.angles = vectoangles(-trace_plane_normal); // face against the surface
+
+	newnuke.oldvelocity = self.velocity;
+
+	newnuke.takedamage = self.takedamage;
+	newnuke.damageforcescale = self.damageforcescale;
+	newnuke.health = self.health;
+	newnuke.event_damage = self.event_damage;
+	newnuke.spawnshieldtime = self.spawnshieldtime;
+
+	newnuke.movetype = MOVETYPE_NONE; // lock the nuke in place
+	newnuke.projectiledeathtype = self.projectiledeathtype;
+
+	newnuke.nuke_time = self.nuke_time;
+
+	newnuke.touch = SUB_Null;
+	newnuke.think = W_Nuke_Think;
+	newnuke.nextthink = time;
+	newnuke.cnt = self.cnt;
+	newnuke.flags = self.flags;
+
+	remove(self);
+	self = newnuke;
+
+	if(to)
+		SetMovetypeFollow(self, to);
+}
+
+void W_Nuke_Explode ()
+{
+	if(other.takedamage == DAMAGE_AIM)
+		if(other.classname == "player")
+			if(IsDifferentTeam(self.realowner, other))
+				if(other.deadflag == DEAD_NO)
+					if(IsFlying(other))
+						AnnounceTo(self.realowner, "airshot");
+
+	self.event_damage = SUB_Null;
+	self.takedamage = DAMAGE_NO;
+
+	RadiusDamage (self, self.realowner, autocvar_g_balance_nukelayer_damage, autocvar_g_balance_nukelayer_edgedamage, autocvar_g_balance_nukelayer_radius, world, autocvar_g_balance_nukelayer_force, self.projectiledeathtype, other);
+
+
+
+
+
+	//Start Explosion Shockwave and fireball
+	if (autocvar_g_balance_nukelayer_enableshockwave == 1) {
+	//if (autocvar_g_balance_nukelayer_radius > 8191) {
+		//modeleffect_spawn("models/sphere/hugesphere.obj", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.8, 0.05, 0.22);
+	//} else
+	 if (autocvar_g_balance_nukelayer_radius > 7999) {
+		//Tact Nuke Shockwaves
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.2, 0.05, 0.08);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 1, 0.05, 0.1);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.9, 0.05, 0.12);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.8, 0.05, 0.14);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.7, 0.05, 0.16);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.8, 0.05, 0.22);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.6, 0.05, 0.32);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.4, 0.05, 0.42);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.2, 0.05, 0.52);
+		//Tact Nuke Fireballs
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.8, 0.05, 0.6);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.7, 0.05, 1.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.6, 2, 2.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.5, 3, 3.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.4, 4, 4.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.3, 5, 5.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.2, 6, 6.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.1, 7, 7.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.05, 8, 8.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.025, 9, 9.0);
+		
+	} else if (autocvar_g_balance_nukelayer_radius > 5999) {
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.6, 0.05, 0.22);
+		//Secondary Fireball
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.60, 0.05, 0.4);
+		
+	} else if (autocvar_g_balance_nukelayer_radius > 3999) {
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.4, 0.05, 0.22);
+		
+	} else if (autocvar_g_balance_nukelayer_radius > 1999) {
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.2, 0.05, 0.22);
+		
+	} else if (autocvar_g_balance_nukelayer_radius > 499) {
+		//Pushes vapor away
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.1, 0.05, 0.22);
+		
+	}
+	
+	modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_radius, 0.95, 0.05, 0.25);
+	
+	}
+	//End Explosion Shockwave and Fireball
+
+
+	//Spontanious Ignition
+	
+	//Ring 0
+	local entity eburn;
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire0_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+		//Burn EVERYTHING
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire0_damage *
+		autocvar_g_balance_nukelayer_fire0_burntime, autocvar_g_balance_nukelayer_fire0_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 1
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire1_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+		//Burn EVERYTHING
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire1_damage *
+		autocvar_g_balance_nukelayer_fire1_burntime, autocvar_g_balance_nukelayer_fire1_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 2
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire2_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire2_damage *
+		autocvar_g_balance_nukelayer_fire2_burntime, autocvar_g_balance_nukelayer_fire2_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 3
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire3_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire3_damage *
+		autocvar_g_balance_nukelayer_fire3_burntime, autocvar_g_balance_nukelayer_fire3_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 4
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire4_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire4_damage *
+		autocvar_g_balance_nukelayer_fire4_burntime, autocvar_g_balance_nukelayer_fire4_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 5
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire5_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire5_damage *
+		autocvar_g_balance_nukelayer_fire5_burntime, autocvar_g_balance_nukelayer_fire5_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//End Spontanious Ignition
+	
+
+	if (self.realowner.weapon == WEP_NUKE_LAYER)
+	{
+		entity oldself;
+		oldself = self;
+		self = self.realowner;
+		if (!weapon_action(WEP_NUKE_LAYER, WR_CHECKAMMO1))
+		{
+			self.cnt = WEP_NUKE_LAYER;
+			ATTACK_FINISHED(self) = time;
+			self.switchweapon = w_getbestweapon(self);
+		}
+		self = oldself;
+	}
+	self.realowner.nukelayer_nukes -= 1;
+	remove (self);
+}
+
+void W_Nuke_DoRemoteExplode ()
+{
+	self.event_damage = SUB_Null;
+	self.takedamage = DAMAGE_NO;
+
+	if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+		self.velocity = self.oldvelocity;
+
+	RadiusDamage (self, self.realowner, autocvar_g_balance_nukelayer_remote_damage, autocvar_g_balance_nukelayer_remote_edgedamage, autocvar_g_balance_nukelayer_remote_radius, world, autocvar_g_balance_nukelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+
+
+
+
+//Start Explosion Shockwave and fireball
+	if (autocvar_g_balance_nukelayer_enableshockwave == 1) {
+	//if (autocvar_g_balance_nukelayer_remote_radius > 8191) {
+		//modeleffect_spawn("models/sphere/hugesphere.obj", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.8, 0.05, 0.22);
+	//} else
+	 if (autocvar_g_balance_nukelayer_remote_radius > 7999) {
+		//Tact Nuke Shockwaves
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.2, 0.05, 0.08);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 1, 0.05, 0.1);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.9, 0.05, 0.12);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.8, 0.05, 0.14);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.7, 0.05, 0.16);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.8, 0.05, 0.22);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.6, 0.05, 0.32);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.4, 0.05, 0.42);
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.2, 0.05, 0.52);
+		//Tact Nuke Fireballs
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.8, 0.05, 0.6);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.7, 0.05, 1.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.6, 2, 2.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.5, 3, 3.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.4, 4, 4.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.3, 5, 5.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.2, 6, 6.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.1, 7, 7.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.05, 8, 8.0);
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.025, 9, 9.0);
+		
+	} else if (autocvar_g_balance_nukelayer_remote_radius > 5999) {
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.6, 0.05, 0.22);
+		//Secondary Fireball
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.60, 0.05, 0.4);
+		
+	} else if (autocvar_g_balance_nukelayer_remote_radius > 3999) {
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.4, 0.05, 0.22);
+		
+	} else if (autocvar_g_balance_nukelayer_remote_radius > 1999) {
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.2, 0.05, 0.22);
+		
+	} else if (autocvar_g_balance_nukelayer_remote_radius > 499) {
+		//Pushes vapor away
+		modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.1, 0.05, 0.22);
+		
+	}
+	
+	modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_nukelayer_remote_radius, 0.95, 0.05, 0.25);
+	
+	}
+	//End Explosion Shockwave and Fireball
+	
+	
+	//Spontanious Ignition
+	
+	//Ring 0
+	local entity eburn;
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire0_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire0_damage *
+		autocvar_g_balance_nukelayer_fire0_burntime, autocvar_g_balance_nukelayer_fire0_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 1
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire1_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+		//Burn EVERYTHING
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire1_damage *
+		autocvar_g_balance_nukelayer_fire1_burntime, autocvar_g_balance_nukelayer_fire1_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 2
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire2_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+		//Burn EVERYTHING
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire2_damage *
+		autocvar_g_balance_nukelayer_fire2_burntime, autocvar_g_balance_nukelayer_fire2_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 3
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire3_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire3_damage *
+		autocvar_g_balance_nukelayer_fire3_burntime, autocvar_g_balance_nukelayer_fire3_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 4
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire4_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire4_damage *
+		autocvar_g_balance_nukelayer_fire4_burntime, autocvar_g_balance_nukelayer_fire4_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//Ring 5
+	eburn = findradius(self.origin, autocvar_g_balance_nukelayer_fire5_radius * autocvar_g_balance_nukelayer_radius);
+	while(eburn)
+	{
+	if (eburn.classname == "player" && eburn.health > 0)
+		Fire_AddDamage(eburn, self.realowner, autocvar_g_balance_nukelayer_fire5_damage *
+		autocvar_g_balance_nukelayer_fire5_burntime, autocvar_g_balance_nukelayer_fire5_burntime, 
+		self.projectiledeathtype | HITTYPE_BOUNCE);
+		
+		eburn = eburn.chain;
+	}
+	
+	//End Spontanious Ignition
+	
+
+	
+	if (self.realowner.weapon == WEP_NUKE_LAYER)
+	{
+		entity oldself;
+		oldself = self;
+		self = self.realowner;
+		if (!weapon_action(WEP_NUKE_LAYER, WR_CHECKAMMO1))
+		{
+			self.cnt = WEP_NUKE_LAYER;
+			ATTACK_FINISHED(self) = time;
+			self.switchweapon = w_getbestweapon(self);
+		}
+		self = oldself;
+	}
+	self.realowner.nukelayer_nukes -= 1;
+	remove (self);
+}
+
+void W_Nuke_RemoteExplode ()
+{
+	if(self.realowner.deadflag == DEAD_NO)
+		if((self.spawnshieldtime >= 0)
+			? (time >= self.spawnshieldtime) // timer
+			: (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_nukelayer_remote_radius) // safety device
+		)
+		{
+			W_Nuke_DoRemoteExplode();
+		}
+}
+
+void W_Nuke_ProximityExplode ()
+{
+	// make sure no friend is in the nuke's radius. If there is any, explosion is delayed until he's at a safe distance
+	if(autocvar_g_balance_nukelayer_protection && self.nuke_explodeanyway == 0)
+	{
+		entity head;
+		head = findradius(self.origin, autocvar_g_balance_nukelayer_radius);
+		while(head)
+		{
+			if(head == self.realowner || !IsDifferentTeam(head, self.realowner))
+				return;
+			head = head.chain;
+		}
+	}
+
+	self.nuke_time = 0;
+	W_Nuke_Explode();
+}
+
+float W_Nuke_Count(entity e)
+{
+	float nukecount;
+	entity nuke;
+	for(nuke = world; (nuke = find(nuke, classname, "nuke")); ) if(nuke.realowner == e)
+		nukecount += 1;
+		
+	return nukecount;
+}
+
+void W_Nuke_Think (void)
+{
+	entity head;
+
+	self.nextthink = time;
+
+	if(self.movetype == MOVETYPE_FOLLOW)
+	{
+		if(LostMovetypeFollow(self))
+		{
+			UnsetMovetypeFollow(self);
+			self.movetype = MOVETYPE_NONE;
+		}
+	}
+	
+	// our lifetime has expired, it's time to die - nuke_time just allows us to play a sound for this
+	// TODO: replace this mine_trigger.wav sound with a real countdown
+	if ((time > self.cnt) && (!self.nuke_time))
+	{
+		if(autocvar_g_balance_nukelayer_lifetime_countdown > 0)
+			spamsound (self, CH_SHOTS, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+		self.nuke_time = time + autocvar_g_balance_nukelayer_lifetime_countdown;
+		self.nuke_explodeanyway = 1; // make the nuke super aggressive -- Samual: Rather, make it not care if a team mate is near.
+	}
+
+	// shall explode if he disconnects or dies
+	// Not for nukes
+
+	// set the nuke for detonation when a foe gets close enough
+	head = findradius(self.origin, autocvar_g_balance_nukelayer_proximityradius);
+	while(head)
+	{
+		if(head.classname == "player" && head.deadflag == DEAD_NO)
+		if(head != self.realowner && IsDifferentTeam(head, self.realowner)) // don't trigger for team mates
+		if(!self.nuke_time)
+		{
+			spamsound (self, CH_SHOTS, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+			self.nuke_time = time + autocvar_g_balance_nukelayer_time;
+		}
+		head = head.chain;
+	}
+
+	// explode if it's time to
+	if(self.nuke_time && time >= self.nuke_time)
+	{
+		W_Nuke_ProximityExplode();
+		return;
+	}
+
+	// remote detonation
+	if (self.realowner.weapon == WEP_NUKE_LAYER)
+	if (self.realowner.deadflag == DEAD_NO)
+	if (self.nukelayer_detonate)
+		W_Nuke_RemoteExplode();
+}
+
+void W_Nuke_Touch (void)
+{
+	if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+		return; // we're already a stuck nuke, why do we get called? TODO does this even happen?
+
+	PROJECTILE_TOUCH;
+
+	if(other && other.classname == "player" && other.deadflag == DEAD_NO)
+	{
+		// hit a player
+		// don't stick
+	}
+	else
+	{
+		W_Nuke_Stick(other);
+	}
+}
+
+void W_Nuke_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	if (self.health <= 0)
+		return;
+	self.health = self.health - damage;
+	self.angles = vectoangles(self.velocity);
+	if (self.health <= 0)
+		W_PrepareExplosionByDamage(attacker, W_Nuke_Explode);
+}
+
+void W_Nuke_Attack (void)
+{
+	entity nuke;
+	entity flash;
+
+	// scan how many nukes we placed, and return if we reached our limit
+	if(autocvar_g_balance_nukelayer_limit)
+	{
+	
+		if(W_Nuke_Count(self) >= autocvar_g_balance_nukelayer_limit)
+		{
+			// the refire delay keeps this message from being spammed
+			sprint(self, strcat("You cannot place more than ^2", ftos(autocvar_g_balance_nukelayer_limit), " ^7nukes at a time\n") );
+			play2(self, "weapons/unavailable.wav");
+			return;
+		}
+	}
+
+	W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_nukelayer_ammo, autocvar_g_balance_nukelayer_reload_ammo);
+
+	W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CH_WEAPON_A, autocvar_g_balance_nukelayer_damage);
+	pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	nuke = WarpZone_RefSys_SpawnSameRefSys(self);
+	nuke.owner = nuke.realowner = self;
+	if(autocvar_g_balance_nukelayer_detonatedelay >= 0)
+		nuke.spawnshieldtime = time + autocvar_g_balance_nukelayer_detonatedelay;
+	else
+		nuke.spawnshieldtime = -1;
+	nuke.classname = "nuke";
+	nuke.bot_dodge = TRUE;
+	nuke.bot_dodgerating = autocvar_g_balance_nukelayer_damage * 2; // * 2 because it can detonate inflight which makes it even more dangerous
+
+	nuke.takedamage = DAMAGE_YES;
+	nuke.damageforcescale = autocvar_g_balance_nukelayer_damageforcescale;
+	nuke.health = autocvar_g_balance_nukelayer_health;
+	nuke.event_damage = W_Nuke_Damage;
+
+	nuke.movetype = MOVETYPE_TOSS;
+	PROJECTILE_MAKETRIGGER(nuke);
+	nuke.projectiledeathtype = WEP_NUKE_LAYER;
+	setsize (nuke, '-4 -4 -4', '4 4 4'); // give it some size so it can be shot
+
+	setorigin (nuke, w_shotorg - v_forward * 4); // move it back so it hits the wall at the right point
+	W_SetupProjectileVelocity(nuke, autocvar_g_balance_nukelayer_speed, 0);
+	nuke.angles = vectoangles (nuke.velocity);
+
+	nuke.touch = W_Nuke_Touch;
+	nuke.think = W_Nuke_Think;
+	nuke.nextthink = time;
+	nuke.cnt = time + (autocvar_g_balance_nukelayer_lifetime - autocvar_g_balance_nukelayer_lifetime_countdown);
+	nuke.flags = FL_PROJECTILE;
+
+	CSQCProjectile(nuke, TRUE, PROJECTILE_MINE, TRUE);
+
+	// muzzle flash for 1st person view
+	flash = spawn ();
+	setmodel (flash, "models/flash.md3"); // precision set below
+	SUB_SetFade (flash, time, 0.1);
+	flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+	W_AttachToShotorg(flash, '5 0 0');
+
+	// common properties
+
+	other = nuke; MUTATOR_CALLHOOK(EditProjectile);
+	
+	self.nukelayer_nukes = W_Nuke_Count(self);
+}
+
+void spawnfunc_weapon_nukelayer (void); // defined in t_items.qc
+
+float W_PlacedNukes(float detonate)
+{
+	entity nuke;
+	float minfound;
+
+	for(nuke = world; (nuke = find(nuke, classname, "nuke")); ) if(nuke.realowner == self)
+	{
+		if(detonate)
+		{
+			if(!nuke.nukelayer_detonate)
+			{
+				nuke.nukelayer_detonate = TRUE;
+				minfound = 1;
+			}
+		}
+		else
+			minfound = 1;
+	}
+	return minfound;
+}
+
+float w_nukelayer(float req)
+{
+	entity nuke;
+	float ammo_amount;
+
+	if (req == WR_AIM)
+	{
+		// aim and decide to fire if appropriate
+		self.BUTTON_ATCK = bot_aim(autocvar_g_balance_nukelayer_speed, 0, autocvar_g_balance_nukelayer_lifetime, FALSE);
+		if(skill >= 2) // skill 0 and 1 bots won't detonate nukes!
+		{
+			// decide whether to detonate nukes
+			entity targetlist, targ;
+			float edgedamage, coredamage, edgeradius, recipricoledgeradius, d;
+			float selfdamage, teamdamage, enemydamage;
+			edgedamage = autocvar_g_balance_nukelayer_edgedamage;
+			coredamage = autocvar_g_balance_nukelayer_damage;
+			edgeradius = autocvar_g_balance_nukelayer_radius;
+			recipricoledgeradius = 1 / edgeradius;
+			selfdamage = 0;
+			teamdamage = 0;
+			enemydamage = 0;
+			targetlist = findchainfloat(bot_attack, TRUE);
+			nuke = find(world, classname, "nuke");
+			while (nuke)
+			{
+				if (nuke.realowner != self)
+				{
+					nuke = find(nuke, classname, "nuke");
+					continue;
+				}
+				targ = targetlist;
+				while (targ)
+				{
+					d = vlen(targ.origin + (targ.mins + targ.maxs) * 0.5 - nuke.origin);
+					d = bound(0, edgedamage + (coredamage - edgedamage) * sqrt(1 - d * recipricoledgeradius), 10000);
+					// count potential damage according to type of target
+					if (targ == self)
+						selfdamage = selfdamage + d;
+					else if (targ.team == self.team && teamplay)
+						teamdamage = teamdamage + d;
+					else if (bot_shouldattack(targ))
+						enemydamage = enemydamage + d;
+					targ = targ.chain;
+				}
+				nuke = find(nuke, classname, "nuke");
+			}
+			float desirabledamage;
+			desirabledamage = enemydamage;
+			if (time > self.invincible_finished && time > self.spawnshieldtime)
+				desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
+			if (teamplay && self.team)
+				desirabledamage = desirabledamage - teamdamage;
+
+			nuke = find(world, classname, "nuke");
+			while (nuke)
+			{
+				if (nuke.realowner != self)
+				{
+					nuke = find(nuke, classname, "nuke");
+					continue;
+				}
+				makevectors(nuke.v_angle);
+				targ = targetlist;
+				if (skill > 9) // normal players only do this for the target they are tracking
+				{
+					targ = targetlist;
+					while (targ)
+					{
+						if (
+							(v_forward * normalize(nuke.origin - targ.origin)< 0.1)
+							&& desirabledamage > 0.1*coredamage
+						)self.BUTTON_ATCK2 = TRUE;
+						targ = targ.chain;
+					}
+				}else{
+					float distance; distance= bound(300,vlen(self.origin-self.enemy.origin),30000);
+					//As the distance gets larger, a correct detonation gets near imposible
+					//Bots are assumed to use the nuke spawnfunc_light to see if the nuke gets near a player
+					if(v_forward * normalize(nuke.origin - self.enemy.origin)< 0.1)
+						if(self.enemy.classname == "player")
+							if(desirabledamage >= 0.1*coredamage)
+								if(random()/distance*300 > frametime*bound(0,(10-skill)*0.2,1))
+									self.BUTTON_ATCK2 = TRUE;
+				//	dprint(ftos(random()/distance*300),">");dprint(ftos(frametime*bound(0,(10-skill)*0.2,1)),"\n");
+				}
+
+				nuke = find(nuke, classname, "nuke");
+			}
+			// if we would be doing at X percent of the core damage, detonate it
+			// but don't fire a new shot at the same time!
+			if (desirabledamage >= 0.75 * coredamage) //this should do group damage in rare fortunate events
+				self.BUTTON_ATCK2 = TRUE;
+			if ((skill > 6.5) && (selfdamage > self.health))
+				self.BUTTON_ATCK2 = FALSE;
+			//if(self.BUTTON_ATCK2 == TRUE)
+			//	dprint(ftos(desirabledamage),"\n");
+			if (self.BUTTON_ATCK2 == TRUE) self.BUTTON_ATCK = FALSE;
+		}
+	}
+	else if (req == WR_THINK)
+	{
+		if(autocvar_g_balance_nukelayer_reload_ammo && self.clip_load < autocvar_g_balance_nukelayer_ammo) // forced reload
+		{
+			// not if we're holding the nukelayer without enough ammo, but can detonate existing nukes
+			if not (W_PlacedNukes(FALSE) && self.ammo_rockets < autocvar_g_balance_nukelayer_ammo)
+				weapon_action(self.weapon, WR_RELOAD);
+		}
+		else if (self.BUTTON_ATCK)
+		{
+			if(weapon_prepareattack(0, autocvar_g_balance_nukelayer_refire))
+			{
+				W_Nuke_Attack();
+				weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nukelayer_animtime, w_ready);
+			}
+		}
+
+		if (self.BUTTON_ATCK2)
+		{
+			if(W_PlacedNukes(TRUE))
+				sound (self, CH_WEAPON_B, "weapons/mine_det.wav", VOL_BASE, ATTN_NORM);
+		}
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/flash.md3");
+		precache_model ("models/nukemine.md3");
+		precache_model ("models/weapons/g_nukelayer.md3");
+		precache_model ("models/weapons/v_nukelayer.md3");
+		precache_model ("models/weapons/h_nukelayer.iqm");
+		precache_model ("models/sphere/sphere.md3");
+		precache_model ("models/sphere/sphexp.md3");
+		precache_sound ("weapons/mine_det.wav");
+		precache_sound ("weapons/mine_fire.wav");
+		precache_sound ("weapons/mine_stick.wav");
+		precache_sound ("weapons/mine_trigger.wav");
+		//precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
+	}
+	else if (req == WR_SETUP)
+	{
+		weapon_setup(WEP_NUKE_LAYER);
+		self.current_ammo = ammo_rockets;
+	}
+	else if (req == WR_CHECKAMMO1)
+	{
+		// don't switch while placing a nuke
+		if (ATTACK_FINISHED(self) <= time || self.weapon != WEP_NUKE_LAYER)
+		{
+			ammo_amount = self.ammo_rockets >= autocvar_g_balance_nukelayer_ammo;
+			ammo_amount += self.weapon_load[WEP_NUKE_LAYER] >= autocvar_g_balance_nukelayer_ammo;
+			return ammo_amount;
+		}
+	}
+	else if (req == WR_CHECKAMMO2)
+	{
+		if (W_PlacedNukes(FALSE))
+			return TRUE;
+		else
+			return FALSE;
+	}
+	else if (req == WR_RELOAD)
+	{
+		W_Reload(autocvar_g_balance_nukelayer_ammo, autocvar_g_balance_nukelayer_reload_ammo, autocvar_g_balance_nukelayer_reload_time, "weapons/reload.wav");
+	}
+	return TRUE;
+};
+#endif
+#ifdef CSQC
+float w_nukelayer(float req)
+{
+	if(req == WR_IMPACTEFFECT)
+	{
+		vector org2;
+		org2 = w_org + w_backoff * 12;
+		pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
+		if(!w_issilent)
+			sound(self, CH_SHOTS, "weapons/nuke_exp.wav", VOL_BASE, ATTN_NORM);
+	}
+	else if(req == WR_PRECACHE)
+	{
+		precache_sound("weapons/nuke_exp.wav");
+	}
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = _("%s exploded");
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
+			w_deathtypestring = _("%s got too close to %s's nuke");
+		else if(w_deathtype & HITTYPE_SPLASH)
+			w_deathtypestring = _("%s almost dodged %s's nuke");
+		else
+			w_deathtypestring = _("%s stepped on %s's nuke");
+	}
+	return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_pistol.qc b/qcsrc/server/w_pistol.qc
new file mode 100644
index 0000000..8a99b5f
--- /dev/null
+++ b/qcsrc/server/w_pistol.qc
@@ -0,0 +1,290 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(PISTOL, w_pistol, IT_NAILS, 2, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_LOW, "pistol", "pistol", _("Pistol"))
+#else
+#ifdef SVQC
+
+.float pistol_release;
+.float pistol_accumulator;
+.float pistol_jammed;
+
+void W_Pistol_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
+{
+	float i;
+
+	W_DecreaseAmmo(ammo_nails, pAmmo, autocvar_g_balance_pistol_reload_ammo);
+
+	if (autocvar_g_balance_pistol_jamrate &&
+ 	(autocvar_g_balance_pistol_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your pistol jammed\n");
+		self.pistol_jammed = 1;
+	} else { //Start Not Jammed
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CH_WEAPON_A, (pDamage + pHeadshotAddedDamage) * pShots);
+
+	pointparticles(particleeffectnum("pistol_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
+
+	if(self.BUTTON_ZOOM | self.BUTTON_ZOOMSCRIPT) // if zoomed, shoot from the eye
+	{
+		w_shotdir = v_forward;
+		w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
+	}
+
+	for(i = 0; i < pShots; ++i)
+		fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
+	endFireBallisticBullet();
+
+	if (autocvar_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, self);
+
+	} //End Not Jammed
+}
+
+void W_Pistol_Attack()
+{
+	W_Pistol_FireBullet(autocvar_g_balance_pistol_primary_spread, autocvar_g_balance_pistol_primary_damage, autocvar_g_balance_pistol_primary_headshotaddeddamage, autocvar_g_balance_pistol_primary_force, autocvar_g_balance_pistol_primary_speed, autocvar_g_balance_pistol_primary_lifetime, autocvar_g_balance_pistol_primary_ammo, WEP_PISTOL, autocvar_g_balance_pistol_primary_bulletconstant, autocvar_g_balance_pistol_primary_tracer, autocvar_g_balance_pistol_primary_shots, "weapons/campingrifle_fire.wav");
+}
+
+void W_Pistol_Attack2()
+{
+	W_Pistol_FireBullet(autocvar_g_balance_pistol_secondary_spread, autocvar_g_balance_pistol_secondary_damage, autocvar_g_balance_pistol_secondary_headshotaddeddamage, autocvar_g_balance_pistol_secondary_force, autocvar_g_balance_pistol_secondary_speed, autocvar_g_balance_pistol_secondary_lifetime, autocvar_g_balance_pistol_secondary_ammo, WEP_PISTOL | HITTYPE_SECONDARY, autocvar_g_balance_pistol_secondary_bulletconstant, autocvar_g_balance_pistol_secondary_tracer, autocvar_g_balance_pistol_secondary_shots, "weapons/campingrifle_fire2.wav");
+}
+
+void spawnfunc_weapon_pistol (void)
+{
+	weapon_defaultspawnfunc(WEP_PISTOL);
+}
+
+// compatibility alias
+void spawnfunc_weapon_campingpistol (void)
+{
+	spawnfunc_weapon_pistol();
+}
+void spawnfunc_weapon_sniperpistol (void)
+{
+	spawnfunc_weapon_pistol();
+}
+
+.void(void) pistol_bullethail_attackfunc;
+.float pistol_bullethail_frame;
+.float pistol_bullethail_animtime;
+.float pistol_bullethail_refire;
+void W_Pistol_BulletHail_Continue()
+{
+	float r, sw, af;
+
+	sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
+	af = ATTACK_FINISHED(self);
+	self.switchweapon = self.weapon;
+	ATTACK_FINISHED(self) = time;
+	print(ftos(self.ammo_nails), "\n");
+	r = weapon_prepareattack(self.pistol_bullethail_frame == WFRAME_FIRE2, self.pistol_bullethail_refire);
+	if(self.switchweapon == self.weapon)
+		self.switchweapon = sw;
+	if(r)
+	{
+		self.pistol_bullethail_attackfunc();
+		weapon_thinkf(self.pistol_bullethail_frame, self.pistol_bullethail_animtime, W_Pistol_BulletHail_Continue);
+		print("thinkf set\n");
+	}
+	else
+	{
+		ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
+		print("out of ammo... ", ftos(self.weaponentity.state), "\n");
+	}
+}
+
+void W_Pistol_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
+{
+	// if we get here, we have at least one bullet to fire
+	AttackFunc();
+	if(mode)
+	{
+		// continue hail
+		self.pistol_bullethail_attackfunc = AttackFunc;
+		self.pistol_bullethail_frame = fr;
+		self.pistol_bullethail_animtime = animtime;
+		self.pistol_bullethail_refire = refire;
+		weapon_thinkf(fr, animtime, W_Pistol_BulletHail_Continue);
+	}
+	else
+	{
+		// just one shot
+		weapon_thinkf(fr, animtime, w_ready);
+	}
+}
+
+.float bot_secondary_pistolmooth;
+float w_pistol(float req)
+{
+	float ammo_amount;
+
+	if (req == WR_AIM)
+	{
+		self.BUTTON_ATCK=FALSE;
+		self.BUTTON_ATCK2=FALSE;
+		if(vlen(self.origin-self.enemy.origin) > 1000)
+			self.bot_secondary_pistolmooth = 0;
+		if(self.bot_secondary_pistolmooth == 0)
+		{
+			if(bot_aim(autocvar_g_balance_pistol_primary_speed, 0, autocvar_g_balance_pistol_primary_lifetime, FALSE))
+			{
+				self.BUTTON_ATCK = TRUE;
+				if(random() < 0.01) self.bot_secondary_pistolmooth = 1;
+			}
+		}
+		else
+		{
+			if(bot_aim(autocvar_g_balance_pistol_secondary_speed, 0, autocvar_g_balance_pistol_secondary_lifetime, FALSE))
+			{
+				self.BUTTON_ATCK2 = TRUE;
+				if(random() < 0.03) self.bot_secondary_pistolmooth = 0;
+			}
+		}
+	}
+	else if (req == WR_THINK)
+	{
+		if(autocvar_g_balance_pistol_reload_ammo && self.clip_load < min(autocvar_g_balance_pistol_primary_ammo, autocvar_g_balance_pistol_secondary_ammo)) // forced reload
+            weapon_action(self.weapon, WR_RELOAD);
+		else
+		{
+			self.pistol_accumulator = bound(time - autocvar_g_balance_pistol_bursttime, self.pistol_accumulator, time);
+			if (self.BUTTON_ATCK)
+			if (self.pistol_release)
+			if (self.pistol_jammed != 1)
+			if (weapon_prepareattack_check(0, autocvar_g_balance_pistol_primary_refire))
+			if (time >= self.pistol_accumulator + autocvar_g_balance_pistol_primary_burstcost)
+			{
+				weapon_prepareattack_do(0, autocvar_g_balance_pistol_primary_refire);
+				W_Pistol_BulletHail(autocvar_g_balance_pistol_primary_bullethail, W_Pistol_Attack, WFRAME_FIRE1, autocvar_g_balance_pistol_primary_animtime, autocvar_g_balance_pistol_primary_refire);
+				self.pistol_accumulator += autocvar_g_balance_pistol_primary_burstcost;
+				self.pistol_release = 0;
+			}
+			if (self.BUTTON_ATCK2)
+			if (self.pistol_jammed != 1)
+			{
+				if (autocvar_g_balance_pistol_secondary)
+				{
+                 			if(autocvar_g_balance_pistol_secondary_reload)
+                  		      		weapon_action(self.weapon, WR_RELOAD);
+                			else
+                 			{
+                  				if (weapon_prepareattack_check(1, autocvar_g_balance_pistol_secondary_refire))
+						if (self.pistol_release)
+                     				if (time >= self.pistol_accumulator + autocvar_g_balance_pistol_secondary_burstcost)
+                      		  		{
+                            				weapon_prepareattack_do(1, autocvar_g_balance_pistol_secondary_refire);
+                            				W_Pistol_BulletHail(autocvar_g_balance_pistol_secondary_bullethail, W_Pistol_Attack2, WFRAME_FIRE2, autocvar_g_balance_pistol_secondary_animtime, autocvar_g_balance_pistol_primary_refire);
+                            				self.pistol_accumulator += autocvar_g_balance_pistol_secondary_burstcost;
+			    				self.pistol_release = 0;
+                        			}
+                    			}
+				}
+			}
+			if not(self.BUTTON_ATCK || self.BUTTON_ATCK2)
+				self.pistol_release = 1;
+		}
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/weapons/g_pistol.md3");
+		precache_model ("models/weapons/v_pistol.md3");
+		precache_model ("models/weapons/h_pistol.iqm");
+		precache_sound ("weapons/campingrifle_fire.wav");
+		precache_sound ("weapons/campingrifle_fire2.wav");
+		//precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
+	}
+	else if (req == WR_SETUP)
+	{
+		weapon_setup(WEP_PISTOL);
+		self.current_ammo = ammo_nails;
+	}
+	else if (req == WR_CHECKAMMO1)
+	{
+		ammo_amount = self.ammo_nails >= autocvar_g_balance_pistol_primary_ammo;
+		ammo_amount += self.weapon_load[WEP_PISTOL] >= autocvar_g_balance_pistol_primary_ammo;
+		return ammo_amount;
+	}
+	else if (req == WR_CHECKAMMO2)
+	{
+		ammo_amount = self.ammo_nails >= autocvar_g_balance_pistol_secondary_ammo;
+		ammo_amount += self.weapon_load[WEP_PISTOL] >= autocvar_g_balance_pistol_secondary_ammo;
+		return ammo_amount;
+	}
+	else if (req == WR_RESETPLAYER)
+	{
+		self.pistol_accumulator = time - autocvar_g_balance_pistol_bursttime;
+	}
+	else if (req == WR_RELOAD)
+	{
+		if (self.pistol_jammed) {
+			weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_pistol_clearjam_time, w_ready);
+			self.pistol_jammed = 0;
+			sprint(self.owner, "You cleared the jam\n");
+		} else {
+			W_Reload(min(autocvar_g_balance_pistol_primary_ammo, autocvar_g_balance_pistol_secondary_ammo), autocvar_g_balance_pistol_reload_ammo, autocvar_g_balance_pistol_reload_time, "weapons/reload.wav");
+		}
+	}
+	return TRUE;
+};
+#endif
+#ifdef CSQC
+float w_pistol(float req)
+{
+	if(req == WR_IMPACTEFFECT)
+	{
+		vector org2;
+		org2 = w_org + w_backoff * 2;
+		pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
+		if(!w_issilent)
+		{
+			if(w_random < 0.2)
+				sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.4)
+				sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.5)
+				sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+		}
+	}
+	else if(req == WR_PRECACHE)
+	{
+		precache_sound("weapons/ric1.wav");
+		precache_sound("weapons/ric2.wav");
+		precache_sound("weapons/ric3.wav");
+	}
+	else if (req == WR_SUICIDEMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+			w_deathtypestring = _("%s quickly self-dispached");
+		else
+			w_deathtypestring = _("%s committed suicide via gunshot wound");
+	}
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+		{
+			if(w_deathtype & HITTYPE_BOUNCE)
+				w_deathtypestring = _("%s failed to hide from %s's quick trigger finger");
+			else
+				w_deathtypestring = _("%s by %s The Pistoleer");
+		}
+		else
+		{
+			if(w_deathtype & HITTYPE_BOUNCE)
+			{
+				// TODO special headshot message here too?
+				w_deathtypestring = _("%s tried to hide from %s's pistol");
+			}
+			else
+			{
+				if(w_deathtype & HITTYPE_HEADSHOT)
+					w_deathtypestring = _("%s was executed by %s");
+				else
+					w_deathtypestring = _("%s was shot down by %s");
+			}
+		}
+	}
+	return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_pumpshotgun.qc b/qcsrc/server/w_pumpshotgun.qc
new file mode 100644
index 0000000..05e873e
--- /dev/null
+++ b/qcsrc/server/w_pumpshotgun.qc
@@ -0,0 +1,297 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(PUMPSHOTGUN, w_pumpshotgun, IT_SHELLS, 2, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_LOW, "pumpshotgun", "pumpshotgun", _("Pump Shotgun"))
+#else
+#ifdef SVQC
+
+.float pumpshotgun_release;
+
+void W_PumpShotgun_Attack (void)
+{
+	float	sc;
+	float	ammoamount;
+	float	bullets;
+	float	d;
+	float	f;
+	float	spread;
+	float	bulletspeed;
+	float	bulletconstant;
+	entity flash;
+
+	ammoamount = autocvar_g_balance_pumpshotgun_primary_ammo;
+	bullets = autocvar_g_balance_pumpshotgun_primary_bullets;
+	d = autocvar_g_balance_pumpshotgun_primary_damage;
+	f = autocvar_g_balance_pumpshotgun_primary_force;
+	spread = autocvar_g_balance_pumpshotgun_primary_spread;
+	bulletspeed = autocvar_g_balance_pumpshotgun_primary_speed;
+	bulletconstant = autocvar_g_balance_pumpshotgun_primary_bulletconstant;
+
+	W_DecreaseAmmo(ammo_shells, ammoamount, autocvar_g_balance_pumpshotgun_reload_ammo);
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d * bullets);
+	for (sc = 0;sc < bullets;sc = sc + 1)
+		fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_PUMPSHOTGUN, 0, 1, bulletconstant);
+	endFireBallisticBullet();
+
+	pointparticles(particleeffectnum("pumpshotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, autocvar_g_balance_pumpshotgun_primary_ammo);
+
+	// muzzle flash for 1st person view
+	flash = spawn();
+	setmodel(flash, "models/uziflash.md3"); // precision set below
+	flash.think = SUB_Remove;
+	flash.nextthink = time + 0.06;
+	flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+	W_AttachToShotorg(flash, '5 0 0');
+}
+
+.float swing_prev;
+.entity swing_alreadyhit;
+void pumpshotgun_meleethink (void)
+{
+	// declarations
+	float i, f, swing, swing_factor, swing_damage, meleetime, is_player;
+	entity target_victim;
+	vector targpos;
+
+	if(!self.cnt) // set start time of melee
+	{
+		self.cnt = time; 
+		W_PlayStrengthSound(self.realowner);
+	}
+
+	makevectors(self.realowner.v_angle); // update values for v_* vectors
+	
+	// calculate swing percentage based on time
+	meleetime = autocvar_g_balance_pumpshotgun_secondary_melee_time * W_WeaponRateFactor();
+	swing = bound(0, (self.cnt + meleetime - time) / meleetime, 10);
+	f = ((1 - swing) * autocvar_g_balance_pumpshotgun_secondary_melee_traces);
+	
+	// check to see if we can still continue, otherwise give up now
+	if((self.realowner.deadflag != DEAD_NO) && autocvar_g_balance_pumpshotgun_secondary_melee_no_doubleslap)
+	{
+		remove(self);
+		return;
+	}
+	
+	// if okay, perform the traces needed for this frame 
+	for(i=self.swing_prev; i < f; ++i)
+	{
+		swing_factor = ((1 - (i / autocvar_g_balance_pumpshotgun_secondary_melee_traces)) * 2 - 1);
+		
+		targpos = (self.realowner.origin + self.realowner.view_ofs 
+			+ (v_forward * autocvar_g_balance_pumpshotgun_secondary_melee_range)
+			+ (v_up * swing_factor * autocvar_g_balance_pumpshotgun_secondary_melee_swing_up)
+			+ (v_right * swing_factor * autocvar_g_balance_pumpshotgun_secondary_melee_swing_side));
+
+		WarpZone_traceline_antilag(self.realowner, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, self.realowner, ANTILAG_LATENCY(self.realowner));
+		
+		// draw lightning beams for debugging
+		//te_lightning2(world, targpos, self.realowner.origin + self.realowner.view_ofs + v_forward * 5 - v_up * 5); 
+		//te_customflash(targpos, 40,  2, '1 1 1');
+		
+		is_player = (trace_ent.classname == "player" || trace_ent.classname == "body");
+
+		if((trace_fraction < 1) // if trace is good, apply the damage and remove self
+			&& (trace_ent.takedamage == DAMAGE_AIM)  
+			&& (trace_ent != self.swing_alreadyhit)
+			&& (is_player || autocvar_g_balance_pumpshotgun_secondary_melee_nonplayerdamage))
+		{
+			target_victim = trace_ent; // so it persists through other calls
+			
+			if(is_player) // this allows us to be able to nerf the non-player damage done in e.g. assault or onslaught.
+				swing_damage = (autocvar_g_balance_pumpshotgun_secondary_damage * min(1, swing_factor + 1));
+			else
+				swing_damage = (autocvar_g_balance_pumpshotgun_secondary_melee_nonplayerdamage * min(1, swing_factor + 1));
+			
+			//print(strcat(self.realowner.netname, " hitting ", target_victim.netname, " with ", strcat(ftos(swing_damage), " damage (factor: ", ftos(swing_factor), ") at "), ftos(time), " seconds.\n"));
+			
+			Damage(target_victim, self.realowner, self.realowner, 
+				swing_damage, WEP_PUMPSHOTGUN | HITTYPE_SECONDARY, 
+				self.realowner.origin + self.realowner.view_ofs, 
+				v_forward * autocvar_g_balance_pumpshotgun_secondary_force);
+				
+			if(accuracy_isgooddamage(self.realowner, target_victim)) { accuracy_add(self.realowner, WEP_PUMPSHOTGUN, 0, swing_damage); }
+				
+			// draw large red flash for debugging
+			//te_customflash(targpos, 200, 2, '15 0 0');
+			
+			if(autocvar_g_balance_pumpshotgun_secondary_melee_multihit) // allow multiple hits with one swing, but not against the same player twice.
+			{
+				self.swing_alreadyhit = target_victim;
+				continue; // move along to next trace
+			}
+			else
+			{
+				remove(self);
+				return;
+			}
+		}
+	}
+	
+	if(time >= self.cnt + meleetime)
+	{
+		// melee is finished
+		remove(self);
+		return;
+	}
+	else
+	{
+		// set up next frame 
+		self.swing_prev = i;
+		self.nextthink = time;
+	}
+}
+
+void W_PumpShotgun_Attack2 (void)
+{
+	sound (self, CH_WEAPON_A, "weapons/pumpshotgun_rack.wav", VOL_BASE, ATTN_NORM);
+	weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_pumpshotgun_secondary_animtime, w_ready);
+
+
+	entity meleetemp;
+	//meleetemp = spawn();
+	//meleetemp.owner = meleetemp.realowner = self;
+	//meleetemp.think = pumpshotgun_meleethink;
+	//meleetemp.nextthink = time + autocvar_g_balance_pumpshotgun_secondary_melee_delay * W_WeaponRateFactor();
+	//W_SetupShot_Range(self, TRUE, 0, "", 0, autocvar_g_balance_pumpshotgun_secondary_damage, autocvar_g_balance_pumpshotgun_secondary_melee_range);
+
+	// casing code
+	////float	sc;
+	////float	ammoamount;
+	
+	if (autocvar_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, self);
+	}
+
+}
+
+void spawnfunc_weapon_pumpshotgun (void)
+{
+	weapon_defaultspawnfunc(WEP_PUMPSHOTGUN);
+}
+
+
+.float pumpshotgun_primarytime;
+
+float w_pumpshotgun(float req)
+{
+	float ammo_amount;
+	if (req == WR_AIM)
+		if(vlen(self.origin-self.enemy.origin) <= autocvar_g_balance_pumpshotgun_secondary_melee_range)
+			self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
+		else
+		{
+			if(autocvar_g_antilag_bullets)
+				self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+			else
+				self.BUTTON_ATCK = bot_aim(autocvar_g_balance_pumpshotgun_primary_speed, 0, 0.001, FALSE);
+		}
+
+	else if (req == WR_THINK)
+	{
+		if(autocvar_g_balance_pumpshotgun_reload_ammo && self.clip_load < autocvar_g_balance_pumpshotgun_primary_ammo) // forced reload
+		{
+			// don't force reload an empty pumpshotgun if its melee attack is active
+			if not(autocvar_g_balance_pumpshotgun_secondary && self.ammo_shells < autocvar_g_balance_pumpshotgun_primary_ammo)
+				weapon_action(self.weapon, WR_RELOAD);
+				self.pumpshotgun_release = 0;
+		}
+		else
+		{
+			if (self.BUTTON_ATCK)
+			if (self.pumpshotgun_release != 1)
+			if (time >= self.pumpshotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary
+			{
+					if(weapon_prepareattack(0, autocvar_g_balance_pumpshotgun_primary_animtime))
+					{
+						W_PumpShotgun_Attack();
+						self.pumpshotgun_primarytime = time + autocvar_g_balance_pumpshotgun_primary_refire * W_WeaponRateFactor();
+						weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_pumpshotgun_primary_animtime, w_ready);
+						self.pumpshotgun_release = 1; //Slide needs to be wracked
+					}
+			}
+			if (self.BUTTON_ATCK2)
+			if (self.pumpshotgun_release == 1)
+			if (weapon_prepareattack(1, autocvar_g_balance_pumpshotgun_secondary_refire))
+			{
+				// attempt forcing playback of the anim by switching to another anim (that we never play) here...
+				weapon_thinkf(WFRAME_FIRE1, 0, W_PumpShotgun_Attack2);
+				self.pumpshotgun_release = 0; //We wracked the slide
+			}
+		}
+		
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/uziflash.md3");
+		precache_model ("models/weapons/g_pumpshotgun.md3");
+		precache_model ("models/weapons/v_pumpshotgun.md3");
+		precache_model ("models/weapons/h_pumpshotgun.iqm");
+		precache_sound ("misc/itempickup.wav");
+		precache_sound ("weapons/shotgun_fire.wav");
+		precache_sound ("weapons/pumpshotgun_rack.wav");
+		//precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
+	}
+	else if (req == WR_SETUP)
+	{
+		weapon_setup(WEP_PUMPSHOTGUN);
+		self.current_ammo = ammo_shells;
+	}
+	else if (req == WR_CHECKAMMO1)
+	{
+		ammo_amount = self.ammo_shells >= autocvar_g_balance_pumpshotgun_primary_ammo;
+		ammo_amount += self.(weapon_load[WEP_PUMPSHOTGUN]) >= autocvar_g_balance_pumpshotgun_primary_ammo;
+		return ammo_amount;
+	}
+	else if (req == WR_CHECKAMMO2)
+	{
+		// melee attack is always available
+		return TRUE;
+	}
+	else if (req == WR_RELOAD)
+	{
+		W_Reload(autocvar_g_balance_pumpshotgun_primary_ammo, autocvar_g_balance_pumpshotgun_reload_ammo, autocvar_g_balance_pumpshotgun_reload_time, "weapons/reload.wav");
+		self.pumpshotgun_release = 0;
+	}
+	return TRUE;
+}
+#endif
+#ifdef CSQC
+.float prevric;
+float w_pumpshotgun(float req)
+{
+	if(req == WR_IMPACTEFFECT)
+	{
+		vector org2;
+		org2 = w_org + w_backoff * 2;
+		pointparticles(particleeffectnum("shotgun_impact"), org2, w_backoff * 1000, 1);
+		if(!w_issilent && time - self.prevric > 0.25)
+		{
+			if(w_random < 0.0165)
+				sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.033)
+				sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.05)
+				sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+			self.prevric = time;
+		}
+	}
+	else if(req == WR_PRECACHE)
+	{
+		precache_sound("weapons/ric1.wav");
+		precache_sound("weapons/ric2.wav");
+		precache_sound("weapons/ric3.wav");
+	}
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = _("%s is now thinking with portals");
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+			w_deathtypestring = _("%2$s slapped %1$s around a bit with a large pumpshotgun");
+		else
+			w_deathtypestring = _("%s was gunned down with a pumpshotgun by %s");
+	}
+	return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_rocketlauncher.qc b/qcsrc/server/w_rocketlauncher.qc
index 723389e..d3ea7cb 100644
--- a/qcsrc/server/w_rocketlauncher.qc
+++ b/qcsrc/server/w_rocketlauncher.qc
@@ -4,6 +4,7 @@ REGISTER_WEAPON(ROCKET_LAUNCHER, w_rlauncher, IT_ROCKETS, 9, WEP_FLAG_NORMAL | W
 #ifdef SVQC
 .float rl_release;
 .float rl_detonate_later;
+float autocvar_g_balance_rocketlauncher_enableshockwave;
 
 void W_Rocket_Unregister()
 {
@@ -18,6 +19,12 @@ void W_Rocket_Explode ()
 {
 	W_Rocket_Unregister();
 
+	if(autocvar_g_balance_rocketlauncher_primary_failurerate &&
+ 	(autocvar_g_balance_rocketlauncher_primary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your rocket was a dud\n");
+	} else {
+	
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.realowner, other))
@@ -30,6 +37,16 @@ void W_Rocket_Explode ()
 
 	RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
 
+
+	//Start Explosion Shockwave and fireball
+	if (autocvar_g_balance_rocketlauncher_enableshockwave == 1) {
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_rocketlauncher_radius, 0.95, 0.05, 0.25);
+	}
+	//End Explosion Shockwave and Fireball
+	
+	} //End To Dud or not to dud.
+	
+	
 	if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
 	{
 		if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
@@ -39,17 +56,39 @@ void W_Rocket_Explode ()
 			self.realowner.switchweapon = w_getbestweapon(self.realowner);
 		}
 	}
+	
 	remove (self);
 }
 
 void W_Rocket_DoRemoteExplode ()
 {
 	W_Rocket_Unregister();
+	
+	if(autocvar_g_balance_rocketlauncher_commlink_failurerate &&
+ 	(autocvar_g_balance_rocketlauncher_commlink_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your rocket experienced a commlink error\n");
+	} else {
+	
+	
+	if(autocvar_g_balance_rocketlauncher_secondary_failurerate &&
+ 	(autocvar_g_balance_rocketlauncher_secondary_failurerate > random() ))
+ 	{
+		sprint(self.owner, "Your rocket flew but never died\n");
+	} else {
 
 	self.event_damage = SUB_Null;
 	self.takedamage = DAMAGE_NO;
 
 	RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+	
+	//Start Explosion Shockwave and fireball
+	if (autocvar_g_balance_rocketlauncher_enableshockwave == 1) {
+		modeleffect_spawn("models/sphere/sphexp.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_rocketlauncher_remote_radius, 0.95, 0.05, 0.25);
+	}
+	//End Explosion Shockwave and Fireball
+	
+	} //End To Dud or not to dud.
 
 	if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
 	{
@@ -61,6 +100,8 @@ void W_Rocket_DoRemoteExplode ()
 		}
 	}
 	remove (self);
+	
+	} //End Commlink Error
 }
 
 entity FindLaserTarget(entity e, float dist_variance, float dot_variance)
@@ -445,6 +486,7 @@ float w_rlauncher(float req)
 	}
 	else if (req == WR_PRECACHE)
 	{
+		precache_model ("models/sphere/sphexp.md3");
 		precache_model ("models/flash.md3");
 		precache_model ("models/weapons/g_rl.md3");
 		precache_model ("models/weapons/v_rl.md3");
diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc
index c4c08bb..199171e 100644
--- a/qcsrc/server/w_seeker.qc
+++ b/qcsrc/server/w_seeker.qc
@@ -12,9 +12,17 @@ REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 8, WEP_FLAG_RELOADABLE | WEP_TYPE_
 // ============================
 void Seeker_Missile_Explode ()
 {
+	if(autocvar_g_balance_seeker_missile_failurerate &&
+ 	(autocvar_g_balance_seeker_missile_failurerate > random() ))
+ 	{
+		sprint(self.owner, "One of your missiles was a dud\n");
+	} else {
+	
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
 
+	} //End To Dud or not to dud.
+
 	remove (self);
 }
 
diff --git a/qcsrc/server/w_shotgun.qc b/qcsrc/server/w_shotgun.qc
index fcf9a27..4dcb246 100644
--- a/qcsrc/server/w_shotgun.qc
+++ b/qcsrc/server/w_shotgun.qc
@@ -2,6 +2,7 @@
 REGISTER_WEAPON(SHOTGUN, w_shotgun, IT_SHELLS, 2, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_LOW, "shotgun", "shotgun", _("Shotgun"))
 #else
 #ifdef SVQC
+.float shotgun_jammed;
 
 void W_Shotgun_Attack (void)
 {
@@ -25,6 +26,13 @@ void W_Shotgun_Attack (void)
 
 	W_DecreaseAmmo(ammo_shells, ammoamount, autocvar_g_balance_shotgun_reload_ammo);
 
+	if (autocvar_g_balance_shotgun_jamrate &&
+ 	(autocvar_g_balance_shotgun_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your shotgun jammed\n");
+		self.shotgun_jammed = 1;
+	} else { //Start Not Jammed
+
 	W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d * bullets);
 	for (sc = 0;sc < bullets;sc = sc + 1)
 		fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
@@ -44,6 +52,8 @@ void W_Shotgun_Attack (void)
 	flash.nextthink = time + 0.06;
 	flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
 	W_AttachToShotorg(flash, '5 0 0');
+	
+	} //End Not Jammed
 }
 
 .float swing_prev;
@@ -185,7 +195,8 @@ float w_shotgun(float req)
 		}
 		else
 		{
-			if (self.BUTTON_ATCK)
+			if ((self.BUTTON_ATCK) &&
+			(self.shotgun_jammed != 1))
 			{
 				if (time >= self.shotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary
 				{
@@ -236,7 +247,13 @@ float w_shotgun(float req)
 	}
 	else if (req == WR_RELOAD)
 	{
-		W_Reload(autocvar_g_balance_shotgun_primary_ammo, autocvar_g_balance_shotgun_reload_ammo, autocvar_g_balance_shotgun_reload_time, "weapons/reload.wav");
+		if (self.shotgun_jammed) {
+			weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_shotgun_clearjam_time, w_ready);
+			self.shotgun_jammed = 0;
+			sprint(self.owner, "You cleared the jam\n");
+		} else {
+			W_Reload(autocvar_g_balance_shotgun_primary_ammo, autocvar_g_balance_shotgun_reload_ammo, autocvar_g_balance_shotgun_reload_time, "weapons/reload.wav");
+		}
 	}
 	return TRUE;
 }
diff --git a/qcsrc/server/w_shotgunautomat.qc b/qcsrc/server/w_shotgunautomat.qc
new file mode 100644
index 0000000..f1cb5ac
--- /dev/null
+++ b/qcsrc/server/w_shotgunautomat.qc
@@ -0,0 +1,289 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(SHOTGUNAUTOMAT, w_shotgunautomat, IT_SHELLS, 3, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "shotgunautomat", "shotgunautomat", _("ShotgunAutomat"))
+#else
+#ifdef SVQC
+.float shotgunautomat_jammed;
+
+void W_ShotgunAutomat_Attack (void)
+{
+	float	sc;
+	float	ammoamount;
+	float	bullets;
+	float	d;
+	float	f;
+	float	spread;
+	float	bulletspeed;
+	float	bulletconstant;
+	local entity flash;
+
+	ammoamount = autocvar_g_balance_shotgunautomat_primary_ammo;
+	bullets = autocvar_g_balance_shotgunautomat_primary_bullets;
+	d = autocvar_g_balance_shotgunautomat_primary_damage;
+	f = autocvar_g_balance_shotgunautomat_primary_force;
+	spread = autocvar_g_balance_shotgunautomat_primary_spread;
+	bulletspeed = autocvar_g_balance_shotgunautomat_primary_speed;
+	bulletconstant = autocvar_g_balance_shotgunautomat_primary_bulletconstant;
+
+	W_DecreaseAmmo(ammo_shells, ammoamount, autocvar_g_balance_shotgunautomat_reload_ammo);
+
+	if (autocvar_g_balance_shotgunautomat_jamrate &&
+ 	(autocvar_g_balance_shotgunautomat_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your automatic shotgun jammed\n");
+		self.shotgunautomat_jammed = 1;
+	} else { //Start Not Jammed
+	
+	W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d * bullets);
+	for (sc = 0;sc < bullets;sc = sc + 1)
+		fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUNAUTOMAT, 0, 1, bulletconstant);
+	endFireBallisticBullet();
+
+	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, autocvar_g_balance_shotgunautomat_primary_ammo);
+
+	// casing code
+	if (autocvar_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, self);
+
+	// muzzle flash for 1st person view
+	flash = spawn();
+	setmodel(flash, "models/uziflash.md3"); // precision set below
+	flash.think = SUB_Remove;
+	flash.nextthink = time + 0.06;
+	flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+	W_AttachToShotorg(flash, '5 0 0');
+	
+	} //End Not Jammed
+}
+
+entity lgbeam_owner_ent;
+void shotgunautomat_meleethink (void)
+{
+	// store time when we started swinging down inside self.cnt
+	if(!self.cnt)
+		self.cnt = time;
+
+	makevectors(self.realowner.v_angle);
+	vector angle;
+	angle = v_forward;
+
+	float meleetime;
+	meleetime = autocvar_g_balance_shotgunautomat_secondary_melee_time * W_WeaponRateFactor();
+
+	// perform trace
+	float f;
+	f = (self.cnt + meleetime - time) / meleetime * 2 - 1;
+	vector targpos;
+	targpos = self.realowner.origin + self.realowner.view_ofs + angle * autocvar_g_balance_shotgunautomat_secondary_melee_range + v_right * f * autocvar_g_balance_shotgunautomat_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgunautomat_secondary_melee_swing;
+
+	if(!lgbeam_owner_ent)
+	{
+		lgbeam_owner_ent = spawn();
+		lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+	}
+	WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner));
+
+	// apply the damage, also remove self
+	if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body"))
+	{
+		vector force;
+		force = angle * autocvar_g_balance_shotgunautomat_secondary_force;
+		if(accuracy_isgooddamage(self.realowner, trace_ent))
+			accuracy_add(self.realowner, WEP_SHOTGUNAUTOMAT, 0, autocvar_g_balance_shotgunautomat_secondary_damage * min(1, f + 1));
+		Damage (trace_ent, self.realowner, self.realowner, autocvar_g_balance_shotgunautomat_secondary_damage * min(1, f + 1), WEP_SHOTGUNAUTOMAT | HITTYPE_SECONDARY , self.realowner.origin + self.realowner.view_ofs, force);
+		remove(self);
+	}
+	else if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgunautomat_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
+		remove(self);
+	else // continue swinging the weapon in hope of hitting someone :)
+		self.nextthink = time;
+}
+
+void W_ShotgunAutomat_Attack2 (void)
+{
+	float	sc2;
+	float	ammoamount2;
+	float	bullets2;
+	float	d2;
+	float	f2;
+	float	spread2;
+	float	bulletspeed2;
+	float	bulletconstant2;
+	local entity flash;
+
+	ammoamount2 = autocvar_g_balance_shotgunautomat_secondary_ammo;
+	bullets2 = autocvar_g_balance_shotgunautomat_secondary_bullets;
+	d2 = autocvar_g_balance_shotgunautomat_secondary_damage;
+	f2 = autocvar_g_balance_shotgunautomat_secondary_force;
+	spread2 = autocvar_g_balance_shotgunautomat_secondary_spread;
+	bulletspeed2 = autocvar_g_balance_shotgunautomat_secondary_speed;
+	bulletconstant2 = autocvar_g_balance_shotgunautomat_secondary_bulletconstant;
+
+	W_DecreaseAmmo(ammo_shells, ammoamount2, autocvar_g_balance_shotgunautomat_reload_ammo);
+
+	if (autocvar_g_balance_shotgunautomat_jamrate &&
+ 	(autocvar_g_balance_shotgunautomat_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your shotgun jammed\n");
+		self.shotgunautomat_jammed = 1;
+	} else { //Start Not Jammed
+
+	W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed2 >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d2 * bullets2);
+	for (sc2 = 0;sc2 < bullets2;sc2 = sc2 + 1)
+		fireBallisticBullet(w_shotorg, w_shotdir, spread2, bulletspeed2, 5, d2, 0, f2, WEP_SHOTGUNAUTOMAT, 0, 1, bulletconstant2);
+	endFireBallisticBullet();
+
+	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, autocvar_g_balance_shotgunautomat_secondary_ammo);
+
+	// casing code
+	if (autocvar_g_casings >= 1) {
+		for (sc2 = 0;sc2 < ammoamount2;sc2 = sc2 + 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();
+	setmodel(flash, "models/uziflash.md3"); // precision set below
+	flash.think = SUB_Remove;
+	flash.nextthink = time + 0.06;
+	flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+	W_AttachToShotorg(flash, '5 0 0');
+	
+	} //End Not Jammed
+}
+
+void spawnfunc_weapon_shotgunautomat (void)
+{
+	weapon_defaultspawnfunc(WEP_SHOTGUNAUTOMAT);
+}
+
+.float shotgun_primarytime;
+.float shotgun_secondarytime;
+
+float w_shotgunautomat(float req)
+{
+	float ammo_amount;
+	if (req == WR_AIM)
+		if(vlen(self.origin-self.enemy.origin) <= autocvar_g_balance_shotgunautomat_secondary_melee_range)
+			self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
+		else
+			self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+	else if (req == WR_THINK)
+	{
+		if(autocvar_g_balance_shotgunautomat_reload_ammo && self.clip_load < autocvar_g_balance_shotgunautomat_primary_ammo) // forced reload
+		{
+			// don't force reload an empty shotgun if its melee attack is active
+			//if not(autocvar_g_balance_shotgunautomat_secondary && self.ammo_shells < autocvar_g_balance_shotgunautomat_primary_ammo)
+				weapon_action(self.weapon, WR_RELOAD);
+		}
+		else
+		{
+			if ((self.BUTTON_ATCK) &&
+			(self.shotgunautomat_jammed != 1))
+			{
+				if (time >= self.shotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary
+				{
+					if(weapon_prepareattack(0, autocvar_g_balance_shotgunautomat_primary_animtime))
+					{
+						W_ShotgunAutomat_Attack();
+						self.shotgun_primarytime = time + autocvar_g_balance_shotgunautomat_primary_refire;
+						weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_shotgunautomat_primary_animtime, w_ready);
+					}
+				}
+			}
+			else if ((self.BUTTON_ATCK2) &&
+			(self.shotgunautomat_jammed != 1))
+			{
+				if (time >= self.shotgun_secondarytime) // handle refire separately so the secondary can be fired straight after a secondary
+				{
+					if(weapon_prepareattack(0, autocvar_g_balance_shotgunautomat_secondary_animtime))
+					{
+					W_ShotgunAutomat_Attack2();
+					self.shotgun_secondarytime = time + autocvar_g_balance_shotgunautomat_secondary_refire;
+					weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_shotgunautomat_secondary_animtime, w_ready);
+					}
+				}
+			}
+		}
+		//if (self.clip_load >= 0) // we are not currently reloading
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/uziflash.md3");
+		precache_model ("models/weapons/g_shotgunautomat.md3");
+		precache_model ("models/weapons/v_shotgunautomat.md3");
+		precache_model ("models/weapons/h_shotgunautomat.iqm");
+		precache_sound ("misc/itempickup.wav");
+		precache_sound ("weapons/shotgun_fire.wav");
+		precache_sound ("weapons/shotgun_melee.wav");
+		//precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
+	}
+	else if (req == WR_SETUP)
+	{
+		weapon_setup(WEP_SHOTGUNAUTOMAT);
+		self.current_ammo = ammo_shells;
+	}
+	else if (req == WR_CHECKAMMO1)
+	{
+		ammo_amount = self.ammo_shells >= autocvar_g_balance_shotgunautomat_primary_ammo;
+		ammo_amount += self.weapon_load[WEP_SHOTGUNAUTOMAT] >= autocvar_g_balance_shotgunautomat_primary_ammo;
+		return ammo_amount;
+	}
+	else if (req == WR_CHECKAMMO2)
+	{
+		// melee attack is always available
+		return TRUE;
+	}
+	else if (req == WR_RELOAD)
+	{
+		if (self.shotgunautomat_jammed) {
+			weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_shotgunautomat_clearjam_time, w_ready);
+			self.shotgunautomat_jammed = 0;
+			sprint(self.owner, "You cleared the jam\n");
+		} else {
+			W_Reload(autocvar_g_balance_shotgunautomat_primary_ammo, autocvar_g_balance_shotgunautomat_reload_ammo, autocvar_g_balance_shotgunautomat_reload_time, "weapons/reload.wav");
+		}
+	}
+	return TRUE;
+};
+#endif
+#ifdef CSQC
+.float prevric;
+float w_shotgunautomat(float req)
+{
+	if(req == WR_IMPACTEFFECT)
+	{
+		vector org2;
+		org2 = w_org + w_backoff * 2;
+		pointparticles(particleeffectnum("shotgun_impact"), org2, w_backoff * 1000, 1);
+		if(!w_issilent && time - self.prevric > 0.25)
+		{
+			if(w_random < 0.0165)
+				sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.033)
+				sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+			else if(w_random < 0.05)
+				sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+			self.prevric = time;
+		}
+	}
+	else if(req == WR_PRECACHE)
+	{
+		precache_sound("weapons/ric1.wav");
+		precache_sound("weapons/ric2.wav");
+		precache_sound("weapons/ric3.wav");
+	}
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = _("%s is now thinking with portals");
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+			w_deathtypestring = _("%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun");
+		else
+			w_deathtypestring = _("%s was gunned by %s");
+	}
+	return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_uzi.qc b/qcsrc/server/w_uzi.qc
index 77d8b4a..f9a84ad 100644
--- a/qcsrc/server/w_uzi.qc
+++ b/qcsrc/server/w_uzi.qc
@@ -2,6 +2,7 @@
 REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", _("Machine Gun"))
 #else
 #ifdef SVQC
+.float uzi_jammed;
 
 // leilei's fancy muzzleflash stuff
 void UZI_Flash_Go()
@@ -41,6 +42,13 @@ void UziFlash()
 
 void W_UZI_Attack (float deathtype)
 {
+	if (autocvar_g_balance_uzi_jamrate &&
+ 	(autocvar_g_balance_uzi_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your gun jammed\n");
+		self.uzi_jammed = 1;
+	} else { //Start Not Jammed
+	
 	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage));
 	if (!g_norecoil)
 	{
@@ -66,6 +74,8 @@ void W_UZI_Attack (float deathtype)
 	if (autocvar_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, self);
 
+	} //End Not Jammed
+	
 	if (self.misc_bulletcounter == 1)
 		W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_first_ammo, autocvar_g_balance_uzi_reload_ammo);
 	else
@@ -80,7 +90,15 @@ void uzi_fire1_02()
 		w_ready();
 		return;
 	}
+	
+	if (self.uzi_jammed)
+	{
+		w_ready();
+		return;
+	}
+	
 	if (self.BUTTON_ATCK)
+	if (self.uzi_jammed != 1)
 	{
 		if (!weapon_action(self.weapon, WR_CHECKAMMO2))
 		if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
@@ -102,6 +120,12 @@ void uzi_mode1_fire_auto()
 {
 	float uzi_spread;
 
+	if (self.uzi_jammed)
+	{
+		w_ready();
+		return;
+	}
+	
 	if (!self.BUTTON_ATCK)
 	{
 		w_ready();
@@ -118,6 +142,13 @@ void uzi_mode1_fire_auto()
 
 	W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_reload_ammo);
 
+	if(autocvar_g_balance_uzi_jamrate &&
+ 	(autocvar_g_balance_uzi_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your gun jammed\n");
+		self.uzi_jammed = 1;
+	} else { //Start Not Jammed
+
 	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage);
 	if (!g_norecoil)
 	{
@@ -139,12 +170,27 @@ void uzi_mode1_fire_auto()
 	if (autocvar_g_casings >= 2) // casing code
 		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);
 
+	} //End Not Jammed
+	
 	ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
 	weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
 }
 
 void uzi_mode1_fire_burst()
 {
+	if (self.uzi_jammed)
+	{
+		w_ready();
+		return;
+	}
+	
+	if(autocvar_g_balance_uzi_jamrate &&
+ 	(autocvar_g_balance_uzi_jamrate > random() ))
+ 	{
+		sprint(self.owner, "Your gun jammed\n");
+		self.uzi_jammed = 1;
+	} else { //Start Not Jammed
+	
 	W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage);
 	if (!g_norecoil)
 	{
@@ -165,6 +211,9 @@ void uzi_mode1_fire_burst()
 		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.misc_bulletcounter = self.misc_bulletcounter + 1;
+	
+	} //End Not Jammed
+	
 	if (self.misc_bulletcounter == 0)
 	{
 		ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_burst_refire2 * W_WeaponRateFactor();
@@ -196,6 +245,7 @@ float w_uzi(float req)
 		else if(autocvar_g_balance_uzi_mode == 1)
 		{
 			if (self.BUTTON_ATCK)
+			if (self.uzi_jammed != 1)
 			if (weapon_prepareattack(0, 0))
 			{
 				self.misc_bulletcounter = 0;
@@ -203,6 +253,7 @@ float w_uzi(float req)
 			}
 
 			if(self.BUTTON_ATCK2)
+			if (self.uzi_jammed != 1)
 			if(weapon_prepareattack(1, 0))
 			{
 				if (!weapon_action(self.weapon, WR_CHECKAMMO2))
@@ -223,6 +274,7 @@ float w_uzi(float req)
 		{
 
 			if (self.BUTTON_ATCK)
+			if (self.uzi_jammed != 1)
 			if (weapon_prepareattack(0, 0))
 			{
 				self.misc_bulletcounter = 1;
@@ -231,6 +283,7 @@ float w_uzi(float req)
 			}
 
 			if (self.BUTTON_ATCK2 && autocvar_g_balance_uzi_first)
+			if (self.uzi_jammed != 1)
 			if (weapon_prepareattack(1, 0))
 			{
 				self.misc_bulletcounter = 1;
@@ -287,7 +340,13 @@ float w_uzi(float req)
 	}
 	else if (req == WR_RELOAD)
 	{
-		W_Reload(min(max(autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_first_ammo), autocvar_g_balance_uzi_burst_ammo), autocvar_g_balance_uzi_reload_ammo, autocvar_g_balance_uzi_reload_time, "weapons/reload.wav");
+		if (self.uzi_jammed) {
+			weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_uzi_clearjam_time, w_ready);
+			self.uzi_jammed = 0;
+			sprint(self.owner, "You cleared the jam\n");
+		} else {
+			W_Reload(min(max(autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_first_ammo), autocvar_g_balance_uzi_burst_ammo), autocvar_g_balance_uzi_reload_ammo, autocvar_g_balance_uzi_reload_time, "weapons/reload.wav");
+		}
 	}
 	return TRUE;
 }
diff --git a/scripts/shotgunautomat.shader b/scripts/shotgunautomat.shader
new file mode 100644
index 0000000..f6437b6
--- /dev/null
+++ b/scripts/shotgunautomat.shader
@@ -0,0 +1,10 @@
+shotautosight
+{
+	surfaceparm trans
+
+	{
+		map textures/shotautosight.tga
+		blendfunc add
+		//rgbGen vertex
+	}	
+}
diff --git a/shootfromhip.cfg b/shootfromhip.cfg
new file mode 100644
index 0000000..57218f0
--- /dev/null
+++ b/shootfromhip.cfg
@@ -0,0 +1,2 @@
+g_shootfromfixedorigin ""
+g_shootfromclient 2
diff --git a/shootfromleftshoulder.cfg b/shootfromleftshoulder.cfg
new file mode 100644
index 0000000..2b6923e
--- /dev/null
+++ b/shootfromleftshoulder.cfg
@@ -0,0 +1,2 @@
+g_shootfromfixedorigin "0 12 -5"
+g_shootfromclient 0
diff --git a/shootfromrightshoulder.cfg b/shootfromrightshoulder.cfg
new file mode 100644
index 0000000..c20b523
--- /dev/null
+++ b/shootfromrightshoulder.cfg
@@ -0,0 +1,2 @@
+g_shootfromfixedorigin "0 -12 -5"
+g_shootfromclient 0
diff --git a/shotgunautomat.cfg b/shotgunautomat.cfg
new file mode 100644
index 0000000..a9808e9
--- /dev/null
+++ b/shotgunautomat.cfg
@@ -0,0 +1,36 @@
+// }}}
+// {{{ shotgunautomat
+set g_balance_shotgunautomat_primary_bullets 14
+set g_balance_shotgunautomat_primary_damage 4
+set g_balance_shotgunautomat_primary_force 15
+set g_balance_shotgunautomat_primary_spread 0.12
+set g_balance_shotgunautomat_primary_refire 0.1
+set g_balance_shotgunautomat_primary_animtime 0.1
+set g_balance_shotgunautomat_primary_ammo 1
+set g_balance_shotgunautomat_primary_speed 8000
+set g_balance_shotgunautomat_primary_bulletconstant 75 // 3.8qu
+set g_balance_shotgunautomat_secondary 1
+set g_balance_shotgunautomat_secondary_melee_delay 0.25 // 0.35 was too slow
+set g_balance_shotgunautomat_secondary_melee_range 120
+set g_balance_shotgunautomat_secondary_melee_swing 50
+set g_balance_shotgunautomat_secondary_melee_time 0.1
+set g_balance_shotgunautomat_secondary_melee_no_doubleslap 1
+
+set g_balance_shotgunautomat_secondary_bullets 42
+set g_balance_shotgunautomat_secondary_damage 4
+set g_balance_shotgunautomat_secondary_force 15
+set g_balance_shotgunautomat_secondary_spread 0.24
+set g_balance_shotgunautomat_secondary_refire 0.8
+set g_balance_shotgunautomat_secondary_animtime 0.2
+set g_balance_shotgunautomat_secondary_ammo 3
+set g_balance_shotgunautomat_secondary_speed 8000
+set g_balance_shotgunautomat_secondary_bulletconstant 75 // 3.8qu
+
+set g_balance_shotgunautomat_reload_ammo 0 //default: 8
+set g_balance_shotgunautomat_reload_time 2
+// }}}
+
+seta crosshair_shotgunautomat ""	"crosshair to display when wielding the shotgunautomat"
+seta crosshair_shotgunautomat_color "1.0 0.3 0.0"	"crosshair color to display when wielding the shotgunautomat"
+seta crosshair_shotgunautomat_alpha 1.1	"crosshair alpha value to display when wielding the shotgunautomat"
+seta crosshair_shotgunautomat_size 0.65	"crosshair size when wielding the shotgunautomat"
diff --git a/sound/weapons/pumpshotgun_rack.ogg b/sound/weapons/pumpshotgun_rack.ogg
new file mode 100644
index 0000000..b2a5e68
Binary files /dev/null and b/sound/weapons/pumpshotgun_rack.ogg differ
diff --git a/textures/nukelayer.tga b/textures/nukelayer.tga
new file mode 100644
index 0000000..fe6384d
Binary files /dev/null and b/textures/nukelayer.tga differ
diff --git a/textures/nukelayer_gloss.tga b/textures/nukelayer_gloss.tga
new file mode 100644
index 0000000..2ca8b9a
Binary files /dev/null and b/textures/nukelayer_gloss.tga differ
diff --git a/textures/nukelayer_glow.tga b/textures/nukelayer_glow.tga
new file mode 100644
index 0000000..34e865f
Binary files /dev/null and b/textures/nukelayer_glow.tga differ
diff --git a/textures/nukelaynukemine.tga b/textures/nukelaynukemine.tga
new file mode 100644
index 0000000..b53f995
Binary files /dev/null and b/textures/nukelaynukemine.tga differ
diff --git a/textures/nukelaynukemine_gloss.tga b/textures/nukelaynukemine_gloss.tga
new file mode 100644
index 0000000..2e084c3
Binary files /dev/null and b/textures/nukelaynukemine_gloss.tga differ
diff --git a/textures/nukelaynukemine_glow.tga b/textures/nukelaynukemine_glow.tga
new file mode 100644
index 0000000..aff112e
Binary files /dev/null and b/textures/nukelaynukemine_glow.tga differ
diff --git a/textures/shotauto.tga b/textures/shotauto.tga
new file mode 100644
index 0000000..91da941
Binary files /dev/null and b/textures/shotauto.tga differ
diff --git a/textures/shotauto_gloss.tga b/textures/shotauto_gloss.tga
new file mode 100644
index 0000000..78fdd31
Binary files /dev/null and b/textures/shotauto_gloss.tga differ
diff --git a/textures/shotauto_glow.tga b/textures/shotauto_glow.tga
new file mode 100644
index 0000000..c49c2e5
Binary files /dev/null and b/textures/shotauto_glow.tga differ
diff --git a/textures/shotauto_norm.tga b/textures/shotauto_norm.tga
new file mode 100644
index 0000000..100b3a4
Binary files /dev/null and b/textures/shotauto_norm.tga differ
diff --git a/textures/shotauto_shirt.tga b/textures/shotauto_shirt.tga
new file mode 100644
index 0000000..418d3ea
Binary files /dev/null and b/textures/shotauto_shirt.tga differ
diff --git a/textures/shotautosight.tga b/textures/shotautosight.tga
new file mode 100644
index 0000000..36ce078
Binary files /dev/null and b/textures/shotautosight.tga differ
diff --git a/textures/shotautosight_glow.tga b/textures/shotautosight_glow.tga
new file mode 100644
index 0000000..3aed968
Binary files /dev/null and b/textures/shotautosight_glow.tga differ
diff --git a/textures/shotautosight_shirt.tga b/textures/shotautosight_shirt.tga
new file mode 100644
index 0000000..ef8fd83
Binary files /dev/null and b/textures/shotautosight_shirt.tga differ
diff --git a/textures/somepistol.tga b/textures/somepistol.tga
new file mode 100644
index 0000000..75da7a4
Binary files /dev/null and b/textures/somepistol.tga differ
diff --git a/textures/somepistol_colormap.xcf b/textures/somepistol_colormap.xcf
new file mode 100644
index 0000000..67f8a58
Binary files /dev/null and b/textures/somepistol_colormap.xcf differ
diff --git a/textures/somepistol_gloss.tga b/textures/somepistol_gloss.tga
new file mode 100644
index 0000000..e7b0770
Binary files /dev/null and b/textures/somepistol_gloss.tga differ
diff --git a/textures/somepistol_gloss.xcf b/textures/somepistol_gloss.xcf
new file mode 100644
index 0000000..e5c6efd
Binary files /dev/null and b/textures/somepistol_gloss.xcf differ
diff --git a/textures/somepistol_glow.tga b/textures/somepistol_glow.tga
new file mode 100644
index 0000000..e58bac2
Binary files /dev/null and b/textures/somepistol_glow.tga differ
diff --git a/textures/somepistol_norm.tga b/textures/somepistol_norm.tga
new file mode 100644
index 0000000..f39dc99
Binary files /dev/null and b/textures/somepistol_norm.tga differ
diff --git a/textures/somepistol_shirt.tga b/textures/somepistol_shirt.tga
new file mode 100644
index 0000000..02dba0c
Binary files /dev/null and b/textures/somepistol_shirt.tga differ

