From 1322163d80b16cd7d19098667a545999cd96de7d Mon Sep 17 00:00:00 2001
From: Samual Lenks <samual@xonotic.org>
Date: Mon, 9 Dec 2013 17:34:08 -0500
Subject: [PATCH] Clean up settings lists slightly

---
 qcsrc/common/weapons/w_arc.qc        |  35 ++++----
 qcsrc/common/weapons/w_blaster.qc    |  41 ++++-----
 qcsrc/common/weapons/w_crylink.qc    |  67 ++++++++-------
 qcsrc/common/weapons/w_devastator.qc |  63 +++++++-------
 qcsrc/common/weapons/w_electro.qc    |  81 +++++++++---------
 qcsrc/common/weapons/w_fireball.qc   |  61 ++++++-------
 qcsrc/common/weapons/w_hagar.qc      |  65 +++++++-------
 qcsrc/common/weapons/w_hlac.qc       |  49 +++++------
 qcsrc/common/weapons/w_hook.qc       |  51 +++++------
 qcsrc/common/weapons/w_machinegun.qc |  63 +++++++-------
 qcsrc/common/weapons/w_minelayer.qc  |  60 ++++++-------
 qcsrc/common/weapons/w_minstanex.qc  |  47 +++++-----
 qcsrc/common/weapons/w_mortar.qc     |  59 ++++++-------
 qcsrc/common/weapons/w_nex.qc        |  67 ++++++++-------
 qcsrc/common/weapons/w_porto.qc      |  27 +++---
 qcsrc/common/weapons/w_rifle.qc      |  50 +++++------
 qcsrc/common/weapons/w_seeker.qc     | 117 ++++++++++++-------------
 qcsrc/common/weapons/w_shockwave.qc  | 123 ++++++++++++++-------------
 qcsrc/common/weapons/w_tuba.qc       |  31 +++----
 19 files changed, 587 insertions(+), 570 deletions(-)

diff --git a/qcsrc/common/weapons/w_arc.qc b/qcsrc/common/weapons/w_arc.qc
index ec7b962bc7..1ed5faae20 100644
--- a/qcsrc/common/weapons/w_arc.qc
+++ b/qcsrc/common/weapons/w_arc.qc
@@ -11,23 +11,24 @@ REGISTER_WEAPON(
 /* fullname */ _("Arc")
 );
 
-#define ARC_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_ARC, arc, MO_BOTH, ammo) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  animtime) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  damage) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  falloff_halflifedist) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  falloff_maxdist) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  falloff_mindist) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  force) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  range) \
-	w_cvar(WEP_ARC, arc, MO_PRI,  refire) \
-	w_prop(WEP_ARC, arc, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_ARC, arc, float,  reloading_time, reload_time) \
-	w_prop(WEP_ARC, arc, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_ARC, arc, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_ARC, arc, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_ARC, arc, float,  weaponstart, weaponstart) \
-	w_prop(WEP_ARC, arc, float,  weaponstartoverride, weaponstartoverride)
+#define ARC_SETTINGS(w_cvar,w_prop) ARC_SETTINGS_LIST(w_cvar, w_prop, WEP_ARC, arc)
+#define ARC_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_PRI,  animtime) \
+	w_cvar(id, sn, MO_PRI,  damage) \
+	w_cvar(id, sn, MO_PRI,  falloff_halflifedist) \
+	w_cvar(id, sn, MO_PRI,  falloff_maxdist) \
+	w_cvar(id, sn, MO_PRI,  falloff_mindist) \
+	w_cvar(id, sn, MO_PRI,  force) \
+	w_cvar(id, sn, MO_PRI,  range) \
+	w_cvar(id, sn, MO_PRI,  refire) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifndef MENUQC
 vector arc_shotorigin[4];
diff --git a/qcsrc/common/weapons/w_blaster.qc b/qcsrc/common/weapons/w_blaster.qc
index fb8c7db076..cd8ba5d207 100644
--- a/qcsrc/common/weapons/w_blaster.qc
+++ b/qcsrc/common/weapons/w_blaster.qc
@@ -11,26 +11,27 @@ REGISTER_WEAPON(
 /* fullname */ _("Blaster")
 );
 
-#define BLASTER_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, animtime) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, damage) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, delay) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, edgedamage) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, force) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, lifetime) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, radius) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, refire) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, shotangle) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, speed) \
-	w_cvar(WEP_BLASTER, blaster, MO_BOTH, spread) \
-	w_cvar(WEP_BLASTER, blaster, MO_NONE, secondary) \
-	w_prop(WEP_BLASTER, blaster, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_BLASTER, blaster, float,  reloading_time, reload_time) \
-	w_prop(WEP_BLASTER, blaster, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_BLASTER, blaster, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_BLASTER, blaster, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_BLASTER, blaster, float,  weaponstart, weaponstart) \
-	w_prop(WEP_BLASTER, blaster, float,  weaponstartoverride, weaponstartoverride)
+#define BLASTER_SETTINGS(w_cvar,w_prop) BLASTER_SETTINGS_LIST(w_cvar, w_prop, WEP_BLASTER, blaster)
+#define BLASTER_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, delay) \
+	w_cvar(id, sn, MO_BOTH, edgedamage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_BOTH, radius) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, shotangle) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 BLASTER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_crylink.qc b/qcsrc/common/weapons/w_crylink.qc
index b0814fb38b..a47feb19a2 100644
--- a/qcsrc/common/weapons/w_crylink.qc
+++ b/qcsrc/common/weapons/w_crylink.qc
@@ -11,39 +11,40 @@ REGISTER_WEAPON(
 /* fullname */ _("Crylink")
 );
 
-#define CRYLINK_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, ammo) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, animtime) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, damage) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, edgedamage) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, radius) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, force) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, spread) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, refire) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, speed) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, shots) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, bounces) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, bouncedamagefactor) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, middle_lifetime) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, middle_fadetime) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, other_lifetime) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, other_fadetime) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, linkexplode) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joindelay) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joinspread) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joinexplode) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joinexplode_damage) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joinexplode_edgedamage) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joinexplode_radius) \
-	w_cvar(WEP_CRYLINK, crylink, MO_BOTH, joinexplode_force) \
-	w_cvar(WEP_CRYLINK, crylink, MO_SEC,  spreadtype) \
-	w_prop(WEP_CRYLINK, crylink, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_CRYLINK, crylink, float,  reloading_time, reload_time) \
-	w_prop(WEP_CRYLINK, crylink, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_CRYLINK, crylink, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_CRYLINK, crylink, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_CRYLINK, crylink, float,  weaponstart, weaponstart) \
-	w_prop(WEP_CRYLINK, crylink, float,  weaponstartoverride, weaponstartoverride)
+#define CRYLINK_SETTINGS(w_cvar,w_prop) CRYLINK_SETTINGS_LIST(w_cvar, w_prop, WEP_CRYLINK, crylink)
+#define CRYLINK_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, edgedamage) \
+	w_cvar(id, sn, MO_BOTH, radius) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, shots) \
+	w_cvar(id, sn, MO_BOTH, bounces) \
+	w_cvar(id, sn, MO_BOTH, bouncedamagefactor) \
+	w_cvar(id, sn, MO_BOTH, middle_lifetime) \
+	w_cvar(id, sn, MO_BOTH, middle_fadetime) \
+	w_cvar(id, sn, MO_BOTH, other_lifetime) \
+	w_cvar(id, sn, MO_BOTH, other_fadetime) \
+	w_cvar(id, sn, MO_BOTH, linkexplode) \
+	w_cvar(id, sn, MO_BOTH, joindelay) \
+	w_cvar(id, sn, MO_BOTH, joinspread) \
+	w_cvar(id, sn, MO_BOTH, joinexplode) \
+	w_cvar(id, sn, MO_BOTH, joinexplode_damage) \
+	w_cvar(id, sn, MO_BOTH, joinexplode_edgedamage) \
+	w_cvar(id, sn, MO_BOTH, joinexplode_radius) \
+	w_cvar(id, sn, MO_BOTH, joinexplode_force) \
+	w_cvar(id, sn, MO_SEC,  spreadtype) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 CRYLINK_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_devastator.qc b/qcsrc/common/weapons/w_devastator.qc
index 0b1fc5ec26..e9833f5980 100644
--- a/qcsrc/common/weapons/w_devastator.qc
+++ b/qcsrc/common/weapons/w_devastator.qc
@@ -11,37 +11,38 @@ REGISTER_WEAPON(
 /* fullname */ _("Devastator")
 );
 
