From 5fd740c8af8d516339caa0797f51165d211d056d Mon Sep 17 00:00:00 2001
From: Mario <mario.mario@y7mail.com>
Date: Mon, 7 Oct 2013 09:12:36 -0700
Subject: [PATCH] Begin cleaning up some mess

---
 balance25.cfg                                 |  39 ++++++
 balanceFruitieX.cfg                           |  39 ++++++
 balanceXDF.cfg                                |  37 +++++
 balanceXPM.cfg                                |  38 ++++++
 balanceXonotic.cfg                            |  42 ++++++
 defaultXonotic.cfg                            |   2 +
 mutators.cfg                                  |  17 +++
 overkill.cfg                                  | 129 ++++++++++++++++++
 qcsrc/client/autocvars.qh                     |  10 ++
 qcsrc/client/projectile.qc                    |  15 +-
 qcsrc/client/waypointsprites.qc               |   2 +
 qcsrc/common/constants.qh                     |   2 +
 qcsrc/common/notifications.qh                 |  14 +-
 .../dialog_multiplayer_create_mutators.c      |   7 +-
 qcsrc/server/autocvars.qh                     |  28 ++++
 qcsrc/server/miscfunctions.qc                 |   1 +
 qcsrc/server/mutators/mutators.qh             |   2 +
 qcsrc/server/progs.src                        |   2 +
 qcsrc/server/w_all.qc                         |   3 +
 19 files changed, 415 insertions(+), 14 deletions(-)
 create mode 100644 overkill.cfg

diff --git a/balance25.cfg b/balance25.cfg
index 9451d377d9..0ef9549534 100644
--- a/balance25.cfg
+++ b/balance25.cfg
@@ -705,3 +705,42 @@ set g_balance_fireball_secondary_spread 0
 set g_balance_fireball_switchdelay_drop 0.15
 set g_balance_fireball_switchdelay_raise 0.15
 // }}}
+
+
+// {{{ heavy machine gun
+set g_balance_hmg_spread_min 0.02
+set g_balance_hmg_spread_max 0.05
+set g_balance_hmg_spread_add 0.01
+
+set g_balance_hmg_sustained_damage 10 // 200 dps
+set g_balance_hmg_sustained_headshotaddeddamage 0
+set g_balance_hmg_sustained_force 5
+set g_balance_hmg_sustained_spread 0.03
+set g_balance_hmg_sustained_refire 0.05
+set g_balance_hmg_sustained_ammo 1
+
+set g_balance_hmg_speed 24000
+set g_balance_hmg_bulletconstant 115 // 13.1qu
+
+set g_balance_hmg_reload_ammo 120 //default: 30
+set g_balance_hmg_reload_time 1
+// }}}
+
+// {{{ RPC
+set g_balance_rpc_ammo 10
+set g_balance_rpc_animtime 1
+set g_balance_rpc_damage 150
+set g_balance_rpc_damage2 500
+set g_balance_rpc_damageforcescale 2
+set g_balance_rpc_edgedamage 50
+set g_balance_rpc_force 400
+set g_balance_rpc_health 25
+set g_balance_rpc_lifetime 30
+set g_balance_rpc_radius 300
+set g_balance_rpc_refire 1
+set g_balance_rpc_speed 1250
+set g_balance_rpc_speedaccel 0
+set g_balance_rpc_speedstart 1250
+set g_balance_rpc_reload_ammo 10
+set g_balance_rpc_reload_time 1
+// }}}
diff --git a/balanceFruitieX.cfg b/balanceFruitieX.cfg
index f985659f9c..599c7ce14e 100644
--- a/balanceFruitieX.cfg
+++ b/balanceFruitieX.cfg
@@ -705,3 +705,42 @@ set g_balance_fireball_secondary_spread 0
 set g_balance_fireball_switchdelay_drop 0.15
 set g_balance_fireball_switchdelay_raise 0.15
 // }}}