-#define DEVASTATOR_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, ammo) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, animtime) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, damage) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, damageforcescale) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, detonatedelay) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, edgedamage) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, force) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, guidedelay) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, guidegoal) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, guiderate) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, guideratedelay) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, guidestop) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, health) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, lifetime) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, radius) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, refire) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, remote_damage) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, remote_edgedamage) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, remote_force) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, remote_radius) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, speed) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, speedaccel) \
-	w_cvar(WEP_DEVASTATOR, devastator, MO_NONE, speedstart) \
-	w_prop(WEP_DEVASTATOR, devastator, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_DEVASTATOR, devastator, float,  reloading_time, reload_time) \
-	w_prop(WEP_DEVASTATOR, devastator, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_DEVASTATOR, devastator, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_DEVASTATOR, devastator, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_DEVASTATOR, devastator, float,  weaponstart, weaponstart) \
-	w_prop(WEP_DEVASTATOR, devastator, float,  weaponstartoverride, weaponstartoverride)
+#define DEVASTATOR_SETTINGS(w_cvar,w_prop) DEVASTATOR_SETTINGS_LIST(w_cvar, w_prop, WEP_DEVASTATOR, devastator)
+#define DEVASTATOR_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_NONE, ammo) \
+	w_cvar(id, sn, MO_NONE, animtime) \
+	w_cvar(id, sn, MO_NONE, damage) \
+	w_cvar(id, sn, MO_NONE, damageforcescale) \
+	w_cvar(id, sn, MO_NONE, detonatedelay) \
+	w_cvar(id, sn, MO_NONE, edgedamage) \
+	w_cvar(id, sn, MO_NONE, force) \
+	w_cvar(id, sn, MO_NONE, guidedelay) \
+	w_cvar(id, sn, MO_NONE, guidegoal) \
+	w_cvar(id, sn, MO_NONE, guiderate) \
+	w_cvar(id, sn, MO_NONE, guideratedelay) \
+	w_cvar(id, sn, MO_NONE, guidestop) \
+	w_cvar(id, sn, MO_NONE, health) \
+	w_cvar(id, sn, MO_NONE, lifetime) \
+	w_cvar(id, sn, MO_NONE, radius) \
+	w_cvar(id, sn, MO_NONE, refire) \
+	w_cvar(id, sn, MO_NONE, remote_damage) \
+	w_cvar(id, sn, MO_NONE, remote_edgedamage) \
+	w_cvar(id, sn, MO_NONE, remote_force) \
+	w_cvar(id, sn, MO_NONE, remote_radius) \
+	w_cvar(id, sn, MO_NONE, speed) \
+	w_cvar(id, sn, MO_NONE, speedaccel) \
+	w_cvar(id, sn, MO_NONE, speedstart) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 DEVASTATOR_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_electro.qc b/qcsrc/common/weapons/w_electro.qc
index 7a2a7a0ac3..4982e051e1 100644
--- a/qcsrc/common/weapons/w_electro.qc
+++ b/qcsrc/common/weapons/w_electro.qc
@@ -11,46 +11,47 @@ REGISTER_WEAPON(
 /* fullname */ _("Electro")
 );
 
-#define ELECTRO_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, ammo) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, animtime) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, damage) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, edgedamage) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, force) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, radius) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, refire) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, speed) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, spread) \
-	w_cvar(WEP_ELECTRO, electro, MO_BOTH, lifetime) \
-	w_cvar(WEP_ELECTRO, electro, MO_PRI,  comboradius) \
-	w_cvar(WEP_ELECTRO, electro, MO_PRI,  midaircombo_explode) \
-	w_cvar(WEP_ELECTRO, electro, MO_PRI,  midaircombo_interval) \
-	w_cvar(WEP_ELECTRO, electro, MO_PRI,  midaircombo_radius) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  bouncefactor) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  bouncestop) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  count) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  damageforcescale) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  damagedbycontents) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  health) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  refire2) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  speed_up) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  speed_z) \
-	w_cvar(WEP_ELECTRO, electro, MO_SEC,  touchexplode) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_comboradius) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_comboradius_thruwall) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_damage) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_edgedamage) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_force) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_radius) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_speed) \
-	w_cvar(WEP_ELECTRO, electro, MO_NONE, combo_safeammocheck) \
-	w_prop(WEP_ELECTRO, electro, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_ELECTRO, electro, float,  reloading_time, reload_time) \
-	w_prop(WEP_ELECTRO, electro, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_ELECTRO, electro, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_ELECTRO, electro, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_ELECTRO, electro, float,  weaponstart, weaponstart) \
-	w_prop(WEP_ELECTRO, electro, float,  weaponstartoverride, weaponstartoverride)
+#define ELECTRO_SETTINGS(w_cvar,w_prop) ELECTRO_SETTINGS_LIST(w_cvar, w_prop, WEP_ELECTRO, electro)
+#define ELECTRO_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, edgedamage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, radius) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_PRI,  comboradius) \
+	w_cvar(id, sn, MO_PRI,  midaircombo_explode) \
+	w_cvar(id, sn, MO_PRI,  midaircombo_interval) \
+	w_cvar(id, sn, MO_PRI,  midaircombo_radius) \
+	w_cvar(id, sn, MO_SEC,  bouncefactor) \
+	w_cvar(id, sn, MO_SEC,  bouncestop) \
+	w_cvar(id, sn, MO_SEC,  count) \
+	w_cvar(id, sn, MO_SEC,  damageforcescale) \
+	w_cvar(id, sn, MO_SEC,  damagedbycontents) \
+	w_cvar(id, sn, MO_SEC,  health) \
+	w_cvar(id, sn, MO_SEC,  refire2) \
+	w_cvar(id, sn, MO_SEC,  speed_up) \
+	w_cvar(id, sn, MO_SEC,  speed_z) \
+	w_cvar(id, sn, MO_SEC,  touchexplode) \
+	w_cvar(id, sn, MO_NONE, combo_comboradius) \
+	w_cvar(id, sn, MO_NONE, combo_comboradius_thruwall) \
+	w_cvar(id, sn, MO_NONE, combo_damage) \
+	w_cvar(id, sn, MO_NONE, combo_edgedamage) \
+	w_cvar(id, sn, MO_NONE, combo_force) \
+	w_cvar(id, sn, MO_NONE, combo_radius) \
+	w_cvar(id, sn, MO_NONE, combo_speed) \
+	w_cvar(id, sn, MO_NONE, combo_safeammocheck) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 ELECTRO_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_fireball.qc b/qcsrc/common/weapons/w_fireball.qc
index 179559712a..a3a144279a 100644
--- a/qcsrc/common/weapons/w_fireball.qc
+++ b/qcsrc/common/weapons/w_fireball.qc
@@ -11,36 +11,37 @@ REGISTER_WEAPON(
 /* fullname */ _("Fireball")
 );
 