+
+
+// {{{ heavy machine gun
+set g_balance_hmg_spread_min 0.02
+set g_balance_hmg_spread_max 0.05
+set g_balance_hmg_spread_add 0.01
+
+set g_balance_hmg_sustained_damage 10 // 200 dps
+set g_balance_hmg_sustained_headshotaddeddamage 0
+set g_balance_hmg_sustained_force 5
+set g_balance_hmg_sustained_spread 0.03
+set g_balance_hmg_sustained_refire 0.05
+set g_balance_hmg_sustained_ammo 1
+
+set g_balance_hmg_speed 24000
+set g_balance_hmg_bulletconstant 115 // 13.1qu
+
+set g_balance_hmg_reload_ammo 120 //default: 30
+set g_balance_hmg_reload_time 1
+// }}}
+
+// {{{ RPC
+set g_balance_rpc_ammo 10
+set g_balance_rpc_animtime 1
+set g_balance_rpc_damage 150
+set g_balance_rpc_damage2 500
+set g_balance_rpc_damageforcescale 2
+set g_balance_rpc_edgedamage 50
+set g_balance_rpc_force 400
+set g_balance_rpc_health 25
+set g_balance_rpc_lifetime 30
+set g_balance_rpc_radius 300
+set g_balance_rpc_refire 1
+set g_balance_rpc_speed 1250
+set g_balance_rpc_speedaccel 0
+set g_balance_rpc_speedstart 1250
+set g_balance_rpc_reload_ammo 10
+set g_balance_rpc_reload_time 1
+// }}}
diff --git a/balanceXDF.cfg b/balanceXDF.cfg
index 4e06315238..591bc8d430 100644
--- a/balanceXDF.cfg
+++ b/balanceXDF.cfg
@@ -705,3 +705,40 @@ set g_balance_fireball_secondary_spread 0
 set g_balance_fireball_switchdelay_drop 0
 set g_balance_fireball_switchdelay_raise 0
 // }}}
+// {{{ heavy machine gun
+set g_balance_hmg_spread_min 0.02
+set g_balance_hmg_spread_max 0.05
+set g_balance_hmg_spread_add 0.01
+
+set g_balance_hmg_sustained_damage 10 // 200 dps
+set g_balance_hmg_sustained_headshotaddeddamage 0
+set g_balance_hmg_sustained_force 5
+set g_balance_hmg_sustained_spread 0.03
+set g_balance_hmg_sustained_refire 0.05
+set g_balance_hmg_sustained_ammo 1
+
+set g_balance_hmg_speed 24000
+set g_balance_hmg_bulletconstant 115 // 13.1qu
+
+set g_balance_hmg_reload_ammo 120 //default: 30
+set g_balance_hmg_reload_time 1
+// }}}
+// {{{ RPC
+set g_balance_rpc_ammo 10
+set g_balance_rpc_animtime 1
+set g_balance_rpc_damage 150
+set g_balance_rpc_damage2 500
+set g_balance_rpc_damageforcescale 2
+set g_balance_rpc_edgedamage 50
+set g_balance_rpc_force 400
+set g_balance_rpc_health 25
+set g_balance_rpc_lifetime 30
+set g_balance_rpc_radius 300
+set g_balance_rpc_refire 1
+set g_balance_rpc_speed 1250
+set g_balance_rpc_speedaccel 0
+set g_balance_rpc_speedstart 1250
+set g_balance_rpc_reload_ammo 10
+set g_balance_rpc_reload_time 1
+// }}}
+
diff --git a/balanceXPM.cfg b/balanceXPM.cfg
index 8c171476a1..fdce03b729 100644
--- a/balanceXPM.cfg
+++ b/balanceXPM.cfg
@@ -705,3 +705,41 @@ set g_balance_fireball_secondary_spread 0
 set g_balance_fireball_switchdelay_drop 0.2
 set g_balance_fireball_switchdelay_raise 0.2
 // }}}