-#define FIREBALL_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, animtime) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, refire) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, damage) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, damageforcescale) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, speed) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, spread) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, lifetime) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laserburntime) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laserdamage) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laseredgedamage) \
-	w_cvar(WEP_FIREBALL, fireball, MO_BOTH, laserradius) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  edgedamage) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  force) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  radius) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  health) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  refire2) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  bfgdamage) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  bfgforce) \
-	w_cvar(WEP_FIREBALL, fireball, MO_PRI,  bfgradius) \
-	w_cvar(WEP_FIREBALL, fireball, MO_SEC,  damagetime) \
-	w_cvar(WEP_FIREBALL, fireball, MO_SEC,  speed_up) \
-	w_cvar(WEP_FIREBALL, fireball, MO_SEC,  speed_z) \
-	w_prop(WEP_FIREBALL, fireball, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_FIREBALL, fireball, float,  reloading_time, reload_time) \
-	w_prop(WEP_FIREBALL, fireball, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_FIREBALL, fireball, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_FIREBALL, fireball, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_FIREBALL, fireball, float,  weaponstart, weaponstart) \
-	w_prop(WEP_FIREBALL, fireball, float,  weaponstartoverride, weaponstartoverride)
+#define FIREBALL_SETTINGS(w_cvar,w_prop) FIREBALL_SETTINGS_LIST(w_cvar, w_prop, WEP_FIREBALL, fireball)
+#define FIREBALL_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, damageforcescale) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_BOTH, laserburntime) \
+	w_cvar(id, sn, MO_BOTH, laserdamage) \
+	w_cvar(id, sn, MO_BOTH, laseredgedamage) \
+	w_cvar(id, sn, MO_BOTH, laserradius) \
+	w_cvar(id, sn, MO_PRI,  edgedamage) \
+	w_cvar(id, sn, MO_PRI,  force) \
+	w_cvar(id, sn, MO_PRI,  radius) \
+	w_cvar(id, sn, MO_PRI,  health) \
+	w_cvar(id, sn, MO_PRI,  refire2) \
+	w_cvar(id, sn, MO_PRI,  bfgdamage) \
+	w_cvar(id, sn, MO_PRI,  bfgforce) \
+	w_cvar(id, sn, MO_PRI,  bfgradius) \
+	w_cvar(id, sn, MO_SEC,  damagetime) \
+	w_cvar(id, sn, MO_SEC,  speed_up) \
+	w_cvar(id, sn, MO_SEC,  speed_z) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 FIREBALL_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_hagar.qc b/qcsrc/common/weapons/w_hagar.qc
index 9fdc970d54..ef334d9df4 100644
--- a/qcsrc/common/weapons/w_hagar.qc
+++ b/qcsrc/common/weapons/w_hagar.qc
@@ -11,38 +11,39 @@ REGISTER_WEAPON(
 /* fullname */ _("Hagar")
 );
 
-#define HAGAR_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, ammo) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, damage) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, edgedamage) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, force) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, radius) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, refire) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, speed) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, spread) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, damageforcescale) \
-	w_cvar(WEP_HAGAR, hagar, MO_BOTH, health) \
-	w_cvar(WEP_HAGAR, hagar, MO_PRI,  lifetime) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_max) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_abort) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_animtime) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_hold) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_speed) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_releasedeath) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_spread) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_spread_bias) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  load_linkexplode) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  lifetime_min) \
-	w_cvar(WEP_HAGAR, hagar, MO_SEC,  lifetime_rand) \
-	w_cvar(WEP_HAGAR, hagar, MO_NONE, secondary) \
-	w_prop(WEP_HAGAR, hagar, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_HAGAR, hagar, float,  reloading_time, reload_time) \
-	w_prop(WEP_HAGAR, hagar, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_HAGAR, hagar, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_HAGAR, hagar, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_HAGAR, hagar, float,  weaponstart, weaponstart) \
-	w_prop(WEP_HAGAR, hagar, float,  weaponstartoverride, weaponstartoverride)
+#define HAGAR_SETTINGS(w_cvar,w_prop) HAGAR_SETTINGS_LIST(w_cvar, w_prop, WEP_HAGAR, hagar)
+#define HAGAR_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, edgedamage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, radius) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_BOTH, damageforcescale) \
+	w_cvar(id, sn, MO_BOTH, health) \
+	w_cvar(id, sn, MO_PRI,  lifetime) \
+	w_cvar(id, sn, MO_SEC,  load) \
+	w_cvar(id, sn, MO_SEC,  load_max) \
+	w_cvar(id, sn, MO_SEC,  load_abort) \
+	w_cvar(id, sn, MO_SEC,  load_animtime) \
+	w_cvar(id, sn, MO_SEC,  load_hold) \
+	w_cvar(id, sn, MO_SEC,  load_speed) \
+	w_cvar(id, sn, MO_SEC,  load_releasedeath) \
+	w_cvar(id, sn, MO_SEC,  load_spread) \
+	w_cvar(id, sn, MO_SEC,  load_spread_bias) \
+	w_cvar(id, sn, MO_SEC,  load_linkexplode) \
+	w_cvar(id, sn, MO_SEC,  lifetime_min) \
+	w_cvar(id, sn, MO_SEC,  lifetime_rand) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 HAGAR_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_hlac.qc b/qcsrc/common/weapons/w_hlac.qc
index cc71080a5d..b49274c651 100644
--- a/qcsrc/common/weapons/w_hlac.qc
+++ b/qcsrc/common/weapons/w_hlac.qc
@@ -11,30 +11,31 @@ REGISTER_WEAPON(
 /* fullname */ _("Heavy Laser Assault Cannon")
 );
 
-#define HLAC_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, ammo) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, animtime) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, damage) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, edgedamage) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, force) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, lifetime) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, radius) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, refire) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, speed) \
-	w_cvar(WEP_HLAC, hlac, MO_BOTH, spread_crouchmod) \
-	w_cvar(WEP_HLAC, hlac, MO_PRI,  spread_add) \
-	w_cvar(WEP_HLAC, hlac, MO_PRI,  spread_max) \
-	w_cvar(WEP_HLAC, hlac, MO_PRI,  spread_min) \
-	w_cvar(WEP_HLAC, hlac, MO_NONE, secondary) \
-	w_cvar(WEP_HLAC, hlac, MO_SEC,  shots) \
-	w_cvar(WEP_HLAC, hlac, MO_SEC,  spread) \
-	w_prop(WEP_HLAC, hlac, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_HLAC, hlac, float,  reloading_time, reload_time) \
-	w_prop(WEP_HLAC, hlac, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_HLAC, hlac, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_HLAC, hlac, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_HLAC, hlac, float,  weaponstart, weaponstart) \
-	w_prop(WEP_HLAC, hlac, float,  weaponstartoverride, weaponstartoverride)
+#define HLAC_SETTINGS(w_cvar,w_prop) HLAC_SETTINGS_LIST(w_cvar, w_prop, WEP_HLAC, hlac)
+#define HLAC_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, edgedamage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_BOTH, radius) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, spread_crouchmod) \
+	w_cvar(id, sn, MO_PRI,  spread_add) \
+	w_cvar(id, sn, MO_PRI,  spread_max) \
+	w_cvar(id, sn, MO_PRI,  spread_min) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_cvar(id, sn, MO_SEC,  shots) \
+	w_cvar(id, sn, MO_SEC,  spread) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 HLAC_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_hook.qc b/qcsrc/common/weapons/w_hook.qc
index eb7491e7d8..a45fa6b5db 100644
--- a/qcsrc/common/weapons/w_hook.qc
+++ b/qcsrc/common/weapons/w_hook.qc
@@ -11,31 +11,32 @@ REGISTER_WEAPON(
 /* fullname */ _("Grappling Hook")
 );
 
-#define HOOK_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_HOOK, hook, MO_BOTH, animtime) \
-	w_cvar(WEP_HOOK, hook, MO_BOTH, ammo) \
-	w_cvar(WEP_HOOK, hook, MO_BOTH, refire) \
-	w_cvar(WEP_HOOK, hook, MO_PRI,  hooked_ammo) \
-	w_cvar(WEP_HOOK, hook, MO_PRI,  hooked_time_free) \
-	w_cvar(WEP_HOOK, hook, MO_PRI,  hooked_time_max) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  damage) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  duration) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  edgedamage) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  force) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  gravity) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  lifetime) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  power) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  radius) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  speed) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  health) \
-	w_cvar(WEP_HOOK, hook, MO_SEC,  damageforcescale) \
-	w_prop(WEP_HOOK, hook, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_HOOK, hook, float,  reloading_time, reload_time) \
-	w_prop(WEP_HOOK, hook, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_HOOK, hook, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_HOOK, hook, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_HOOK, hook, float,  weaponstart, weaponstart) \
-	w_prop(WEP_HOOK, hook, float,  weaponstartoverride, weaponstartoverride)
+#define HOOK_SETTINGS(w_cvar,w_prop) HOOK_SETTINGS_LIST(w_cvar, w_prop, WEP_HOOK, hook)
+#define HOOK_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_PRI,  hooked_ammo) \
+	w_cvar(id, sn, MO_PRI,  hooked_time_free) \
+	w_cvar(id, sn, MO_PRI,  hooked_time_max) \
+	w_cvar(id, sn, MO_SEC,  damage) \
+	w_cvar(id, sn, MO_SEC,  duration) \
+	w_cvar(id, sn, MO_SEC,  edgedamage) \
+	w_cvar(id, sn, MO_SEC,  force) \
+	w_cvar(id, sn, MO_SEC,  gravity) \
+	w_cvar(id, sn, MO_SEC,  lifetime) \
+	w_cvar(id, sn, MO_SEC,  power) \
+	w_cvar(id, sn, MO_SEC,  radius) \
+	w_cvar(id, sn, MO_SEC,  speed) \
+	w_cvar(id, sn, MO_SEC,  health) \
+	w_cvar(id, sn, MO_SEC,  damageforcescale) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 HOOK_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_machinegun.qc b/qcsrc/common/weapons/w_machinegun.qc
index e3907b1795..f2c28d771f 100644
--- a/qcsrc/common/weapons/w_machinegun.qc
+++ b/qcsrc/common/weapons/w_machinegun.qc
@@ -11,37 +11,38 @@ REGISTER_WEAPON(
 /* fullname */ _("Machine Gun")
 );
 
-#define UZI_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, speed) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, spread_min) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, spread_max) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, spread_add) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, mode) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, bulletconstant) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, first) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, first_damage) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, first_force) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, first_refire) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, first_spread) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, first_ammo) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, sustained_damage) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, sustained_force) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, sustained_refire) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, sustained_spread) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, sustained_ammo) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, burst) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, burst_refire) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, burst_refire2) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, burst_animtime) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, burst_speed) \
-	w_cvar(WEP_UZI, uzi, MO_NONE, burst_ammo) \
-	w_prop(WEP_UZI, uzi, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_UZI, uzi, float,  reloading_time, reload_time) \
-	w_prop(WEP_UZI, uzi, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_UZI, uzi, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_UZI, uzi, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_UZI, uzi, float,  weaponstart, weaponstart) \
-	w_prop(WEP_UZI, uzi, float,  weaponstartoverride, weaponstartoverride)
+#define UZI_SETTINGS(w_cvar,w_prop) UZI_SETTINGS_LIST(w_cvar, w_prop, WEP_UZI, uzi)
+#define UZI_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_NONE, speed) \
+	w_cvar(id, sn, MO_NONE, spread_min) \
+	w_cvar(id, sn, MO_NONE, spread_max) \
+	w_cvar(id, sn, MO_NONE, spread_add) \
+	w_cvar(id, sn, MO_NONE, mode) \
+	w_cvar(id, sn, MO_NONE, bulletconstant) \
+	w_cvar(id, sn, MO_NONE, first) \
+	w_cvar(id, sn, MO_NONE, first_damage) \
+	w_cvar(id, sn, MO_NONE, first_force) \
+	w_cvar(id, sn, MO_NONE, first_refire) \
+	w_cvar(id, sn, MO_NONE, first_spread) \
+	w_cvar(id, sn, MO_NONE, first_ammo) \
+	w_cvar(id, sn, MO_NONE, sustained_damage) \
+	w_cvar(id, sn, MO_NONE, sustained_force) \
+	w_cvar(id, sn, MO_NONE, sustained_refire) \
+	w_cvar(id, sn, MO_NONE, sustained_spread) \
+	w_cvar(id, sn, MO_NONE, sustained_ammo) \
+	w_cvar(id, sn, MO_NONE, burst) \
+	w_cvar(id, sn, MO_NONE, burst_refire) \
+	w_cvar(id, sn, MO_NONE, burst_refire2) \
+	w_cvar(id, sn, MO_NONE, burst_animtime) \
+	w_cvar(id, sn, MO_NONE, burst_speed) \
+	w_cvar(id, sn, MO_NONE, burst_ammo) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 UZI_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_minelayer.qc b/qcsrc/common/weapons/w_minelayer.qc
index d2aaa8a8f1..ec6d8bcc44 100644
--- a/qcsrc/common/weapons/w_minelayer.qc
+++ b/qcsrc/common/weapons/w_minelayer.qc
@@ -10,36 +10,36 @@ REGISTER_WEAPON(
 /* netname  */ "minelayer",
 /* fullname */ _("Mine Layer")
 );