+
+// {{{ heavy machine gun
+set g_balance_hmg_spread_min 0.02
+set g_balance_hmg_spread_max 0.05
+set g_balance_hmg_spread_add 0.01
+
+set g_balance_hmg_sustained_damage 10 // 200 dps
+set g_balance_hmg_sustained_headshotaddeddamage 0
+set g_balance_hmg_sustained_force 5
+set g_balance_hmg_sustained_spread 0.03
+set g_balance_hmg_sustained_refire 0.05
+set g_balance_hmg_sustained_ammo 1
+
+set g_balance_hmg_speed 24000
+set g_balance_hmg_bulletconstant 115 // 13.1qu
+
+set g_balance_hmg_reload_ammo 120 //default: 30
+set g_balance_hmg_reload_time 1
+// }}}
+
+// {{{ RPC
+set g_balance_rpc_ammo 10
+set g_balance_rpc_animtime 1
+set g_balance_rpc_damage 150
+set g_balance_rpc_damage2 500
+set g_balance_rpc_damageforcescale 2
+set g_balance_rpc_edgedamage 50
+set g_balance_rpc_force 400
+set g_balance_rpc_health 25
+set g_balance_rpc_lifetime 30
+set g_balance_rpc_radius 300
+set g_balance_rpc_refire 1
+set g_balance_rpc_speed 1250
+set g_balance_rpc_speedaccel 0
+set g_balance_rpc_speedstart 1250
+set g_balance_rpc_reload_ammo 10
+set g_balance_rpc_reload_time 1
+// }}}
diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg
index cdf3f20135..28b552b529 100644
--- a/balanceXonotic.cfg
+++ b/balanceXonotic.cfg
@@ -705,3 +705,45 @@ set g_balance_fireball_secondary_spread 0
 set g_balance_fireball_switchdelay_drop 0.2
 set g_balance_fireball_switchdelay_raise 0.2
 // }}}
+
+// {{{ heavy machine gun
+set g_balance_hmg_spread_min 0.02
+set g_balance_hmg_spread_max 0.05
+set g_balance_hmg_spread_add 0.01
+
+set g_balance_hmg_sustained_damage 10 // 200 dps
+set g_balance_hmg_sustained_headshotaddeddamage 0
+set g_balance_hmg_sustained_force 5
+set g_balance_hmg_sustained_spread 0.03
+set g_balance_hmg_sustained_refire 0.05
+set g_balance_hmg_sustained_ammo 1
+
+set g_balance_hmg_speed 24000
+set g_balance_hmg_bulletconstant 115 // 13.1qu
+
+set g_balance_hmg_reload_ammo 120 //default: 30
+set g_balance_hmg_reload_time 1
+set g_balance_hmg_switchdelay_drop 0.2
+set g_balance_hmg_switchdelay_raise 0.2
+// }}}
+
+// {{{ RPC
+set g_balance_rpc_ammo 10
+set g_balance_rpc_animtime 1
+set g_balance_rpc_damage 150
+set g_balance_rpc_damage2 500
+set g_balance_rpc_damageforcescale 2
+set g_balance_rpc_edgedamage 50
+set g_balance_rpc_force 400
+set g_balance_rpc_health 25
+set g_balance_rpc_lifetime 30
+set g_balance_rpc_radius 300
+set g_balance_rpc_refire 1
+set g_balance_rpc_speed 1250
+set g_balance_rpc_speedaccel 0
+set g_balance_rpc_speedstart 1250
+set g_balance_rpc_reload_ammo 10
+set g_balance_rpc_reload_time 1
+set g_balance_rpc_switchdelay_drop 0.2
+set g_balance_rpc_switchdelay_raise 0.2
+// }}}
diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg
index d967d53d55..93aff3128c 100644
--- a/defaultXonotic.cfg
+++ b/defaultXonotic.cfg
@@ -1377,6 +1377,8 @@ set g_weaponreplace_minstanex ""
 set g_weaponreplace_hook ""
 set g_weaponreplace_tuba ""
 set g_weaponreplace_fireball ""
+set g_weaponreplace_hmg ""
+set g_weaponreplace_rpc ""
 set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility in mapinfo files)"
 
 set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
diff --git a/mutators.cfg b/mutators.cfg
index e88fbc0afc..9cd318a6f5 100644
--- a/mutators.cfg
+++ b/mutators.cfg
@@ -33,6 +33,23 @@ set g_minstagib_invis_alpha 0.15
 set g_minstagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup"
 
 
+// ==========
+//  overkill
+// ==========
+set g_overkill 0 "enable overkill"
+set g_overkill_spawnsystem 1 "experimental spawnsystem"
+set g_overkill_spawnsystem_delay 2.5 "how long to wait before its OK to spawn at a player after someone just spawned at this player"
+set g_overkill_spawnsystem_delay_death 0 "how long to wait before its OK to spawn at a player after death "
+set g_overkill_spawnsystem_check_health 1 "only allow spawn at this player if hes health is full"
+set g_overkill_spawnsystem_close2death 1 "spawn as close as possible to where we died"
+
+set g_overkill_100a_anyway 1
+set g_overkill_100h_anyway 1
+set g_overkill_powerups_replace 1
+set g_overkill_superguns_onemag 1
+set g_overkill_superguns_respawn_time 20
+
+
 // =========
 //  vampire
 // =========