-
-#define MINELAYER_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, ammo) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, animtime) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, damage) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, damageforcescale) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, detonatedelay) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, edgedamage) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, force) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, health) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, lifetime) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, lifetime_countdown) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, limit) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, protection) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, proximityradius) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, radius) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, refire) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, remote_damage) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, remote_edgedamage) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, remote_force) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, remote_radius) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, speed) \
-	w_cvar(WEP_MINE_LAYER, minelayer, MO_NONE, time) \
-	w_prop(WEP_MINE_LAYER, minelayer, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_MINE_LAYER, minelayer, float,  reloading_time, reload_time) \
-	w_prop(WEP_MINE_LAYER, minelayer, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_MINE_LAYER, minelayer, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_MINE_LAYER, minelayer, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_MINE_LAYER, minelayer, float,  weaponstart, weaponstart) \
-	w_prop(WEP_MINE_LAYER, minelayer, float,  weaponstartoverride, weaponstartoverride)
+#define MINELAYER_SETTINGS(w_cvar,w_prop) MINELAYER_SETTINGS_LIST(w_cvar, w_prop, WEP_MINE_LAYER, minelayer)
+#define MINELAYER_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_NONE, ammo) \
+	w_cvar(id, sn, MO_NONE, animtime) \
+	w_cvar(id, sn, MO_NONE, damage) \
+	w_cvar(id, sn, MO_NONE, damageforcescale) \
+	w_cvar(id, sn, MO_NONE, detonatedelay) \
+	w_cvar(id, sn, MO_NONE, edgedamage) \
+	w_cvar(id, sn, MO_NONE, force) \
+	w_cvar(id, sn, MO_NONE, health) \
+	w_cvar(id, sn, MO_NONE, lifetime) \
+	w_cvar(id, sn, MO_NONE, lifetime_countdown) \
+	w_cvar(id, sn, MO_NONE, limit) \
+	w_cvar(id, sn, MO_NONE, protection) \
+	w_cvar(id, sn, MO_NONE, proximityradius) \
+	w_cvar(id, sn, MO_NONE, radius) \
+	w_cvar(id, sn, MO_NONE, refire) \
+	w_cvar(id, sn, MO_NONE, remote_damage) \
+	w_cvar(id, sn, MO_NONE, remote_edgedamage) \
+	w_cvar(id, sn, MO_NONE, remote_force) \
+	w_cvar(id, sn, MO_NONE, remote_radius) \
+	w_cvar(id, sn, MO_NONE, speed) \
+	w_cvar(id, sn, MO_NONE, time) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 MINELAYER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_minstanex.qc b/qcsrc/common/weapons/w_minstanex.qc
index 102c24b806..a8e238197c 100644
--- a/qcsrc/common/weapons/w_minstanex.qc
+++ b/qcsrc/common/weapons/w_minstanex.qc
@@ -11,29 +11,30 @@ REGISTER_WEAPON(
 /* fullname */ _("MinstaNex")
 );
 
-#define MINSTANEX_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_PRI, ammo) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_PRI, animtime) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_PRI, refire) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, ammo) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, animtime) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, damage) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, delay) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, edgedamage) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, force) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, lifetime) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, radius) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, refire) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, shotangle) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, speed) \
-	w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, spread) \
-	w_prop(WEP_MINSTANEX, minstanex, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_MINSTANEX, minstanex, float,  reloading_time, reload_time) \
-	w_prop(WEP_MINSTANEX, minstanex, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_MINSTANEX, minstanex, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_MINSTANEX, minstanex, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_MINSTANEX, minstanex, float,  weaponstart, weaponstart) \
-	w_prop(WEP_MINSTANEX, minstanex, float,  weaponstartoverride, weaponstartoverride)
+#define MINSTANEX_SETTINGS(w_cvar,w_prop) MINSTANEX_SETTINGS_LIST(w_cvar, w_prop, WEP_MINSTANEX, minstanex)
+#define MINSTANEX_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_PRI, ammo) \
+	w_cvar(id, sn, MO_PRI, animtime) \
+	w_cvar(id, sn, MO_PRI, refire) \
+	w_cvar(id, sn, MO_SEC, ammo) \
+	w_cvar(id, sn, MO_SEC, animtime) \
+	w_cvar(id, sn, MO_SEC, damage) \
+	w_cvar(id, sn, MO_SEC, delay) \
+	w_cvar(id, sn, MO_SEC, edgedamage) \
+	w_cvar(id, sn, MO_SEC, force) \
+	w_cvar(id, sn, MO_SEC, lifetime) \
+	w_cvar(id, sn, MO_SEC, radius) \
+	w_cvar(id, sn, MO_SEC, refire) \
+	w_cvar(id, sn, MO_SEC, shotangle) \
+	w_cvar(id, sn, MO_SEC, speed) \
+	w_cvar(id, sn, MO_SEC, spread) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 MINSTANEX_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_mortar.qc b/qcsrc/common/weapons/w_mortar.qc
index 2ebb0a7a52..dc61caa78a 100644
--- a/qcsrc/common/weapons/w_mortar.qc
+++ b/qcsrc/common/weapons/w_mortar.qc
@@ -11,35 +11,36 @@ REGISTER_WEAPON(
 /* fullname */ _("Mortar")
 );
 
-#define MORTAR_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, ammo) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, animtime) \
-	w_cvar(WEP_MORTAR, mortar, MO_NONE, bouncefactor) \
-	w_cvar(WEP_MORTAR, mortar, MO_NONE, bouncestop) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, damage) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, damageforcescale) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, edgedamage) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, force) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, health) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, lifetime) \
-	w_cvar(WEP_MORTAR, mortar, MO_SEC,  lifetime_bounce) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, lifetime_stick) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, radius) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, refire) \
-	w_cvar(WEP_MORTAR, mortar, MO_SEC,  remote_detonateprimary) \
-	w_cvar(WEP_MORTAR, mortar, MO_PRI,  remote_minbouncecnt) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, speed) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, speed_up) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, speed_z) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, spread) \
-	w_cvar(WEP_MORTAR, mortar, MO_BOTH, type) \
-	w_prop(WEP_MORTAR, mortar, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_MORTAR, mortar, float,  reloading_time, reload_time) \
-	w_prop(WEP_MORTAR, mortar, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_MORTAR, mortar, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_MORTAR, mortar, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_MORTAR, mortar, float,  weaponstart, weaponstart) \
-	w_prop(WEP_MORTAR, mortar, float,  weaponstartoverride, weaponstartoverride)
+#define MORTAR_SETTINGS(w_cvar,w_prop) MORTAR_SETTINGS_LIST(w_cvar, w_prop, WEP_MORTAR, mortar)
+#define MORTAR_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_NONE, bouncefactor) \
+	w_cvar(id, sn, MO_NONE, bouncestop) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, damageforcescale) \
+	w_cvar(id, sn, MO_BOTH, edgedamage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, health) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_SEC,  lifetime_bounce) \
+	w_cvar(id, sn, MO_BOTH, lifetime_stick) \
+	w_cvar(id, sn, MO_BOTH, radius) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_SEC,  remote_detonateprimary) \
+	w_cvar(id, sn, MO_PRI,  remote_minbouncecnt) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, speed_up) \
+	w_cvar(id, sn, MO_BOTH, speed_z) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_BOTH, type) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 MORTAR_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_nex.qc b/qcsrc/common/weapons/w_nex.qc
index b6a4da15d8..9c364113b6 100644
--- a/qcsrc/common/weapons/w_nex.qc
+++ b/qcsrc/common/weapons/w_nex.qc
@@ -11,39 +11,40 @@ REGISTER_WEAPON(
 /* fullname */ _("Nex")
 );
 
-#define NEX_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, ammo) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, animtime) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, damage) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, force) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, damagefalloff_mindist) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, damagefalloff_maxdist) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, damagefalloff_halflife) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, damagefalloff_forcehalflife) \
-	w_cvar(WEP_NEX, nex, MO_BOTH, refire) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_mindmg) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_shot_multiplier) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_animlimit) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_limit) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_rate) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_rot_rate) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_rot_pause) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_start) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_minspeed) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_maxspeed) \
-	w_cvar(WEP_NEX, nex, MO_NONE, charge_velocity_rate) \
-	w_cvar(WEP_NEX, nex, MO_NONE, secondary) \
-	w_cvar(WEP_NEX, nex, MO_SEC,  chargepool) \
-	w_cvar(WEP_NEX, nex, MO_SEC,  chargepool_regen) \
-	w_cvar(WEP_NEX, nex, MO_SEC,  chargepool_pause_regen) \
-	w_prop(WEP_NEX, nex, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_NEX, nex, float,  reloading_time, reload_time) \
-	w_prop(WEP_NEX, nex, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_NEX, nex, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_NEX, nex, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_NEX, nex, float,  weaponstart, weaponstart) \
-	w_prop(WEP_NEX, nex, float,  weaponstartoverride, weaponstartoverride)
+#define NEX_SETTINGS(w_cvar,w_prop) NEX_SETTINGS_LIST(w_cvar, w_prop, WEP_NEX, nex)
+#define NEX_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, damagefalloff_mindist) \
+	w_cvar(id, sn, MO_BOTH, damagefalloff_maxdist) \
+	w_cvar(id, sn, MO_BOTH, damagefalloff_halflife) \
+	w_cvar(id, sn, MO_BOTH, damagefalloff_forcehalflife) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_NONE, charge) \
+	w_cvar(id, sn, MO_NONE, charge_mindmg) \
+	w_cvar(id, sn, MO_NONE, charge_shot_multiplier) \
+	w_cvar(id, sn, MO_NONE, charge_animlimit) \
+	w_cvar(id, sn, MO_NONE, charge_limit) \
+	w_cvar(id, sn, MO_NONE, charge_rate) \
+	w_cvar(id, sn, MO_NONE, charge_rot_rate) \
+	w_cvar(id, sn, MO_NONE, charge_rot_pause) \
+	w_cvar(id, sn, MO_NONE, charge_start) \
+	w_cvar(id, sn, MO_NONE, charge_minspeed) \
+	w_cvar(id, sn, MO_NONE, charge_maxspeed) \
+	w_cvar(id, sn, MO_NONE, charge_velocity_rate) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_cvar(id, sn, MO_SEC,  chargepool) \
+	w_cvar(id, sn, MO_SEC,  chargepool_regen) \
+	w_cvar(id, sn, MO_SEC,  chargepool_pause_regen) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 NEX_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_porto.qc b/qcsrc/common/weapons/w_porto.qc
index ee246a89b6..c11f2e640b 100644
--- a/qcsrc/common/weapons/w_porto.qc
+++ b/qcsrc/common/weapons/w_porto.qc
@@ -11,19 +11,20 @@ REGISTER_WEAPON(
 /* fullname */ _("Port-O-Launch")
 );
 
-#define PORTO_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_PORTO, porto, MO_BOTH, animtime) \
-	w_cvar(WEP_PORTO, porto, MO_BOTH, lifetime) \
-	w_cvar(WEP_PORTO, porto, MO_BOTH, refire) \
-	w_cvar(WEP_PORTO, porto, MO_BOTH, speed) \
-	w_cvar(WEP_PORTO, porto, MO_NONE, secondary) \
-	w_prop(WEP_PORTO, porto, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_PORTO, porto, float,  reloading_time, reload_time) \
-	w_prop(WEP_PORTO, porto, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_PORTO, porto, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_PORTO, porto, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_PORTO, porto, float,  weaponstart, weaponstart) \
-	w_prop(WEP_PORTO, porto, float,  weaponstartoverride, weaponstartoverride)
+#define PORTO_SETTINGS(w_cvar,w_prop) PORTO_SETTINGS_LIST(w_cvar, w_prop, WEP_PORTO, porto)
+#define PORTO_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 PORTO_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_rifle.qc b/qcsrc/common/weapons/w_rifle.qc
index c92bbf35f5..a7433b47cd 100644
--- a/qcsrc/common/weapons/w_rifle.qc
+++ b/qcsrc/common/weapons/w_rifle.qc
@@ -10,31 +10,31 @@ REGISTER_WEAPON(
 /* netname  */ "rifle",
 /* fullname */ _("Rifle")
 );
-
-#define RIFLE_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, ammo) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, animtime) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, bulletconstant) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, bullethail) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, burstcost) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, damage) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, force) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, lifetime) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, refire) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, shots) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, speed) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, spread) \
-	w_cvar(WEP_RIFLE, rifle, MO_BOTH, tracer) \
-	w_cvar(WEP_RIFLE, rifle, MO_NONE, bursttime) \
-	w_cvar(WEP_RIFLE, rifle, MO_NONE, secondary) \
-	w_cvar(WEP_RIFLE, rifle, MO_SEC,  reload) \
-	w_prop(WEP_RIFLE, rifle, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_RIFLE, rifle, float,  reloading_time, reload_time) \
-	w_prop(WEP_RIFLE, rifle, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_RIFLE, rifle, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_RIFLE, rifle, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_RIFLE, rifle, float,  weaponstart, weaponstart) \
-	w_prop(WEP_RIFLE, rifle, float,  weaponstartoverride, weaponstartoverride)
+#define RIFLE_SETTINGS(w_cvar,w_prop) RIFLE_SETTINGS_LIST(w_cvar, w_prop, WEP_RIFLE, rifle)
+#define RIFLE_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_BOTH, ammo) \
+	w_cvar(id, sn, MO_BOTH, animtime) \
+	w_cvar(id, sn, MO_BOTH, bulletconstant) \
+	w_cvar(id, sn, MO_BOTH, bullethail) \
+	w_cvar(id, sn, MO_BOTH, burstcost) \
+	w_cvar(id, sn, MO_BOTH, damage) \
+	w_cvar(id, sn, MO_BOTH, force) \
+	w_cvar(id, sn, MO_BOTH, lifetime) \
+	w_cvar(id, sn, MO_BOTH, refire) \
+	w_cvar(id, sn, MO_BOTH, shots) \
+	w_cvar(id, sn, MO_BOTH, speed) \
+	w_cvar(id, sn, MO_BOTH, spread) \
+	w_cvar(id, sn, MO_BOTH, tracer) \
+	w_cvar(id, sn, MO_NONE, bursttime) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_cvar(id, sn, MO_SEC,  reload) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 RIFLE_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_seeker.qc b/qcsrc/common/weapons/w_seeker.qc
index c4dc163d86..9444723aec 100644
--- a/qcsrc/common/weapons/w_seeker.qc
+++ b/qcsrc/common/weapons/w_seeker.qc
@@ -11,64 +11,65 @@ REGISTER_WEAPON(
 /* fullname */ _("T.A.G. Seeker")
 );
 