diff --git a/overkill.cfg b/overkill.cfg
new file mode 100644
index 0000000000..1eff76a4a0
--- /dev/null
+++ b/overkill.cfg
@@ -0,0 +1,129 @@
+g_overkill 1
+
+g_overkill_ammo_start 50
+g_overkill_ammo_max   100
+g_overkill_ammo_regen 2.52
+g_overkill_superguns_builtin 0
+
+g_use_ammunition 1
+g_pickup_items 0
+sv_gibhealth 120
+g_spawnshieldtime 0.5
+
+g_balance_health_regen 0
+g_balance_health_regenlinear 100
+g_balance_health_rot 0
+g_balance_health_rotstable 200 // needs this too, else it rots towards 100 even with g_balance_health_rot 0
+g_balance_armor_rotstable 0
+g_balance_armor_rotlinear 1
+g_balance_armor_rot 0
+g_balance_pause_health_regen 2
+
+// g_balance_laser_primary_force_velocitybias 1.2  // sorry i realy hate this
+
+g_balance_shotgun_primary_damage 17
+g_balance_shotgun_primary_bullets 10
+g_balance_shotgun_primary_force 80
+g_balance_shotgun_primary_spread 0.07
+g_balance_shotgun_primary_animtime 0.65
+g_balance_shotgun_primary_ammo 6.25
+g_balance_shotgun_reload_ammo 50
+g_balance_shotgun_reload_time 2
+g_balance_shotgun_primary_bulletconstant 3000
+
+g_balance_uzi_mode 1
+g_balance_uzi_sustained_damage 25
+g_balance_uzi_sustained_refire 0.1
+g_balance_uzi_sustained_spread 0.01
+g_balance_uzi_sustained_force 5
+g_balance_uzi_reload_ammo 30
+g_balance_uzi_reload_time 1.5
+g_balance_uzi_spread_min 0
+g_balance_uzi_spread_add 0.0015
+g_balance_uzi_bulletconstant 500
+
+g_balance_hmg_spread_min 0.01
+g_balance_hmg_spread_max 0.06
+g_balance_hmg_spread_add 0.005
+
+g_balance_hmg_sustained_damage 30
+g_balance_hmg_sustained_headshotaddeddamage 0
+g_balance_hmg_sustained_force 10
+g_balance_hmg_sustained_spread 0.03
+g_balance_hmg_sustained_refire 0.05
+g_balance_hmg_sustained_ammo 1
+
+g_balance_hmg_speed 24000
+g_balance_hmg_bulletconstant 115 // 13.1qu
+
+g_balance_hmg_reload_ammo 100 //default: 30
+g_balance_hmg_reload_time 1
+
+g_balance_nex_primary_damage 100
+g_balance_nex_primary_force 500
+g_balance_nex_primary_refire 1
+g_balance_nex_primary_animtime 0.95
+g_balance_nex_primary_ammo 10
+g_balance_nex_primary_damagefalloff_mindist 0
+g_balance_nex_primary_damagefalloff_maxdist 0
+g_balance_nex_primary_damagefalloff_halflife 0
+g_balance_nex_primary_damagefalloff_forcehalflife 0
+
+g_balance_nex_secondary 1
+g_balance_nex_charge 0
+g_balance_nex_reload_ammo 50
+g_balance_nex_reload_time 2
+
+g_balance_rpc_ammo 10
+g_balance_rpc_animtime 1
+g_balance_rpc_damage 150
+g_balance_rpc_damage2 500
+g_balance_rpc_damageforcescale 2
+g_balance_rpc_edgedamage 50
+g_balance_rpc_force 400
+g_balance_rpc_health 25
+g_balance_rpc_lifetime 30
+g_balance_rpc_radius 300
+g_balance_rpc_refire 1
+g_balance_rpc_speed 2500
+g_balance_rpc_speedaccel 5000
+g_balance_rpc_reload_ammo 50
+g_balance_rpc_reload_time 1
+
+g_projectiles_newton_style_2_minfactor 1 // rocket will never fly below default speed, even you you move backwards
+
+g_overkill_spawnsystem 1                // Experimental spawnsystem
+g_overkill_spawnsystem_delay 2.5        // How long to wait before its OK to spawn at a player after someone just spawned at this player
+g_overkill_spawnsystem_delay_death 0    // How long to wait before its OK to spawn at a player after death 
+g_overkill_spawnsystem_check_health 1   // Only allow spawn at this player if hes health is full
+g_overkill_spawnsystem_close2death 1    // Spawn as close as possible to where we died?
+g_overkill_spawnsystem_give_nade 1      // Give nade at spawn
+
+g_overkill_nade_lifetime 3.5
+g_overkill_nade_minforce 400
+g_overkill_nade_maxforce 2000
+g_overkill_nade_health 25
+g_overkill_nade_refire 10
+
+g_overkill_nade_damage 225
+g_overkill_nade_edgedamage 90
+g_overkill_nade_radius 300
+g_overkill_nade_force 650
+g_overkill_nade_newton_style 0
+
+g_pickup_healthmega_anyway 0
+g_pikup_armorsmall_max 20
+g_pickup_armorsmall_anyway 0
+g_pickup_healthmega_max 200
+g_pickup_healthmega_anyway 0
+
+g_overkill_100a_anyway 1
+g_overkill_100h_anyway 1
+g_overkill_powerups_repalce 1
+g_overkill_superguns_onemag 1
+g_overkill_superguns_respawn_time 20
+
+sv_defaultcharacter 1
+sv_defaultplayermodel "models/ok_player/okrobot1.dpm models/ok_player/okrobot2.dpm models/ok_player/okrobot3.dpm models/ok_player/okrobot4.dpm models/ok_player/okmale1.dpm models/ok_player/okmale2.dpm models/ok_player/okmale3.dpm models/ok_player/okmale4.dpm"
+sv_defaultplayermodel_red "models/ok_player/okrobot1.dpm models/ok_player/okrobot2.dpm models/ok_player/okrobot3.dpm models/ok_player/okrobot4.dpm"
+sv_defaultplayermodel_blue "models/ok_player/okmale1.dpm models/ok_player/okmale2.dpm models/ok_player/okmale3.dpm models/ok_player/okmale4.dpm"
diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh
index 8175695abb..f8a00a35b1 100644
--- a/qcsrc/client/autocvars.qh
+++ b/qcsrc/client/autocvars.qh
@@ -427,3 +427,13 @@ string autocvar__cl_playermodel;
 float autocvar_cl_deathglow;
 float autocvar_developer_csqcentities;
 float autocvar_g_jetpack_attenuation;