-#define SEEKER_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, type) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_ammo) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_animtime) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_damage) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_edgedamage) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_force) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_lifetime) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_lifetime_rand) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_radius) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_refire) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_speed) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_speed_up) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_speed_z) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, flac_spread) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_accel) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_ammo) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_animtime) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_count) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_damage) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_damageforcescale) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_decel) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_delay) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_edgedamage) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_force) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_health) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_lifetime) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_proxy) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_proxy_delay) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_proxy_maxrange) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_radius) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_refire) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_smart) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_smart_mindist) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_smart_trace_max) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_smart_trace_min) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_speed) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_speed_max) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_speed_up) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_speed_z) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_spread) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, missile_turnrate) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_ammo) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_animtime) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_damageforcescale) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_health) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_lifetime) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_refire) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_speed) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_spread) \
-	w_cvar(WEP_SEEKER, seeker, MO_NONE, tag_tracker_lifetime) \
-	w_prop(WEP_SEEKER, seeker, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_SEEKER, seeker, float,  reloading_time, reload_time) \
-	w_prop(WEP_SEEKER, seeker, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_SEEKER, seeker, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_SEEKER, seeker, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_SEEKER, seeker, float,  weaponstart, weaponstart) \
-	w_prop(WEP_SEEKER, seeker, float,  weaponstartoverride, weaponstartoverride)
+#define SEEKER_SETTINGS(w_cvar,w_prop) SEEKER_SETTINGS_LIST(w_cvar, w_prop, WEP_SEEKER, seeker)
+#define SEEKER_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_NONE, type) \
+	w_cvar(id, sn, MO_NONE, flac_ammo) \
+	w_cvar(id, sn, MO_NONE, flac_animtime) \
+	w_cvar(id, sn, MO_NONE, flac_damage) \
+	w_cvar(id, sn, MO_NONE, flac_edgedamage) \
+	w_cvar(id, sn, MO_NONE, flac_force) \
+	w_cvar(id, sn, MO_NONE, flac_lifetime) \
+	w_cvar(id, sn, MO_NONE, flac_lifetime_rand) \
+	w_cvar(id, sn, MO_NONE, flac_radius) \
+	w_cvar(id, sn, MO_NONE, flac_refire) \
+	w_cvar(id, sn, MO_NONE, flac_speed) \
+	w_cvar(id, sn, MO_NONE, flac_speed_up) \
+	w_cvar(id, sn, MO_NONE, flac_speed_z) \
+	w_cvar(id, sn, MO_NONE, flac_spread) \
+	w_cvar(id, sn, MO_NONE, missile_accel) \
+	w_cvar(id, sn, MO_NONE, missile_ammo) \
+	w_cvar(id, sn, MO_NONE, missile_animtime) \
+	w_cvar(id, sn, MO_NONE, missile_count) \
+	w_cvar(id, sn, MO_NONE, missile_damage) \
+	w_cvar(id, sn, MO_NONE, missile_damageforcescale) \
+	w_cvar(id, sn, MO_NONE, missile_decel) \
+	w_cvar(id, sn, MO_NONE, missile_delay) \
+	w_cvar(id, sn, MO_NONE, missile_edgedamage) \
+	w_cvar(id, sn, MO_NONE, missile_force) \
+	w_cvar(id, sn, MO_NONE, missile_health) \
+	w_cvar(id, sn, MO_NONE, missile_lifetime) \
+	w_cvar(id, sn, MO_NONE, missile_proxy) \
+	w_cvar(id, sn, MO_NONE, missile_proxy_delay) \
+	w_cvar(id, sn, MO_NONE, missile_proxy_maxrange) \
+	w_cvar(id, sn, MO_NONE, missile_radius) \
+	w_cvar(id, sn, MO_NONE, missile_refire) \
+	w_cvar(id, sn, MO_NONE, missile_smart) \
+	w_cvar(id, sn, MO_NONE, missile_smart_mindist) \
+	w_cvar(id, sn, MO_NONE, missile_smart_trace_max) \
+	w_cvar(id, sn, MO_NONE, missile_smart_trace_min) \
+	w_cvar(id, sn, MO_NONE, missile_speed) \
+	w_cvar(id, sn, MO_NONE, missile_speed_max) \
+	w_cvar(id, sn, MO_NONE, missile_speed_up) \
+	w_cvar(id, sn, MO_NONE, missile_speed_z) \
+	w_cvar(id, sn, MO_NONE, missile_spread) \
+	w_cvar(id, sn, MO_NONE, missile_turnrate) \
+	w_cvar(id, sn, MO_NONE, tag_ammo) \
+	w_cvar(id, sn, MO_NONE, tag_animtime) \
+	w_cvar(id, sn, MO_NONE, tag_damageforcescale) \
+	w_cvar(id, sn, MO_NONE, tag_health) \
+	w_cvar(id, sn, MO_NONE, tag_lifetime) \
+	w_cvar(id, sn, MO_NONE, tag_refire) \
+	w_cvar(id, sn, MO_NONE, tag_speed) \
+	w_cvar(id, sn, MO_NONE, tag_spread) \
+	w_cvar(id, sn, MO_NONE, tag_tracker_lifetime) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 SEEKER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_shockwave.qc b/qcsrc/common/weapons/w_shockwave.qc
index 21ed3815b3..d859f62e81 100644
--- a/qcsrc/common/weapons/w_shockwave.qc
+++ b/qcsrc/common/weapons/w_shockwave.qc
@@ -11,67 +11,68 @@ REGISTER_WEAPON(
 /* fullname */ _("Shockwave")
 );
 