+
+// OK Crosshair
+var string autocvar_crosshair_hmg = ""; 
+var vector autocvar_crosshair_hmg_color = '0.2 1.0 0.2';
+var float autocvar_crosshair_hmg_alpha = 1;
+var float autocvar_crosshair_hmg_size = 1;
+var string autocvar_crosshair_rpc = ""; 
+var vector autocvar_crosshair_rpc_color = '0.2 1.0 0.2';
+var float autocvar_crosshair_rpc_alpha = 1;
+var float autocvar_crosshair_rpc_size = 1;
diff --git a/qcsrc/client/projectile.qc b/qcsrc/client/projectile.qc
index b86c234bdb..53890bc5c5 100644
--- a/qcsrc/client/projectile.qc
+++ b/qcsrc/client/projectile.qc
@@ -335,6 +335,8 @@ void Ent_Projectile()
 			case PROJECTILE_NADE_PINK_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_pink_burn"); break;
 			case PROJECTILE_NADE: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade"); break;
 			case PROJECTILE_NADE_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_burn"); break;
+			
+			case PROJECTILE_RPC: setmodel(self, "models/weapons/ok_rocket.md3");self.traileffect = particleeffectnum("TR_ROCKET"); break;
 
 			default:
 				error("Received invalid CSQC projectile, can't work with this!");
@@ -360,6 +362,7 @@ void Ent_Projectile()
 				self.move_bounce_factor = g_balance_electro_secondary_bouncefactor;
 				self.move_bounce_stopspeed = g_balance_electro_secondary_bouncestop;
 				break;
+			case PROJECTILE_RPC:
 			case PROJECTILE_ROCKET:
 				loopsound(self, CH_SHOTS_SINGLE, "weapons/rocket_fly.wav", VOL_BASE, ATTEN_NORM);
 				self.mins = '-3 -3 -3';
@@ -369,17 +372,6 @@ void Ent_Projectile()
 				self.mins = '-3 -3 -3';
 				self.maxs = '3 3 3';
 				break;
-			case PROJECTILE_NADE_RED_BURN:
-			case PROJECTILE_NADE_RED:
-			case PROJECTILE_NADE_BLUE_BURN:
-			case PROJECTILE_NADE_BLUE:
-				self.mins = '-3 -3 -3';
-				self.maxs = '3 3 3';
-				self.move_movetype = MOVETYPE_BOUNCE;
-				self.move_touch = func_null;
-				self.scale = 1.5;
-				self.avelocity = randomvec() * 720;
-				break;
 			case PROJECTILE_GRENADE_BOUNCING:
 				self.mins = '-3 -3 -3';
 				self.maxs = '3 3 3';
@@ -525,6 +517,7 @@ void Projectile_Precache()
 	precache_model("models/tracer.mdl");
 	
 	precache_model("models/weapons/v_ok_grenade.md3");
+	precache_model("models/weapons/ok_rocket.md3");
 
 	precache_sound("weapons/electro_fly.wav");
 	precache_sound("weapons/rocket_fly.wav");
diff --git a/qcsrc/client/waypointsprites.qc b/qcsrc/client/waypointsprites.qc
index a2ace4f46a..6b3c52be2c 100644
--- a/qcsrc/client/waypointsprites.qc
+++ b/qcsrc/client/waypointsprites.qc
@@ -304,6 +304,8 @@ string spritelookuptext(string s)
 		case "wpn-hlac": return _("HLAC");
 		case "wpn-campingrifle": return _("Rifle");
 		case "wpn-minelayer": return _("Mine Layer");
+		case "wpn-hmg": return _("Heavy Machine Gun");
+		case "wpn-rpc": return _("Rocket-Propelled Chainsaw");
 		case "dom-neut": return _("Control point");
 		case "dom-red": return _("Control point");
 		case "dom-blue": return _("Control point");
diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh
index b3dafaaf7b..9d3b532595 100644
--- a/qcsrc/common/constants.qh
+++ b/qcsrc/common/constants.qh
@@ -369,6 +369,8 @@ const float PROJECTILE_NADE_PINK_BURN = 57;
 const float PROJECTILE_NADE = 58;
 const float PROJECTILE_NADE_BURN = 59;
 
+const float PROJECTILE_RPC = 60;
+
 const float SPECIES_HUMAN = 0;
 const float SPECIES_ROBOT_SOLID = 1;
 const float SPECIES_ALIEN = 2;
diff --git a/qcsrc/common/notifications.qh b/qcsrc/common/notifications.qh
index 0214ec3d61..e004fbbd3c 100644
--- a/qcsrc/common/notifications.qh
+++ b/qcsrc/common/notifications.qh
@@ -515,7 +515,12 @@ void Send_Notification_WOCOVA(
 	MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_MURDER,                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weapontuba",             _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s%s"), "") \
 	MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_SUICIDE,                  2, 1, "s1 s2loc spree_lost", "s1",                 "weapontuba",             _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s%s"), "") \
 	MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SNIPE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"), "") \