-#define SHOCKWAVE_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_damage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_distance) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_edgedamage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_force) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_force_forwardbias) \
-	/*w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_force_velocitybias)*/ \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_force_zscale) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_damage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_edgedamage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_force) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_force_velocitybias) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_force_zscale) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_multiplier_accuracy) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_multiplier_distance) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_multiplier_min) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_jump_radius) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_multiplier_accuracy) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_multiplier_distance) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_multiplier_min) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_damage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_edgedamage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_force) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_force_forwardbias) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_multiplier_accuracy) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_multiplier_distance) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_multiplier_min) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_splash_radius) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_spread_max) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, blast_spread_min) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_animtime) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_damage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_delay) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_force) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_multihit) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_no_doubleslap) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_nonplayerdamage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_range) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_refire) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_swing_side) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_swing_up) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_time) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, melee_traces) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_ammo) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_animtime) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_bulletconstant) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_bullets) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_damage) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_force) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_refire) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_speed) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, pellets_spread) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, primary) \
-	w_cvar(WEP_SHOCKWAVE, shockwave, MO_NONE, secondary) \
-	w_prop(WEP_SHOCKWAVE, shockwave, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_SHOCKWAVE, shockwave, float,  reloading_time, reload_time) \
-	w_prop(WEP_SHOCKWAVE, shockwave, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_SHOCKWAVE, shockwave, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_SHOCKWAVE, shockwave, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_SHOCKWAVE, shockwave, float,  weaponstart, weaponstart) \
-	w_prop(WEP_SHOCKWAVE, shockwave, float,  weaponstartoverride, weaponstartoverride)
+#define SHOCKWAVE_SETTINGS(w_cvar,w_prop) SHOCKWAVE_SETTINGS_LIST(w_cvar, w_prop, WEP_SHOCKWAVE, shockwave)
+#define SHOCKWAVE_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_NONE, blast_damage) \
+	w_cvar(id, sn, MO_NONE, blast_distance) \
+	w_cvar(id, sn, MO_NONE, blast_edgedamage) \
+	w_cvar(id, sn, MO_NONE, blast_force) \
+	w_cvar(id, sn, MO_NONE, blast_force_forwardbias) \
+	/*w_cvar(id, sn, MO_NONE, blast_force_velocitybias)*/ \
+	w_cvar(id, sn, MO_NONE, blast_force_zscale) \
+	w_cvar(id, sn, MO_NONE, blast_jump_damage) \
+	w_cvar(id, sn, MO_NONE, blast_jump_edgedamage) \
+	w_cvar(id, sn, MO_NONE, blast_jump_force) \
+	w_cvar(id, sn, MO_NONE, blast_jump_force_velocitybias) \
+	w_cvar(id, sn, MO_NONE, blast_jump_force_zscale) \
+	w_cvar(id, sn, MO_NONE, blast_jump_multiplier_accuracy) \
+	w_cvar(id, sn, MO_NONE, blast_jump_multiplier_distance) \
+	w_cvar(id, sn, MO_NONE, blast_jump_multiplier_min) \
+	w_cvar(id, sn, MO_NONE, blast_jump_radius) \
+	w_cvar(id, sn, MO_NONE, blast_multiplier_accuracy) \
+	w_cvar(id, sn, MO_NONE, blast_multiplier_distance) \
+	w_cvar(id, sn, MO_NONE, blast_multiplier_min) \
+	w_cvar(id, sn, MO_NONE, blast_splash_damage) \
+	w_cvar(id, sn, MO_NONE, blast_splash_edgedamage) \
+	w_cvar(id, sn, MO_NONE, blast_splash_force) \
+	w_cvar(id, sn, MO_NONE, blast_splash_force_forwardbias) \
+	w_cvar(id, sn, MO_NONE, blast_splash_multiplier_accuracy) \
+	w_cvar(id, sn, MO_NONE, blast_splash_multiplier_distance) \
+	w_cvar(id, sn, MO_NONE, blast_splash_multiplier_min) \
+	w_cvar(id, sn, MO_NONE, blast_splash_radius) \
+	w_cvar(id, sn, MO_NONE, blast_spread_max) \
+	w_cvar(id, sn, MO_NONE, blast_spread_min) \
+	w_cvar(id, sn, MO_NONE, melee_animtime) \
+	w_cvar(id, sn, MO_NONE, melee_damage) \
+	w_cvar(id, sn, MO_NONE, melee_delay) \
+	w_cvar(id, sn, MO_NONE, melee_force) \
+	w_cvar(id, sn, MO_NONE, melee_multihit) \
+	w_cvar(id, sn, MO_NONE, melee_no_doubleslap) \
+	w_cvar(id, sn, MO_NONE, melee_nonplayerdamage) \
+	w_cvar(id, sn, MO_NONE, melee_range) \
+	w_cvar(id, sn, MO_NONE, melee_refire) \
+	w_cvar(id, sn, MO_NONE, melee_swing_side) \
+	w_cvar(id, sn, MO_NONE, melee_swing_up) \
+	w_cvar(id, sn, MO_NONE, melee_time) \
+	w_cvar(id, sn, MO_NONE, melee_traces) \
+	w_cvar(id, sn, MO_NONE, pellets_ammo) \
+	w_cvar(id, sn, MO_NONE, pellets_animtime) \
+	w_cvar(id, sn, MO_NONE, pellets_bulletconstant) \
+	w_cvar(id, sn, MO_NONE, pellets_bullets) \
+	w_cvar(id, sn, MO_NONE, pellets_damage) \
+	w_cvar(id, sn, MO_NONE, pellets_force) \
+	w_cvar(id, sn, MO_NONE, pellets_refire) \
+	w_cvar(id, sn, MO_NONE, pellets_speed) \
+	w_cvar(id, sn, MO_NONE, pellets_spread) \
+	w_cvar(id, sn, MO_NONE, primary) \
+	w_cvar(id, sn, MO_NONE, secondary) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 SHOCKWAVE_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
diff --git a/qcsrc/common/weapons/w_tuba.qc b/qcsrc/common/weapons/w_tuba.qc
index 50ee4c81d0..08d5e9d969 100644
--- a/qcsrc/common/weapons/w_tuba.qc
+++ b/qcsrc/common/weapons/w_tuba.qc
@@ -12,21 +12,22 @@ REGISTER_WEAPON(
 /* fullname  */ _("@!#%'n Tuba")
 );
 
-#define TUBA_SETTINGS(w_cvar,w_prop) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, animtime) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, attenuation) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, damage) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, edgedamage) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, force) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, radius) \
-	w_cvar(WEP_TUBA, tuba, MO_NONE, refire) \
-	w_prop(WEP_TUBA, tuba, float,  reloading_ammo, reload_ammo) \
-	w_prop(WEP_TUBA, tuba, float,  reloading_time, reload_time) \
-	w_prop(WEP_TUBA, tuba, float,  switchdelay_raise, switchdelay_raise) \
-	w_prop(WEP_TUBA, tuba, float,  switchdelay_drop, switchdelay_drop) \
-	w_prop(WEP_TUBA, tuba, string, weaponreplace, weaponreplace) \
-	w_prop(WEP_TUBA, tuba, float,  weaponstart, weaponstart) \
-	w_prop(WEP_TUBA, tuba, float,  weaponstartoverride, weaponstartoverride)
+#define TUBA_SETTINGS(w_cvar,w_prop) TUBA_SETTINGS_LIST(w_cvar, w_prop, WEP_TUBA, tuba)
+#define TUBA_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
+	w_cvar(id, sn, MO_NONE, animtime) \
+	w_cvar(id, sn, MO_NONE, attenuation) \
+	w_cvar(id, sn, MO_NONE, damage) \
+	w_cvar(id, sn, MO_NONE, edgedamage) \
+	w_cvar(id, sn, MO_NONE, force) \
+	w_cvar(id, sn, MO_NONE, radius) \
+	w_cvar(id, sn, MO_NONE, refire) \
+	w_prop(id, sn, float,  reloading_ammo, reload_ammo) \
+	w_prop(id, sn, float,  reloading_time, reload_time) \
+	w_prop(id, sn, float,  switchdelay_raise, switchdelay_raise) \
+	w_prop(id, sn, float,  switchdelay_drop, switchdelay_drop) \
+	w_prop(id, sn, string, weaponreplace, weaponreplace) \
+	w_prop(id, sn, float,  weaponstart, weaponstart) \
+	w_prop(id, sn, float,  weaponstartoverride, weaponstartoverride)
 
 #ifdef SVQC
 TUBA_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
-- 
2.39.5