-	MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SPRAY,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"), "") 
+	MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SPRAY,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"), "") \
+	MSG_INFO_NOTIF(1, INFO_WEAPON_HMG_MURDER_SNIPE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhmg",              _("^BG%s%s^K1 was sniped by ^BG%s^K1's Heavy Machine Gun%s%s"), "") \
+	MSG_INFO_NOTIF(1, INFO_WEAPON_HMG_MURDER_SPRAY,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhmg",              _("^BG%s%s^K1 was torn to bits by ^BG%s^K1's Heavy Machine Gun%s%s"), "") \
+	MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_MURDER_DIRECT,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrpc",              _("^BG%s%s^K1 got sawn in half by ^BG%s^K1's Rocket Propelled Chainsaw%s%s"), "") \
+	MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_MURDER_SPLASH,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrpc",              _("^BG%s%s^K1 almost dodged ^BG%s^K1's Rocket Propelled Chainsaw%s%s"), "") \
+	MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_SUICIDE,                   2, 1, "s1 s2loc spree_lost", "s1",                 "weaponrpc",              _("^BG%s^K1 blew themself up with their Rocket Propelled Chainsaw%s%s"), "") 
 
 #define MULTITEAM_CENTER2(default,prefix,strnum,flnum,args,cpid,durcnt,normal,gentle) \
 	MSG_CENTER_NOTIF(default, prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
@@ -798,7 +803,12 @@ void Send_Notification_WOCOVA(
 	MSG_MULTI_NOTIF(1, WEAPON_TUBA_MURDER,                   NO_MSG,        INFO_WEAPON_TUBA_MURDER,                   NO_MSG) \
 	MSG_MULTI_NOTIF(1, WEAPON_TUBA_SUICIDE,                  NO_MSG,        INFO_WEAPON_TUBA_SUICIDE,                  CENTER_DEATH_SELF_GENERIC) \
 	MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SNIPE,              NO_MSG,        INFO_WEAPON_UZI_MURDER_SNIPE,              NO_MSG) \
-	MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SPRAY,              NO_MSG,        INFO_WEAPON_UZI_MURDER_SPRAY,              NO_MSG)
+	MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SPRAY,              NO_MSG,        INFO_WEAPON_UZI_MURDER_SPRAY,              NO_MSG) \
+	MSG_MULTI_NOTIF(1, WEAPON_HMG_MURDER_SNIPE,              NO_MSG,        INFO_WEAPON_HMG_MURDER_SNIPE,              NO_MSG) \
+	MSG_MULTI_NOTIF(1, WEAPON_HMG_MURDER_SPRAY,              NO_MSG,        INFO_WEAPON_HMG_MURDER_SPRAY,              NO_MSG) \
+	MSG_MULTI_NOTIF(1, WEAPON_RPC_MURDER_DIRECT,             NO_MSG,        INFO_WEAPON_RPC_MURDER_DIRECT,             NO_MSG) \
+	MSG_MULTI_NOTIF(1, WEAPON_RPC_MURDER_SPLASH,             NO_MSG,        INFO_WEAPON_RPC_MURDER_SPLASH,             NO_MSG) \
+	MSG_MULTI_NOTIF(1, WEAPON_RPC_SUICIDE,                   NO_MSG,        INFO_WEAPON_RPC_SUICIDE,                   NO_MSG)
 
 #define MULTITEAM_CHOICE2(default,challow,prefix,chtype,optiona,optionb) \
 	MSG_CHOICE_NOTIF(default, challow, prefix##RED, chtype, optiona##RED, optionb##RED) \
diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c b/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
index 18c376b503..c908d82d3f 100644
--- a/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
+++ b/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
@@ -98,6 +98,8 @@ string XonoticMutatorsDialog_toString(entity me)
 		s = strcat(s, ", ", _("Blood loss"));
 	if(cvar("g_jetpack"))
 		s = strcat(s, ", ", _("Jet pack"));
+	if(cvar("g_overkill"))
+		s = strcat(s, ", ", _("Overkill"));
 	if(cvar("g_powerups") == 0)
 		s = strcat(s, ", ", _("No powerups"));
 	if(cvar("g_powerups") > 0)
@@ -253,6 +255,9 @@ void XonoticMutatorsDialog_fill(entity me)
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 1.8, e = makeXonoticRadioButton(1, "g_minstagib", "1", _("MinstaGib")));
 			e.cvarOffValue = "0";
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_overkill", "1", _("Overkill")));
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 1.8, e = makeXonoticRadioButton(1, "g_nix", "1", _("NIX")));
@@ -265,7 +270,7 @@ void XonoticMutatorsDialog_fill(entity me)
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 1.8, e = makeXonoticRadioButton(1, "g_start_weapon_laser", "0", _("No start weapons")));
 			e.cvarOffValue = "-1";
-			makeMulti(e, "g_start_weapon_shotgun g_start_weapon_uzi g_start_weapon_grenadelauncher g_start_weapon_minelayer g_start_weapon_electro g_start_weapon_crylink g_start_weapon_nex g_start_weapon_hagar g_start_weapon_rocketlauncher g_start_weapon_porto g_start_weapon_minstanex g_start_weapon_hook g_start_weapon_hlac g_start_weapon_rifle g_start_weapon_fireball g_start_weapon_seeker g_start_weapon_tuba");
+			makeMulti(e, "g_start_weapon_shotgun g_start_weapon_uzi g_start_weapon_grenadelauncher g_start_weapon_minelayer g_start_weapon_electro g_start_weapon_crylink g_start_weapon_nex g_start_weapon_hagar g_start_weapon_rocketlauncher g_start_weapon_porto g_start_weapon_minstanex g_start_weapon_hook g_start_weapon_hlac g_start_weapon_rifle g_start_weapon_fireball g_start_weapon_seeker g_start_weapon_tuba g_overkill");
 
 	me.gotoRC(me, me.rows - 1, 0);
 		me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh
index 759aea6add..c19757916a 100644
--- a/qcsrc/server/autocvars.qh
+++ b/qcsrc/server/autocvars.qh
@@ -1207,6 +1207,34 @@ float autocvar_waypoint_benchmark;
 float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
 float autocvar_g_trueaim_minrange;
 float autocvar_g_debug_defaultsounds;
+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_rpc_ammo;
+float autocvar_g_balance_rpc_animtime;
+float autocvar_g_balance_rpc_damage;
+float autocvar_g_balance_rpc_damage2;
+float autocvar_g_balance_rpc_damageforcescale;
+float autocvar_g_balance_rpc_edgedamage;
+float autocvar_g_balance_rpc_force;
+float autocvar_g_balance_rpc_health;
+float autocvar_g_balance_rpc_lifetime;
+float autocvar_g_balance_rpc_radius;
+float autocvar_g_balance_rpc_refire;
+float autocvar_g_balance_rpc_speed;
+float autocvar_g_balance_rpc_speedaccel;
+float autocvar_g_balance_rpc_reload_ammo;
+float autocvar_g_balance_rpc_reload_time;
 float autocvar_g_grab_range;
 float autocvar_g_sandbox_info;
 float autocvar_g_sandbox_readonly;
diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc
index 0b5b427812..ccfc440c69 100644
--- a/qcsrc/server/miscfunctions.qc
+++ b/qcsrc/server/miscfunctions.qc
@@ -924,6 +924,7 @@ void readlevelcvars(void)
 	CHECK_MUTATOR_ADD("g_nades", mutator_nades, 1);
 	CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1);
 	CHECK_MUTATOR_ADD("g_campcheck", mutator_campcheck, 1);
+	CHECK_MUTATOR_ADD("g_overkill", mutator_overkill, !cvar("g_minstagib"));
 	
 	#undef CHECK_MUTATOR_ADD
 	
diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh
index e7a95de7ec..cd37a6505a 100644
--- a/qcsrc/server/mutators/mutators.qh
+++ b/qcsrc/server/mutators/mutators.qh
@@ -31,3 +31,5 @@ MUTATOR_DECLARATION(mutator_nades);
 MUTATOR_DECLARATION(mutator_campcheck);
 
 MUTATOR_DECLARATION(sandbox);
+MUTATOR_DECLARATION(mutator_overkill);
+
diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src
index e9e9a4b8c8..3063d8ddbd 100644
--- a/qcsrc/server/progs.src
+++ b/qcsrc/server/progs.src
@@ -47,6 +47,7 @@ mutators/gamemode_nexball.qh
 mutators/gamemode_lms.qh
 mutators/mutator_dodging.qh
 mutators/mutator_nades.qh
+mutators/mutator_overkill.qh
 
 //// tZork Turrets ////
 tturrets/include/turrets_early.qh
@@ -244,6 +245,7 @@ mutators/mutator_nix.qc
 mutators/mutator_dodging.qc
 mutators/mutator_rocketflying.qc
 mutators/mutator_vampire.qc
+mutators/mutator_overkill.qc
 mutators/mutator_spawn_near_teammate.qc
 mutators/mutator_physical_items.qc
 mutators/sandbox.qc
diff --git a/qcsrc/server/w_all.qc b/qcsrc/server/w_all.qc
index ac4ef47ed3..9f05407516 100644
--- a/qcsrc/server/w_all.qc
+++ b/qcsrc/server/w_all.qc
@@ -19,3 +19,6 @@
 #include "w_rifle.qc"
 #include "w_fireball.qc"
 #include "w_seeker.qc"
+#include "w_hmg.qc"
+#include "w_rpc.qc"
+
-- 
2.39.5