]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'divVerent/ballistic2' into samual/weapons
authorRudolf Polzer <divverent@xonotic.org>
Thu, 12 Dec 2013 12:16:14 +0000 (13:16 +0100)
committerRudolf Polzer <divverent@xonotic.org>
Thu, 12 Dec 2013 12:38:58 +0000 (13:38 +0100)
Conflicts:
bal-wep-xonotic.cfg
qcsrc/common/weapons/w_machinegun.qc
qcsrc/common/weapons/w_rifle.qc
qcsrc/common/weapons/w_shotgun.qc
qcsrc/server/autocvars.qh
qcsrc/server/tturrets/units/unit_machinegun.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/weapons/tracing.qc

19 files changed:
1  2 
bal-wep-xonotic.cfg
defaultXonotic.cfg
oldbalance25.cfg
oldbalanceFruitieX.cfg
oldbalanceXDF.cfg
oldbalanceXPM.cfg
qcsrc/client/Main.qc
qcsrc/client/particles.qc
qcsrc/common/constants.qh
qcsrc/common/weapons/w_machinegun.qc
qcsrc/common/weapons/w_rifle.qc
qcsrc/common/weapons/w_shotgun.qc
qcsrc/server/autocvars.qh
qcsrc/server/defs.qh
qcsrc/server/miscfunctions.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/weapons/tracing.qc
qcsrc/server/weapons/tracing.qh

diff --combined bal-wep-xonotic.cfg
index e395278bd13d7094d49d58b2a54adc4da6380ef4,0000000000000000000000000000000000000000..277809b164f8411e032e4dc1466246c71084b58e
mode 100644,000000..100644
--- /dev/null
@@@ -1,717 -1,0 +1,711 @@@
- set g_balance_uzi_bulletconstant 115
 +// {{{ #1: Blaster
 +set g_balance_blaster_primary_animtime 0.2
 +set g_balance_blaster_primary_damage 25
 +set g_balance_blaster_primary_delay 0
 +set g_balance_blaster_primary_edgedamage 12.5
 +set g_balance_blaster_primary_force 300
 +set g_balance_blaster_primary_lifetime 5
 +set g_balance_blaster_primary_radius 70
 +set g_balance_blaster_primary_refire 0.7
 +set g_balance_blaster_primary_shotangle 0
 +set g_balance_blaster_primary_speed 6000
 +set g_balance_blaster_primary_spread 0
 +set g_balance_blaster_secondary 0
 +set g_balance_blaster_secondary_animtime 0.2
 +set g_balance_blaster_secondary_damage 25
 +set g_balance_blaster_secondary_delay 0
 +set g_balance_blaster_secondary_edgedamage 12.5
 +set g_balance_blaster_secondary_force 300
 +set g_balance_blaster_secondary_lifetime 5
 +set g_balance_blaster_secondary_radius 70
 +set g_balance_blaster_secondary_refire 0.7
 +set g_balance_blaster_secondary_shotangle 0
 +set g_balance_blaster_secondary_speed 6000
 +set g_balance_blaster_secondary_spread 0
 +set g_balance_blaster_switchdelay_drop 0.15
 +set g_balance_blaster_switchdelay_raise 0.15
 +set g_balance_blaster_weaponreplace ""
 +set g_balance_blaster_weaponstart 1
 +set g_balance_blaster_weaponstartoverride -1
 +// }}}
 +// {{{ #2: Shockwave
 +set g_balance_shockwave_blast_animtime 0.3
 +set g_balance_shockwave_blast_damage 20
 +set g_balance_shockwave_blast_distance 2000
 +set g_balance_shockwave_blast_edgedamage 0
 +set g_balance_shockwave_blast_force 200
 +set g_balance_shockwave_blast_force_forwardbias 50
 +set g_balance_shockwave_blast_force_zscale 2
 +set g_balance_shockwave_blast_jump_damage 20
 +set g_balance_shockwave_blast_jump_edgedamage 0
 +set g_balance_shockwave_blast_jump_force 300
 +set g_balance_shockwave_blast_jump_force_velocitybias 0
 +set g_balance_shockwave_blast_jump_force_zscale 1.25
 +set g_balance_shockwave_blast_jump_multiplier_accuracy 0.5
 +set g_balance_shockwave_blast_jump_multiplier_distance 0.5
 +set g_balance_shockwave_blast_jump_multiplier_min 0
 +set g_balance_shockwave_blast_jump_radius 150
 +set g_balance_shockwave_blast_multiplier_accuracy 0.5
 +set g_balance_shockwave_blast_multiplier_distance 0.5
 +set g_balance_shockwave_blast_multiplier_min 0
 +set g_balance_shockwave_blast_refire 0.75
 +set g_balance_shockwave_blast_splash_damage 15
 +set g_balance_shockwave_blast_splash_edgedamage 0
 +set g_balance_shockwave_blast_splash_force 100
 +set g_balance_shockwave_blast_splash_force_forwardbias 50
 +set g_balance_shockwave_blast_splash_multiplier_accuracy 0.5
 +set g_balance_shockwave_blast_splash_multiplier_distance 0.5
 +set g_balance_shockwave_blast_splash_multiplier_min 0
 +set g_balance_shockwave_blast_splash_radius 70
 +set g_balance_shockwave_blast_spread_max 120
 +set g_balance_shockwave_blast_spread_min 25
 +set g_balance_shockwave_melee_animtime 1.3
 +set g_balance_shockwave_melee_damage 80
 +set g_balance_shockwave_melee_delay 0.25
 +set g_balance_shockwave_melee_force 200
 +set g_balance_shockwave_melee_multihit 1
 +set g_balance_shockwave_melee_no_doubleslap 1
 +set g_balance_shockwave_melee_nonplayerdamage 40
 +set g_balance_shockwave_melee_range 120
 +set g_balance_shockwave_melee_refire 1.25
 +set g_balance_shockwave_melee_swing_side 120
 +set g_balance_shockwave_melee_swing_up 30
 +set g_balance_shockwave_melee_time 0.15
 +set g_balance_shockwave_melee_traces 10
 +set g_balance_shockwave_switchdelay_drop 0.2
 +set g_balance_shockwave_switchdelay_raise 0.2
 +set g_balance_shockwave_weaponreplace ""
 +set g_balance_shockwave_weaponstart 1
 +set g_balance_shockwave_weaponstartoverride -1
 +// }}}
 +// {{{ #3: Machine Gun
- set g_balance_uzi_speed 18000
 +set g_balance_uzi_burst 3
 +set g_balance_uzi_burst_ammo 3
 +set g_balance_uzi_burst_animtime 0.3
 +set g_balance_uzi_burst_refire 0.06
 +set g_balance_uzi_burst_refire2 0.45
 +set g_balance_uzi_burst_speed 0
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_ammo 1
 +set g_balance_uzi_first_damage 14
 +set g_balance_uzi_first_force 5
 +set g_balance_uzi_first_refire 0.125
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_mode 1
 +set g_balance_uzi_reload_ammo 60
 +set g_balance_uzi_reload_time 2
- set g_balance_rifle_primary_bulletconstant 110
++set g_balance_uzi_solidpenetration 13.1
 +set g_balance_uzi_spread_add 0.012
 +set g_balance_uzi_spread_max 0.05
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_sustained_ammo 1
 +set g_balance_uzi_sustained_damage 10
 +set g_balance_uzi_sustained_force 5
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_spread 0.03
 +set g_balance_uzi_switchdelay_drop 0.2
 +set g_balance_uzi_switchdelay_raise 0.2
 +set g_balance_uzi_weaponreplace "arc"
 +set g_balance_uzi_weaponstart 0
 +set g_balance_uzi_weaponstartoverride -1
 +// }}}
 +// {{{ #4: Mortar
 +set g_balance_mortar_bouncefactor 0.5
 +set g_balance_mortar_bouncestop 0.075
 +set g_balance_mortar_primary_ammo 2
 +set g_balance_mortar_primary_animtime 0.3
 +set g_balance_mortar_primary_damage 50
 +set g_balance_mortar_primary_damageforcescale 0
 +set g_balance_mortar_primary_edgedamage 25
 +set g_balance_mortar_primary_force 250
 +set g_balance_mortar_primary_health 15
 +set g_balance_mortar_primary_lifetime 5
 +set g_balance_mortar_primary_lifetime_stick 0
 +set g_balance_mortar_primary_radius 120
 +set g_balance_mortar_primary_refire 0.8
 +set g_balance_mortar_primary_remote_minbouncecnt 0
 +set g_balance_mortar_primary_speed 1900
 +set g_balance_mortar_primary_speed_up 225
 +set g_balance_mortar_primary_speed_z 0
 +set g_balance_mortar_primary_spread 0
 +set g_balance_mortar_primary_type 0
 +set g_balance_mortar_reload_ammo 0
 +set g_balance_mortar_reload_time 2
 +set g_balance_mortar_secondary_ammo 2
 +set g_balance_mortar_secondary_animtime 0.3
 +set g_balance_mortar_secondary_damage 60
 +set g_balance_mortar_secondary_damageforcescale 4
 +set g_balance_mortar_secondary_edgedamage 30
 +set g_balance_mortar_secondary_force 250
 +set g_balance_mortar_secondary_health 30
 +set g_balance_mortar_secondary_lifetime 5
 +set g_balance_mortar_secondary_lifetime_bounce 0.5
 +set g_balance_mortar_secondary_lifetime_stick 0
 +set g_balance_mortar_secondary_radius 120
 +set g_balance_mortar_secondary_refire 0.7
 +set g_balance_mortar_secondary_remote_detonateprimary 0
 +set g_balance_mortar_secondary_speed 1400
 +set g_balance_mortar_secondary_speed_up 150
 +set g_balance_mortar_secondary_speed_z 0
 +set g_balance_mortar_secondary_spread 0
 +set g_balance_mortar_secondary_type 1
 +set g_balance_mortar_switchdelay_drop 0.2
 +set g_balance_mortar_switchdelay_raise 0.2
 +set g_balance_mortar_weaponreplace ""
 +set g_balance_mortar_weaponstart 0
 +set g_balance_mortar_weaponstartoverride -1
 +// }}}
 +// {{{ #5: Mine Layer (MUTATOR WEAPON)
 +set g_balance_minelayer_ammo 4
 +set g_balance_minelayer_animtime 0.4
 +set g_balance_minelayer_damage 40
 +set g_balance_minelayer_damageforcescale 0
 +set g_balance_minelayer_detonatedelay -1
 +set g_balance_minelayer_edgedamage 20
 +set g_balance_minelayer_force 250
 +set g_balance_minelayer_health 15
 +set g_balance_minelayer_lifetime 10
 +set g_balance_minelayer_lifetime_countdown 0.5
 +set g_balance_minelayer_limit 3
 +set g_balance_minelayer_protection 0
 +set g_balance_minelayer_proximityradius 150
 +set g_balance_minelayer_radius 175
 +set g_balance_minelayer_refire 1.5
 +set g_balance_minelayer_reload_ammo 0
 +set g_balance_minelayer_reload_time 2
 +set g_balance_minelayer_remote_damage 45
 +set g_balance_minelayer_remote_edgedamage 40
 +set g_balance_minelayer_remote_force 300
 +set g_balance_minelayer_remote_radius 200
 +set g_balance_minelayer_speed 1000
 +set g_balance_minelayer_switchdelay_drop 0.2
 +set g_balance_minelayer_switchdelay_raise 0.2
 +set g_balance_minelayer_time 0.5
 +set g_balance_minelayer_weaponreplace ""
 +set g_balance_minelayer_weaponstart 0
 +set g_balance_minelayer_weaponstartoverride -1
 +// }}}
 +// {{{ #6: Electro
 +set g_balance_electro_combo_comboradius 300
 +set g_balance_electro_combo_comboradius_thruwall 200
 +set g_balance_electro_combo_damage 50
 +set g_balance_electro_combo_edgedamage 25
 +set g_balance_electro_combo_force 120
 +set g_balance_electro_combo_radius 150
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_primary_ammo 4
 +set g_balance_electro_primary_animtime 0.3
 +set g_balance_electro_primary_comboradius 300
 +set g_balance_electro_primary_damage 40
 +set g_balance_electro_primary_edgedamage 20
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_lifetime 5
 +set g_balance_electro_primary_midaircombo_explode 1
 +set g_balance_electro_primary_midaircombo_interval 0.1
 +set g_balance_electro_primary_midaircombo_radius 100
 +set g_balance_electro_primary_radius 100
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_speed 2500
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_reload_ammo 0
 +set g_balance_electro_reload_time 2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_bouncefactor 0.3
 +set g_balance_electro_secondary_bouncestop 0.05
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_damage 40
 +set g_balance_electro_secondary_damagedbycontents 1
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_edgedamage 20
 +set g_balance_electro_secondary_force 50
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_lifetime 4
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 1.6
 +set g_balance_electro_secondary_speed 1000
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.04
 +set g_balance_electro_secondary_touchexplode 0
 +set g_balance_electro_switchdelay_drop 0.2
 +set g_balance_electro_switchdelay_raise 0.2
 +set g_balance_electro_weaponreplace ""
 +set g_balance_electro_weaponstart 0
 +set g_balance_electro_weaponstartoverride -1
 +// }}}
 +// {{{ #7: Arc
 +set g_balance_arc_primary_ammo 0
 +set g_balance_arc_primary_animtime 0
 +set g_balance_arc_primary_damage 0
 +set g_balance_arc_primary_falloff_halflifedist 0
 +set g_balance_arc_primary_falloff_maxdist 0
 +set g_balance_arc_primary_falloff_mindist 0
 +set g_balance_arc_primary_force 0
 +set g_balance_arc_primary_range 0
 +set g_balance_arc_primary_refire 0
 +set g_balance_arc_secondary_ammo 0
 +set g_balance_arc_switchdelay_drop 0
 +set g_balance_arc_switchdelay_raise 0
 +set g_balance_arc_weaponreplace ""
 +set g_balance_arc_weaponstart 0
 +set g_balance_arc_weaponstartoverride -1
 +// }}}
 +// {{{ #8: Crylink
 +set g_balance_crylink_primary_ammo 3
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_damage 12
 +set g_balance_crylink_primary_edgedamage 6
 +set g_balance_crylink_primary_force -50
 +set g_balance_crylink_primary_joindelay 0.1
 +set g_balance_crylink_primary_joinexplode 1
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinspread 0.2
 +set g_balance_crylink_primary_linkexplode 1
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_middle_lifetime 5
 +set g_balance_crylink_primary_other_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 5
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_refire 0.7
 +set g_balance_crylink_primary_shots 6
 +set g_balance_crylink_primary_speed 2000
 +set g_balance_crylink_primary_spread 0.08
 +set g_balance_crylink_reload_ammo 0
 +set g_balance_crylink_reload_time 2
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_animtime 0.2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_damage 10
 +set g_balance_crylink_secondary_edgedamage 5
 +set g_balance_crylink_secondary_force -250
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinexplode 0
 +set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinspread 0
 +set g_balance_crylink_secondary_linkexplode 1
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_middle_lifetime 5
 +set g_balance_crylink_secondary_other_fadetime 5
 +set g_balance_crylink_secondary_other_lifetime 5
 +set g_balance_crylink_secondary_radius 100
 +set g_balance_crylink_secondary_refire 0.7
 +set g_balance_crylink_secondary_shots 5
 +set g_balance_crylink_secondary_speed 3000
 +set g_balance_crylink_secondary_spread 0.01
 +set g_balance_crylink_secondary_spreadtype 1
 +set g_balance_crylink_switchdelay_drop 0.2
 +set g_balance_crylink_switchdelay_raise 0.2
 +set g_balance_crylink_weaponreplace ""
 +set g_balance_crylink_weaponstart 0
 +set g_balance_crylink_weaponstartoverride -1
 +// }}}
 +// {{{ #9: Vortex
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1
 +set g_balance_nex_charge_maxspeed 800
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_rate 0.4
 +set g_balance_nex_charge_rot_pause 0
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_primary_ammo 6
 +set g_balance_nex_primary_animtime 0.6
 +set g_balance_nex_primary_damage 80
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0
 +set g_balance_nex_primary_damagefalloff_halflife 0
 +set g_balance_nex_primary_damagefalloff_maxdist 0
 +set g_balance_nex_primary_damagefalloff_mindist 0
 +set g_balance_nex_primary_force 400
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_reload_ammo 0
 +set g_balance_nex_reload_time 2
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_ammo 2
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_switchdelay_drop 0.3
 +set g_balance_nex_switchdelay_raise 0.25
 +set g_balance_nex_weaponreplace ""
 +set g_balance_nex_weaponstart 0
 +set g_balance_nex_weaponstartoverride -1
 +// }}}
 +// {{{ #10: Hagar
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_primary_damage 25
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_edgedamage 12.5
 +set g_balance_hagar_primary_force 100
 +set g_balance_hagar_primary_health 15
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_radius 65
 +set g_balance_hagar_primary_refire 0.16667
 +set g_balance_hagar_primary_speed 2500
 +set g_balance_hagar_primary_spread 0.03
 +set g_balance_hagar_reload_ammo 0
 +set g_balance_hagar_reload_time 2
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_secondary_damage 40
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_edgedamage 20
 +set g_balance_hagar_secondary_force 75
 +set g_balance_hagar_secondary_health 15
 +set g_balance_hagar_secondary_lifetime_min 10
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_load 1
 +set g_balance_hagar_secondary_load_abort 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_load_hold 4
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_releasedeath 0
 +set g_balance_hagar_secondary_load_speed 0.5
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_radius 80
 +set g_balance_hagar_secondary_refire 0.5
 +set g_balance_hagar_secondary_speed 2500
 +set g_balance_hagar_secondary_spread 0.05
 +set g_balance_hagar_switchdelay_drop 0.2
 +set g_balance_hagar_switchdelay_raise 0.2
 +set g_balance_hagar_weaponreplace ""
 +set g_balance_hagar_weaponstart 0
 +set g_balance_hagar_weaponstartoverride -1
 +// }}}
 +// {{{ #11: Devastator
 +set g_balance_devastator_ammo 4
 +set g_balance_devastator_animtime 0.4
 +set g_balance_devastator_damage 70
 +set g_balance_devastator_damageforcescale 1
 +set g_balance_devastator_detonatedelay 0.02
 +set g_balance_devastator_edgedamage 35
 +set g_balance_devastator_force 450
 +set g_balance_devastator_guidedelay 0.2
 +set g_balance_devastator_guidegoal 512
 +set g_balance_devastator_guiderate 70
 +set g_balance_devastator_guideratedelay 0.01
 +set g_balance_devastator_guidestop 0
 +set g_balance_devastator_health 30
 +set g_balance_devastator_lifetime 10
 +set g_balance_devastator_radius 110
 +set g_balance_devastator_refire 1.2
 +set g_balance_devastator_reload_ammo 0
 +set g_balance_devastator_reload_time 2
 +set g_balance_devastator_remote_damage 70
 +set g_balance_devastator_remote_edgedamage 35
 +set g_balance_devastator_remote_force 400
 +set g_balance_devastator_remote_radius 110
 +set g_balance_devastator_speed 1300
 +set g_balance_devastator_speedaccel 1300
 +set g_balance_devastator_speedstart 1000
 +set g_balance_devastator_switchdelay_drop 0.3
 +set g_balance_devastator_switchdelay_raise 0.2
 +set g_balance_devastator_weaponreplace ""
 +set g_balance_devastator_weaponstart 0
 +set g_balance_devastator_weaponstartoverride -1
 +// }}}
 +// {{{ #12: Port-O-Launch
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_speed 1000
 +set g_balance_porto_secondary 1
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_speed 1000
 +set g_balance_porto_switchdelay_drop 0.2
 +set g_balance_porto_switchdelay_raise 0.2
 +set g_balance_porto_weaponreplace ""
 +set g_balance_porto_weaponstart 0
 +set g_balance_porto_weaponstartoverride -1
 +// }}}
 +// {{{ #13: Vaporizer
 +set g_balance_minstanex_primary_ammo 10
 +set g_balance_minstanex_primary_animtime 0.3
 +set g_balance_minstanex_primary_refire 1
 +set g_balance_minstanex_reload_ammo 0
 +set g_balance_minstanex_reload_time 0
 +set g_balance_minstanex_secondary_ammo 0
 +set g_balance_minstanex_secondary_animtime 0.3
 +set g_balance_minstanex_secondary_damage 0
 +set g_balance_minstanex_secondary_delay 0
 +set g_balance_minstanex_secondary_edgedamage 0
 +set g_balance_minstanex_secondary_force 300
 +set g_balance_minstanex_secondary_lifetime 5
 +set g_balance_minstanex_secondary_radius 70
 +set g_balance_minstanex_secondary_refire 0.7
 +set g_balance_minstanex_secondary_shotangle 0
 +set g_balance_minstanex_secondary_speed 6000
 +set g_balance_minstanex_secondary_spread 0
 +set g_balance_minstanex_switchdelay_drop 0.2
 +set g_balance_minstanex_switchdelay_raise 0.2
 +set g_balance_minstanex_weaponreplace ""
 +set g_balance_minstanex_weaponstart 0
 +set g_balance_minstanex_weaponstartoverride -1
 +// }}}
 +// {{{ #14: Grappling Hook
 +set g_balance_hook_primary_ammo 5
 +set g_balance_hook_primary_animtime 0.3
 +set g_balance_hook_primary_hooked_ammo 5
 +set g_balance_hook_primary_hooked_time_free 2
 +set g_balance_hook_primary_hooked_time_max 0
 +set g_balance_hook_primary_refire 0
 +set g_balance_hook_secondary_animtime 0.3
 +set g_balance_hook_secondary_damage 25
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_secondary_duration 1.5
 +set g_balance_hook_secondary_edgedamage 5
 +set g_balance_hook_secondary_force -2000
 +set g_balance_hook_secondary_gravity 5
 +set g_balance_hook_secondary_health 15
 +set g_balance_hook_secondary_lifetime 5
 +set g_balance_hook_secondary_power 3
 +set g_balance_hook_secondary_radius 500
 +set g_balance_hook_secondary_refire 3
 +set g_balance_hook_secondary_speed 0
 +set g_balance_hook_switchdelay_drop 0.2
 +set g_balance_hook_switchdelay_raise 0.2
 +set g_balance_hook_weaponreplace ""
 +set g_balance_hook_weaponstart 0
 +set g_balance_hook_weaponstartoverride -1
 +// }}}
 +// {{{ #15: Heavy Laser Assault Cannon (MUTATOR WEAPON)
 +set g_balance_hlac_primary_ammo 1
 +set g_balance_hlac_primary_animtime 0.4
 +set g_balance_hlac_primary_damage 18
 +set g_balance_hlac_primary_edgedamage 9
 +set g_balance_hlac_primary_force 90
 +set g_balance_hlac_primary_lifetime 5
 +set g_balance_hlac_primary_radius 70
 +set g_balance_hlac_primary_refire 0.15
 +set g_balance_hlac_primary_speed 9000
 +set g_balance_hlac_primary_spread_add 0.0045
 +set g_balance_hlac_primary_spread_crouchmod 0.25
 +set g_balance_hlac_primary_spread_max 0.25
 +set g_balance_hlac_primary_spread_min 0.01
 +set g_balance_hlac_reload_ammo 0
 +set g_balance_hlac_reload_time 2
 +set g_balance_hlac_secondary 1
 +set g_balance_hlac_secondary_ammo 10
 +set g_balance_hlac_secondary_animtime 0.3
 +set g_balance_hlac_secondary_damage 15
 +set g_balance_hlac_secondary_edgedamage 7.5
 +set g_balance_hlac_secondary_force 90
 +set g_balance_hlac_secondary_lifetime 5
 +set g_balance_hlac_secondary_radius 70
 +set g_balance_hlac_secondary_refire 1
 +set g_balance_hlac_secondary_shots 6
 +set g_balance_hlac_secondary_speed 9000
 +set g_balance_hlac_secondary_spread 0.15
 +set g_balance_hlac_secondary_spread_crouchmod 0.5
 +set g_balance_hlac_switchdelay_drop 0.2
 +set g_balance_hlac_switchdelay_raise 0.2
 +set g_balance_hlac_weaponreplace ""
 +set g_balance_hlac_weaponstart 0
 +set g_balance_hlac_weaponstartoverride -1
 +// }}}
 +// {{{ #16: @!#%'n Tuba
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_force 40
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_switchdelay_drop 0.2
 +set g_balance_tuba_switchdelay_raise 0.2
 +set g_balance_tuba_weaponreplace ""
 +set g_balance_tuba_weaponstart 0
 +set g_balance_tuba_weaponstartoverride -1
 +// }}}
 +// {{{ #17: Rifle (MUTATOR WEAPON)
 +set g_balance_rifle_bursttime 0
 +set g_balance_rifle_primary_ammo 10
 +set g_balance_rifle_primary_animtime 0.4
- set g_balance_rifle_primary_lifetime 5
 +set g_balance_rifle_primary_bullethail 0
 +set g_balance_rifle_primary_burstcost 0
 +set g_balance_rifle_primary_damage 80
 +set g_balance_rifle_primary_force 100
- set g_balance_rifle_primary_speed 40000
 +set g_balance_rifle_primary_refire 1.2
 +set g_balance_rifle_primary_shots 1
- set g_balance_rifle_secondary_bulletconstant 110
++set g_balance_rifle_primary_solidpenetration 62.2
 +set g_balance_rifle_primary_spread 0
 +set g_balance_rifle_primary_tracer 1
 +set g_balance_rifle_reload_ammo 80
 +set g_balance_rifle_reload_time 2
 +set g_balance_rifle_secondary 1
 +set g_balance_rifle_secondary_ammo 10
 +set g_balance_rifle_secondary_animtime 0.3
- set g_balance_rifle_secondary_lifetime 5
 +set g_balance_rifle_secondary_bullethail 0
 +set g_balance_rifle_secondary_burstcost 0
 +set g_balance_rifle_secondary_damage 20
 +set g_balance_rifle_secondary_force 50
- set g_balance_rifle_secondary_speed 20000
 +set g_balance_rifle_secondary_refire 0.9
 +set g_balance_rifle_secondary_reload 0
 +set g_balance_rifle_secondary_shots 4
- set g_balance_shotgun_primary_bulletconstant 75
++set g_balance_rifle_secondary_solidpenetration 15.5
 +set g_balance_rifle_secondary_spread 0.04
 +set g_balance_rifle_secondary_tracer 0
 +set g_balance_rifle_switchdelay_drop 0.2
 +set g_balance_rifle_switchdelay_raise 0.2
 +set g_balance_rifle_weaponreplace ""
 +set g_balance_rifle_weaponstart 0
 +set g_balance_rifle_weaponstartoverride -1
 +// }}}
 +// {{{ #18: Fireball
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 0
 +set g_balance_fireball_primary_edgedamage 50
 +set g_balance_fireball_primary_force 600
 +set g_balance_fireball_primary_health 0
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 2
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 1200
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 1.5
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.2
 +set g_balance_fireball_switchdelay_raise 0.2
 +set g_balance_fireball_weaponreplace ""
 +set g_balance_fireball_weaponstart 0
 +set g_balance_fireball_weaponstartoverride -1
 +// }}}
 +// {{{ #19: T.A.G. Seeker (MUTATOR WEAPON)
 +set g_balance_seeker_flac_ammo 1
 +set g_balance_seeker_flac_animtime 0.1
 +set g_balance_seeker_flac_damage 15
 +set g_balance_seeker_flac_edgedamage 10
 +set g_balance_seeker_flac_force 50
 +set g_balance_seeker_flac_lifetime 0.1
 +set g_balance_seeker_flac_lifetime_rand 0.05
 +set g_balance_seeker_flac_radius 100
 +set g_balance_seeker_flac_refire 0.1
 +set g_balance_seeker_flac_speed 3000
 +set g_balance_seeker_flac_speed_up 1000
 +set g_balance_seeker_flac_speed_z 0
 +set g_balance_seeker_flac_spread 0.4
 +set g_balance_seeker_missile_accel 1400
 +set g_balance_seeker_missile_ammo 2
 +set g_balance_seeker_missile_animtime 0.2
 +set g_balance_seeker_missile_count 3
 +set g_balance_seeker_missile_damage 30
 +set g_balance_seeker_missile_damageforcescale 4
 +set g_balance_seeker_missile_decel 1400
 +set g_balance_seeker_missile_delay 0.25
 +set g_balance_seeker_missile_edgedamage 10
 +set g_balance_seeker_missile_force 150
 +set g_balance_seeker_missile_health 5
 +set g_balance_seeker_missile_lifetime 15
 +set g_balance_seeker_missile_proxy 0
 +set g_balance_seeker_missile_proxy_delay 0.2
 +set g_balance_seeker_missile_proxy_maxrange 45
 +set g_balance_seeker_missile_radius 80
 +set g_balance_seeker_missile_refire 0.5
 +set g_balance_seeker_missile_smart 1
 +set g_balance_seeker_missile_smart_mindist 800
 +set g_balance_seeker_missile_smart_trace_max 2500
 +set g_balance_seeker_missile_smart_trace_min 1000
 +set g_balance_seeker_missile_speed 700
 +set g_balance_seeker_missile_speed_max 1300
 +set g_balance_seeker_missile_speed_up 300
 +set g_balance_seeker_missile_speed_z 0
 +set g_balance_seeker_missile_spread 0
 +set g_balance_seeker_missile_turnrate 0.65
 +set g_balance_seeker_reload_ammo 0
 +set g_balance_seeker_reload_time 2
 +set g_balance_seeker_switchdelay_drop 0.2
 +set g_balance_seeker_switchdelay_raise 0.2
 +set g_balance_seeker_tag_ammo 1
 +set g_balance_seeker_tag_animtime 0.2
 +set g_balance_seeker_tag_damageforcescale 4
 +set g_balance_seeker_tag_health 5
 +set g_balance_seeker_tag_lifetime 15
 +set g_balance_seeker_tag_refire 0.75
 +set g_balance_seeker_tag_speed 5000
 +set g_balance_seeker_tag_spread 0
 +set g_balance_seeker_tag_tracker_lifetime 10
 +set g_balance_seeker_type 0
 +set g_balance_seeker_weaponreplace ""
 +set g_balance_seeker_weaponstart 0
 +set g_balance_seeker_weaponstartoverride -1
 +// }}}
 +// {{{ #20: Shotgun (MUTATOR WEAPON)
 +set g_balance_shotgun_primary_ammo 1
 +set g_balance_shotgun_primary_animtime 0.2
- set g_balance_shotgun_primary_speed 8000
 +set g_balance_shotgun_primary_bullets 14
 +set g_balance_shotgun_primary_damage 4
 +set g_balance_shotgun_primary_force 15
 +set g_balance_shotgun_primary_refire 0.75
++set g_balance_shotgun_primary_solidpenetration 3.8
 +set g_balance_shotgun_primary_spread 0.12
 +set g_balance_shotgun_reload_ammo 0
 +set g_balance_shotgun_reload_time 2
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_secondary_damage 80
 +set g_balance_shotgun_secondary_force 200
 +set g_balance_shotgun_secondary_melee_delay 0.25
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_refire 1.25
 +set g_balance_shotgun_switchdelay_drop 0.2
 +set g_balance_shotgun_switchdelay_raise 0.2
 +set g_balance_shotgun_weaponreplace ""
 +set g_balance_shotgun_weaponstart 0
 +set g_balance_shotgun_weaponstartoverride -1
 +// }}}
diff --combined defaultXonotic.cfg
index b489b7474b03210e5c2104c8a49eb93587ed8a84,466585204086cde39e810908b53f2fdce29c8b62..d5ea2b6995cebbb2e339c5a144a198ce141d66eb
@@@ -1189,32 -1189,9 +1189,9 @@@ set g_showweaponspawns 1       "display sprit
  //   Quake-Joule:  1 qJ  = 1 qN * 1 qu
  //   Quake-Pascal: 1 qPa = 1 qN / 1 qu^2
  
- set g_ballistics_materialconstant 1414213562
- set g_ballistics_mindistance 16
+ set g_ballistics_mindistance 2 // enable ballistics starting from 2 qu
  set g_ballistics_density_player 0.50 // players are 2x as easy to pass as walls
  set g_ballistics_density_corpse 0.10 // corpses are 10x as easy to pass as walls
- // unit: qJ / qu^3 (energy needed per volume unit of solid to push/burn away
- // parameter: bullet constant: mass / area in g/qu^2
- // = mass / (pi/4 * caliber^2)
- // with caliber in inches, mass in grams:
- // = 1.273239544735163 * mass / caliber^2
- // with caliber in inches, mass in grains:
- // = 0.082633246453312 * mass / caliber^2
- // bullet max travel distance inside solid:
- //   0.5 * v^2 * bulletconstant / g_ballistics_materialconstant
- // some bullet constants:
- //   http://hypertextbook.com/facts/2000/ShantayArmstrong.shtml
- //     second bullet: caliber .45, mass 16.2g, bullet constant 101.859163578813
- //     third bullet: caliber .338, mass 16.2g, bullet constant 180.5476053421592
- //     fourth bullet: caliber .25, mass 2.3g, bullet constant 46.85521524625399
- //   http://en.wikipedia.org/wiki/.50_BMG
- //     caliber .5, 360 grains, bullet constant 118.9918748927693
- //   AK-47:
- //     caliber .3, 62 grains, bullet constant 56.92512533450383
- //   .3 winchester magnum:
- //     caliber .3, 150 grains, bullet constant 137.7220774221867
  
  set cl_stripcolorcodes 0      "experimental feature (notes: strips ALL color codes from messages!)"
  
@@@ -1552,7 -1529,8 +1529,7 @@@ scr_loadingscreen_scale_base 
  scr_loadingscreen_scale_limit 2
  
  // other config files
 -exec mutator_new_toys.cfg // run BEFORE balance to make sure balance wins
 -exec balanceXonotic.cfg
 +exec balance-xonotic.cfg
  exec effects-normal.cfg
  exec physicsX.cfg
  exec turrets.cfg
diff --combined oldbalance25.cfg
index 633bd96370e4e369520e246205cec0f45407b182,0000000000000000000000000000000000000000..e32b459b003e898d96cd0403378fb5265a64b8c0
mode 100644,000000..100644
--- /dev/null
@@@ -1,781 -1,0 +1,779 @@@
- set g_balance_shotgun_primary_speed 12000
- set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +g_mod_balance Nexuiz25
 +
 +// {{{ starting gear
 +set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_balance_health_start 150
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 40
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 250 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 250
 +set g_lms_start_armor 100
 +set g_lms_start_ammo_shells 50
 +set g_lms_start_ammo_nails 150
 +set g_lms_start_ammo_rockets 50
 +set g_lms_start_ammo_cells 50
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 15
 +set g_balance_nix_ammo_nails 45
 +set g_balance_nix_ammo_rockets 15
 +set g_balance_nix_ammo_cells 15
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 0
 +set g_pickup_weapons_anyway 0
 +set g_pickup_shells 15
 +set g_pickup_shells_weapon 15
 +set g_pickup_shells_max 999
 +set g_pickup_nails 80
 +set g_pickup_nails_weapon 80
 +set g_pickup_nails_max 999
 +set g_pickup_rockets 15
 +set g_pickup_rockets_weapon 15
 +set g_pickup_rockets_max 999
 +set g_pickup_cells 25
 +set g_pickup_cells_weapon 25
 +set g_pickup_cells_max 999
 +set g_pickup_fuel 25
 +set g_pickup_fuel_weapon 25
 +set g_pickup_fuel_jetpack 50
 +set g_pickup_fuel_max 999
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 999
 +set g_pickup_armorsmall_anyway 0
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 999
 +set g_pickup_armormedium_anyway 0
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 999
 +set g_pickup_armorbig_anyway 0
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 999
 +set g_pickup_armorlarge_anyway 0
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 999
 +set g_pickup_healthsmall_anyway 0
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 999
 +set g_pickup_healthmedium_anyway 0
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 999
 +set g_pickup_healthlarge_anyway 0
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 999
 +set g_pickup_healthmega_anyway 0
 +set g_pickup_respawntime_short 15
 +set g_pickup_respawntime_medium 20
 +set g_pickup_respawntime_long 30
 +set g_pickup_respawntime_powerup 120
 +set g_pickup_respawntime_weapon 15
 +set g_pickup_respawntime_superweapon 120
 +set g_pickup_respawntime_ammo 15
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 10
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.1
 +set g_balance_health_regenlinear 0
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0.1
 +set g_balance_health_rotlinear 0
 +set g_balance_pause_health_rot 5
 +set g_balance_pause_health_rot_spawn 10
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0.1
 +set g_balance_armor_rotlinear 0
 +set g_balance_pause_armor_rot 5
 +set g_balance_pause_armor_rot_spawn 10
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.6
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0.6
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 1
 +set g_throughfloor_force 1
 +set g_projectiles_damage 2
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
 +// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 2
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.7
 +set g_projectiles_newton_style_2_maxfactor 5
 +set g_projectiles_spread_style 0
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 150
 +set g_balance_falldamage_minspeed 1400
 +set g_balance_falldamage_factor 0.15
 +set g_balance_falldamage_maxdamage 25
 +set g_balance_damagepush_speedfactor 0
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.2
 +set g_balance_powerup_invincible_time 30
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 4
 +set g_balance_powerup_strength_time 30
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1500 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 130
 +set g_balance_grapplehook_damagedbycontents 0
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 1 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 35
 +set g_balance_laser_primary_edgedamage 10
 +set g_balance_laser_primary_force 400
 +set g_balance_laser_primary_radius 70
 +set g_balance_laser_primary_speed 9000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.7
 +set g_balance_laser_primary_animtime 0.3
 +set g_balance_laser_primary_lifetime 30
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0.05
 +set g_balance_laser_primary_force_zscale 1
 +set g_balance_laser_primary_force_velocitybias 0
 +set g_balance_laser_primary_force_other_scale 1
 +
 +set g_balance_laser_secondary 0 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 35
 +set g_balance_laser_secondary_edgedamage 10
 +set g_balance_laser_secondary_force 400
 +set g_balance_laser_secondary_radius 70
 +set g_balance_laser_secondary_speed 9000
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.7
 +set g_balance_laser_secondary_animtime 0.3
 +set g_balance_laser_secondary_lifetime 30
 +set g_balance_laser_secondary_shotangle 0
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 1
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 1.5
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 100
 +set g_balance_laser_shockwave_spread_min 20
 +
 +set g_balance_laser_switchdelay_drop 0.15
 +set g_balance_laser_switchdelay_raise 0.15
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 6
 +set g_balance_shotgun_primary_damage 9
 +set g_balance_shotgun_primary_force 60
 +set g_balance_shotgun_primary_spread 0.07
 +set g_balance_shotgun_primary_refire 0.5
 +set g_balance_shotgun_primary_animtime 0.2
 +set g_balance_shotgun_primary_ammo 1
- set g_balance_uzi_speed 18000
- set g_balance_uzi_bulletconstant 115 // 13.1qu
++set g_balance_shotgun_primary_solidpenetration 3.8
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 0
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 115
 +set g_balance_shotgun_secondary_force 150
 +set g_balance_shotgun_secondary_refire 1.1
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0.15
 +set g_balance_shotgun_switchdelay_raise 0.15
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 0                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_spread_max 0.6
 +set g_balance_uzi_spread_add 0.012
 +
 +set g_balance_uzi_burst 0                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.75
 +set g_balance_uzi_burst_refire 0.05           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.75  // refire after burst
 +set g_balance_uzi_burst_spread 0.04
 +set g_balance_uzi_burst_damage 18
 +set g_balance_uzi_burst_force 50
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 30
 +set g_balance_uzi_first_force 50
 +set g_balance_uzi_first_spread 0.015
 +set g_balance_uzi_first_refire 0.2
 +set g_balance_uzi_first_ammo 1
 +
 +set g_balance_uzi_sustained_damage 15
 +set g_balance_uzi_sustained_force 27
 +set g_balance_uzi_sustained_spread 0.05
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
++set g_balance_uzi_solidpenetration 13.1
 +
 +set g_balance_uzi_switchdelay_drop 0.15
 +set g_balance_uzi_switchdelay_raise 0.15
 +
 +set g_balance_uzi_reload_ammo 0 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 70
 +set g_balance_grenadelauncher_primary_edgedamage 38
 +set g_balance_grenadelauncher_primary_force 400
 +set g_balance_grenadelauncher_primary_radius 140
 +set g_balance_grenadelauncher_primary_speed 2000
 +set g_balance_grenadelauncher_primary_speed_up 200
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 30
 +set g_balance_grenadelauncher_primary_lifetime2 1
 +set g_balance_grenadelauncher_primary_refire 0.8
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 25
 +set g_balance_grenadelauncher_primary_damageforcescale 4
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 70
 +set g_balance_grenadelauncher_secondary_edgedamage 38
 +set g_balance_grenadelauncher_secondary_force 400
 +set g_balance_grenadelauncher_secondary_radius 140
 +set g_balance_grenadelauncher_secondary_speed 1400
 +set g_balance_grenadelauncher_secondary_speed_up 200
 +set g_balance_grenadelauncher_secondary_speed_z 0
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 2.5
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0
 +set g_balance_grenadelauncher_secondary_refire 0.7
 +set g_balance_grenadelauncher_secondary_animtime 0.3
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 10
 +set g_balance_grenadelauncher_secondary_damageforcescale 4
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.075
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0.15
 +set g_balance_grenadelauncher_switchdelay_raise 0.15
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 0
 +set g_balance_electro_primary_damage 65
 +set g_balance_electro_primary_edgedamage 0
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_force_up 0
 +set g_balance_electro_primary_radius 150
 +set g_balance_electro_primary_comboradius 0
 +set g_balance_electro_primary_speed 2000
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 30
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_animtime 0.3
 +set g_balance_electro_primary_ammo 2
 +set g_balance_electro_primary_range 0
 +set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
 +set g_balance_electro_primary_falloff_maxdist 850
 +set g_balance_electro_primary_falloff_halflifedist 425
 +set g_balance_electro_secondary_damage 50
 +set g_balance_electro_secondary_edgedamage 0
 +set g_balance_electro_secondary_force 200
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_speed 900
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0
 +set g_balance_electro_secondary_lifetime 5
 +set g_balance_electro_secondary_refire 0.3
 +set g_balance_electro_secondary_refire2 0
 +set g_balance_electro_secondary_animtime 0.3
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 0
 +set g_balance_electro_secondary_count 1
 +set g_balance_electro_secondary_bouncefactor 0.5
 +set g_balance_electro_secondary_bouncestop 0.075
 +set g_balance_electro_combo_damage 80
 +set g_balance_electro_combo_edgedamage 0
 +set g_balance_electro_combo_force 200
 +set g_balance_electro_combo_radius 250
 +set g_balance_electro_combo_comboradius 0
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_combo_safeammocheck 0
 +set g_balance_electro_switchdelay_drop 0.15
 +set g_balance_electro_switchdelay_raise 0.15
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ lightning
 +set g_balance_lightning_primary_ammo 5
 +set g_balance_lightning_primary_animtime 0.2
 +set g_balance_lightning_primary_damage 100
 +set g_balance_lightning_primary_edgedamage 0
 +set g_balance_lightning_primary_falloff_mindist 0
 +set g_balance_lightning_primary_falloff_maxdist 0
 +set g_balance_lightning_primary_falloff_halflifedist 0
 +set g_balance_lightning_primary_force 425
 +set g_balance_lightning_primary_lifetime 0
 +set g_balance_lightning_primary_radius 850
 +set g_balance_lightning_primary_range 800
 +set g_balance_lightning_primary_refire 0.4
 +set g_balance_lightning_primary_speed 0
 +set g_balance_lightning_primary_spread 0
 +set g_balance_lightning_secondary_ammo 5
 +set g_balance_lightning_secondary_animtime 0.5
 +set g_balance_lightning_secondary_damage 100
 +set g_balance_lightning_secondary_damageforcescale 4
 +set g_balance_lightning_secondary_edgedamage 80
 +set g_balance_lightning_secondary_flyingdamage 1
 +set g_balance_lightning_secondary_flyingforce -80
 +set g_balance_lightning_secondary_flyingradius 200
 +set g_balance_lightning_secondary_force -200
 +set g_balance_lightning_secondary_health 1
 +set g_balance_lightning_secondary_lifetime 30
 +set g_balance_lightning_secondary_radius 300
 +set g_balance_lightning_secondary_refire 5
 +set g_balance_lightning_secondary_speed 600
 +// }}}
 +// {{{ crylink
 +set g_balance_crylink_primary_damage 18
 +set g_balance_crylink_primary_edgedamage 0
 +set g_balance_crylink_primary_force -55
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 7000
 +set g_balance_crylink_primary_spread 0.03
 +set g_balance_crylink_primary_shots 4
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_refire 0.4
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 2
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_joindelay 0
 +set g_balance_crylink_primary_joinspread 0
 +set g_balance_crylink_primary_joinexplode 0
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2450
 +set g_balance_crylink_primary_other_fadetime 0.25
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 18
 +set g_balance_crylink_secondary_edgedamage 0
 +set g_balance_crylink_secondary_force -55
 +set g_balance_crylink_secondary_radius 3
 +set g_balance_crylink_secondary_speed 7000
 +set g_balance_crylink_secondary_spread 0.08
 +set g_balance_crylink_secondary_spreadtype 0
 +set g_balance_crylink_secondary_shots 7
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_refire 0.5
 +set g_balance_crylink_secondary_animtime 0.3
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0
 +set g_balance_crylink_secondary_joinexplode 0
 +set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 1
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_line_lifetime 2 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_line_fadetime 2
 +
 +set g_balance_crylink_switchdelay_drop 0.15
 +set g_balance_crylink_switchdelay_raise 0.15
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 100
 +set g_balance_nex_primary_force 600
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_primary_animtime 0.3
 +set g_balance_nex_primary_ammo 5
 +set g_balance_nex_primary_damagefalloff_mindist 0
 +set g_balance_nex_primary_damagefalloff_maxdist 0
 +set g_balance_nex_primary_damagefalloff_halflife 0
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_charge 0
 +set g_balance_nex_secondary_charge_rate 0.1
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_pause_health_regen 1
 +set g_balance_nex_secondary_damage 100
 +set g_balance_nex_secondary_force 600
 +set g_balance_nex_secondary_refire 1.5
 +set g_balance_nex_secondary_animtime 0.3
 +set g_balance_nex_secondary_ammo 5
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 0
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_start 0
 +set g_balance_nex_charge_rate 0.1
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 0.5
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_rot_pause 0 // Dont rot down until this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0.5
 +set g_balance_nex_charge_velocity_rate 0.2
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_maxspeed 1000
 +
 +set g_balance_nex_switchdelay_drop 0.15
 +set g_balance_nex_switchdelay_raise 0.15
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.3
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.7
 +set g_balance_minstanex_switchdelay_drop 0.15
 +set g_balance_minstanex_switchdelay_raise 0.15
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 37
 +set g_balance_hagar_primary_edgedamage 15
 +set g_balance_hagar_primary_force 100
 +set g_balance_hagar_primary_health 0
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 65
 +set g_balance_hagar_primary_spread 0.010
 +set g_balance_hagar_primary_speed 3000
 +set g_balance_hagar_primary_lifetime 30
 +set g_balance_hagar_primary_refire 0.15
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_load 0
 +set g_balance_hagar_secondary_load_speed 0.6
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 0
 +set g_balance_hagar_secondary_load_releasedeath 1
 +set g_balance_hagar_secondary_load_abort 1
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 37
 +set g_balance_hagar_secondary_edgedamage 15
 +set g_balance_hagar_secondary_force 100
 +set g_balance_hagar_secondary_health 0
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 65
 +set g_balance_hagar_secondary_spread 0.015
 +set g_balance_hagar_secondary_speed 1400
 +set g_balance_hagar_secondary_lifetime_min 30
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.15
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0.15
 +set g_balance_hagar_switchdelay_raise 0.15
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 105
 +set g_balance_rocketlauncher_edgedamage 40
 +set g_balance_rocketlauncher_force 600
 +set g_balance_rocketlauncher_radius 150
 +set g_balance_rocketlauncher_speed 850
 +set g_balance_rocketlauncher_speedaccel 0
 +set g_balance_rocketlauncher_speedstart 850
 +set g_balance_rocketlauncher_lifetime 30
 +set g_balance_rocketlauncher_refire 1
 +set g_balance_rocketlauncher_animtime 0.3
 +set g_balance_rocketlauncher_ammo 3
 +set g_balance_rocketlauncher_health 40
 +set g_balance_rocketlauncher_damageforcescale 4
 +set g_balance_rocketlauncher_detonatedelay 0.2 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 90 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 105
 +set g_balance_rocketlauncher_remote_edgedamage 40
 +set g_balance_rocketlauncher_remote_radius 150
 +set g_balance_rocketlauncher_remote_force 600
 +set g_balance_rocketlauncher_switchdelay_drop 0.15
 +set g_balance_rocketlauncher_switchdelay_raise 0.15
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_speed 2000
 +set g_balance_porto_primary_lifetime 30
 +set g_balance_porto_secondary 0
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_speed 2000
 +set g_balance_porto_secondary_lifetime 30
 +set g_balance_porto_switchdelay_drop 0.15
 +set g_balance_porto_switchdelay_raise 0.15
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.3 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 50 // a whole pack
 +set g_balance_hook_secondary_lifetime 30 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 0
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0.15
 +set g_balance_hook_switchdelay_raise 0.15
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0.15
 +set g_balance_tuba_switchdelay_raise 0.15
 +// }}}
 +// {{{ fireball
 +set g_balance_fireball_primary_animtime 0.15
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 4
 +set g_balance_fireball_primary_edgedamage 0
 +set g_balance_fireball_primary_force 700
 +set g_balance_fireball_primary_health 50
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 5
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 650
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 2
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.15
 +set g_balance_fireball_switchdelay_raise 0.15
 +// }}}
diff --combined oldbalanceFruitieX.cfg
index a10d8b58d0c5954670576391220de86c8f4d1c8a,0000000000000000000000000000000000000000..844bdd59ee7b94e48c328c9865e5f48afd5c8e8f
mode 100644,000000..100644
--- /dev/null
@@@ -1,781 -1,0 +1,779 @@@
- set g_balance_shotgun_primary_speed 12000
- set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +g_mod_balance FruitieX
 +
 +// {{{ starting gear
 +set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_balance_health_start 125
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 20
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 200 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 200
 +set g_lms_start_armor 100
 +set g_lms_start_ammo_shells 30
 +set g_lms_start_ammo_nails 200
 +set g_lms_start_ammo_rockets 150
 +set g_lms_start_ammo_cells 150
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 15
 +set g_balance_nix_ammo_nails 45
 +set g_balance_nix_ammo_rockets 15
 +set g_balance_nix_ammo_cells 15
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 1
 +set g_pickup_weapons_anyway 1
 +set g_pickup_shells 20
 +set g_pickup_shells_weapon 10
 +set g_pickup_shells_max 45
 +set g_pickup_nails 120
 +set g_pickup_nails_weapon 60
 +set g_pickup_nails_max 300
 +set g_pickup_rockets 25
 +set g_pickup_rockets_weapon 15
 +set g_pickup_rockets_max 150
 +set g_pickup_cells 30
 +set g_pickup_cells_weapon 20
 +set g_pickup_cells_max 150
 +set g_pickup_fuel 25
 +set g_pickup_fuel_weapon 15
 +set g_pickup_fuel_jetpack 50
 +set g_pickup_fuel_max 100
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 150
 +set g_pickup_armorsmall_anyway 1
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 50
 +set g_pickup_armormedium_anyway 0
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 75; // LOG: to allow a little more armor from medium armor
 +set g_pickup_armorbig_anyway 0
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 150
 +set g_pickup_armorlarge_anyway 1
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 250
 +set g_pickup_healthsmall_anyway 1
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 100
 +set g_pickup_healthmedium_anyway 0
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 150
 +set g_pickup_healthlarge_anyway 0
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 250
 +set g_pickup_healthmega_anyway 1
 +set g_pickup_respawntime_short 15
 +set g_pickup_respawntime_medium 20
 +set g_pickup_respawntime_long 30
 +set g_pickup_respawntime_powerup 120
 +set g_pickup_respawntime_weapon 10
 +set g_pickup_respawntime_superweapon 120
 +set g_pickup_respawntime_ammo 25
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 10
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.05
 +set g_balance_health_regenlinear 0
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0
 +set g_balance_health_rotlinear 1
 +set g_balance_pause_health_rot 1
 +set g_balance_pause_health_rot_spawn 0
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0
 +set g_balance_armor_rotlinear 1
 +set g_balance_pause_armor_rot 1
 +set g_balance_pause_armor_rot_spawn 0
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.7
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0.65
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 0.7
 +set g_throughfloor_force 0.8
 +set g_projectiles_damage 2
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
 +// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 2
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.7
 +set g_projectiles_newton_style_2_maxfactor 5
 +set g_projectiles_spread_style 7
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 150
 +set g_balance_falldamage_minspeed 800
 +set g_balance_falldamage_factor 0.20
 +set g_balance_falldamage_maxdamage 15
 +set g_balance_damagepush_speedfactor 2.5
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.6
 +set g_balance_powerup_invincible_time 30
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 4
 +set g_balance_powerup_strength_time 30
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1500 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 130
 +set g_balance_grapplehook_damagedbycontents 0
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 1 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
 +set g_balance_laser_primary_edgedamage 20
 +set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
 +set g_balance_laser_primary_radius 60
 +set g_balance_laser_primary_speed 5000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.6
 +set g_balance_laser_primary_animtime 0.4
 +set g_balance_laser_primary_lifetime 5
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0
 +set g_balance_laser_primary_force_zscale 2 // 300 upforce
 +set g_balance_laser_primary_force_velocitybias 0.3
 +set g_balance_laser_primary_force_other_scale 2.5 // force 375 when pushing others around
 +
 +set g_balance_laser_secondary 0 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 200 // dps
 +set g_balance_laser_secondary_edgedamage 0
 +set g_balance_laser_secondary_force 1300
 +set g_balance_laser_secondary_radius 60
 +set g_balance_laser_secondary_speed 0
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.066
 +set g_balance_laser_secondary_animtime 0.066
 +set g_balance_laser_secondary_lifetime 0
 +set g_balance_laser_secondary_shotangle 0
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1.25
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 0
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 1.5
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 100
 +set g_balance_laser_shockwave_spread_min 20
 +
 +set g_balance_laser_switchdelay_drop 0.15
 +set g_balance_laser_switchdelay_raise 0.15
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 18
 +set g_balance_shotgun_primary_damage 3.5 // LOG: changed from 4 to 3.5, total damage 63
 +set g_balance_shotgun_primary_force 20
 +set g_balance_shotgun_primary_spread 0.16 // LOG: changed from 0.18 -> 0.16 to compensate a little for lower damage
 +set g_balance_shotgun_primary_refire 1
 +set g_balance_shotgun_primary_animtime 0.3
 +set g_balance_shotgun_primary_ammo 1
- set g_balance_uzi_speed 18000
- set g_balance_uzi_bulletconstant 115 // 13.1qu
++set g_balance_shotgun_primary_solidpenetration 3.8
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 0
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 110
 +set g_balance_shotgun_secondary_force 150
 +set g_balance_shotgun_secondary_refire 1.1
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0.15
 +set g_balance_shotgun_switchdelay_raise 0.15
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 1                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_spread_max 0.3 // LOG: 0.6 -> 0.3
 +set g_balance_uzi_spread_add 0.008
 +
 +set g_balance_uzi_burst 3                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.45
 +set g_balance_uzi_burst_refire 0.05           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.45  // refire after burst
 +set g_balance_uzi_burst_spread 0.07
 +set g_balance_uzi_burst_damage 25
 +set g_balance_uzi_burst_force 50
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
 +set g_balance_uzi_first_force 50
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_first_refire 0.2
 +set g_balance_uzi_first_ammo 2
 +
 +set g_balance_uzi_sustained_damage 12   // 120 dps
 +set g_balance_uzi_sustained_force 12
 +set g_balance_uzi_sustained_spread 0.06
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
++set g_balance_uzi_solidpenetration 13.1
 +
 +set g_balance_uzi_switchdelay_drop 0.15
 +set g_balance_uzi_switchdelay_raise 0.15
 +
 +set g_balance_uzi_reload_ammo 0 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 44
 +set g_balance_grenadelauncher_primary_edgedamage 32
 +set g_balance_grenadelauncher_primary_force 300
 +set g_balance_grenadelauncher_primary_radius 115
 +set g_balance_grenadelauncher_primary_speed 1500
 +set g_balance_grenadelauncher_primary_speed_up 225
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 5
 +set g_balance_grenadelauncher_primary_lifetime2 0.65
 +set g_balance_grenadelauncher_primary_refire 0.8
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 80
 +set g_balance_grenadelauncher_primary_damageforcescale 0
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 62
 +set g_balance_grenadelauncher_secondary_edgedamage 32
 +set g_balance_grenadelauncher_secondary_force 300
 +set g_balance_grenadelauncher_secondary_radius 150
 +set g_balance_grenadelauncher_secondary_speed 1000
 +set g_balance_grenadelauncher_secondary_speed_up 250
 +set g_balance_grenadelauncher_secondary_speed_z 0
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 3
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0.65
 +set g_balance_grenadelauncher_secondary_refire 0.8
 +set g_balance_grenadelauncher_secondary_animtime 0.3
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 40
 +set g_balance_grenadelauncher_secondary_damageforcescale 0
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.12
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0.15
 +set g_balance_grenadelauncher_switchdelay_raise 0.15
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 1
 +set g_balance_electro_primary_damage 100
 +set g_balance_electro_primary_edgedamage 0
 +set g_balance_electro_primary_force 425
 +set g_balance_electro_primary_force_up 125
 +set g_balance_electro_primary_radius 850
 +set g_balance_electro_primary_comboradius 150
 +set g_balance_electro_primary_speed 0
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 0
 +set g_balance_electro_primary_refire 0.4
 +set g_balance_electro_primary_animtime 0.2
 +set g_balance_electro_primary_ammo 5
 +set g_balance_electro_primary_range 800
 +set g_balance_electro_primary_falloff_mindist 0
 +set g_balance_electro_primary_falloff_maxdist 0
 +set g_balance_electro_primary_falloff_halflifedist 0
 +set g_balance_electro_secondary_damage 25
 +set g_balance_electro_secondary_edgedamage 0
 +set g_balance_electro_secondary_force 100
 +set g_balance_electro_secondary_radius 100
 +set g_balance_electro_secondary_speed 700
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.08
 +set g_balance_electro_secondary_lifetime 3.5
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 2
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 10
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 0
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_bouncefactor 0.5
 +set g_balance_electro_secondary_bouncestop 0.075
 +set g_balance_electro_combo_damage 50
 +set g_balance_electro_combo_edgedamage 0
 +set g_balance_electro_combo_force 80
 +set g_balance_electro_combo_radius 250
 +set g_balance_electro_combo_comboradius 0
 +set g_balance_electro_combo_speed 400
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_switchdelay_drop 0.15
 +set g_balance_electro_switchdelay_raise 0.15
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ lightning
 +set g_balance_lightning_primary_ammo 5
 +set g_balance_lightning_primary_animtime 0.2
 +set g_balance_lightning_primary_damage 100
 +set g_balance_lightning_primary_edgedamage 0
 +set g_balance_lightning_primary_falloff_mindist 0
 +set g_balance_lightning_primary_falloff_maxdist 0
 +set g_balance_lightning_primary_falloff_halflifedist 0
 +set g_balance_lightning_primary_force 425
 +set g_balance_lightning_primary_lifetime 0
 +set g_balance_lightning_primary_radius 850
 +set g_balance_lightning_primary_range 800
 +set g_balance_lightning_primary_refire 0.4
 +set g_balance_lightning_primary_speed 0
 +set g_balance_lightning_primary_spread 0
 +set g_balance_lightning_secondary_ammo 5
 +set g_balance_lightning_secondary_animtime 0.5
 +set g_balance_lightning_secondary_damage 100
 +set g_balance_lightning_secondary_damageforcescale 4
 +set g_balance_lightning_secondary_edgedamage 80
 +set g_balance_lightning_secondary_flyingdamage 1
 +set g_balance_lightning_secondary_flyingforce -80
 +set g_balance_lightning_secondary_flyingradius 200
 +set g_balance_lightning_secondary_force -200
 +set g_balance_lightning_secondary_health 1
 +set g_balance_lightning_secondary_lifetime 30
 +set g_balance_lightning_secondary_radius 300
 +set g_balance_lightning_secondary_refire 5
 +set g_balance_lightning_secondary_speed 600
 +// }}}
 +// {{{ crylink
 +set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
 +set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
 +set g_balance_crylink_primary_force 35
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 1500
 +set g_balance_crylink_primary_spread 0.05
 +set g_balance_crylink_primary_shots 7
 +set g_balance_crylink_primary_bounces 2
 +set g_balance_crylink_primary_refire 0.8
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 2
 +set g_balance_crylink_primary_bouncedamagefactor 0.2
 +set g_balance_crylink_primary_joindelay 0
 +set g_balance_crylink_primary_joinspread 0.2
 +set g_balance_crylink_primary_joinexplode 0
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
 +set g_balance_crylink_primary_other_fadetime 0.25
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 5 // LOG: 8 -> 5
 +set g_balance_crylink_secondary_edgedamage 3
 +set g_balance_crylink_secondary_force 16 // LOG: 20 -> 16
 +set g_balance_crylink_secondary_radius 15 // LOG: 20 -> 15
 +set g_balance_crylink_secondary_speed 1250 // LOG: 1500 -> 1250
 +set g_balance_crylink_secondary_spread 0.1
 +set g_balance_crylink_secondary_spreadtype 0
 +set g_balance_crylink_secondary_shots 6
 +set g_balance_crylink_secondary_bounces 2
 +set g_balance_crylink_secondary_refire 0.9 // LOG: 0.8 -> 0.9
 +set g_balance_crylink_secondary_animtime 0.3
 +set g_balance_crylink_secondary_ammo 3 // LOG: 2 -> 3
 +set g_balance_crylink_secondary_bouncedamagefactor 0.4 // LOG: 0.2 -> 0.4
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0.2
 +set g_balance_crylink_secondary_joinexplode 0
 +set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 0
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
 +set g_balance_crylink_secondary_line_fadetime 0.25
 +
 +set g_balance_crylink_switchdelay_drop 0.15
 +set g_balance_crylink_switchdelay_raise 0.15
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 90
 +set g_balance_nex_primary_force 500
 +set g_balance_nex_primary_refire 1
 +set g_balance_nex_primary_animtime 0.3
 +set g_balance_nex_primary_ammo 5
 +set g_balance_nex_primary_damagefalloff_mindist 0
 +set g_balance_nex_primary_damagefalloff_maxdist 0
 +set g_balance_nex_primary_damagefalloff_halflife 0
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_secondary 0 // LOG: disable secondary
 +set g_balance_nex_secondary_charge 0 // LOG: disable secondary charge
 +set g_balance_nex_secondary_charge_rate 0.4
 +set g_balance_nex_secondary_chargepool 1
 +set g_balance_nex_secondary_chargepool_regen 0.25
 +set g_balance_nex_secondary_chargepool_pause_regen 2
 +set g_balance_nex_secondary_chargepool_pause_health_regen 0.5
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_ammo 0.4 // full charge pool is 1, so it depletes in 2.5 secs
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_mindmg 20
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_rate 0.5
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1 // LOG: 0.5 -> 1 - allow to fully charge automaticaly
 +set g_balance_nex_charge_rot_rate 0 // LOG: 0.1 -> 0 - disable rot
 +set g_balance_nex_charge_rot_pause 0.5 // Dont rot down until this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_charge_minspeed 600
 +set g_balance_nex_charge_maxspeed 1000
 +
 +set g_balance_nex_switchdelay_drop 0.15
 +set g_balance_nex_switchdelay_raise 0.15
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.50
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.6
 +set g_balance_minstanex_switchdelay_drop 0.15
 +set g_balance_minstanex_switchdelay_raise 0.15
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 14
 +set g_balance_hagar_primary_edgedamage 6
 +set g_balance_hagar_primary_force 70
 +set g_balance_hagar_primary_health 0
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 110
 +set g_balance_hagar_primary_spread 0.1
 +set g_balance_hagar_primary_speed 1800
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_refire 0.12
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_load 0
 +set g_balance_hagar_secondary_load_speed 0.6
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 0
 +set g_balance_hagar_secondary_load_releasedeath 1
 +set g_balance_hagar_secondary_load_abort 1
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 14 // default for _load: 32
 +set g_balance_hagar_secondary_edgedamage 6 // default for _load: 10
 +set g_balance_hagar_secondary_force 70 // default for _load: 160
 +set g_balance_hagar_secondary_health 0
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 125
 +set g_balance_hagar_secondary_spread 0.15 // default for _load: 0.08
 +set g_balance_hagar_secondary_speed 1800
 +set g_balance_hagar_secondary_lifetime_min 5
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.12 // default for _load: 0.8
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0.15
 +set g_balance_hagar_switchdelay_raise 0.15
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 82
 +set g_balance_rocketlauncher_edgedamage 32
 +set g_balance_rocketlauncher_force 350
 +set g_balance_rocketlauncher_radius 130
 +set g_balance_rocketlauncher_speed 1400
 +set g_balance_rocketlauncher_speedaccel 1400
 +set g_balance_rocketlauncher_speedstart 800
 +set g_balance_rocketlauncher_lifetime 5
 +set g_balance_rocketlauncher_refire 1
 +set g_balance_rocketlauncher_animtime 0.3
 +set g_balance_rocketlauncher_ammo 3
 +set g_balance_rocketlauncher_health 0
 +set g_balance_rocketlauncher_damageforcescale 0
 +set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 42 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 60
 +set g_balance_rocketlauncher_remote_edgedamage 20
 +set g_balance_rocketlauncher_remote_radius 120
 +set g_balance_rocketlauncher_remote_force 350
 +set g_balance_rocketlauncher_switchdelay_drop 0.15
 +set g_balance_rocketlauncher_switchdelay_raise 0.15
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.2
 +set g_balance_porto_primary_speed 2000
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_secondary 0
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.2
 +set g_balance_porto_secondary_speed 2000
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_switchdelay_drop 0.15
 +set g_balance_porto_switchdelay_raise 0.15
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.2 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 50 // a whole pack
 +set g_balance_hook_secondary_lifetime 5 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.2 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 0
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0.15
 +set g_balance_hook_switchdelay_raise 0.15
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0.15
 +set g_balance_tuba_switchdelay_raise 0.15
 +// }}}
 +// {{{ fireball
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 4
 +set g_balance_fireball_primary_edgedamage 0
 +set g_balance_fireball_primary_force 700
 +set g_balance_fireball_primary_health 50
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 5
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 650
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.2
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 2
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.15
 +set g_balance_fireball_switchdelay_raise 0.15
 +// }}}
diff --combined oldbalanceXDF.cfg
index f408bf88027851462e2b76c6f2d5ef6d1a76ee35,0000000000000000000000000000000000000000..3e8f0d2c013d8583ae29976ab710003a1b2ee45a
mode 100644,000000..100644
--- /dev/null
@@@ -1,751 -1,0 +1,749 @@@
- set g_balance_shotgun_primary_speed 8000
- set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +g_mod_balance XDF
 +
 +// {{{ starting gear
 +set g_start_weapon_laser 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi 1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default" // UNTIL IT CAN BE REMOVED FROM CODE
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_balance_health_start 100
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 15
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 100 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 200
 +set g_lms_start_armor 200
 +set g_lms_start_ammo_shells 60
 +set g_lms_start_ammo_nails 320
 +set g_lms_start_ammo_rockets 160
 +set g_lms_start_ammo_cells 180
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 60
 +set g_balance_nix_ammo_nails 320
 +set g_balance_nix_ammo_rockets 160
 +set g_balance_nix_ammo_cells 180
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 1
 +set g_pickup_weapons_anyway 1
 +set g_pickup_shells 15
 +set g_pickup_shells_weapon 15
 +set g_pickup_shells_max 60
 +set g_pickup_nails 80
 +set g_pickup_nails_weapon 80
 +set g_pickup_nails_max 320
 +set g_pickup_rockets 40
 +set g_pickup_rockets_weapon 40
 +set g_pickup_rockets_max 160
 +set g_pickup_cells 30
 +set g_pickup_cells_weapon 30
 +set g_pickup_cells_max 180
 +set g_pickup_fuel 50
 +set g_pickup_fuel_weapon 50
 +set g_pickup_fuel_jetpack 100
 +set g_pickup_fuel_max 100
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 200
 +set g_pickup_armorsmall_anyway 1
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 200
 +set g_pickup_armormedium_anyway 1
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 200
 +set g_pickup_armorbig_anyway 1
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 200
 +set g_pickup_armorlarge_anyway 1
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 200
 +set g_pickup_healthsmall_anyway 1
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 200
 +set g_pickup_healthmedium_anyway 1
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 200
 +set g_pickup_healthlarge_anyway 1
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 200
 +set g_pickup_healthmega_anyway 1
 +set g_pickup_respawntime_short 0.1
 +set g_pickup_respawntime_medium 0.1
 +set g_pickup_respawntime_long 0.1
 +set g_pickup_respawntime_powerup 0.1
 +set g_pickup_respawntime_weapon 0.1
 +set g_pickup_respawntime_superweapon 0.1
 +set g_pickup_respawntime_ammo 0.1
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 30
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.08
 +set g_balance_health_regenlinear 0.5
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0.04
 +set g_balance_health_rotlinear 0.75
 +set g_balance_pause_health_rot 1
 +set g_balance_pause_health_rot_spawn 5
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0.04
 +set g_balance_armor_rotlinear 0.75
 +set g_balance_pause_armor_rot 1
 +set g_balance_pause_armor_rot_spawn 5
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.6
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 0.4
 +set g_throughfloor_force 0.7
 +set g_projectiles_damage 2
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
 +// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 2
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.8
 +set g_projectiles_newton_style_2_maxfactor 1.5
 +set g_projectiles_spread_style 7
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 250
 +set g_balance_falldamage_minspeed 900
 +set g_balance_falldamage_factor 0.20
 +set g_balance_falldamage_maxdamage 40
 +set g_balance_damagepush_speedfactor 2.5
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
 +set g_balance_powerup_invincible_time 999
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 3
 +set g_balance_powerup_strength_time 999
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 130
 +set g_balance_grapplehook_damagedbycontents 0
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 1 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 25
 +set g_balance_laser_primary_edgedamage 12.5
 +set g_balance_laser_primary_force 250
 +set g_balance_laser_primary_radius 70
 +set g_balance_laser_primary_speed 6000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.7
 +set g_balance_laser_primary_animtime 0.3
 +set g_balance_laser_primary_lifetime 5
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0
 +set g_balance_laser_primary_force_zscale 1.5
 +set g_balance_laser_primary_force_velocitybias 0
 +set g_balance_laser_primary_force_other_scale 1
 +
 +set g_balance_laser_secondary 0 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 25
 +set g_balance_laser_secondary_edgedamage 12.5
 +set g_balance_laser_secondary_force 400
 +set g_balance_laser_secondary_radius 70
 +set g_balance_laser_secondary_speed 12000
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.7
 +set g_balance_laser_secondary_animtime 0.2
 +set g_balance_laser_secondary_lifetime 5
 +set g_balance_laser_secondary_shotangle -90
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1.25
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 1
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 2
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 120
 +set g_balance_laser_shockwave_spread_min 25
 +
 +set g_balance_laser_switchdelay_drop 0
 +set g_balance_laser_switchdelay_raise 0
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 14
 +set g_balance_shotgun_primary_damage 4
 +set g_balance_shotgun_primary_force 15
 +set g_balance_shotgun_primary_spread 0.12
 +set g_balance_shotgun_primary_refire 0.75
 +set g_balance_shotgun_primary_animtime 0.2
 +set g_balance_shotgun_primary_ammo 1
- set g_balance_uzi_speed 18000
- set g_balance_uzi_bulletconstant 115 // 13.1qu
++set g_balance_shotgun_primary_solidpenetration 3.8
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 80
 +set g_balance_shotgun_secondary_force 200
 +set g_balance_shotgun_secondary_refire 1.25
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0
 +set g_balance_shotgun_switchdelay_raise 0
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 1                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0
 +set g_balance_uzi_spread_max 0
 +set g_balance_uzi_spread_add 0
 +
 +set g_balance_uzi_burst 3                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.3
 +set g_balance_uzi_burst_refire 0.06           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.45  // refire after burst
 +set g_balance_uzi_burst_spread 0.03
 +set g_balance_uzi_burst_damage 25
 +set g_balance_uzi_burst_force 20
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 14
 +set g_balance_uzi_first_force 5
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_first_refire 0.4
 +set g_balance_uzi_first_ammo 1
 +
 +set g_balance_uzi_sustained_damage 12
 +set g_balance_uzi_sustained_force 5
 +set g_balance_uzi_sustained_spread 0
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
++set g_balance_uzi_solidpenetration 13.1
 +
 +set g_balance_uzi_switchdelay_drop 0
 +set g_balance_uzi_switchdelay_raise 0
 +
 +set g_balance_uzi_reload_ammo 0 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 50
 +set g_balance_grenadelauncher_primary_edgedamage 25
 +set g_balance_grenadelauncher_primary_force 250
 +set g_balance_grenadelauncher_primary_radius 100
 +set g_balance_grenadelauncher_primary_speed 2000
 +set g_balance_grenadelauncher_primary_speed_up 200
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 5
 +set g_balance_grenadelauncher_primary_lifetime2 1
 +set g_balance_grenadelauncher_primary_refire 0.7
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 0
 +set g_balance_grenadelauncher_primary_damageforcescale 0
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 60
 +set g_balance_grenadelauncher_secondary_edgedamage 30
 +set g_balance_grenadelauncher_secondary_force 300
 +set g_balance_grenadelauncher_secondary_radius 200
 +set g_balance_grenadelauncher_secondary_speed 800
 +set g_balance_grenadelauncher_secondary_speed_up 0
 +set g_balance_grenadelauncher_secondary_speed_z 200
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 8
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0
 +set g_balance_grenadelauncher_secondary_refire 0.7
 +set g_balance_grenadelauncher_secondary_animtime 0.5
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 0
 +set g_balance_grenadelauncher_secondary_damageforcescale 0
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.075
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0
 +set g_balance_grenadelauncher_switchdelay_raise 0
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 0
 +set g_balance_electro_primary_damage 55
 +set g_balance_electro_primary_edgedamage 27.5
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_force_up 0
 +set g_balance_electro_primary_radius 100
 +set g_balance_electro_primary_comboradius 150
 +set g_balance_electro_primary_speed 2500
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 5
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_animtime 0.1
 +set g_balance_electro_primary_ammo 4
 +set g_balance_electro_primary_range 0
 +set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
 +set g_balance_electro_primary_falloff_maxdist 850
 +set g_balance_electro_primary_falloff_halflifedist 425
 +set g_balance_electro_secondary_damage 40
 +set g_balance_electro_secondary_edgedamage 20
 +set g_balance_electro_secondary_force 200
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_speed 900
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.05
 +set g_balance_electro_secondary_lifetime 3
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 1.5
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 1
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_bouncefactor 0.4
 +set g_balance_electro_secondary_bouncestop 0.05
 +set g_balance_electro_combo_damage 40
 +set g_balance_electro_combo_edgedamage 20
 +set g_balance_electro_combo_force 120
 +set g_balance_electro_combo_radius 175
 +set g_balance_electro_combo_comboradius 275
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_switchdelay_drop 0
 +set g_balance_electro_switchdelay_raise 0
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ crylink
 +set g_balance_crylink_primary_damage 12
 +set g_balance_crylink_primary_edgedamage 6
 +set g_balance_crylink_primary_force -50
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 2000
 +set g_balance_crylink_primary_spread 0.08
 +set g_balance_crylink_primary_shots 6
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_refire 0.7
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 3
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_joindelay 0.1
 +set g_balance_crylink_primary_joinspread 0.2
 +set g_balance_crylink_primary_joinexplode 1
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 5
 +set g_balance_crylink_primary_other_fadetime 5
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 10
 +set g_balance_crylink_secondary_edgedamage 5
 +set g_balance_crylink_secondary_force -150
 +set g_balance_crylink_secondary_radius 100
 +set g_balance_crylink_secondary_speed 3000
 +set g_balance_crylink_secondary_spread 0.01
 +set g_balance_crylink_secondary_spreadtype 1
 +set g_balance_crylink_secondary_shots 5
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_refire 0.7
 +set g_balance_crylink_secondary_animtime 0.2
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0
 +set g_balance_crylink_secondary_joinexplode 0
 +set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 1
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_line_lifetime 5
 +set g_balance_crylink_secondary_line_fadetime 5
 +
 +set g_balance_crylink_switchdelay_drop 0
 +set g_balance_crylink_switchdelay_raise 0
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 90
 +set g_balance_nex_primary_force 400
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_primary_animtime 0.4
 +set g_balance_nex_primary_ammo 6
 +set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
 +set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
 +set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
 +
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_charge 0
 +set g_balance_nex_secondary_charge_rate 0.1
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_pause_health_regen 1
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_ammo 2
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_rate 0.4
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_rot_pause 0 // Dont rot down untill this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_maxspeed 800
 +
 +set g_balance_nex_switchdelay_drop 0
 +set g_balance_nex_switchdelay_raise 0
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.3
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.7
 +set g_balance_minstanex_switchdelay_drop 0
 +set g_balance_minstanex_switchdelay_raise 0
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 25
 +set g_balance_hagar_primary_edgedamage 12.5
 +set g_balance_hagar_primary_force 92
 +set g_balance_hagar_primary_health 15
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 25
 +set g_balance_hagar_primary_spread 0.03
 +set g_balance_hagar_primary_speed 2000
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_refire 0.11
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 0
 +set g_balance_hagar_secondary_load 1
 +set g_balance_hagar_secondary_load_speed 0.5
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 4
 +set g_balance_hagar_secondary_load_releasedeath 0
 +set g_balance_hagar_secondary_load_abort 0
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 40
 +set g_balance_hagar_secondary_edgedamage 20
 +set g_balance_hagar_secondary_force 75
 +set g_balance_hagar_secondary_health 15
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 80
 +set g_balance_hagar_secondary_spread 0.05
 +set g_balance_hagar_secondary_speed 2000
 +set g_balance_hagar_secondary_lifetime_min 10
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.5
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0
 +set g_balance_hagar_switchdelay_raise 0
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 80
 +set g_balance_rocketlauncher_edgedamage 40
 +set g_balance_rocketlauncher_force 350
 +set g_balance_rocketlauncher_radius 110
 +set g_balance_rocketlauncher_speed 1000
 +set g_balance_rocketlauncher_speedaccel 0
 +set g_balance_rocketlauncher_speedstart 1000
 +set g_balance_rocketlauncher_lifetime 100
 +set g_balance_rocketlauncher_refire 0.9
 +set g_balance_rocketlauncher_animtime 0.7
 +set g_balance_rocketlauncher_ammo 4
 +set g_balance_rocketlauncher_health 0 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
 +set g_balance_rocketlauncher_damageforcescale 0 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
 +set g_balance_rocketlauncher_detonatedelay 999 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 0 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 1 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 70
 +set g_balance_rocketlauncher_remote_edgedamage 35
 +set g_balance_rocketlauncher_remote_radius 110
 +set g_balance_rocketlauncher_remote_force 350
 +set g_balance_rocketlauncher_switchdelay_drop 0
 +set g_balance_rocketlauncher_switchdelay_raise 0
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_speed 5000
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_secondary 1
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_speed 1000
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_switchdelay_drop 0
 +set g_balance_porto_switchdelay_raise 0
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.3 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 50 // a whole pack
 +set g_balance_hook_secondary_lifetime 5 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 15
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0
 +set g_balance_hook_switchdelay_raise 0
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0
 +set g_balance_tuba_switchdelay_raise 0
 +// }}}
 +// {{{ fireball // this is a superweapon -- lets make it behave as one.
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 0
 +set g_balance_fireball_primary_edgedamage 50
 +set g_balance_fireball_primary_force 600
 +set g_balance_fireball_primary_health 0
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 2
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 1200
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 1.5
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0
 +set g_balance_fireball_switchdelay_raise 0
 +// }}}
diff --combined oldbalanceXPM.cfg
index 9c90e04aca12a53a753ef851475ba0fdc6ae079f,0000000000000000000000000000000000000000..65e3a7909576d685f6d3a7d95c0b660f821bf2b8
mode 100644,000000..100644
--- /dev/null
@@@ -1,781 -1,0 +1,779 @@@
- set g_balance_shotgun_primary_speed 8000
- set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +g_mod_balance XPM
 +
 +// {{{ starting gear
 +set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_balance_health_start 100
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 15
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 100 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 200
 +set g_lms_start_armor 200
 +set g_lms_start_ammo_shells 60
 +set g_lms_start_ammo_nails 320
 +set g_lms_start_ammo_rockets 160
 +set g_lms_start_ammo_cells 180
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 60
 +set g_balance_nix_ammo_nails 320
 +set g_balance_nix_ammo_rockets 160
 +set g_balance_nix_ammo_cells 180
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 1
 +set g_pickup_weapons_anyway 1
 +set g_pickup_shells 15
 +set g_pickup_shells_weapon 15
 +set g_pickup_shells_max 60
 +set g_pickup_nails 80
 +set g_pickup_nails_weapon 80
 +set g_pickup_nails_max 320
 +set g_pickup_rockets 40
 +set g_pickup_rockets_weapon 40
 +set g_pickup_rockets_max 160
 +set g_pickup_cells 30
 +set g_pickup_cells_weapon 30
 +set g_pickup_cells_max 180
 +set g_pickup_fuel 50
 +set g_pickup_fuel_weapon 50
 +set g_pickup_fuel_jetpack 100
 +set g_pickup_fuel_max 100
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 200
 +set g_pickup_armorsmall_anyway 0
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 100
 +set g_pickup_armormedium_anyway 0
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 100
 +set g_pickup_armorbig_anyway 0
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 200
 +set g_pickup_armorlarge_anyway 0
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 200
 +set g_pickup_healthsmall_anyway 0
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 100
 +set g_pickup_healthmedium_anyway 0
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 100
 +set g_pickup_healthlarge_anyway 0
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 200
 +set g_pickup_healthmega_anyway 0
 +set g_pickup_respawntime_short 15
 +set g_pickup_respawntime_medium 20
 +set g_pickup_respawntime_long 30
 +set g_pickup_respawntime_powerup 120
 +set g_pickup_respawntime_weapon 10
 +set g_pickup_respawntime_superweapon 120
 +set g_pickup_respawntime_ammo 15
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 30
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.08
 +set g_balance_health_regenlinear 0.5
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0.03
 +set g_balance_health_rotlinear 0.75
 +set g_balance_pause_health_rot 1
 +set g_balance_pause_health_rot_spawn 5
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0.03
 +set g_balance_armor_rotlinear 0.75
 +set g_balance_pause_armor_rot 1
 +set g_balance_pause_armor_rot_spawn 5
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.6
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0.65
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 0.75
 +set g_throughfloor_force 0.75
 +set g_projectiles_damage 1
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
 +// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 0
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.8
 +set g_projectiles_newton_style_2_maxfactor 1.5
 +set g_projectiles_spread_style 7
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 250
 +set g_balance_falldamage_minspeed 900
 +set g_balance_falldamage_factor 0.20
 +set g_balance_falldamage_maxdamage 40
 +set g_balance_damagepush_speedfactor 2.5
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
 +set g_balance_powerup_invincible_time 30
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 3
 +set g_balance_powerup_strength_time 30
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 50
 +set g_balance_grapplehook_damagedbycontents 1
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 0 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 25
 +set g_balance_laser_primary_edgedamage 12.5
 +set g_balance_laser_primary_force 300
 +set g_balance_laser_primary_radius 70
 +set g_balance_laser_primary_speed 6000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.7
 +set g_balance_laser_primary_animtime 0.2
 +set g_balance_laser_primary_lifetime 5
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0
 +set g_balance_laser_primary_force_zscale 1.2
 +set g_balance_laser_primary_force_velocitybias 0
 +set g_balance_laser_primary_force_other_scale 1
 +
 +set g_balance_laser_secondary 2 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 25
 +set g_balance_laser_secondary_edgedamage 12.5
 +set g_balance_laser_secondary_force 400
 +set g_balance_laser_secondary_radius 70
 +set g_balance_laser_secondary_speed 12000
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.7
 +set g_balance_laser_secondary_animtime 0.2
 +set g_balance_laser_secondary_lifetime 5
 +set g_balance_laser_secondary_shotangle -90
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1.25
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 1
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 2
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 120
 +set g_balance_laser_shockwave_spread_min 25
 +
 +set g_balance_laser_switchdelay_drop 0.15
 +set g_balance_laser_switchdelay_raise 0.15
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 14
 +set g_balance_shotgun_primary_damage 4
 +set g_balance_shotgun_primary_force 15
 +set g_balance_shotgun_primary_spread 0.12
 +set g_balance_shotgun_primary_refire 0.75
 +set g_balance_shotgun_primary_animtime 0.2
 +set g_balance_shotgun_primary_ammo 1
- set g_balance_uzi_speed 18000
- set g_balance_uzi_bulletconstant 115 // 13.1qu
++set g_balance_shotgun_primary_solidpenetration 3.8
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 80
 +set g_balance_shotgun_secondary_force 200
 +set g_balance_shotgun_secondary_refire 1.25
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0.2
 +set g_balance_shotgun_switchdelay_raise 0.2
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 1                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_spread_max 0.05
 +set g_balance_uzi_spread_add 0.012
 +
 +set g_balance_uzi_burst 3                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.3
 +set g_balance_uzi_burst_refire 0.06           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.45  // refire after burst
 +set g_balance_uzi_burst_spread 0.02
 +set g_balance_uzi_burst_damage 25
 +set g_balance_uzi_burst_force 20
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 14
 +set g_balance_uzi_first_force 5
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_first_refire 0.125
 +set g_balance_uzi_first_ammo 1
 +
 +set g_balance_uzi_sustained_damage 10 // 100 dps
 +set g_balance_uzi_sustained_force 5
 +set g_balance_uzi_sustained_spread 0.03
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
++set g_balance_uzi_solidpenetration 13.1
 +
 +set g_balance_uzi_switchdelay_drop 0.2
 +set g_balance_uzi_switchdelay_raise 0.2
 +
 +set g_balance_uzi_reload_ammo 60 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 50
 +set g_balance_grenadelauncher_primary_edgedamage 25
 +set g_balance_grenadelauncher_primary_force 250
 +set g_balance_grenadelauncher_primary_radius 120
 +set g_balance_grenadelauncher_primary_speed 1900
 +set g_balance_grenadelauncher_primary_speed_up 225
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 5
 +set g_balance_grenadelauncher_primary_lifetime2 1
 +set g_balance_grenadelauncher_primary_refire 0.8
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 15
 +set g_balance_grenadelauncher_primary_damageforcescale 0
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 60
 +set g_balance_grenadelauncher_secondary_edgedamage 30
 +set g_balance_grenadelauncher_secondary_force 250
 +set g_balance_grenadelauncher_secondary_radius 120
 +set g_balance_grenadelauncher_secondary_speed 1400
 +set g_balance_grenadelauncher_secondary_speed_up 150
 +set g_balance_grenadelauncher_secondary_speed_z 0
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 5
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0
 +set g_balance_grenadelauncher_secondary_refire 0.7
 +set g_balance_grenadelauncher_secondary_animtime 0.3
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 30
 +set g_balance_grenadelauncher_secondary_damageforcescale 4
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.075
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0.2
 +set g_balance_grenadelauncher_switchdelay_raise 0.2
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 0
 +set g_balance_electro_primary_damage 40
 +set g_balance_electro_primary_edgedamage 20
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_force_up 0
 +set g_balance_electro_primary_radius 100
 +set g_balance_electro_primary_comboradius 300
 +set g_balance_electro_primary_speed 2500
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 5
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_animtime 0.3
 +set g_balance_electro_primary_ammo 4
 +set g_balance_electro_primary_range 0
 +set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
 +set g_balance_electro_primary_falloff_maxdist 850
 +set g_balance_electro_primary_falloff_halflifedist 425
 +set g_balance_electro_secondary_damage 40
 +set g_balance_electro_secondary_edgedamage 20
 +set g_balance_electro_secondary_force 50
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_speed 1000
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.04
 +set g_balance_electro_secondary_lifetime 4
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 1.6
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 1
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_bouncefactor 0.3
 +set g_balance_electro_secondary_bouncestop 0.05
 +set g_balance_electro_combo_damage 50
 +set g_balance_electro_combo_edgedamage 25
 +set g_balance_electro_combo_force 120
 +set g_balance_electro_combo_radius 150
 +set g_balance_electro_combo_comboradius 300
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_switchdelay_drop 0.2
 +set g_balance_electro_switchdelay_raise 0.2
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ lightning
 +set g_balance_lightning_primary_ammo 5
 +set g_balance_lightning_primary_animtime 0.2
 +set g_balance_lightning_primary_damage 100
 +set g_balance_lightning_primary_edgedamage 0
 +set g_balance_lightning_primary_falloff_mindist 0
 +set g_balance_lightning_primary_falloff_maxdist 0
 +set g_balance_lightning_primary_falloff_halflifedist 0
 +set g_balance_lightning_primary_force 425
 +set g_balance_lightning_primary_lifetime 0
 +set g_balance_lightning_primary_radius 850
 +set g_balance_lightning_primary_range 800
 +set g_balance_lightning_primary_refire 0.4
 +set g_balance_lightning_primary_speed 0
 +set g_balance_lightning_primary_spread 0
 +set g_balance_lightning_secondary_ammo 5
 +set g_balance_lightning_secondary_animtime 0.5
 +set g_balance_lightning_secondary_damage 100
 +set g_balance_lightning_secondary_damageforcescale 4
 +set g_balance_lightning_secondary_edgedamage 80
 +set g_balance_lightning_secondary_flyingdamage 1
 +set g_balance_lightning_secondary_flyingforce -80
 +set g_balance_lightning_secondary_flyingradius 200
 +set g_balance_lightning_secondary_force -200
 +set g_balance_lightning_secondary_health 1
 +set g_balance_lightning_secondary_lifetime 30
 +set g_balance_lightning_secondary_radius 300
 +set g_balance_lightning_secondary_refire 5
 +set g_balance_lightning_secondary_speed 600
 +// }}}
 +// {{{ crylink 
 +set g_balance_crylink_primary_damage 12
 +set g_balance_crylink_primary_edgedamage 6
 +set g_balance_crylink_primary_force -50
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 2000
 +set g_balance_crylink_primary_spread 0.08
 +set g_balance_crylink_primary_shots 6
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_refire 0.7
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 3
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_joindelay 0.1
 +set g_balance_crylink_primary_joinspread 0.2
 +set g_balance_crylink_primary_joinexplode 1
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 5
 +set g_balance_crylink_primary_other_fadetime 5
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 10
 +set g_balance_crylink_secondary_edgedamage 5
 +set g_balance_crylink_secondary_force -250
 +set g_balance_crylink_secondary_radius 100
 +set g_balance_crylink_secondary_speed 3000
 +set g_balance_crylink_secondary_spread 0.01
 +set g_balance_crylink_secondary_spreadtype 1
 +set g_balance_crylink_secondary_shots 5
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_refire 0.7
 +set g_balance_crylink_secondary_animtime 0.2
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0
 +set g_balance_crylink_secondary_joinexplode 0
 +set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 1
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_line_lifetime 5
 +set g_balance_crylink_secondary_line_fadetime 5
 +
 +set g_balance_crylink_switchdelay_drop 0.2
 +set g_balance_crylink_switchdelay_raise 0.2
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 80
 +set g_balance_nex_primary_force 400
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_primary_animtime 0.6
 +set g_balance_nex_primary_ammo 6
 +set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
 +set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
 +set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
 +
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_charge 0
 +set g_balance_nex_secondary_charge_rate 0.1
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_pause_health_regen 1
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_ammo 2
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_rate 0.4
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_rot_pause 0 // Dont rot down until this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_maxspeed 800
 +
 +set g_balance_nex_switchdelay_drop 0.3
 +set g_balance_nex_switchdelay_raise 0.25
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.3
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.7
 +set g_balance_minstanex_switchdelay_drop 0.2
 +set g_balance_minstanex_switchdelay_raise 0.2
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 25
 +set g_balance_hagar_primary_edgedamage 12.5
 +set g_balance_hagar_primary_force 100
 +set g_balance_hagar_primary_health 15
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 65
 +set g_balance_hagar_primary_spread 0.03
 +set g_balance_hagar_primary_speed 2500
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_refire 0.16667 // 6 rockets per second
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_load 1
 +set g_balance_hagar_secondary_load_speed 0.5
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 4
 +set g_balance_hagar_secondary_load_releasedeath 0
 +set g_balance_hagar_secondary_load_abort 0
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 40
 +set g_balance_hagar_secondary_edgedamage 20
 +set g_balance_hagar_secondary_force 75
 +set g_balance_hagar_secondary_health 15
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 80
 +set g_balance_hagar_secondary_spread 0.05
 +set g_balance_hagar_secondary_speed 2000
 +set g_balance_hagar_secondary_lifetime_min 10
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.5
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0.2
 +set g_balance_hagar_switchdelay_raise 0.2
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 70
 +set g_balance_rocketlauncher_edgedamage 35
 +set g_balance_rocketlauncher_force 450
 +set g_balance_rocketlauncher_radius 110
 +set g_balance_rocketlauncher_speed 1300
 +set g_balance_rocketlauncher_speedaccel 1300
 +set g_balance_rocketlauncher_speedstart 1000
 +set g_balance_rocketlauncher_lifetime 10
 +set g_balance_rocketlauncher_refire 1.2
 +set g_balance_rocketlauncher_animtime 0.4
 +set g_balance_rocketlauncher_ammo 4
 +set g_balance_rocketlauncher_health 30 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
 +set g_balance_rocketlauncher_damageforcescale 1 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
 +set g_balance_rocketlauncher_detonatedelay 0.02 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 70 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 70
 +set g_balance_rocketlauncher_remote_edgedamage 35
 +set g_balance_rocketlauncher_remote_radius 110
 +set g_balance_rocketlauncher_remote_force 400
 +set g_balance_rocketlauncher_switchdelay_drop 0.3
 +set g_balance_rocketlauncher_switchdelay_raise 0.2
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_speed 1000
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_secondary 1
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_speed 1000
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_switchdelay_drop 0.2
 +set g_balance_porto_switchdelay_raise 0.2
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.3 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 30 // a whole pack
 +set g_balance_hook_secondary_lifetime 5 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 15
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0.2
 +set g_balance_hook_switchdelay_raise 0.2
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0.2
 +set g_balance_tuba_switchdelay_raise 0.2
 +// }}}
 +// {{{ fireball // this is a superweapon -- lets make it behave as one.
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 0
 +set g_balance_fireball_primary_edgedamage 50
 +set g_balance_fireball_primary_force 600
 +set g_balance_fireball_primary_health 0
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 2
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 1200
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 1.5
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.2
 +set g_balance_fireball_switchdelay_raise 0.2
 +// }}}
diff --combined qcsrc/client/Main.qc
index 6493a8360bd864891de9d8b5615291747b22eae5,6423c16e567194b9042a99842a1ae0bb3fb74f88..bab39d4009f3c3409fb0267674a167795adbde32
@@@ -120,6 -120,7 +120,6 @@@ void CSQC_Init(void
        Hook_Precache();
        GibSplash_Precache();
        Casings_Precache();
 -      DamageInfo_Precache();
        Vehicles_Precache();
        turrets_precache();
        Tuba_Precache();
@@@ -817,7 -818,8 +817,7 @@@ void CSQC_Ent_Update(float bIsNewEntity
                case ENT_CLIENT_WARPZONE_TELEPORTED: WarpZone_Teleported_Read(bIsNewEntity); break;
                case ENT_CLIENT_TRIGGER_MUSIC: Ent_ReadTriggerMusic(); break;
                case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break;
 -              case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
 -              case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
 +              case ENT_CLIENT_ARC_BEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_ARC_BEAM); break;
                case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
                case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
                case ENT_CLIENT_TURRET: ent_turret(); break;
@@@ -953,10 -955,14 +953,10 @@@ void Ent_Init(
        hook_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
        hook_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
        hook_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
 -      electro_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
 -      electro_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
 -      electro_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
 -      electro_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
 -      gauntlet_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
 -      gauntlet_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
 -      gauntlet_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
 -      gauntlet_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
 +      arc_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
 +      arc_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
 +      arc_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
 +      arc_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
  
        if(forcefog)
                strunzone(forcefog);
@@@ -1210,10 -1216,6 +1210,6 @@@ float CSQC_Parse_TempEntity(
                        Net_ReadRace();
                        bHandled = true;
                        break;
-               case TE_CSQC_ZCURVEPARTICLES:
-                       Net_ReadZCurveParticles();
-                       bHandled = true;
-                       break;
                case TE_CSQC_NEXGUNBEAMPARTICLE:
                        Net_ReadNexgunBeamParticle();
                        bHandled = true;
                        Net_TeamNagger();
                        bHandled = true;
                        break;
 -              case TE_CSQC_LIGHTNINGARC:
 -                      Net_ReadLightningarc();
 +              case TE_CSQC_ARC:
 +                      Net_ReadArc();
                        bHandled = true;
                        break;
                case TE_CSQC_PINGPLREPORT:
                        cl_notice_read();
                        bHandled = true;
                        break;
 +              case TE_CSQC_SHOCKWAVEPARTICLE:
 +                      Net_ReadShockwaveParticle();
 +                      bHandled = true;
 +                      break;
                default:
                        // No special logic for this temporary entity; return 0 so the engine can handle it
                        bHandled = false;
index e496725e547e89f66c2459fa64b6fbc6b94cf5c7,8751cc0c5535c107d2e4de8b43d2f033c232e408..7a1c90e10102a0e51de196ff359f9e53fd3d72fe
@@@ -225,64 -225,6 +225,6 @@@ void Ent_RainOrSnow(
                self.draw = Draw_Snow;
  }
  
- entity zcurve;
- void zcurveparticles(float effectnum, vector start, vector end, float end_dz, float speed, float depth)
- {
-       // end_dz:
-       //   IF IT WERE A STRAIGHT LINE, it'd end end_dz above end
-       vector mid;
-       mid = (start + end) * 0.5;
-       end_dz *= 0.25;
-       mid_z += end_dz;
-       --depth;
-       if(depth < 0 || normalize(mid - start) * normalize(end - start) > 0.999999)
-       // TODO make this a variable threshold
-       // currently: 0.081 degrees
-       // 0.99999 would be 0.256 degrees and is visible
-       {
-               zcurve.velocity = speed * normalize(end - start);
-               trailparticles(zcurve, effectnum, start, end);
-       }
-       else
-       {
-               zcurveparticles(effectnum, start, mid, end_dz, speed, depth);
-               zcurveparticles(effectnum, mid, end, end_dz, speed, depth);
-       }
- }
- void Net_ReadZCurveParticles()
- {
-       vector start, end;
-       float end_dz;
-       float effectnum, speed;
-       if(!zcurve)
-       {
-               zcurve = spawn();
-               zcurve.classname = "zcurve";
-       }
-       effectnum = ReadShort();
-       start_x = ReadCoord();
-       start_y = ReadCoord();
-       start_z = ReadCoord();
-       do
-       {
-               end_x = ReadCoord();
-               end_y = ReadCoord();
-               end_z = ReadCoord();
-               end_dz = ReadCoord();
-               speed = ReadShort();
-               zcurveparticles(effectnum, start, end, end_dz, 16 * (speed & 0x7FFF), 5); // at most 32 segments
-       }
-       while(!(speed & 0x8000));
- }
  void Net_ReadNexgunBeamParticle()
  {
        vector shotorg, endpos;
        else
                WarpZone_TrailParticles_WithMultiplier(world, particleeffectnum("nex_beam"), shotorg, endpos, 1, PARTICLES_USEALPHA | PARTICLES_USEFADE);
  }
 +
 +.vector sw_shotorg;
 +.vector sw_endpos;
 +.float sw_spread_max;
 +.float sw_spread_min;
 +.float sw_time;
 +
 +void Draw_Shockwave()
 +{
 +      float a = bound(0, (0.5 - ((time - self.sw_time) / 0.4)), 0.5);
 +
 +      if(!a) { remove(self); }
 +      
 +      vector deviation, angle;
 +
 +      vector sw_color = getcsqcplayercolor(self.sv_entnum); // GetTeamRGB(GetPlayerColor(self.sv_entnum));
 +
 +      vector first_min_end = '0 0 0', prev_min_end = '0 0 0', new_min_end = '0 0 0';
 +      vector first_max_end = '0 0 0', prev_max_end = '0 0 0', new_max_end = '0 0 0';
 +
 +      float new_max_dist, new_min_dist;
 +      
 +      vector shotdir = normalize(self.sw_endpos - self.sw_shotorg);
 +      vectorvectors(shotdir);
 +      vector right = v_right;
 +      vector up = v_up;
 +      
 +      float counter, dist_before_normal = 200, shots = 20;
 +      
 +      vector min_end = ((self.sw_shotorg + (shotdir * dist_before_normal)) + (up * self.sw_spread_min));
 +      vector max_end = (self.sw_endpos + (up * self.sw_spread_max));
 +      
 +      float spread_to_min = vlen(normalize(min_end - self.sw_shotorg) - shotdir);
 +      float spread_to_max = vlen(normalize(max_end - min_end) - shotdir);
 +      
 +      for(counter = 0; counter < shots; ++counter)
 +      {
 +              // perfect circle effect lines
 +              angle = '0 0 0';
 +              makevectors('0 360 0' * (0.75 + (counter - 0.5) / shots));
 +              angle_y = v_forward_x;
 +              angle_z = v_forward_y;
 +
 +              // first do the spread_to_min effect
 +              deviation = angle * spread_to_min;
 +              deviation = ((shotdir + (right * deviation_y) + (up * deviation_z)));
 +              new_min_dist = dist_before_normal;
 +              new_min_end = (self.sw_shotorg + (deviation * new_min_dist));
 +              //te_lightning2(world, new_min_end, self.sw_shotorg);
 +
 +              // then calculate spread_to_max effect
 +              deviation = angle * spread_to_max;
 +              deviation = ((shotdir + (right * deviation_y) + (up * deviation_z)));
 +              new_max_dist = vlen(new_min_end - self.sw_endpos);
 +              new_max_end = (new_min_end + (deviation * new_max_dist));
 +              //te_lightning2(world, new_end, prev_min_end);
 +              
 +
 +              if(counter == 0)
 +              {
 +                      first_min_end = new_min_end;
 +                      first_max_end = new_max_end;
 +              }
 +
 +              if(counter >= 1)
 +              {
 +                      R_BeginPolygon("", DRAWFLAG_NORMAL);
 +                      R_PolygonVertex(prev_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(new_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(self.sw_shotorg, '0 0 0', sw_color, a);
 +                      R_EndPolygon();
 +
 +                      R_BeginPolygon("", DRAWFLAG_NORMAL);
 +                      R_PolygonVertex(new_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(prev_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(prev_max_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(new_max_end, '0 0 0', sw_color, a);
 +                      R_EndPolygon();
 +              }
 +
 +              prev_min_end = new_min_end;
 +              prev_max_end = new_max_end;
 +
 +              if((counter + 1) == shots)
 +              {
 +                      R_BeginPolygon("", DRAWFLAG_NORMAL);
 +                      R_PolygonVertex(prev_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(first_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(self.sw_shotorg, '0 0 0', sw_color, a);
 +                      R_EndPolygon();
 +
 +                      R_BeginPolygon("", DRAWFLAG_NORMAL);
 +                      R_PolygonVertex(first_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(prev_min_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(prev_max_end, '0 0 0', sw_color, a);
 +                      R_PolygonVertex(first_max_end, '0 0 0', sw_color, a);
 +                      R_EndPolygon();
 +              }
 +      }
 +}
 +
 +void Net_ReadShockwaveParticle()
 +{
 +      entity shockwave;
 +      shockwave = spawn();
 +      shockwave.draw = Draw_Shockwave;
 +      
 +      shockwave.sw_shotorg_x = ReadCoord(); shockwave.sw_shotorg_y = ReadCoord(); shockwave.sw_shotorg_z = ReadCoord();
 +      shockwave.sw_endpos_x  = ReadCoord(); shockwave.sw_endpos_y  = ReadCoord(); shockwave.sw_endpos_z  = ReadCoord();
 +      
 +      shockwave.sw_spread_max = ReadByte();
 +      shockwave.sw_spread_min = ReadByte();
 +
 +      shockwave.sv_entnum = ReadByte();
 +
 +      shockwave.sw_time = time;
 +}
 +
index 19abacb26c757327e9757608a0b6de97f26b1769,8ae465e54dab91f32187850029b5ffdd0fde0797..41a9520dd863920ec2c895add6f26d0a8a015490
@@@ -30,9 -30,8 +30,8 @@@ const float AS_FLOAT = 8
  
  const float TE_CSQC_PICTURE = 100;
  const float TE_CSQC_RACE = 101;
- const float TE_CSQC_ZCURVEPARTICLES = 102;
  const float TE_CSQC_NEXGUNBEAMPARTICLE = 103;
 -const float TE_CSQC_LIGHTNINGARC = 104;
 +const float TE_CSQC_ARC = 104;
  const float TE_CSQC_TEAMNAGGER = 105;
  const float TE_CSQC_PINGPLREPORT = 106;
  const float TE_CSQC_TARGET_MUSIC = 107;
@@@ -42,7 -41,6 +41,7 @@@ const float TE_CSQC_MINELAYER_MAXMINES 
  const float TE_CSQC_HAGAR_MAXROCKETS = 111;
  const float TE_CSQC_VEHICLESETUP = 112;
  const float TE_CSQC_SVNOTICE = 113;
 +const float TE_CSQC_SHOCKWAVEPARTICLE = 114;
  
  const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
  const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@@ -87,7 -85,8 +86,7 @@@ const float ENT_CLIENT_WARPZONE = 24
  const float ENT_CLIENT_WARPZONE_CAMERA = 25;
  const float ENT_CLIENT_TRIGGER_MUSIC = 26;
  const float ENT_CLIENT_HOOK = 27;
 -const float ENT_CLIENT_LGBEAM = 28;
 -const float ENT_CLIENT_GAUNTLET = 29;
 +const float ENT_CLIENT_ARC_BEAM = 29; // WEAPONTODO: fix numbers
  const float ENT_CLIENT_ACCURACY = 30;
  const float ENT_CLIENT_SHOWNAMES = 31;
  const float ENT_CLIENT_WARPZONE_TELEPORTED = 32;
@@@ -323,7 -322,7 +322,7 @@@ const float ATTEN_MAX = 3.984375
  #define VOL_BASE 0.7
  #define VOL_BASEVOICE 1.0
  
 -// this sets sounds and other properties of the projectiles in csqc
 +// WEAPONTODO: move this into separate/new projectile handling code // this sets sounds and other properties of the projectiles in csqc
  const float PROJECTILE_ELECTRO = 1;
  const float PROJECTILE_ROCKET = 2;
  const float PROJECTILE_TAG = 3;
@@@ -332,7 -331,7 +331,7 @@@ const float PROJECTILE_ELECTRO_BEAM = 6
  const float PROJECTILE_GRENADE = 7;
  const float PROJECTILE_GRENADE_BOUNCING = 8;
  const float PROJECTILE_MINE = 9;
 -const float PROJECTILE_LASER = 10;
 +const float PROJECTILE_BLASTER = 10;
  const float PROJECTILE_HLAC = 11;
  const float PROJECTILE_SEEKER = 12;
  const float PROJECTILE_FLAC = 13;
@@@ -385,6 -384,25 +384,6 @@@ const float WATERLEVEL_NONE = 0
  const float WATERLEVEL_WETFEET = 1;
  const float WATERLEVEL_SWIMMING = 2;
  const float WATERLEVEL_SUBMERGED = 3;
 -
 -const float MAX_SHOT_DISTANCE = 32768;
 -
 -// weapon requests
 -const float WR_SETUP = 1; // (SVQC) setup weapon data
 -const float WR_THINK = 2; // (SVQC) logic to run every frame
 -const float WR_CHECKAMMO1 = 3; // (SVQC) checks ammo for weapon
 -const float WR_CHECKAMMO2 = 4; // (SVQC) checks ammo for weapon
 -const float WR_AIM = 5; // (SVQC) runs bot aiming code for this weapon
 -const float WR_PRECACHE = 6; // (CSQC and SVQC) precaches models/sounds used by this weapon
 -const float WR_SUICIDEMESSAGE = 7; // (SVQC) notification number for suicide message (may inspect w_deathtype for details)
 -const float WR_KILLMESSAGE = 8; // (SVQC) notification number for kill message (may inspect w_deathtype for details)
 -const float WR_RELOAD = 9; // (SVQC) does not need to do anything
 -const float WR_RESETPLAYER = 10; // (SVQC) does not need to do anything
 -const float WR_IMPACTEFFECT = 11; // (CSQC) impact effect
 -const float WR_SWITCHABLE = 12; // (CSQC) impact effect
 -const float WR_PLAYERDEATH = 13; // (SVQC) does not need to do anything
 -const float WR_GONETHINK = 14; // (SVQC) logic to run every frame, also if no longer having the weapon as long as the switch away has not been performed
 -
  #define SERVERFLAG_ALLOW_FULLBRIGHT 1
  #define SERVERFLAG_TEAMPLAY 2
  #define SERVERFLAG_PLAYERSTATS 4
index d1dacd5b9048a5ba9e5acf910aa4a5798a516946,0000000000000000000000000000000000000000..4ac5fe368cbec541e8e64762516ee4ffa01721bb
mode 100644,000000..100644
--- /dev/null
@@@ -1,402 -1,0 +1,397 @@@
-       w_cvar(id, sn, NONE, speed) \
 +#ifdef REGISTER_WEAPON
 +REGISTER_WEAPON(
 +/* WEP_##id */ UZI,
 +/* function */ w_uzi,
 +/* ammotype */ ammo_nails,
 +/* impulse  */ 3,
 +/* flags    */ WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN,
 +/* rating   */ BOT_PICKUP_RATING_MID,
 +/* model    */ "uzi",
 +/* netname  */ "uzi",
 +/* fullname */ _("Machine Gun")
 +);
 +
 +#define UZI_SETTINGS(w_cvar,w_prop) UZI_SETTINGS_LIST(w_cvar, w_prop, UZI, uzi)
 +#define UZI_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
-       w_cvar(id, sn, NONE, bulletconstant) \
 +      w_cvar(id, sn, NONE, spread_min) \
 +      w_cvar(id, sn, NONE, spread_max) \
 +      w_cvar(id, sn, NONE, spread_add) \
 +      w_cvar(id, sn, NONE, mode) \
-               fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, first_spread), WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, first_damage), WEP_CVAR(uzi, first_force), deathtype, 0, WEP_CVAR(uzi, bulletconstant));
 +      w_cvar(id, sn, NONE, first) \
 +      w_cvar(id, sn, NONE, first_damage) \
 +      w_cvar(id, sn, NONE, first_force) \
 +      w_cvar(id, sn, NONE, first_refire) \
 +      w_cvar(id, sn, NONE, first_spread) \
 +      w_cvar(id, sn, NONE, first_ammo) \
++      w_cvar(id, sn, NONE, solidpenetration) \
 +      w_cvar(id, sn, NONE, sustained_damage) \
 +      w_cvar(id, sn, NONE, sustained_force) \
 +      w_cvar(id, sn, NONE, sustained_refire) \
 +      w_cvar(id, sn, NONE, sustained_spread) \
 +      w_cvar(id, sn, NONE, sustained_ammo) \
 +      w_cvar(id, sn, NONE, burst) \
 +      w_cvar(id, sn, NONE, burst_refire) \
 +      w_cvar(id, sn, NONE, burst_refire2) \
 +      w_cvar(id, sn, NONE, burst_animtime) \
 +      w_cvar(id, sn, NONE, burst_speed) \
 +      w_cvar(id, sn, 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)
 +#endif
 +#else
 +#ifdef SVQC
 +
 +void spawnfunc_weapon_uzi()
 +{
 +      if(autocvar_sv_q3acompat_machineshotgunswap)
 +      if(self.classname != "droppedweapon")
 +      {
 +              weapon_defaultspawnfunc(WEP_SHOCKWAVE);
 +              return;
 +      }
 +      weapon_defaultspawnfunc(WEP_UZI);
 +}
 +
 +// leilei's fancy muzzleflash stuff
 +void UZI_Flash_Go()
 +{
 +      self.frame = self.frame + 2;
 +      self.scale = self.scale * 0.5;
 +      self.alpha = self.alpha - 0.25;
 +      self.nextthink = time + 0.05;
 +
 +      if (self.alpha <= 0)
 +      {
 +              self.think = SUB_Remove;
 +              self.nextthink = time;
 +              self.realowner.muzzle_flash = world;
 +              return;
 +      }
 +
 +}
 +
 +void UziFlash()
 +{
 +      if (self.muzzle_flash == world)
 +              self.muzzle_flash = spawn();
 +
 +      // muzzle flash for 1st person view
 +      setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
 +
 +      self.muzzle_flash.scale = 0.75;
 +      self.muzzle_flash.think = UZI_Flash_Go;
 +      self.muzzle_flash.nextthink = time + 0.02;
 +      self.muzzle_flash.frame = 2;
 +      self.muzzle_flash.alpha = 0.75;
 +      self.muzzle_flash.angles_z = random() * 180;
 +      self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
 +      self.muzzle_flash.owner = self.muzzle_flash.realowner = self;
 +}
 +
 +void W_UZI_Attack (float deathtype)
 +{
 +      W_SetupShot (self, TRUE, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? WEP_CVAR(uzi, first_damage) : WEP_CVAR(uzi, sustained_damage)));
 +      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
 +      // this attack_finished just enforces a cooldown at the end of a burst
 +      ATTACK_FINISHED(self) = time + WEP_CVAR(uzi, first_refire) * W_WeaponRateFactor();
 +
 +      if (self.misc_bulletcounter == 1)
-               fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, sustained_spread), WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), deathtype, 0, WEP_CVAR(uzi, bulletconstant));
-       endFireBallisticBullet();
++              fireBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, first_spread), WEP_CVAR(uzi, solidpenetration), WEP_CVAR(uzi, first_damage), WEP_CVAR(uzi, first_force), deathtype, 0);
 +      else
-       fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), WEP_UZI, 0, WEP_CVAR(uzi, bulletconstant));
-       endFireBallisticBullet();
++              fireBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, sustained_spread), WEP_CVAR(uzi, solidpenetration), WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), deathtype, 0);
 +
 +      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      UziFlash();
 +      W_AttachToShotorg(self.muzzle_flash, '5 0 0');
 +
 +      // casing code
 +      if (autocvar_g_casings >= 2)
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +
 +      if (self.misc_bulletcounter == 1)
 +              W_DecreaseAmmo(WEP_CVAR(uzi, first_ammo));
 +      else
 +              W_DecreaseAmmo(WEP_CVAR(uzi, sustained_ammo));
 +}
 +
 +// weapon frames
 +void uzi_fire1_02()
 +{
 +      if(self.weapon != self.switchweapon) // abort immediately if switching
 +      {
 +              w_ready();
 +              return;
 +      }
 +      if (self.BUTTON_ATCK)
 +      {
 +              if (!WEP_ACTION(self.weapon, WR_CHECKAMMO2))
 +              if (!(self.items & IT_UNLIMITED_WEAPON_AMMO))
 +              {
 +                      W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +                      w_ready();
 +                      return;
 +              }
 +              self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +              W_UZI_Attack(WEP_UZI);
 +              weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), uzi_fire1_02);
 +      }
 +      else
 +              weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), w_ready);
 +}
 +
 +
 +void uzi_mode1_fire_auto()
 +{
 +      float uzi_spread;
 +
 +      if (!self.BUTTON_ATCK)
 +      {
 +              w_ready();
 +              return;
 +      }
 +
 +      if (!WEP_ACTION(self.weapon, WR_CHECKAMMO1))
 +      if (!(self.items & IT_UNLIMITED_WEAPON_AMMO))
 +      {
 +              W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +              w_ready();
 +              return;
 +      }
 +
 +      W_DecreaseAmmo(WEP_CVAR(uzi, sustained_ammo));
 +
 +      W_SetupShot (self, TRUE, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, WEP_CVAR(uzi, sustained_damage));
 +      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
 +      uzi_spread = bound(WEP_CVAR(uzi, spread_min), WEP_CVAR(uzi, spread_min) + (WEP_CVAR(uzi, spread_add) * self.misc_bulletcounter), WEP_CVAR(uzi, spread_max));
-       fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, burst_speed), WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), WEP_UZI, 0, WEP_CVAR(uzi, bulletconstant));
-       endFireBallisticBullet();
++      fireBullet(w_shotorg, w_shotdir, uzi_spread, WEP_CVAR(uzi, solidpenetration), WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), WEP_UZI, 0);
 +
 +      self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +
 +      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      UziFlash();
 +      W_AttachToShotorg(self.muzzle_flash, '5 0 0');
 +
 +      if (autocvar_g_casings >= 2) // casing code
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +
 +      ATTACK_FINISHED(self) = time + WEP_CVAR(uzi, first_refire) * W_WeaponRateFactor();
 +      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), uzi_mode1_fire_auto);
 +}
 +
 +void uzi_mode1_fire_burst()
 +{
 +      W_SetupShot (self, TRUE, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, WEP_CVAR(uzi, sustained_damage));
 +      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
++      fireBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, burst_speed), WEP_CVAR(uzi, solidpenetration), WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), WEP_UZI, 0);
 +
 +      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      UziFlash();
 +      W_AttachToShotorg(self.muzzle_flash, '5 0 0');
 +
 +      if (autocvar_g_casings >= 2) // casing code
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +
 +      self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +      if (self.misc_bulletcounter == 0)
 +      {
 +              ATTACK_FINISHED(self) = time + WEP_CVAR(uzi, burst_refire2) * W_WeaponRateFactor();
 +              weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(uzi, burst_animtime), w_ready);
 +      }
 +      else
 +      {
 +              weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(uzi, burst_refire), uzi_mode1_fire_burst);
 +      }
 +
 +}
 +
 +float w_uzi(float req)
 +{
 +      float ammo_amount;
 +      switch(req)
 +      {
 +              case WR_AIM:
 +              {
 +                      if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
 +                              self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
 +                      else
 +                              self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
 +                      
 +                      return TRUE;
 +              }
 +              case WR_THINK:
 +              {
 +                      if(autocvar_g_balance_uzi_reload_ammo && self.clip_load < min(max(WEP_CVAR(uzi, sustained_ammo), WEP_CVAR(uzi, first_ammo)), WEP_CVAR(uzi, burst_ammo))) // forced reload
 +                              WEP_ACTION(self.weapon, WR_RELOAD);
 +                      else if(WEP_CVAR(uzi, mode) == 1)
 +                      {
 +                              if (self.BUTTON_ATCK)
 +                              if (weapon_prepareattack(0, 0))
 +                              {
 +                                      self.misc_bulletcounter = 0;
 +                                      uzi_mode1_fire_auto();
 +                              }
 +
 +                              if(self.BUTTON_ATCK2)
 +                              if(weapon_prepareattack(1, 0))
 +                              {
 +                                      if (!WEP_ACTION(self.weapon, WR_CHECKAMMO2))
 +                                      if (!(self.items & IT_UNLIMITED_WEAPON_AMMO))
 +                                      {
 +                                              W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +                                              w_ready();
 +                                              return FALSE;
 +                                      }
 +
 +                                      W_DecreaseAmmo(WEP_CVAR(uzi, burst_ammo));
 +
 +                                      self.misc_bulletcounter = WEP_CVAR(uzi, burst) * -1;
 +                                      uzi_mode1_fire_burst();
 +                              }
 +                      }
 +                      else
 +                      {
 +
 +                              if (self.BUTTON_ATCK)
 +                              if (weapon_prepareattack(0, 0))
 +                              {
 +                                      self.misc_bulletcounter = 1;
 +                                      W_UZI_Attack(WEP_UZI); // sets attack_finished
 +                                      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), uzi_fire1_02);
 +                              }
 +
 +                              if (self.BUTTON_ATCK2 && WEP_CVAR(uzi, first))
 +                              if (weapon_prepareattack(1, 0))
 +                              {
 +                                      self.misc_bulletcounter = 1;
 +                                      W_UZI_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
 +                                      weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(uzi, first_refire), w_ready);
 +                              }
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_model ("models/uziflash.md3");
 +                      precache_model ("models/weapons/g_uzi.md3");
 +                      precache_model ("models/weapons/v_uzi.md3");
 +                      precache_model ("models/weapons/h_uzi.iqm");
 +                      precache_sound ("weapons/uzi_fire.wav");
 +                      UZI_SETTINGS(WEP_SKIPCVAR, WEP_SET_PROP)
 +                      return TRUE;
 +              }
 +              case WR_CHECKAMMO1:
 +              {
 +                      if(WEP_CVAR(uzi, mode) == 1)
 +                              ammo_amount = self.AMMO_VAL(WEP_UZI) >= WEP_CVAR(uzi, sustained_ammo);
 +                      else
 +                              ammo_amount = self.AMMO_VAL(WEP_UZI) >= WEP_CVAR(uzi, first_ammo);
 +
 +                      if(autocvar_g_balance_uzi_reload_ammo)
 +                      {
 +                              if(WEP_CVAR(uzi, mode) == 1)
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, sustained_ammo);
 +                              else
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, first_ammo);
 +                      }
 +                      return ammo_amount;
 +              }
 +              case WR_CHECKAMMO2:
 +              {
 +                      if(WEP_CVAR(uzi, mode) == 1)
 +                              ammo_amount = self.AMMO_VAL(WEP_UZI) >= WEP_CVAR(uzi, burst_ammo);
 +                      else
 +                              ammo_amount = self.AMMO_VAL(WEP_UZI) >= WEP_CVAR(uzi, first_ammo);
 +
 +                      if(autocvar_g_balance_uzi_reload_ammo)
 +                      {
 +                              if(WEP_CVAR(uzi, mode) == 1)
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, burst_ammo);
 +                              else
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, first_ammo);
 +                      }
 +                      return ammo_amount;
 +              }
 +              case WR_CONFIG:
 +              {
 +                      UZI_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS)
 +                      return TRUE;
 +              }
 +              case WR_RELOAD:
 +              {
 +                      W_Reload(min(max(WEP_CVAR(uzi, sustained_ammo), WEP_CVAR(uzi, first_ammo)), WEP_CVAR(uzi, burst_ammo)), "weapons/reload.wav");
 +                      return TRUE;
 +              }
 +              case WR_SUICIDEMESSAGE:
 +              {
 +                      return WEAPON_THINKING_WITH_PORTALS;
 +              }
 +              case WR_KILLMESSAGE:
 +              {
 +                      if(w_deathtype & HITTYPE_SECONDARY)
 +                              return WEAPON_UZI_MURDER_SNIPE;
 +                      else
 +                              return WEAPON_UZI_MURDER_SPRAY;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#ifdef CSQC
 +float w_uzi(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_IMPACTEFFECT:
 +              {
 +                      vector org2;
 +                      org2 = w_org + w_backoff * 2;
 +                      pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
 +                      if(!w_issilent)
 +                              if(w_random < 0.05)
 +                                      sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
 +                              else if(w_random < 0.1)
 +                                      sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
 +                              else if(w_random < 0.2)
 +                                      sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
 +                                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_sound("weapons/ric1.wav");
 +                      precache_sound("weapons/ric2.wav");
 +                      precache_sound("weapons/ric3.wav");
 +                      return TRUE;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#endif
index 3f8ee02786396c4eef9ddfcde40f186db955b3e6,0000000000000000000000000000000000000000..e8d7ee3939207fe756208c34c46daef7651e9054
mode 100644,000000..100644
--- /dev/null
@@@ -1,298 -1,0 +1,295 @@@
-       w_cvar(id, sn, BOTH, bulletconstant) \
 +#ifdef REGISTER_WEAPON
 +REGISTER_WEAPON(
 +/* WEP_##id */ RIFLE,
 +/* function */ W_Rifle,
 +/* ammotype */ ammo_nails,
 +/* impulse  */ 7,
 +/* flags    */ WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN,
 +/* rating   */ BOT_PICKUP_RATING_MID,
 +/* model    */ "campingrifle",
 +/* netname  */ "rifle",
 +/* fullname */ _("Rifle")
 +);
 +
 +#define RIFLE_SETTINGS(w_cvar,w_prop) RIFLE_SETTINGS_LIST(w_cvar, w_prop, RIFLE, rifle)
 +#define RIFLE_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
 +      w_cvar(id, sn, BOTH, ammo) \
 +      w_cvar(id, sn, BOTH, animtime) \
-       w_cvar(id, sn, BOTH, lifetime) \
 +      w_cvar(id, sn, BOTH, bullethail) \
 +      w_cvar(id, sn, BOTH, burstcost) \
 +      w_cvar(id, sn, BOTH, damage) \
 +      w_cvar(id, sn, BOTH, force) \
-       w_cvar(id, sn, BOTH, speed) \
 +      w_cvar(id, sn, BOTH, refire) \
 +      w_cvar(id, sn, BOTH, shots) \
- void W_Rifle_FireBullet(float pSpread, float pDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
++      w_cvar(id, sn, BOTH, solidpenetration) \
 +      w_cvar(id, sn, BOTH, spread) \
 +      w_cvar(id, sn, BOTH, tracer) \
 +      w_cvar(id, sn, NONE, bursttime) \
 +      w_cvar(id, sn, NONE, secondary) \
 +      w_cvar(id, sn, 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)
 +.float rifle_accumulator;
 +#endif
 +#else
 +#ifdef SVQC
 +void spawnfunc_weapon_rifle (void) { weapon_defaultspawnfunc(WEP_RIFLE); }
 +void spawnfunc_weapon_campingrifle (void) { spawnfunc_weapon_rifle(); }
 +void spawnfunc_weapon_sniperrifle (void) { spawnfunc_weapon_rifle(); }
 +
-               fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), pBulletConstant);
-       endFireBallisticBullet();
++void W_Rifle_FireBullet(float pSpread, float pDamage, float pForce, float pSolidPenetration, float pAmmo, float deathtype, float pTracer, float pShots, string pSound)
 +{
 +      float i;
 +
 +      W_DecreaseAmmo(pAmmo);
 +
 +      W_SetupShot (self, TRUE, 2, pSound, CH_WEAPON_A, pDamage * pShots);
 +
 +      pointparticles(particleeffectnum("rifle_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
 +
 +      if(self.BUTTON_ZOOM | self.BUTTON_ZOOMSCRIPT) // if zoomed, shoot from the eye
 +      {
 +              w_shotdir = v_forward;
 +              w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
 +      }
 +
 +      for(i = 0; i < pShots; ++i)
-       W_Rifle_FireBullet(WEP_CVAR_PRI(rifle, spread), WEP_CVAR_PRI(rifle, damage), WEP_CVAR_PRI(rifle, force), WEP_CVAR_PRI(rifle, speed), WEP_CVAR_PRI(rifle, lifetime), WEP_CVAR_PRI(rifle, ammo), WEP_RIFLE, WEP_CVAR_PRI(rifle, bulletconstant), WEP_CVAR_PRI(rifle, tracer), WEP_CVAR_PRI(rifle, shots), "weapons/campingrifle_fire.wav");
++              fireBullet(w_shotorg, w_shotdir, pSpread, pSolidPenetration, pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE));
 +
 +      if (autocvar_g_casings >= 2)
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +}
 +
 +void W_Rifle_Attack()
 +{
-       W_Rifle_FireBullet(WEP_CVAR_SEC(rifle, spread), WEP_CVAR_SEC(rifle, damage), WEP_CVAR_SEC(rifle, force), WEP_CVAR_SEC(rifle, speed), WEP_CVAR_SEC(rifle, lifetime), WEP_CVAR_SEC(rifle, ammo), WEP_RIFLE | HITTYPE_SECONDARY, WEP_CVAR_SEC(rifle, bulletconstant), WEP_CVAR_SEC(rifle, tracer), WEP_CVAR_SEC(rifle, shots), "weapons/campingrifle_fire2.wav");
++      W_Rifle_FireBullet(WEP_CVAR_PRI(rifle, spread), WEP_CVAR_PRI(rifle, damage), WEP_CVAR_PRI(rifle, force), WEP_CVAR_PRI(rifle, solidpenetration), WEP_CVAR_PRI(rifle, ammo), WEP_RIFLE, WEP_CVAR_PRI(rifle, tracer), WEP_CVAR_PRI(rifle, shots), "weapons/campingrifle_fire.wav");
 +}
 +
 +void W_Rifle_Attack2()
 +{
-                               if(bot_aim(WEP_CVAR_PRI(rifle, speed), 0, WEP_CVAR_PRI(rifle, lifetime), FALSE))
++      W_Rifle_FireBullet(WEP_CVAR_SEC(rifle, spread), WEP_CVAR_SEC(rifle, damage), WEP_CVAR_SEC(rifle, force), WEP_CVAR_SEC(rifle, solidpenetration), WEP_CVAR_SEC(rifle, ammo), WEP_RIFLE | HITTYPE_SECONDARY, WEP_CVAR_SEC(rifle, tracer), WEP_CVAR_SEC(rifle, shots), "weapons/campingrifle_fire2.wav");
 +}
 +
 +.void(void) rifle_bullethail_attackfunc;
 +.float rifle_bullethail_frame;
 +.float rifle_bullethail_animtime;
 +.float rifle_bullethail_refire;
 +void W_Rifle_BulletHail_Continue()
 +{
 +      float r, sw, af;
 +
 +      sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
 +      af = ATTACK_FINISHED(self);
 +      self.switchweapon = self.weapon;
 +      ATTACK_FINISHED(self) = time;
 +      print(ftos(self.AMMO_VAL(WEP_RIFLE)), "\n");
 +      r = weapon_prepareattack(self.rifle_bullethail_frame == WFRAME_FIRE2, self.rifle_bullethail_refire);
 +      if(self.switchweapon == self.weapon)
 +              self.switchweapon = sw;
 +      if(r)
 +      {
 +              self.rifle_bullethail_attackfunc();
 +              weapon_thinkf(self.rifle_bullethail_frame, self.rifle_bullethail_animtime, W_Rifle_BulletHail_Continue);
 +              print("thinkf set\n");
 +      }
 +      else
 +      {
 +              ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
 +              print("out of ammo... ", ftos(self.weaponentity.state), "\n");
 +      }
 +}
 +
 +void W_Rifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
 +{
 +      // if we get here, we have at least one bullet to fire
 +      AttackFunc();
 +      if(mode)
 +      {
 +              // continue hail
 +              self.rifle_bullethail_attackfunc = AttackFunc;
 +              self.rifle_bullethail_frame = fr;
 +              self.rifle_bullethail_animtime = animtime;
 +              self.rifle_bullethail_refire = refire;
 +              weapon_thinkf(fr, animtime, W_Rifle_BulletHail_Continue);
 +      }
 +      else
 +      {
 +              // just one shot
 +              weapon_thinkf(fr, animtime, w_ready);
 +      }
 +}
 +
 +.float bot_secondary_riflemooth;
 +float W_Rifle(float req)
 +{
 +      float ammo_amount;
 +      
 +      switch(req)
 +      {
 +              case WR_AIM:
 +              {
 +                      self.BUTTON_ATCK=FALSE;
 +                      self.BUTTON_ATCK2=FALSE;
 +                      if(vlen(self.origin-self.enemy.origin) > 1000)
 +                              self.bot_secondary_riflemooth = 0;
 +                      if(self.bot_secondary_riflemooth == 0)
 +                      {
-                               if(bot_aim(WEP_CVAR_SEC(rifle, speed), 0, WEP_CVAR_SEC(rifle, lifetime), FALSE))
++                              if(bot_aim(1000000, 0, 0.001, FALSE))
 +                              {
 +                                      self.BUTTON_ATCK = TRUE;
 +                                      if(random() < 0.01) self.bot_secondary_riflemooth = 1;
 +                              }
 +                      }
 +                      else
 +                      {
++                              if(bot_aim(1000000, 0, 0.001, FALSE))
 +                              {
 +                                      self.BUTTON_ATCK2 = TRUE;
 +                                      if(random() < 0.03) self.bot_secondary_riflemooth = 0;
 +                              }
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_THINK:
 +              {
 +                      if(autocvar_g_balance_rifle_reload_ammo && self.clip_load < min(WEP_CVAR_PRI(rifle, ammo), WEP_CVAR_SEC(rifle, ammo))) // forced reload
 +                              WEP_ACTION(self.weapon, WR_RELOAD);
 +                      else
 +                      {
 +                              self.rifle_accumulator = bound(time - WEP_CVAR(rifle, bursttime), self.rifle_accumulator, time);
 +                              if (self.BUTTON_ATCK)
 +                              if (weapon_prepareattack_check(0, WEP_CVAR_PRI(rifle, refire)))
 +                              if (time >= self.rifle_accumulator + WEP_CVAR_PRI(rifle, burstcost))
 +                              {
 +                                      weapon_prepareattack_do(0, WEP_CVAR_PRI(rifle, refire));
 +                                      W_Rifle_BulletHail(WEP_CVAR_PRI(rifle, bullethail), W_Rifle_Attack, WFRAME_FIRE1, WEP_CVAR_PRI(rifle, animtime), WEP_CVAR_PRI(rifle, refire));
 +                                      self.rifle_accumulator += WEP_CVAR_PRI(rifle, burstcost);
 +                              }
 +                              if (self.BUTTON_ATCK2)
 +                              {
 +                                      if (WEP_CVAR(rifle, secondary))
 +                                      {
 +                                              if(WEP_CVAR_SEC(rifle, reload))
 +                                                      WEP_ACTION(self.weapon, WR_RELOAD);
 +                                              else
 +                                              {
 +                                                      if (weapon_prepareattack_check(1, WEP_CVAR_SEC(rifle, refire)))
 +                                                      if (time >= self.rifle_accumulator + WEP_CVAR_SEC(rifle, burstcost))
 +                                                      {
 +                                                              weapon_prepareattack_do(1, WEP_CVAR_SEC(rifle, refire));
 +                                                              W_Rifle_BulletHail(WEP_CVAR_SEC(rifle, bullethail), W_Rifle_Attack2, WFRAME_FIRE2, WEP_CVAR_SEC(rifle, animtime), WEP_CVAR_PRI(rifle, refire));
 +                                                              self.rifle_accumulator += WEP_CVAR_SEC(rifle, burstcost);
 +                                                      }
 +                                              }
 +                                      }
 +                              }
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_model ("models/weapons/g_campingrifle.md3");
 +                      precache_model ("models/weapons/v_campingrifle.md3");
 +                      precache_model ("models/weapons/h_campingrifle.iqm");
 +                      precache_sound ("weapons/campingrifle_fire.wav");
 +                      precache_sound ("weapons/campingrifle_fire2.wav");
 +                      RIFLE_SETTINGS(WEP_SKIPCVAR, WEP_SET_PROP)
 +                      return TRUE;
 +              }
 +              case WR_CHECKAMMO1:
 +              {
 +                      ammo_amount = self.AMMO_VAL(WEP_RIFLE) >= WEP_CVAR_PRI(rifle, ammo);
 +                      ammo_amount += self.(weapon_load[WEP_RIFLE]) >= WEP_CVAR_PRI(rifle, ammo);
 +                      return ammo_amount;
 +              }
 +              case WR_CHECKAMMO2:
 +              {
 +                      ammo_amount = self.AMMO_VAL(WEP_RIFLE) >= WEP_CVAR_SEC(rifle, ammo);
 +                      ammo_amount += self.(weapon_load[WEP_RIFLE]) >= WEP_CVAR_SEC(rifle, ammo);
 +                      return ammo_amount;
 +              }
 +              case WR_CONFIG:
 +              {
 +                      RIFLE_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS)
 +                      return TRUE;
 +              }
 +              case WR_RESETPLAYER:
 +              {
 +                      self.rifle_accumulator = time - WEP_CVAR(rifle, bursttime);
 +                      return TRUE;
 +              }
 +              case WR_RELOAD:
 +              {
 +                      W_Reload(min(WEP_CVAR_PRI(rifle, ammo), WEP_CVAR_SEC(rifle, ammo)), "weapons/reload.wav");
 +                      return TRUE;
 +              }
 +              case WR_SUICIDEMESSAGE:
 +              {
 +                      return WEAPON_THINKING_WITH_PORTALS;
 +              }
 +              case WR_KILLMESSAGE:
 +              {
 +                      if(w_deathtype & HITTYPE_SECONDARY)
 +                      {
 +                              if(w_deathtype & HITTYPE_BOUNCE)
 +                                      return WEAPON_RIFLE_MURDER_HAIL_PIERCING;
 +                              else
 +                                      return WEAPON_RIFLE_MURDER_HAIL;
 +                      }
 +                      else
 +                      {
 +                              if(w_deathtype & HITTYPE_BOUNCE)
 +                                      return WEAPON_RIFLE_MURDER_PIERCING;
 +                              else
 +                                      return WEAPON_RIFLE_MURDER;
 +                      }
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#ifdef CSQC
 +float W_Rifle(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_IMPACTEFFECT:
 +              {
 +                      vector org2;
 +                      org2 = w_org + w_backoff * 2;
 +                      pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
 +                      if(!w_issilent)
 +                      {
 +                              if(w_random < 0.2)
 +                                      sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
 +                              else if(w_random < 0.4)
 +                                      sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
 +                              else if(w_random < 0.5)
 +                                      sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_sound("weapons/ric1.wav");
 +                      precache_sound("weapons/ric2.wav");
 +                      precache_sound("weapons/ric3.wav");
 +                      return TRUE;
 +              }
 +      }
 +
 +      return TRUE;
 +}
 +#endif
 +#endif
index a142aa4d07269210d8b3a874b0f7dd1cbc90b957,0000000000000000000000000000000000000000..c00d678ecf1a60ccc23552d57a0868e18294f6c4
mode 100644,000000..100644
--- /dev/null
@@@ -1,323 -1,0 +1,321 @@@
-       w_cvar(id, sn, PRI,  bulletconstant) \
 +#ifdef REGISTER_WEAPON
 +REGISTER_WEAPON(
 +/* WEP_##id  */ SHOTGUN,
 +/* function  */ w_shotgun,
 +/* ammotype  */ ammo_none,
 +/* impulse   */ 2,
 +/* flags     */ WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN | WEP_FLAG_MUTATORBLOCKED,
 +/* rating    */ BOT_PICKUP_RATING_LOW,
 +/* model     */ "shotgun",
 +/* shortname */ "shotgun",
 +/* fullname  */ _("Shotgun")
 +);
 +
 +#define SHOTGUN_SETTINGS(w_cvar,w_prop) SHOTGUN_SETTINGS_LIST(w_cvar, w_prop, SHOTGUN, shotgun)
 +#define SHOTGUN_SETTINGS_LIST(w_cvar,w_prop,id,sn) \
 +      w_cvar(id, sn, PRI,  ammo) \
 +      w_cvar(id, sn, BOTH, animtime) \
 +      w_cvar(id, sn, BOTH, refire) \
 +      w_cvar(id, sn, PRI,  bullets) \
-       w_cvar(id, sn, PRI,  speed) \
 +      w_cvar(id, sn, BOTH, damage) \
 +      w_cvar(id, sn, BOTH, force) \
++      w_cvar(id, sn, PRI,  solidpenetration) \
 +      w_cvar(id, sn, PRI,  spread) \
-               fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR_PRI(shotgun, spread), WEP_CVAR_PRI(shotgun, speed), 5, WEP_CVAR_PRI(shotgun, damage), WEP_CVAR_PRI(shotgun, force), WEP_SHOTGUN, 0, WEP_CVAR_PRI(shotgun, bulletconstant));
-       endFireBallisticBullet();
 +      w_cvar(id, sn, NONE, secondary) \
 +      w_cvar(id, sn, SEC,  melee_time) \
 +      w_cvar(id, sn, SEC,  melee_no_doubleslap) \
 +      w_cvar(id, sn, SEC,  melee_traces) \
 +      w_cvar(id, sn, SEC,  melee_swing_up) \
 +      w_cvar(id, sn, SEC,  melee_swing_side) \
 +      w_cvar(id, sn, SEC,  melee_nonplayerdamage) \
 +      w_cvar(id, sn, SEC,  melee_multihit) \
 +      w_cvar(id, sn, SEC,  melee_delay) \
 +      w_cvar(id, sn, SEC,  melee_range) \
 +      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
 +SHOTGUN_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 +#endif
 +#else
 +#ifdef SVQC
 +
 +void W_Shotgun_Attack (void)
 +{
 +      float   sc;
 +      entity flash;
 +
 +      W_DecreaseAmmo(WEP_CVAR_PRI(shotgun, ammo));
 +
 +      W_SetupShot (self, TRUE, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, WEP_CVAR_PRI(shotgun, damage) * WEP_CVAR_PRI(shotgun, bullets));
 +      for (sc = 0;sc < WEP_CVAR_PRI(shotgun, bullets);sc = sc + 1)
++              fireBullet(w_shotorg, w_shotdir, WEP_CVAR_PRI(shotgun, spread), WEP_CVAR_PRI(shotgun, solidpenetration), WEP_CVAR_PRI(shotgun, damage), WEP_CVAR_PRI(shotgun, force), WEP_SHOTGUN, 0);
 +
 +      pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, WEP_CVAR_PRI(shotgun, ammo));
 +
 +      // casing code
 +      if (autocvar_g_casings >= 1)
 +              for (sc = 0;sc < WEP_CVAR_PRI(shotgun, ammo);sc = sc + 1)
 +                      SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, self);
 +
 +      // muzzle flash for 1st person view
 +      flash = spawn();
 +      setmodel(flash, "models/uziflash.md3"); // precision set below
 +      flash.think = SUB_Remove;
 +      flash.nextthink = time + 0.06;
 +      flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
 +      W_AttachToShotorg(flash, '5 0 0');
 +}
 +
 +.float swing_prev;
 +.entity swing_alreadyhit;
 +void shotgun_meleethink (void)
 +{
 +      // declarations
 +      float i, f, swing, swing_factor, swing_damage, meleetime, is_player;
 +      entity target_victim;
 +      vector targpos;
 +
 +      if(!self.cnt) // set start time of melee
 +      {
 +              self.cnt = time;
 +              W_PlayStrengthSound(self.realowner);
 +      }
 +
 +      makevectors(self.realowner.v_angle); // update values for v_* vectors
 +
 +      // calculate swing percentage based on time
 +      meleetime = WEP_CVAR_SEC(shotgun, melee_time) * W_WeaponRateFactor();
 +      swing = bound(0, (self.cnt + meleetime - time) / meleetime, 10);
 +      f = ((1 - swing) * WEP_CVAR_SEC(shotgun, melee_traces));
 +
 +      // check to see if we can still continue, otherwise give up now
 +      if((self.realowner.deadflag != DEAD_NO) && WEP_CVAR_SEC(shotgun, melee_no_doubleslap))
 +      {
 +              remove(self);
 +              return;
 +      }
 +
 +      // if okay, perform the traces needed for this frame
 +      for(i=self.swing_prev; i < f; ++i)
 +      {
 +              swing_factor = ((1 - (i / WEP_CVAR_SEC(shotgun, melee_traces))) * 2 - 1);
 +
 +              targpos = (self.realowner.origin + self.realowner.view_ofs
 +                      + (v_forward * WEP_CVAR_SEC(shotgun, melee_range))
 +                      + (v_up * swing_factor * WEP_CVAR_SEC(shotgun, melee_swing_up))
 +                      + (v_right * swing_factor * WEP_CVAR_SEC(shotgun, melee_swing_side)));
 +
 +              WarpZone_traceline_antilag(self, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, self, ANTILAG_LATENCY(self.realowner));
 +
 +              // draw lightning beams for debugging
 +              //te_lightning2(world, targpos, self.realowner.origin + self.realowner.view_ofs + v_forward * 5 - v_up * 5);
 +              //te_customflash(targpos, 40,  2, '1 1 1');
 +
 +              is_player = (IS_PLAYER(trace_ent) || trace_ent.classname == "body");
 +
 +              if((trace_fraction < 1) // if trace is good, apply the damage and remove self
 +                      && (trace_ent.takedamage == DAMAGE_AIM)
 +                      && (trace_ent != self.swing_alreadyhit)
 +                      && (is_player || WEP_CVAR_SEC(shotgun, melee_nonplayerdamage)))
 +              {
 +                      target_victim = trace_ent; // so it persists through other calls
 +
 +                      if(is_player) // this allows us to be able to nerf the non-player damage done in e.g. assault or onslaught.
 +                              swing_damage = (WEP_CVAR_SEC(shotgun, damage) * min(1, swing_factor + 1));
 +                      else
 +                              swing_damage = (WEP_CVAR_SEC(shotgun, melee_nonplayerdamage) * min(1, swing_factor + 1));
 +
 +                      //print(strcat(self.realowner.netname, " hitting ", target_victim.netname, " with ", strcat(ftos(swing_damage), " damage (factor: ", ftos(swing_factor), ") at "), ftos(time), " seconds.\n"));
 +
 +                      Damage(target_victim, self.realowner, self.realowner,
 +                              swing_damage, WEP_SHOTGUN | HITTYPE_SECONDARY,
 +                              self.realowner.origin + self.realowner.view_ofs,
 +                              v_forward * WEP_CVAR_SEC(shotgun, force));
 +
 +                      if(accuracy_isgooddamage(self.realowner, target_victim)) { accuracy_add(self.realowner, WEP_SHOTGUN, 0, swing_damage); }
 +
 +                      // draw large red flash for debugging
 +                      //te_customflash(targpos, 200, 2, '15 0 0');
 +
 +                      if(WEP_CVAR_SEC(shotgun, melee_multihit)) // allow multiple hits with one swing, but not against the same player twice.
 +                      {
 +                              self.swing_alreadyhit = target_victim;
 +                              continue; // move along to next trace
 +                      }
 +                      else
 +                      {
 +                              remove(self);
 +                              return;
 +                      }
 +              }
 +      }
 +
 +      if(time >= self.cnt + meleetime)
 +      {
 +              // melee is finished
 +              remove(self);
 +              return;
 +      }
 +      else
 +      {
 +              // set up next frame
 +              self.swing_prev = i;
 +              self.nextthink = time;
 +      }
 +}
 +
 +void W_Shotgun_Attack2 (void)
 +{
 +      sound (self, CH_WEAPON_A, "weapons/shotgun_melee.wav", VOL_BASE, ATTEN_NORM);
 +      weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(shotgun, animtime), w_ready);
 +
 +      entity meleetemp;
 +      meleetemp = spawn();
 +      meleetemp.realowner = self;
 +      meleetemp.think = shotgun_meleethink;
 +      meleetemp.nextthink = time + WEP_CVAR_SEC(shotgun, melee_delay) * W_WeaponRateFactor();
 +      W_SetupShot_Range(self, TRUE, 0, "", 0, WEP_CVAR_SEC(shotgun, damage), WEP_CVAR_SEC(shotgun, melee_range));
 +}
 +
 +void spawnfunc_weapon_shotgun(); // defined in t_items.qc
 +
 +.float shotgun_primarytime;
 +
 +float w_shotgun(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_AIM:
 +              {
 +                      if(vlen(self.origin-self.enemy.origin) <= WEP_CVAR_SEC(shotgun, melee_range))
 +                              self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
 +                      else
 +                              self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
 +
 +                      return TRUE;
 +              }
 +              case WR_THINK:
 +              {
 +                      if(WEP_CVAR(shotgun, reload_ammo) && self.clip_load < WEP_CVAR_PRI(shotgun, ammo)) // forced reload
 +                      {
 +                              // don't force reload an empty shotgun if its melee attack is active
 +                              if (!(WEP_CVAR(shotgun, secondary) && self.ammo_shells < WEP_CVAR_PRI(shotgun, ammo)))
 +                                      WEP_ACTION(self.weapon, WR_RELOAD);
 +                      }
 +                      else
 +                      {
 +                              if (self.BUTTON_ATCK)
 +                              {
 +                                      if (time >= self.shotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary
 +                                      {
 +                                              if(weapon_prepareattack(0, WEP_CVAR_PRI(shotgun, animtime)))
 +                                              {
 +                                                      W_Shotgun_Attack();
 +                                                      self.shotgun_primarytime = time + WEP_CVAR_PRI(shotgun, refire) * W_WeaponRateFactor();
 +                                                      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(shotgun, animtime), w_ready);
 +                                              }
 +                                      }
 +                              }
 +                      }
 +                      if (self.clip_load >= 0) // we are not currently reloading
 +                      if (!self.crouch) // no crouchmelee please
 +                      if (self.BUTTON_ATCK2 && WEP_CVAR(shotgun, secondary))
 +                      if (weapon_prepareattack(1, WEP_CVAR_SEC(shotgun, refire)))
 +                      {
 +                              // attempt forcing playback of the anim by switching to another anim (that we never play) here...
 +                              weapon_thinkf(WFRAME_FIRE1, 0, W_Shotgun_Attack2);
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_model ("models/uziflash.md3");
 +                      precache_model ("models/weapons/g_shotgun.md3");
 +                      precache_model ("models/weapons/v_shotgun.md3");
 +                      precache_model ("models/weapons/h_shotgun.iqm");
 +                      precache_sound ("misc/itempickup.wav");
 +                      precache_sound ("weapons/shotgun_fire.wav");
 +                      precache_sound ("weapons/shotgun_melee.wav");
 +                      SHOTGUN_SETTINGS(WEP_SKIPCVAR, WEP_SET_PROP)
 +                      return TRUE;
 +              }
 +              case WR_SETUP:
 +              {
 +                      self.current_ammo = ammo_none;
 +                      return TRUE;
 +              }
 +              case WR_CHECKAMMO1:
 +              case WR_CHECKAMMO2:
 +              {
 +                      // shotgun has infinite ammo
 +                      return TRUE;
 +              }
 +              case WR_CONFIG:
 +              {
 +                      SHOTGUN_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS)
 +                      return TRUE;
 +              }
 +              case WR_RELOAD:
 +              {
 +                      W_Reload(WEP_CVAR_PRI(shotgun, ammo), "weapons/reload.wav"); // WEAPONTODO
 +                      return TRUE;
 +              }
 +              case WR_SUICIDEMESSAGE:
 +              {
 +                      return WEAPON_THINKING_WITH_PORTALS;
 +              }
 +              case WR_KILLMESSAGE:
 +              {
 +                      if(w_deathtype & HITTYPE_SECONDARY)
 +                              return WEAPON_SHOTGUN_MURDER_SLAP;
 +                      else
 +                              return WEAPON_SHOTGUN_MURDER;
 +              }
 +      }
 +
 +      return TRUE;
 +}
 +#endif
 +#ifdef CSQC
 +.float prevric;
 +float w_shotgun(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_IMPACTEFFECT:
 +              {
 +                      vector org2;
 +                      org2 = w_org + w_backoff * 2;
 +                      pointparticles(particleeffectnum("shotgun_impact"), org2, w_backoff * 1000, 1);
 +                      if(!w_issilent && time - self.prevric > 0.25)
 +                      {
 +                              if(w_random < 0.0165)
 +                                      sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTEN_NORM);
 +                              else if(w_random < 0.033)
 +                                      sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTEN_NORM);
 +                              else if(w_random < 0.05)
 +                                      sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTEN_NORM);
 +                              self.prevric = time;
 +                      }
 +
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_sound("weapons/ric1.wav");
 +                      precache_sound("weapons/ric2.wav");
 +                      precache_sound("weapons/ric3.wav");
 +                      return TRUE;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#endif
index 4b1c7d8804e5e322113dcc8f1e166f7f6708b61c,ada0d4bda9b5eb23619f9d45841839ebafb7fe5b..1dc2d08b39ac7b64012e4d4cce16f0ffc31d2dc4
@@@ -80,6 -80,33 +80,6 @@@ float autocvar_g_balance_armor_rot
  float autocvar_g_balance_armor_rotlinear;
  float autocvar_g_balance_armor_rotstable;
  float autocvar_g_balance_armor_start;
 -float autocvar_g_balance_rifle_bursttime;
 -float autocvar_g_balance_rifle_primary_ammo;
 -float autocvar_g_balance_rifle_primary_animtime;
 -float autocvar_g_balance_rifle_primary_bullethail;
 -float autocvar_g_balance_rifle_primary_burstcost;
 -float autocvar_g_balance_rifle_primary_damage;
 -float autocvar_g_balance_rifle_primary_force;
 -float autocvar_g_balance_rifle_primary_refire;
 -float autocvar_g_balance_rifle_primary_shots;
 -float autocvar_g_balance_rifle_primary_solidpenetration;
 -float autocvar_g_balance_rifle_primary_spread;
 -float autocvar_g_balance_rifle_primary_tracer;
 -float autocvar_g_balance_rifle_secondary;
 -float autocvar_g_balance_rifle_secondary_ammo;
 -float autocvar_g_balance_rifle_secondary_animtime;
 -float autocvar_g_balance_rifle_secondary_bullethail;
 -float autocvar_g_balance_rifle_secondary_burstcost;
 -float autocvar_g_balance_rifle_secondary_damage;
 -float autocvar_g_balance_rifle_secondary_force;
 -float autocvar_g_balance_rifle_secondary_reload;
 -float autocvar_g_balance_rifle_secondary_refire;
 -float autocvar_g_balance_rifle_secondary_shots;
 -float autocvar_g_balance_rifle_secondary_solidpenetration;
 -float autocvar_g_balance_rifle_secondary_spread;
 -float autocvar_g_balance_rifle_secondary_tracer;
 -float autocvar_g_balance_rifle_reload_ammo;
 -float autocvar_g_balance_rifle_reload_time;
  float autocvar_g_balance_cloaked_alpha;
  float autocvar_g_balance_contents_damagerate;
  float autocvar_g_balance_contents_drowndelay;
@@@ -87,11 -114,134 +87,11 @@@ float autocvar_g_balance_contents_playe
  float autocvar_g_balance_contents_playerdamage_lava;
  float autocvar_g_balance_contents_playerdamage_slime;
  float autocvar_g_balance_contents_projectiledamage;
 -float autocvar_g_balance_crylink_primary_ammo;
 -float autocvar_g_balance_crylink_primary_animtime;
 -float autocvar_g_balance_crylink_primary_bouncedamagefactor;
 -float autocvar_g_balance_crylink_primary_bounces;
 -float autocvar_g_balance_crylink_primary_damage;
 -float autocvar_g_balance_crylink_primary_edgedamage;
 -float autocvar_g_balance_crylink_primary_force;
 -float autocvar_g_balance_crylink_primary_joindelay;
 -float autocvar_g_balance_crylink_primary_joinexplode;
 -float autocvar_g_balance_crylink_primary_joinexplode_damage;
 -float autocvar_g_balance_crylink_primary_joinexplode_edgedamage;
 -float autocvar_g_balance_crylink_primary_joinexplode_force;
 -float autocvar_g_balance_crylink_primary_joinexplode_radius;
 -float autocvar_g_balance_crylink_primary_joinspread;
 -float autocvar_g_balance_crylink_primary_linkexplode;
 -float autocvar_g_balance_crylink_primary_middle_fadetime;
 -float autocvar_g_balance_crylink_primary_middle_lifetime;
 -float autocvar_g_balance_crylink_primary_other_fadetime;
 -float autocvar_g_balance_crylink_primary_other_lifetime;
 -float autocvar_g_balance_crylink_primary_radius;
 -float autocvar_g_balance_crylink_primary_refire;
 -float autocvar_g_balance_crylink_primary_shots;
 -float autocvar_g_balance_crylink_primary_speed;
 -float autocvar_g_balance_crylink_primary_spread;
 -float autocvar_g_balance_crylink_secondary;
 -float autocvar_g_balance_crylink_secondary_ammo;
 -float autocvar_g_balance_crylink_secondary_animtime;
 -float autocvar_g_balance_crylink_secondary_bouncedamagefactor;
 -float autocvar_g_balance_crylink_secondary_bounces;
 -float autocvar_g_balance_crylink_secondary_damage;
 -float autocvar_g_balance_crylink_secondary_edgedamage;
 -float autocvar_g_balance_crylink_secondary_force;
 -float autocvar_g_balance_crylink_secondary_joindelay;
 -float autocvar_g_balance_crylink_secondary_joinexplode;
 -float autocvar_g_balance_crylink_secondary_joinexplode_damage;
 -float autocvar_g_balance_crylink_secondary_joinexplode_edgedamage;
 -float autocvar_g_balance_crylink_secondary_joinexplode_force;
 -float autocvar_g_balance_crylink_secondary_joinexplode_radius;
 -float autocvar_g_balance_crylink_secondary_joinspread;
 -float autocvar_g_balance_crylink_secondary_line_fadetime;
 -float autocvar_g_balance_crylink_secondary_line_lifetime;
 -float autocvar_g_balance_crylink_secondary_linkexplode;
 -float autocvar_g_balance_crylink_secondary_middle_fadetime;
 -float autocvar_g_balance_crylink_secondary_middle_lifetime;
 -float autocvar_g_balance_crylink_secondary_radius;
 -float autocvar_g_balance_crylink_secondary_refire;
 -float autocvar_g_balance_crylink_secondary_shots;
 -float autocvar_g_balance_crylink_secondary_speed;
 -float autocvar_g_balance_crylink_secondary_spread;
 -float autocvar_g_balance_crylink_secondary_spreadtype;
 -float autocvar_g_balance_crylink_reload_ammo;
 -float autocvar_g_balance_crylink_reload_time;
  float autocvar_g_balance_damagepush_speedfactor;
 -float autocvar_g_balance_electro_combo_comboradius;
 -float autocvar_g_balance_electro_combo_damage;
 -float autocvar_g_balance_electro_combo_edgedamage;
 -float autocvar_g_balance_electro_combo_force;
 -float autocvar_g_balance_electro_combo_radius;
 -float autocvar_g_balance_electro_combo_speed;
 -float autocvar_g_balance_electro_combo_safeammocheck;
 -float autocvar_g_balance_electro_lightning;
 -float autocvar_g_balance_electro_primary_ammo;
 -float autocvar_g_balance_electro_primary_animtime;
 -float autocvar_g_balance_electro_primary_comboradius;
 -float autocvar_g_balance_electro_primary_damage;
 -float autocvar_g_balance_electro_primary_edgedamage;
 -float autocvar_g_balance_electro_primary_falloff_halflifedist;
 -float autocvar_g_balance_electro_primary_falloff_maxdist;
 -float autocvar_g_balance_electro_primary_falloff_mindist;
 -float autocvar_g_balance_electro_primary_force;
 -float autocvar_g_balance_electro_primary_force_up;
 -float autocvar_g_balance_electro_primary_lifetime;
 -float autocvar_g_balance_electro_primary_radius;
 -float autocvar_g_balance_electro_primary_range;
 -float autocvar_g_balance_electro_primary_refire;
 -float autocvar_g_balance_electro_primary_speed;
 -float autocvar_g_balance_electro_secondary_ammo;
 -float autocvar_g_balance_electro_secondary_animtime;
 -float autocvar_g_balance_electro_secondary_bouncefactor;
 -float autocvar_g_balance_electro_secondary_bouncestop;
 -float autocvar_g_balance_electro_secondary_count;
 -float autocvar_g_balance_electro_secondary_damage;
 -float autocvar_g_balance_electro_secondary_damageforcescale;
 -float autocvar_g_balance_electro_secondary_damagedbycontents;
 -float autocvar_g_balance_electro_secondary_edgedamage;
 -float autocvar_g_balance_electro_secondary_force;
 -float autocvar_g_balance_electro_secondary_health;
 -float autocvar_g_balance_electro_secondary_lifetime;
 -float autocvar_g_balance_electro_secondary_radius;
 -float autocvar_g_balance_electro_secondary_refire;
 -float autocvar_g_balance_electro_secondary_refire2;
 -float autocvar_g_balance_electro_secondary_speed;
 -float autocvar_g_balance_electro_reload_ammo;
 -float autocvar_g_balance_electro_reload_time;
  float autocvar_g_balance_falldamage_deadminspeed;
  float autocvar_g_balance_falldamage_factor;
  float autocvar_g_balance_falldamage_maxdamage;
  float autocvar_g_balance_falldamage_minspeed;
 -float autocvar_g_balance_fireball_primary_animtime;
 -float autocvar_g_balance_fireball_primary_bfgdamage;
 -float autocvar_g_balance_fireball_primary_bfgforce;
 -float autocvar_g_balance_fireball_primary_bfgradius;
 -float autocvar_g_balance_fireball_primary_damage;
 -float autocvar_g_balance_fireball_primary_damageforcescale;
 -float autocvar_g_balance_fireball_primary_edgedamage;
 -float autocvar_g_balance_fireball_primary_force;
 -float autocvar_g_balance_fireball_primary_health;
 -float autocvar_g_balance_fireball_primary_laserburntime;
 -float autocvar_g_balance_fireball_primary_laserdamage;
 -float autocvar_g_balance_fireball_primary_laseredgedamage;
 -float autocvar_g_balance_fireball_primary_laserradius;
 -float autocvar_g_balance_fireball_primary_lifetime;
 -float autocvar_g_balance_fireball_primary_radius;
 -float autocvar_g_balance_fireball_primary_refire;
 -float autocvar_g_balance_fireball_primary_refire2;
 -float autocvar_g_balance_fireball_primary_speed;
 -float autocvar_g_balance_fireball_secondary_animtime;
 -float autocvar_g_balance_fireball_secondary_damage;
 -float autocvar_g_balance_fireball_secondary_damageforcescale;
 -float autocvar_g_balance_fireball_secondary_damagetime;
 -float autocvar_g_balance_fireball_secondary_laserburntime;
 -float autocvar_g_balance_fireball_secondary_laserdamage;
 -float autocvar_g_balance_fireball_secondary_laseredgedamage;
 -float autocvar_g_balance_fireball_secondary_laserradius;
 -float autocvar_g_balance_fireball_secondary_lifetime;
 -float autocvar_g_balance_fireball_secondary_refire;
 -float autocvar_g_balance_fireball_secondary_speed;
 -float autocvar_g_balance_fireball_secondary_speed_up;
  float autocvar_g_balance_firetransfer_damage;
  float autocvar_g_balance_firetransfer_time;
  float autocvar_g_balance_fuel_limit;
@@@ -110,6 -260,75 +110,6 @@@ float autocvar_g_balance_grapplehook_sp
  float autocvar_g_balance_grapplehook_speed_pull;
  float autocvar_g_balance_grapplehook_stretch;
  float autocvar_g_balance_grapplehook_damagedbycontents;
 -float autocvar_g_balance_grenadelauncher_bouncefactor;
 -float autocvar_g_balance_grenadelauncher_bouncestop;
 -float autocvar_g_balance_grenadelauncher_primary_ammo;
 -float autocvar_g_balance_grenadelauncher_primary_animtime;
 -float autocvar_g_balance_grenadelauncher_primary_damage;
 -float autocvar_g_balance_grenadelauncher_primary_damageforcescale;
 -float autocvar_g_balance_grenadelauncher_primary_edgedamage;
 -float autocvar_g_balance_grenadelauncher_primary_force;
 -float autocvar_g_balance_grenadelauncher_primary_health;
 -float autocvar_g_balance_grenadelauncher_primary_lifetime;
 -float autocvar_g_balance_grenadelauncher_primary_lifetime_stick;
 -float autocvar_g_balance_grenadelauncher_primary_radius;
 -float autocvar_g_balance_grenadelauncher_primary_refire;
 -float autocvar_g_balance_grenadelauncher_primary_remote_minbouncecnt;
 -float autocvar_g_balance_grenadelauncher_primary_speed;
 -float autocvar_g_balance_grenadelauncher_primary_speed_up;
 -float autocvar_g_balance_grenadelauncher_primary_type;
 -float autocvar_g_balance_grenadelauncher_secondary_ammo;
 -float autocvar_g_balance_grenadelauncher_secondary_animtime;
 -float autocvar_g_balance_grenadelauncher_secondary_damage;
 -float autocvar_g_balance_grenadelauncher_secondary_damageforcescale;
 -float autocvar_g_balance_grenadelauncher_secondary_edgedamage;
 -float autocvar_g_balance_grenadelauncher_secondary_force;
 -float autocvar_g_balance_grenadelauncher_secondary_health;
 -float autocvar_g_balance_grenadelauncher_secondary_lifetime;
 -float autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce;
 -float autocvar_g_balance_grenadelauncher_secondary_lifetime_stick;
 -float autocvar_g_balance_grenadelauncher_secondary_radius;
 -float autocvar_g_balance_grenadelauncher_secondary_refire;
 -float autocvar_g_balance_grenadelauncher_secondary_speed;
 -float autocvar_g_balance_grenadelauncher_secondary_speed_up;
 -float autocvar_g_balance_grenadelauncher_secondary_type;
 -float autocvar_g_balance_grenadelauncher_reload_ammo;
 -float autocvar_g_balance_grenadelauncher_reload_time;
 -float autocvar_g_balance_hagar_primary_ammo;
 -float autocvar_g_balance_hagar_primary_damage;
 -float autocvar_g_balance_hagar_primary_edgedamage;
 -float autocvar_g_balance_hagar_primary_force;
 -float autocvar_g_balance_hagar_primary_health;
 -float autocvar_g_balance_hagar_primary_damageforcescale;
 -float autocvar_g_balance_hagar_primary_lifetime;
 -float autocvar_g_balance_hagar_primary_radius;
 -float autocvar_g_balance_hagar_primary_refire;
 -float autocvar_g_balance_hagar_primary_speed;
 -float autocvar_g_balance_hagar_secondary;
 -float autocvar_g_balance_hagar_secondary_load;
 -float autocvar_g_balance_hagar_secondary_load_speed;
 -float autocvar_g_balance_hagar_secondary_load_spread;
 -float autocvar_g_balance_hagar_secondary_load_spread_bias;
 -float autocvar_g_balance_hagar_secondary_load_max;
 -float autocvar_g_balance_hagar_secondary_load_hold;
 -float autocvar_g_balance_hagar_secondary_load_releasedeath;
 -float autocvar_g_balance_hagar_secondary_load_abort;
 -float autocvar_g_balance_hagar_secondary_load_linkexplode;
 -float autocvar_g_balance_hagar_secondary_load_animtime;
 -float autocvar_g_balance_hagar_secondary_ammo;
 -float autocvar_g_balance_hagar_secondary_damage;
 -float autocvar_g_balance_hagar_secondary_edgedamage;
 -float autocvar_g_balance_hagar_secondary_force;
 -float autocvar_g_balance_hagar_secondary_health;
 -float autocvar_g_balance_hagar_secondary_damageforcescale;
 -float autocvar_g_balance_hagar_secondary_lifetime_min;
 -float autocvar_g_balance_hagar_secondary_lifetime_rand;
 -float autocvar_g_balance_hagar_secondary_radius;
 -float autocvar_g_balance_hagar_secondary_refire;
 -float autocvar_g_balance_hagar_secondary_speed;
 -float autocvar_g_balance_hagar_secondary_spread;
 -float autocvar_g_balance_hagar_reload_ammo;
 -float autocvar_g_balance_hagar_reload_time;
  float autocvar_g_balance_health_limit;
  float autocvar_g_balance_health_regen;
  float autocvar_g_balance_health_regenlinear;
@@@ -118,6 -337,54 +118,6 @@@ float autocvar_g_balance_health_rot
  float autocvar_g_balance_health_rotlinear;
  float autocvar_g_balance_health_rotstable;
  float autocvar_g_balance_health_start;
 -float autocvar_g_balance_hlac_primary_ammo;
 -float autocvar_g_balance_hlac_primary_animtime;
 -float autocvar_g_balance_hlac_primary_damage;
 -float autocvar_g_balance_hlac_primary_edgedamage;
 -float autocvar_g_balance_hlac_primary_force;
 -float autocvar_g_balance_hlac_primary_lifetime;
 -float autocvar_g_balance_hlac_primary_radius;
 -float autocvar_g_balance_hlac_primary_refire;
 -float autocvar_g_balance_hlac_primary_speed;
 -float autocvar_g_balance_hlac_primary_spread_add;
 -float autocvar_g_balance_hlac_primary_spread_crouchmod;
 -float autocvar_g_balance_hlac_primary_spread_max;
 -float autocvar_g_balance_hlac_primary_spread_min;
 -float autocvar_g_balance_hlac_secondary;
 -float autocvar_g_balance_hlac_secondary_ammo;
 -float autocvar_g_balance_hlac_secondary_animtime;
 -float autocvar_g_balance_hlac_secondary_damage;
 -float autocvar_g_balance_hlac_secondary_edgedamage;
 -float autocvar_g_balance_hlac_secondary_force;
 -float autocvar_g_balance_hlac_secondary_lifetime;
 -float autocvar_g_balance_hlac_secondary_radius;
 -float autocvar_g_balance_hlac_secondary_refire;
 -float autocvar_g_balance_hlac_secondary_shots;
 -float autocvar_g_balance_hlac_secondary_speed;
 -float autocvar_g_balance_hlac_secondary_spread;
 -float autocvar_g_balance_hlac_secondary_spread_crouchmod;
 -float autocvar_g_balance_hlac_reload_ammo;
 -float autocvar_g_balance_hlac_reload_time;
 -float autocvar_g_balance_hook_primary_animtime;
 -float autocvar_g_balance_hook_primary_fuel;
 -float autocvar_g_balance_hook_primary_hooked_fuel;
 -float autocvar_g_balance_hook_primary_hooked_time_free;
 -float autocvar_g_balance_hook_primary_hooked_time_max;
 -float autocvar_g_balance_hook_primary_refire;
 -float autocvar_g_balance_hook_secondary_ammo;
 -float autocvar_g_balance_hook_secondary_animtime;
 -float autocvar_g_balance_hook_secondary_damage;
 -float autocvar_g_balance_hook_secondary_duration;
 -float autocvar_g_balance_hook_secondary_edgedamage;
 -float autocvar_g_balance_hook_secondary_force;
 -float autocvar_g_balance_hook_secondary_gravity;
 -float autocvar_g_balance_hook_secondary_lifetime;
 -float autocvar_g_balance_hook_secondary_power;
 -float autocvar_g_balance_hook_secondary_radius;
 -float autocvar_g_balance_hook_secondary_refire;
 -float autocvar_g_balance_hook_secondary_speed;
 -float autocvar_g_balance_hook_secondary_health;
 -float autocvar_g_balance_hook_secondary_damageforcescale;
  float autocvar_g_balance_keyhunt_damageforcescale;
  float autocvar_g_balance_keyhunt_delay_collect;
  float autocvar_g_balance_keyhunt_delay_return;
@@@ -135,6 -402,102 +135,6 @@@ float autocvar_g_balance_keyhunt_score_
  float autocvar_g_balance_keyhunt_throwvelocity;
  float autocvar_g_balance_kill_delay;
  float autocvar_g_balance_kill_antispam;
 -float autocvar_g_balance_laser_primary_animtime;
 -float autocvar_g_balance_laser_primary_damage;
 -float autocvar_g_balance_laser_primary_delay;
 -float autocvar_g_balance_laser_primary_edgedamage;
 -float autocvar_g_balance_laser_primary_force;
 -float autocvar_g_balance_laser_primary_force_other_scale;
 -float autocvar_g_balance_laser_primary_force_velocitybias;
 -float autocvar_g_balance_laser_primary_force_zscale;
 -float autocvar_g_balance_laser_primary_lifetime;
 -float autocvar_g_balance_laser_primary_radius;
 -float autocvar_g_balance_laser_primary_refire;
 -float autocvar_g_balance_laser_primary_shotangle;
 -float autocvar_g_balance_laser_primary_speed;
 -float autocvar_g_balance_laser_secondary;
 -float autocvar_g_balance_laser_secondary_animtime;
 -float autocvar_g_balance_laser_secondary_damage;
 -float autocvar_g_balance_laser_secondary_edgedamage;
 -float autocvar_g_balance_laser_secondary_force;
 -float autocvar_g_balance_laser_secondary_force_other_scale;
 -float autocvar_g_balance_laser_secondary_force_velocitybias;
 -float autocvar_g_balance_laser_secondary_force_zscale;
 -float autocvar_g_balance_laser_secondary_lifetime;
 -float autocvar_g_balance_laser_secondary_radius;
 -float autocvar_g_balance_laser_secondary_speed;
 -float autocvar_g_balance_laser_reload_ammo;
 -float autocvar_g_balance_laser_reload_time;
 -float autocvar_g_balance_minelayer_ammo;
 -float autocvar_g_balance_minelayer_animtime;
 -float autocvar_g_balance_minelayer_damage;
 -float autocvar_g_balance_minelayer_damageforcescale;
 -float autocvar_g_balance_minelayer_detonatedelay;
 -float autocvar_g_balance_minelayer_edgedamage;
 -float autocvar_g_balance_minelayer_force;
 -float autocvar_g_balance_minelayer_health;
 -float autocvar_g_balance_minelayer_lifetime;
 -float autocvar_g_balance_minelayer_lifetime_countdown;
 -float autocvar_g_balance_minelayer_limit;
 -float autocvar_g_balance_minelayer_protection;
 -float autocvar_g_balance_minelayer_proximityradius;
 -float autocvar_g_balance_minelayer_radius;
 -float autocvar_g_balance_minelayer_refire;
 -float autocvar_g_balance_minelayer_remote_damage;
 -float autocvar_g_balance_minelayer_remote_edgedamage;
 -float autocvar_g_balance_minelayer_remote_force;
 -float autocvar_g_balance_minelayer_remote_radius;
 -float autocvar_g_balance_minelayer_speed;
 -float autocvar_g_balance_minelayer_time;
 -float autocvar_g_balance_minelayer_reload_ammo;
 -float autocvar_g_balance_minelayer_reload_time;
 -float autocvar_g_balance_minstanex_ammo;
 -float autocvar_g_balance_minstanex_laser_ammo;
 -float autocvar_g_balance_minstanex_laser_animtime;
 -float autocvar_g_balance_minstanex_laser_refire;
 -float autocvar_g_balance_minstanex_animtime;
 -float autocvar_g_balance_minstanex_refire;
 -float autocvar_g_balance_minstanex_reload_ammo;
 -float autocvar_g_balance_minstanex_reload_time;
 -float autocvar_g_balance_nex_charge;
 -float autocvar_g_balance_nex_charge_animlimit;
 -float autocvar_g_balance_nex_charge_limit;
 -float autocvar_g_balance_nex_charge_maxspeed;
 -float autocvar_g_balance_nex_charge_mindmg;
 -float autocvar_g_balance_nex_charge_minspeed;
 -float autocvar_g_balance_nex_charge_rate;
 -float autocvar_g_balance_nex_charge_rot_pause;
 -float autocvar_g_balance_nex_charge_rot_rate;
 -float autocvar_g_balance_nex_charge_shot_multiplier;
 -float autocvar_g_balance_nex_charge_start;
 -float autocvar_g_balance_nex_charge_velocity_rate;
 -float autocvar_g_balance_nex_primary_ammo;
 -float autocvar_g_balance_nex_primary_animtime;
 -float autocvar_g_balance_nex_primary_damage;
 -float autocvar_g_balance_nex_primary_damagefalloff_forcehalflife;
 -float autocvar_g_balance_nex_primary_damagefalloff_halflife;
 -float autocvar_g_balance_nex_primary_damagefalloff_maxdist;
 -float autocvar_g_balance_nex_primary_damagefalloff_mindist;
 -float autocvar_g_balance_nex_primary_force;
 -float autocvar_g_balance_nex_primary_refire;
 -float autocvar_g_balance_nex_secondary;
 -float autocvar_g_balance_nex_secondary_ammo;
 -float autocvar_g_balance_nex_secondary_animtime;
 -float autocvar_g_balance_nex_secondary_charge;
 -float autocvar_g_balance_nex_secondary_charge_rate;
 -float autocvar_g_balance_nex_secondary_chargepool;
 -float autocvar_g_balance_nex_secondary_chargepool_pause_health_regen;
 -float autocvar_g_balance_nex_secondary_chargepool_pause_regen;
 -float autocvar_g_balance_nex_secondary_chargepool_regen;
 -float autocvar_g_balance_nex_secondary_damage;
 -float autocvar_g_balance_nex_secondary_damagefalloff_forcehalflife;
 -float autocvar_g_balance_nex_secondary_damagefalloff_halflife;
 -float autocvar_g_balance_nex_secondary_damagefalloff_maxdist;
 -float autocvar_g_balance_nex_secondary_damagefalloff_mindist;
 -float autocvar_g_balance_nex_secondary_force;
 -float autocvar_g_balance_nex_secondary_refire;
 -float autocvar_g_balance_nex_reload_ammo;
 -float autocvar_g_balance_nex_reload_time;
  float autocvar_g_balance_nexball_primary_animtime;
  float autocvar_g_balance_nexball_primary_refire;
  float autocvar_g_balance_nexball_primary_speed;
@@@ -166,6 -529,15 +166,6 @@@ float autocvar_g_balance_pause_health_r
  float autocvar_g_balance_pause_health_rot_spawn;
  float autocvar_g_balance_portal_health;
  float autocvar_g_balance_portal_lifetime;
 -float autocvar_g_balance_porto_primary_animtime;
 -float autocvar_g_balance_porto_primary_lifetime;
 -float autocvar_g_balance_porto_primary_refire;
 -float autocvar_g_balance_porto_primary_speed;
 -float autocvar_g_balance_porto_secondary;
 -float autocvar_g_balance_porto_secondary_animtime;
 -float autocvar_g_balance_porto_secondary_lifetime;
 -float autocvar_g_balance_porto_secondary_refire;
 -float autocvar_g_balance_porto_secondary_speed;
  float autocvar_g_balance_powerup_invincible_takedamage;
  float autocvar_g_balance_powerup_invincible_time;
  float autocvar_g_balance_powerup_strength_damage;
@@@ -174,13 -546,135 +174,12 @@@ float autocvar_g_balance_powerup_streng
  float autocvar_g_balance_powerup_strength_selfforce;
  float autocvar_g_balance_powerup_strength_time;
  float autocvar_g_balance_superweapons_time;
 -float autocvar_g_balance_rocketlauncher_ammo;
 -float autocvar_g_balance_rocketlauncher_animtime;
 -float autocvar_g_balance_rocketlauncher_damage;
 -float autocvar_g_balance_rocketlauncher_damageforcescale;
 -float autocvar_g_balance_rocketlauncher_detonatedelay;
 -float autocvar_g_balance_rocketlauncher_edgedamage;
 -float autocvar_g_balance_rocketlauncher_force;
 -float autocvar_g_balance_rocketlauncher_guidedelay;
 -float autocvar_g_balance_rocketlauncher_guidegoal;
 -float autocvar_g_balance_rocketlauncher_guiderate;
 -float autocvar_g_balance_rocketlauncher_guideratedelay;
 -float autocvar_g_balance_rocketlauncher_guidestop;
 -float autocvar_g_balance_rocketlauncher_health;
 -float autocvar_g_balance_rocketlauncher_lifetime;
 -float autocvar_g_balance_rocketlauncher_radius;
 -float autocvar_g_balance_rocketlauncher_refire;
 -float autocvar_g_balance_rocketlauncher_remote_damage;
 -float autocvar_g_balance_rocketlauncher_remote_edgedamage;
 -float autocvar_g_balance_rocketlauncher_remote_force;
 -float autocvar_g_balance_rocketlauncher_remote_radius;
 -float autocvar_g_balance_rocketlauncher_speed;
 -float autocvar_g_balance_rocketlauncher_speedaccel;
 -float autocvar_g_balance_rocketlauncher_speedstart;
 -float autocvar_g_balance_rocketlauncher_reload_ammo;
 -float autocvar_g_balance_rocketlauncher_reload_time;
 -float autocvar_g_balance_seeker_type;
 -float autocvar_g_balance_seeker_flac_ammo;
 -float autocvar_g_balance_seeker_flac_animtime;
 -float autocvar_g_balance_seeker_flac_damage;
 -float autocvar_g_balance_seeker_flac_edgedamage;
 -float autocvar_g_balance_seeker_flac_force;
 -float autocvar_g_balance_seeker_flac_lifetime;
 -float autocvar_g_balance_seeker_flac_lifetime_rand;
 -float autocvar_g_balance_seeker_flac_radius;
 -float autocvar_g_balance_seeker_flac_refire;
 -float autocvar_g_balance_seeker_missile_accel;
 -float autocvar_g_balance_seeker_missile_ammo;
 -float autocvar_g_balance_seeker_missile_animtime;
 -float autocvar_g_balance_seeker_missile_count;
 -float autocvar_g_balance_seeker_missile_damage;
 -float autocvar_g_balance_seeker_missile_damageforcescale;
 -float autocvar_g_balance_seeker_missile_decel;
 -float autocvar_g_balance_seeker_missile_delay;
 -float autocvar_g_balance_seeker_missile_edgedamage;
 -float autocvar_g_balance_seeker_missile_force;
 -float autocvar_g_balance_seeker_missile_health;
 -float autocvar_g_balance_seeker_missile_lifetime;
 -float autocvar_g_balance_seeker_missile_proxy;
 -float autocvar_g_balance_seeker_missile_proxy_delay;
 -float autocvar_g_balance_seeker_missile_proxy_maxrange;
 -float autocvar_g_balance_seeker_missile_radius;
 -float autocvar_g_balance_seeker_missile_refire;
 -float autocvar_g_balance_seeker_missile_smart;
 -float autocvar_g_balance_seeker_missile_smart_mindist;
 -float autocvar_g_balance_seeker_missile_smart_trace_max;
 -float autocvar_g_balance_seeker_missile_smart_trace_min;
 -float autocvar_g_balance_seeker_missile_speed_max;
 -float autocvar_g_balance_seeker_missile_turnrate;
 -float autocvar_g_balance_seeker_tag_ammo;
 -float autocvar_g_balance_seeker_tag_animtime;
 -float autocvar_g_balance_seeker_tag_damageforcescale;
 -float autocvar_g_balance_seeker_tag_health;
 -float autocvar_g_balance_seeker_tag_lifetime;
 -float autocvar_g_balance_seeker_tag_refire;
 -float autocvar_g_balance_seeker_tag_speed;
 -float autocvar_g_balance_seeker_tag_tracker_lifetime;
 -float autocvar_g_balance_seeker_reload_ammo;
 -float autocvar_g_balance_seeker_reload_time;
  float autocvar_g_balance_selfdamagepercent;
 -float autocvar_g_balance_shotgun_primary_ammo;
 -float autocvar_g_balance_shotgun_primary_animtime;
 -float autocvar_g_balance_shotgun_primary_bullets;
 -float autocvar_g_balance_shotgun_primary_damage;
 -float autocvar_g_balance_shotgun_primary_force;
 -float autocvar_g_balance_shotgun_primary_refire;
 -float autocvar_g_balance_shotgun_primary_solidpenetration;
 -float autocvar_g_balance_shotgun_primary_spread;
 -float autocvar_g_balance_shotgun_secondary;
 -float autocvar_g_balance_shotgun_secondary_animtime;
 -float autocvar_g_balance_shotgun_secondary_damage;
 -float autocvar_g_balance_shotgun_secondary_force;
 -float autocvar_g_balance_shotgun_secondary_melee_delay;
 -float autocvar_g_balance_shotgun_secondary_melee_range;
 -float autocvar_g_balance_shotgun_secondary_melee_swing_side;
 -float autocvar_g_balance_shotgun_secondary_melee_swing_up;
 -float autocvar_g_balance_shotgun_secondary_melee_time;
 -float autocvar_g_balance_shotgun_secondary_melee_traces;
 -float autocvar_g_balance_shotgun_secondary_melee_no_doubleslap;
 -float autocvar_g_balance_shotgun_secondary_melee_nonplayerdamage;
 -float autocvar_g_balance_shotgun_secondary_melee_multihit;
 -float autocvar_g_balance_shotgun_secondary_refire;
 -float autocvar_g_balance_shotgun_reload_ammo;
 -float autocvar_g_balance_shotgun_reload_time;
  float autocvar_g_balance_teams;
  float autocvar_g_balance_teams_prevent_imbalance;
  float autocvar_g_balance_teams_scorefactor;
 -float autocvar_g_balance_tuba_animtime;
 -float autocvar_g_balance_tuba_attenuation;
 -float autocvar_g_balance_tuba_damage;
 -float autocvar_g_balance_tuba_edgedamage;
 -float autocvar_g_balance_tuba_force;
 -float autocvar_g_balance_tuba_radius;
 -float autocvar_g_balance_tuba_refire;
 -float autocvar_g_balance_uzi_burst;
 -float autocvar_g_balance_uzi_burst_ammo;
 -float autocvar_g_balance_uzi_burst_animtime;
 -float autocvar_g_balance_uzi_burst_refire;
 -float autocvar_g_balance_uzi_burst_refire2;
 -float autocvar_g_balance_uzi_burst_spread;
 -float autocvar_g_balance_uzi_first;
 -float autocvar_g_balance_uzi_first_ammo;
 -float autocvar_g_balance_uzi_first_damage;
 -float autocvar_g_balance_uzi_first_force;
 -float autocvar_g_balance_uzi_first_refire;
 -float autocvar_g_balance_uzi_first_spread;
 -float autocvar_g_balance_uzi_mode;
 -float autocvar_g_balance_uzi_solidpenetration;
 -float autocvar_g_balance_uzi_spread_add;
 -float autocvar_g_balance_uzi_spread_max;
 -float autocvar_g_balance_uzi_spread_min;
 -float autocvar_g_balance_uzi_sustained_ammo;
 -float autocvar_g_balance_uzi_sustained_damage;
 -float autocvar_g_balance_uzi_sustained_force;
 -float autocvar_g_balance_uzi_sustained_refire;
 -float autocvar_g_balance_uzi_sustained_spread;
 -float autocvar_g_balance_uzi_reload_ammo;
 -float autocvar_g_balance_uzi_reload_time;
  float autocvar_g_ballistics_density_corpse;
  float autocvar_g_ballistics_density_player;
- float autocvar_g_ballistics_materialconstant;
  float autocvar_g_ballistics_mindistance;
  float autocvar_g_ban_default_bantime;
  float autocvar_g_ban_default_masksize;
diff --combined qcsrc/server/defs.qh
index bf8456e92340c91452a845cb45c9e4b9f24626ef,536dee3ed1fb464479bd11620f38fea1e06103e7..90a73819a6712f21bff095abf82486a352fc9a15
@@@ -183,9 -183,8 +183,9 @@@ void setanim(entity e, vector anim, flo
  .float switchingweapon; // weapon currently being switched to (is copied from switchweapon once switch is possible)
  .string weaponname; // name of .weapon
  
 +// WEAPONTODO
  .float autoswitch;
 -float weapon_action(float wpn, float wrequest);
 +//float WEP_ACTION(float wpn, float wrequest);
  float client_hasweapon(entity cl, float wpn, float andammo, float complain);
  void w_clear();
  void w_ready();
  .float weapon_nextthink;
  .void() weapon_think;
  
 -//float       PLAYER_WEAPONSELECTION_DELAY = );
 -const float   PLAYER_WEAPONSELECTION_SPEED = 18;
 -const vector  PLAYER_WEAPONSELECTION_RANGE = '0 20 -40';
  
  // weapon states (self.weaponentity.state)
  const float WS_CLEAR                  = 0; // no weapon selected
@@@ -457,7 -459,6 +457,6 @@@ void W_Porto_Remove (entity p)
  
  .string message2;
  
- vector railgun_start, railgun_end; // filled by FireRailgunBullet, used by damage code for head shot
  .float stat_allow_oldnexbeam;
  
  // reset to 0 on weapon switch
@@@ -511,6 -512,7 +510,6 @@@ float servertime, serverprevtime, serve
  .float stat_shotorg; // networked stat for trueaim HUD
  
  string matchid;
 -.float hitplotfh;
  
  .float last_pickup;
  
@@@ -526,6 -528,8 +525,6 @@@ float client_cefc_accumulator
  float client_cefc_accumulatortime;
  #endif
  
 -..float current_ammo;
 -
  .float weapon_load[WEP_MAXCOUNT];
  .float ammo_none; // used by the reloading system, must always be 0
  .float clip_load;
@@@ -556,6 -560,9 +555,6 @@@ string deathmessage
  
  .float just_joined;
  
 -.float cvar_cl_accuracy_data_share;
 -.float cvar_cl_accuracy_data_receive;
 -
  .float cvar_cl_weaponimpulsemode;
  .float selectweapon; // last selected weapon of the player
  
index debf95aa4f806e88766e67a3cf3d04a83367851c,9fe5e4303f0a0ffa502f58137eaca9f1f44c6fef..2cc6ee51b8a6ad1436cd8513c1d5337478f40262
@@@ -458,6 -458,7 +458,6 @@@ void GetCvars_handleFloatOnce(string th
                        stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
        }
  }
 -float w_getbestweapon(entity e);
  string W_FixWeaponOrder_ForceComplete_AndBuildImpulseList(string wo)
  {
        string o;
@@@ -624,7 -625,9 +624,7 @@@ float warmup_start_health
  float warmup_start_armorvalue;
  float g_weapon_stay;
  
 -entity get_weaponinfo(float w);
 -
 -float want_weapon(string cvarprefix, entity weaponinfo, float allguns)
 +float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO
  {
        var float i = weaponinfo.weapon;
        var float d = 0;
        else if (g_nexball)
                d = 0; // weapon is set a few lines later
        else
 -              d = (i == WEP_LASER || i == WEP_SHOTGUN);
 +              d = !(!weaponinfo.weaponstart);
  
        if(g_grappling_hook) // if possible, redirect off-hand hook to on-hand hook
                d |= (i == WEP_HOOK);
 -      if(weaponinfo.spawnflags & WEP_FLAG_MUTATORBLOCKED) // never default mutator blocked guns
 +      if(!g_cts && (weaponinfo.spawnflags & WEP_FLAG_MUTATORBLOCKED)) // never default mutator blocked guns
                d = 0;
  
 -      var float t = cvar(strcat(cvarprefix, weaponinfo.netname));
 +      var float t = weaponinfo.weaponstartoverride;
  
        //print(strcat("want_weapon: ", weaponinfo.netname, " - d: ", ftos(d), ", t: ", ftos(t), ". \n"));
  
@@@ -774,7 -777,7 +774,7 @@@ void readplayerstartcvars(
                for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                {
                        e = get_weaponinfo(i);
 -                      float w = want_weapon("g_start_weapon_", e, FALSE);
 +                      float w = want_weapon(e, FALSE);
                        if(w & 1)
                                start_weapons |= WepSet_FromWeapon(i);
                        if(w & 2)
                        for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                        {
                                e = get_weaponinfo(i);
 -                              float w = want_weapon("g_start_weapon_", e, g_warmup_allguns);
 +                              float w = want_weapon(e, g_warmup_allguns);
                                if(w & 1)
                                        warmup_start_weapons |= WepSet_FromWeapon(i);
                                if(w & 2)
        {
                e = get_weaponinfo(i);
                if(precache_weapons & WepSet_FromWeapon(i))
 -                      weapon_action(i, WR_PRECACHE);
 +                      WEP_ACTION(i, WR_INIT);
        }
  
        start_ammo_shells = max(0, start_ammo_shells);
@@@ -1386,6 -1389,18 +1386,6 @@@ void precache(
          precache_sound ("weapons/hook_impact.wav"); // hook
      }
  
 -    if(autocvar_sv_precacheweapons)
 -    {
 -        //precache weapon models/sounds
 -        float wep;
 -        wep = WEP_FIRST;
 -        while (wep <= WEP_LAST)
 -        {
 -            weapon_action(wep, WR_PRECACHE);
 -            wep = wep + 1;
 -        }
 -    }
 -
      precache_model("models/elaser.mdl");
      precache_model("models/laser.mdl");
      precache_model("models/ebomb.mdl");
@@@ -1996,65 -2011,6 +1996,6 @@@ float MoveToRandomMapLocation(entity e
          return FALSE;
  }
  
- float zcurveparticles_effectno;
- vector zcurveparticles_start;
- float zcurveparticles_spd;
- void endzcurveparticles()
- {
-       if(zcurveparticles_effectno)
-       {
-               // terminator
-               WriteShort(MSG_BROADCAST, zcurveparticles_spd | 0x8000);
-       }
-       zcurveparticles_effectno = 0;
- }
- void zcurveparticles(float effectno, vector start, vector end, float end_dz, float spd)
- {
-       spd = bound(0, floor(spd / 16), 32767);
-       if(effectno != zcurveparticles_effectno || start != zcurveparticles_start)
-       {
-               endzcurveparticles();
-               WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
-               WriteByte(MSG_BROADCAST, TE_CSQC_ZCURVEPARTICLES);
-               WriteShort(MSG_BROADCAST, effectno);
-               WriteCoord(MSG_BROADCAST, start_x);
-               WriteCoord(MSG_BROADCAST, start_y);
-               WriteCoord(MSG_BROADCAST, start_z);
-               zcurveparticles_effectno = effectno;
-               zcurveparticles_start = start;
-       }
-       else
-               WriteShort(MSG_BROADCAST, zcurveparticles_spd);
-       WriteCoord(MSG_BROADCAST, end_x);
-       WriteCoord(MSG_BROADCAST, end_y);
-       WriteCoord(MSG_BROADCAST, end_z);
-       WriteCoord(MSG_BROADCAST, end_dz);
-       zcurveparticles_spd = spd;
- }
- void zcurveparticles_from_tracetoss(float effectno, vector start, vector end, vector vel)
- {
-       float end_dz;
-       vector vecxy, velxy;
-       vecxy = end - start;
-       vecxy_z = 0;
-       velxy = vel;
-       velxy_z = 0;
-       if (vlen(velxy) < 0.000001 * fabs(vel_z))
-       {
-               endzcurveparticles();
-               trailparticles(world, effectno, start, end);
-               return;
-       }
-       end_dz = vlen(vecxy) / vlen(velxy) * vel_z - (end_z - start_z);
-       zcurveparticles(effectno, start, end, end_dz, vlen(vel));
- }
  void write_recordmarker(entity pl, float tstart, float dt)
  {
      GameLogEcho(strcat(":recordset:", ftos(pl.playerid), ":", ftos(dt)));
index 2da91aad05c207fe9481455877461f9ec868329d,2eeb08b8fda73978203dbac137b578d5e96e3e58..a91daa190194c04cc7526a8a544c6beb1f41045d
@@@ -51,8 -51,7 +51,8 @@@ void walker_setnoanim(
  }
  void walker_rocket_explode()
  {
 -    RadiusDamage (self, self.owner, autocvar_g_turrets_unit_walker_std_rocket_dmg, 0, autocvar_g_turrets_unit_walker_std_rocket_radius, self, autocvar_g_turrets_unit_walker_std_rocket_force, DEATH_TURRET_WALK_ROCKET, world);
 +    RadiusDamage (self, self.owner, autocvar_g_turrets_unit_walker_std_rocket_dmg, 0, autocvar_g_turrets_unit_walker_std_rocket_radius, self, world, autocvar_g_turrets_unit_walker_std_rocket_force, DEATH_TURRET_WALK_ROCKET, world);
 +
      remove (self);
  }
  
@@@ -516,8 -515,7 +516,7 @@@ void walker_postthink(
  void walker_attack()
  {
      sound (self, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTEN_NORM);
-     fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, self.shot_speed, 5, self.shot_dmg, self.shot_force, DEATH_TURRET_WALK_GUN, 0, WEP_CVAR(uzi, bulletconstant)); // WEAPONTODO
-     endFireBallisticBullet();
+     fireBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, 0, self.shot_dmg, self.shot_force, DEATH_TURRET_WALK_GUN, 0);
      pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
  }
  
index e268f7f8309df477d9f0ffcb7da597a09c64af94,a73997fda5be350ca8469496fcd56033691ae9f7..48e2bc2779bc9e7e7a6d419bfd89f378daf8d0a4
@@@ -43,8 -43,7 +43,7 @@@ float autocvar_g_vehicle_spiderbot_mini
  float autocvar_g_vehicle_spiderbot_minigun_ammo_regen;
  float autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause;
  float autocvar_g_vehicle_spiderbot_minigun_force;
- float autocvar_g_vehicle_spiderbot_minigun_speed;
- float autocvar_g_vehicle_spiderbot_minigun_bulletconstant;
+ float autocvar_g_vehicle_spiderbot_minigun_solidpenetration;
  
  float autocvar_g_vehicle_spiderbot_rocket_damage;
  float autocvar_g_vehicle_spiderbot_rocket_force;
@@@ -495,12 -494,8 +494,8 @@@ float spiderbot_frame(
              v_forward = normalize(v_forward);
              v += v_forward * 50;
  
- //void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float force, float dtype, float tracereffects, float bulletconstant)
-             fireBallisticBullet(v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_speed,
-                                 5, autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN, 0, autocvar_g_vehicle_spiderbot_minigun_bulletconstant);
-             endFireBallisticBullet();
+             fireBullet(v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_solidpenetration,
+                                 autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN, 0);
  
  //            fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
  //                autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_VH_SPID_MINIGUN, 0);
@@@ -723,7 -718,7 +718,7 @@@ void spiderbot_blowup(
      SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
      SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
  
 -    RadiusDamage (self, self.enemy, 250, 15, 250, world, 250, DEATH_VH_SPID_DEATH, world);
 +    RadiusDamage (self, self.enemy, 250, 15, 250, world, world, 250, DEATH_VH_SPID_DEATH, world);
  
      self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
      self.movetype   = MOVETYPE_NONE;
index b70988945564923fcf2b0519a85dec069506a6b1,0000000000000000000000000000000000000000..961335de4006c4a65b61ecbb2615a37735dd17c2
mode 100644,000000..100644
--- /dev/null
@@@ -1,697 -1,0 +1,463 @@@
-       railgun_start = start;
-       railgun_end = end;
 +// this function calculates w_shotorg and w_shotdir based on the weapon model
 +// offset, trueaim and antilag, and won't put w_shotorg inside a wall.
 +// make sure you call makevectors first (FIXME?)
 +void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float chan, float maxdamage, float range)
 +{
 +      float nudge = 1; // added to traceline target and subtracted from result
 +      float oldsolid;
 +      vector vecs, dv;
 +      oldsolid = ent.dphitcontentsmask;
 +      if(ent.weapon == WEP_RIFLE)
 +              ent.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 +      else
 +              ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 +      if(antilag)
 +              WarpZone_traceline_antilag(world, ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * range, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
 +              // passing world, because we do NOT want it to touch dphitcontentsmask
 +      else
 +              WarpZone_TraceLine(ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * range, MOVE_NOMONSTERS, ent);
 +      ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 +
 +      vector vf, vr, vu;
 +      vf = v_forward;
 +      vr = v_right;
 +      vu = v_up;
 +      w_shotend = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos); // warpzone support
 +      v_forward = vf;
 +      v_right = vr;
 +      v_up = vu;
 +
 +      // un-adjust trueaim if shotend is too close
 +      if(vlen(w_shotend - (ent.origin + ent.view_ofs)) < autocvar_g_trueaim_minrange)
 +              w_shotend = ent.origin + ent.view_ofs + s_forward * autocvar_g_trueaim_minrange;
 +
 +      // track max damage
 +      if(accuracy_canbegooddamage(ent))
 +              accuracy_add(ent, ent.weapon, maxdamage, 0);
 +
 +      W_HitPlotAnalysis(ent, v_forward, v_right, v_up);
 +
 +      if(ent.weaponentity.movedir_x > 0)
 +              vecs = ent.weaponentity.movedir;
 +      else
 +              vecs = '0 0 0';
 +
 +      dv = v_right * -vecs_y + v_up * vecs_z;
 +      w_shotorg = ent.origin + ent.view_ofs + dv;
 +
 +      // now move the shotorg forward as much as requested if possible
 +      if(antilag)
 +      {
 +              if(ent.antilag_debug)
 +                      tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs_x + nudge), MOVE_NORMAL, ent, ent.antilag_debug);
 +              else
 +                      tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs_x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
 +      }
 +      else
 +              tracebox(w_shotorg, mi, ma, w_shotorg + v_forward * (vecs_x + nudge), MOVE_NORMAL, ent);
 +      w_shotorg = trace_endpos - v_forward * nudge;
 +      // calculate the shotdir from the chosen shotorg
 +      w_shotdir = normalize(w_shotend - w_shotorg);
 +
 +      if (antilag)
 +      if (!ent.cvar_cl_noantilag)
 +      {
 +              if (autocvar_g_antilag == 1) // switch to "ghost" if not hitting original
 +              {
 +                      traceline(w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent);
 +                      if (!trace_ent.takedamage)
 +                      {
 +                              traceline_antilag_force (ent, w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
 +                              if (trace_ent.takedamage && IS_PLAYER(trace_ent))
 +                              {
 +                                      entity e;
 +                                      e = trace_ent;
 +                                      traceline(w_shotorg, e.origin, MOVE_NORMAL, ent);
 +                                      if(trace_ent == e)
 +                                              w_shotdir = normalize(trace_ent.origin - w_shotorg);
 +                              }
 +                      }
 +              }
 +              else if(autocvar_g_antilag == 3) // client side hitscan
 +              {
 +                      // this part MUST use prydon cursor
 +                      if (ent.cursor_trace_ent)                 // client was aiming at someone
 +                      if (ent.cursor_trace_ent != ent)         // just to make sure
 +                      if (ent.cursor_trace_ent.takedamage)      // and that person is killable
 +                      if (IS_PLAYER(ent.cursor_trace_ent)) // and actually a player
 +                      {
 +                              // verify that the shot would miss without antilag
 +                              // (avoids an issue where guns would always shoot at their origin)
 +                              traceline(w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent);
 +                              if (!trace_ent.takedamage)
 +                              {
 +                                      // verify that the shot would hit if altered
 +                                      traceline(w_shotorg, ent.cursor_trace_ent.origin, MOVE_NORMAL, ent);
 +                                      if (trace_ent == ent.cursor_trace_ent)
 +                                              w_shotdir = normalize(ent.cursor_trace_ent.origin - w_shotorg);
 +                                      else
 +                                              print("antilag fail\n");
 +                              }
 +                      }
 +              }
 +      }
 +
 +      ent.dphitcontentsmask = oldsolid; // restore solid type (generally SOLID_SLIDEBOX)
 +
 +      if (!autocvar_g_norecoil)
 +              ent.punchangle_x = recoil * -1;
 +
 +      if (snd != "")
 +      {
 +              sound (ent, chan, snd, VOL_BASE, ATTN_NORM);
 +              W_PlayStrengthSound(ent);
 +      }
 +
 +      // nudge w_shotend so a trace to w_shotend hits
 +      w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge;
 +}
 +
 +vector W_CalculateProjectileVelocity(vector pvelocity, vector mvelocity, float forceAbsolute)
 +{
 +      vector mdirection;
 +      float mspeed;
 +      vector outvelocity;
 +
 +      mvelocity = mvelocity * g_weaponspeedfactor;
 +
 +      mdirection = normalize(mvelocity);
 +      mspeed = vlen(mvelocity);
 +
 +      outvelocity = get_shotvelocity(pvelocity, mdirection, mspeed, (forceAbsolute ? 0 : autocvar_g_projectiles_newton_style), autocvar_g_projectiles_newton_style_2_minfactor, autocvar_g_projectiles_newton_style_2_maxfactor);
 +
 +      return outvelocity;
 +}
 +
 +#if 0
 +float mspercallsum;
 +float mspercallsstyle;
 +float mspercallcount;
 +#endif
 +void W_SetupProjectileVelocityEx(entity missile, vector dir, vector upDir, float pSpeed, float pUpSpeed, float pZSpeed, float spread, float forceAbsolute)
 +{
 +      if(missile.owner == world)
 +              error("Unowned missile");
 +
 +      dir = dir + upDir * (pUpSpeed / pSpeed);
 +      dir_z += pZSpeed / pSpeed;
 +      pSpeed *= vlen(dir);
 +      dir = normalize(dir);
 +
 +#if 0
 +      if(autocvar_g_projectiles_spread_style != mspercallsstyle)
 +      {
 +              mspercallsum = mspercallcount = 0;
 +              mspercallsstyle = autocvar_g_projectiles_spread_style;
 +      }
 +      mspercallsum -= gettime(GETTIME_HIRES);
 +#endif
 +      dir = W_CalculateSpread(dir, spread, g_weaponspreadfactor, autocvar_g_projectiles_spread_style);
 +#if 0
 +      mspercallsum += gettime(GETTIME_HIRES);
 +      mspercallcount += 1;
 +      print("avg: ", ftos(mspercallcount / mspercallsum), " per sec\n");
 +#endif
 +
 +      missile.velocity = W_CalculateProjectileVelocity(missile.owner.velocity, pSpeed * dir, forceAbsolute);
 +}
 +
 +void W_SetupProjectileVelocity(entity missile, float pSpeed, float spread) // WEAPONTODO
 +{
 +      W_SetupProjectileVelocityEx(missile, w_shotdir, v_up, pSpeed, 0, 0, spread, FALSE);
 +}
 +
 +
 +// ====================
 +//  Ballistics Tracing
 +// ====================
 +
 +void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, float deathtype)
 +{
 +      vector hitloc, force, endpoint, dir;
 +      entity ent, endent;
 +      float endq3surfaceflags;
 +      float totaldmg;
 +      entity o;
 +
 +      float length;
 +      vector beampos;
 +      string snd;
 +      entity pseudoprojectile;
 +      float f, ffs;
 +
 +      pseudoprojectile = world;
 +
- void W_BallisticBullet_Hit (void)
- {
-       float f, q, g;
-       f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier
-       q = 1 + self.dmg_edge / self.dmg;
-       if(other.solid == SOLID_BSP || other.solid == SOLID_SLIDEBOX)
-               Damage_DamageInfo(self.origin, self.dmg * f, 0, 0, max(1, self.dmg_force) * normalize(self.velocity) * f, self.projectiledeathtype, other.species, self);
-       if(other && other != self.enemy)
-       {
-               endzcurveparticles();
-               yoda = 0;
-               railgun_start = self.origin - 2 * frametime * self.velocity;
-               railgun_end = self.origin + 2 * frametime * self.velocity;
-               g = accuracy_isgooddamage(self.realowner, other);
-               Damage(other, self, self.realowner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
-               /*if(yoda && (time > (self.last_yoda + 5)))
-               {
-                       Send_Notification(NOTIF_ONE, self.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
-                       self.last_yoda = time;
-               }*/
-               // calculate hits for ballistic weapons
-               if(g)
-               {
-                       // do not exceed 100%
-                       q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total;
-                       self.dmg_total += f * self.dmg;
-                       accuracy_add(self.realowner, self.realowner.weapon, 0, q);
-               }
-       }
-       self.enemy = other; // don't hit the same player twice with the same bullet
- }
- void W_BallisticBullet_LeaveSolid_think()
- {
-       setorigin(self, self.W_BallisticBullet_LeaveSolid_origin);
-       self.velocity = self.W_BallisticBullet_LeaveSolid_velocity;
-       self.think = self.W_BallisticBullet_LeaveSolid_think_save;
-       self.nextthink = max(time, self.W_BallisticBullet_LeaveSolid_nextthink_save);
-       self.W_BallisticBullet_LeaveSolid_think_save = func_null;
-       self.flags &= ~FL_ONGROUND;
-       if(self.enemy.solid == SOLID_BSP)
-       {
-               float f;
-               f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier
-               Damage_DamageInfo(self.origin, 0, 0, 0, max(1, self.dmg_force) * normalize(self.velocity) * -f, self.projectiledeathtype, 0, self);
-       }
-       UpdateCSQCProjectile(self);
- }
- float W_BallisticBullet_LeaveSolid(float eff)
- {
-       // move the entity along its velocity until it's out of solid, then let it resume
-       vector vel = self.velocity;
-       float dt, dst, velfactor, v0, vs;
-       float maxdist;
-       float E0_m, Es_m;
-       float constant = self.dmg_radius * (other.ballistics_density ? other.ballistics_density : 1);
-       // outside the world? forget it
-       if(self.origin_x > world.maxs_x || self.origin_y > world.maxs_y || self.origin_z > world.maxs_z || self.origin_x < world.mins_x || self.origin_y < world.mins_y || self.origin_z < world.mins_z)
-               return 0;
-       // special case for zero density and zero bullet constant:
-       if(self.dmg_radius == 0)
-       {
-               if(other.ballistics_density < 0)
-                       constant = 0; // infinite travel distance
-               else
-                       return 0; // no penetration
-       }
-       else
-       {
-               if(other.ballistics_density < 0)
-                       constant = 0; // infinite travel distance
-               else if(other.ballistics_density == 0)
-                       constant = self.dmg_radius;
-               else
-                       constant = self.dmg_radius * other.ballistics_density;
-       }
-       // E(s) = E0 - constant * s, constant = area of bullet circle * material constant / mass
-       v0 = vlen(vel);
-       E0_m = 0.5 * v0 * v0;
-       if(constant)
-       {
-               maxdist = E0_m / constant;
-               // maxdist = 0.5 * v0 * v0 / constant
-               // dprint("max dist = ", ftos(maxdist), "\n");
-               if(maxdist <= autocvar_g_ballistics_mindistance)
-                       return 0;
-       }
-       else
-       {
-               maxdist = vlen(other.maxs - other.mins) + 1; // any distance, as long as we leave the entity
-       }
-       traceline_inverted (self.origin, self.origin + normalize(vel) * maxdist, MOVE_NORMAL, self, TRUE);
-       if(trace_fraction == 1) // 1: we never got out of solid
-               return 0;
-       self.W_BallisticBullet_LeaveSolid_origin = trace_endpos;
-       dst = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - self.origin));
-       // E(s) = E0 - constant * s, constant = area of bullet circle * material constant / mass
-       Es_m = E0_m - constant * dst;
-       if(Es_m <= 0)
-       {
-               // roundoff errors got us
-               return 0;
-       }
-       vs = sqrt(2 * Es_m);
-       velfactor = vs / v0;
-       dt = dst / (0.5 * (v0 + vs));
-       // this is not correct, but the differential equations have no analytic
-       // solution - and these times are very small anyway
-       //print("dt = ", ftos(dt), "\n");
-       self.W_BallisticBullet_LeaveSolid_think_save = self.think;
-       self.W_BallisticBullet_LeaveSolid_nextthink_save = self.nextthink;
-       self.think = W_BallisticBullet_LeaveSolid_think;
-       self.nextthink = time + dt;
-       vel = vel * velfactor;
-       self.velocity = '0 0 0';
-       self.flags |= FL_ONGROUND; // prevent moving
-       self.W_BallisticBullet_LeaveSolid_velocity = vel;
-       if(eff >= 0)
-               if(vlen(trace_endpos - self.origin) > 4)
-               {
-                       endzcurveparticles();
-                       trailparticles(self, eff, self.origin, trace_endpos);
-               }
-       return 1;
- }
- void W_BallisticBullet_Touch (void)
- {
-       //float density;
-       if(self.think == W_BallisticBullet_LeaveSolid_think) // skip this!
-               return;
-       PROJECTILE_TOUCH;
-       W_BallisticBullet_Hit ();
-       if(self.dmg_radius < 0) // these NEVER penetrate solid
-       {
-               remove(self);
-               return;
-       }
-       // if we hit "weapclip", bail out
-       //
-       // rationale of this check:
-       //
-       // any shader that is solid, nodraw AND trans is meant to clip weapon
-       // shots and players, but has no other effect!
-       //
-       // if it is not trans, it is caulk and should not have this side effect
-       //
-       // matching shaders:
-       //   common/weapclip (intended)
-       //   common/noimpact (is supposed to eat projectiles, but is erased farther above)
-       if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODRAW)
-       if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NONSOLID))
-       if (!(trace_dphitcontents & DPCONTENTS_OPAQUE))
-       {
-               remove(self);
-               return;
-       }
-       // go through solid!
-       if(!W_BallisticBullet_LeaveSolid(-1))
-       {
-               remove(self);
-               return;
-       }
-       self.projectiledeathtype |= HITTYPE_BOUNCE;
- }
- void endFireBallisticBullet() // WEAPONTODO
 +      dir = normalize(end - start);
 +      length = vlen(end - start);
 +      force = dir * bforce;
 +
 +      // go a little bit into the wall because we need to hit this wall later
 +      end = end + dir;
 +
 +      totaldmg = 0;
 +
 +      // trace multiple times until we hit a wall, each obstacle will be made
 +      // non-solid so we can hit the next, while doing this we spawn effects and
 +      // note down which entities were hit so we can damage them later
 +      o = self;
 +      while (1)
 +      {
 +              if(self.antilag_debug)
 +                      WarpZone_traceline_antilag (self, start, end, FALSE, o, self.antilag_debug);
 +              else
 +                      WarpZone_traceline_antilag (self, start, end, FALSE, o, ANTILAG_LATENCY(self));
 +              if(o && WarpZone_trace_firstzone)
 +              {
 +                      o = world;
 +                      continue;
 +              }
 +
 +              if(trace_ent.solid == SOLID_BSP || trace_ent.solid == SOLID_SLIDEBOX)
 +                      Damage_DamageInfo(trace_endpos, bdamage, 0, 0, force, deathtype, trace_ent.species, self);
 +
 +              // if it is world we can't hurt it so stop now
 +              if (trace_ent == world || trace_fraction == 1)
 +                      break;
 +
 +              // make the entity non-solid so we can hit the next one
 +              trace_ent.railgunhit = TRUE;
 +              trace_ent.railgunhitloc = end;
 +              trace_ent.railgunhitsolidbackup = trace_ent.solid;
 +              trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start);
 +              trace_ent.railgunforce = WarpZone_TransformVelocity(WarpZone_trace_transform, force);
 +
 +              // stop if this is a wall
 +              if (trace_ent.solid == SOLID_BSP)
 +                      break;
 +
 +              // make the entity non-solid
 +              trace_ent.solid = SOLID_NOT;
 +      }
 +
 +      endpoint = trace_endpos;
 +      endent = trace_ent;
 +      endq3surfaceflags = trace_dphitq3surfaceflags;
 +
 +      // find all the entities the railgun hit and restore their solid state
 +      ent = findfloat(world, railgunhit, TRUE);
 +      while (ent)
 +      {
 +              // restore their solid type
 +              ent.solid = ent.railgunhitsolidbackup;
 +              ent = findfloat(ent, railgunhit, TRUE);
 +      }
 +
 +      // spawn a temporary explosion entity for RadiusDamage calls
 +      //explosion = spawn();
 +
 +      // Find all non-hit players the beam passed close by
 +      if(deathtype == WEP_MINSTANEX || deathtype == WEP_NEX)
 +      {
 +              FOR_EACH_REALCLIENT(msg_entity)
 +              if(msg_entity != self)
 +              if(!msg_entity.railgunhit)
 +              if(!(IS_SPEC(msg_entity) && msg_entity.enemy == self)) // we use realclient, so spectators can hear the whoosh too
 +              {
 +                      // nearest point on the beam
 +                      beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
 +
 +                      f = bound(0, 1 - vlen(beampos - msg_entity.origin) / 512, 1);
 +                      if(f <= 0)
 +                              continue;
 +
 +                      snd = strcat("weapons/nexwhoosh", ftos(floor(random() * 3) + 1), ".wav");
 +
 +                      if(!pseudoprojectile)
 +                              pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
 +                      soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, snd, VOL_BASE * f, ATTEN_NONE);
 +              }
 +
 +              if(pseudoprojectile)
 +                      remove(pseudoprojectile);
 +      }
 +
 +      // find all the entities the railgun hit and hurt them
 +      ent = findfloat(world, railgunhit, TRUE);
 +      while (ent)
 +      {
 +              // get the details we need to call the damage function
 +              hitloc = ent.railgunhitloc;
 +
 +              f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance);
 +              ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance);
 +
 +              if(accuracy_isgooddamage(self.realowner, ent))
 +                      totaldmg += bdamage * f;
 +
 +              // apply the damage
 +              if (ent.takedamage)
 +                      Damage (ent, self, self, bdamage * f, deathtype, hitloc, ent.railgunforce * ffs);
 +
 +              // create a small explosion to throw gibs around (if applicable)
 +              //setorigin (explosion, hitloc);
 +              //RadiusDamage (explosion, self, 10, 0, 50, world, world, 300, deathtype);
 +
 +              ent.railgunhitloc = '0 0 0';
 +              ent.railgunhitsolidbackup = SOLID_NOT;
 +              ent.railgunhit = FALSE;
 +              ent.railgundistance = 0;
 +
 +              // advance to the next entity
 +              ent = findfloat(ent, railgunhit, TRUE);
 +      }
 +
 +      // calculate hits and fired shots for hitscan
 +      accuracy_add(self, self.weapon, 0, min(bdamage, totaldmg));
 +
 +      trace_endpos = endpoint;
 +      trace_ent = endent;
 +      trace_dphitq3surfaceflags = endq3surfaceflags;
 +}
 +
-       endzcurveparticles();
- }
- void fireBallisticBullet_trace_callback(vector start, vector hit, vector end)
- {
-       if(vlen(trace_endpos - fireBallisticBullet_trace_callback_ent.origin) > 16)
-               zcurveparticles_from_tracetoss(fireBallisticBullet_trace_callback_eff, fireBallisticBullet_trace_callback_ent.origin, trace_endpos, fireBallisticBullet_trace_callback_ent.velocity);
++void fireBullet_trace_callback(vector start, vector hit, vector end)
 +{
-       self.owner = world;
++      if(vlen(hit - start) > 16)
++              trailparticles(world, fireBullet_trace_callback_eff, start, hit);
 +      WarpZone_trace_forent = world;
- void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float force, float dtype, float tracereffects, float bulletconstant)
++      fireBullet_last_hit = world;
 +}
 +
-       float lag, dt, savetime; //, density;
-       entity pl, oldself;
-       entity proj;
-       proj = spawn();
-       proj.classname = "bullet";
-       proj.owner = proj.realowner = self;
-       PROJECTILE_MAKETRIGGER(proj);
-       proj.movetype = MOVETYPE_FLY;
-       proj.think = SUB_Remove;
-       proj.nextthink = time + lifetime; // min(pLifetime, vlen(world.maxs - world.mins) / pSpeed);
-       W_SetupProjectileVelocityEx(proj, dir, v_up, pSpeed, 0, 0, spread, TRUE);
-       proj.angles = vectoangles(proj.velocity);
-       if(bulletconstant > 0)
-               proj.dmg_radius = autocvar_g_ballistics_materialconstant / bulletconstant;
-       else if(bulletconstant == 0)
-               proj.dmg_radius = 0;
-       else
-               proj.dmg_radius = -1;
-       // so: bulletconstant = bullet mass / area of bullet circle
-       setorigin(proj, start);
-       proj.flags = FL_PROJECTILE;
-       proj.touch = W_BallisticBullet_Touch;
-       proj.dmg = damage;
-       proj.dmg_force = force;
-       proj.projectiledeathtype = dtype;
-       proj.oldvelocity = proj.velocity;
++void fireBullet(vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, float tracereffects)
 +{
-       other = proj; MUTATOR_CALLHOOK(EditProjectile);
++      vector  end;
 +
-       float eff;
++      dir = normalize(dir + randomvec() * spread);
++      end = start + dir * MAX_SHOT_DISTANCE;
 +
-               eff = particleeffectnum("tr_rifle");
++      entity pl;
++      fireBullet_last_hit = world;
++      float solid_penetration_left = 1;
++      float total_damage = 0;
 +
 +      if(tracereffects & EF_RED)
-               eff = particleeffectnum("tr_rifle_weak");
++              fireBullet_trace_callback_eff = particleeffectnum("tr_rifle");
 +      else if(tracereffects & EF_BLUE)
-               eff = particleeffectnum("tr_bullet");
++              fireBullet_trace_callback_eff = particleeffectnum("tr_rifle_weak");
 +      else
-       // NOTE: this may severely throw off weapon balance
-       lag = ANTILAG_LATENCY(self);
++              fireBullet_trace_callback_eff = particleeffectnum("tr_bullet");
 +
++      float lag = ANTILAG_LATENCY(self);
 +      if(lag < 0.001)
 +              lag = 0;
 +      if (!IS_REAL_CLIENT(self))
 +              lag = 0;
 +      if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
 +              lag = 0; // only do hitscan, but no antilag
-       oldself = self;
-       self = proj;
 +      if(lag)
 +              FOR_EACH_PLAYER(pl)
 +                      if(pl != self)
 +                              antilag_takeback(pl, time - lag);
 +
-       savetime = frametime;
-       frametime = 0.05;
-       for(;;)
++      WarpZone_trace_forent = self;
 +
-               // DP tracetoss is stupid and always traces in 0.05s
-               // ticks. This makes it trace in 0.05*0.125s ticks
-               // instead.
-               vector v0;
-               v0 = self.velocity;
-               self.velocity = self.velocity * 0.125;
-               trace_fraction = 0;
-               fireBallisticBullet_trace_callback_ent = self;
-               fireBallisticBullet_trace_callback_eff = eff;
-               WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback);
-               self.velocity = v0;
-               if(trace_fraction == 1)
++      for (;;)
 +      {
-                       // won't hit anything anytime soon (DP's
-                       // tracetoss does 200 tics of, here,
-                       // 0.05*0.125s, that is, 1.25 seconds
-               other = trace_ent;
-               dt = WarpZone_tracetoss_time * 0.125; // this is only approximate!
-               setorigin(self, trace_endpos);
-               self.velocity = WarpZone_tracetoss_velocity * (1 / 0.125);
-               if(!SUB_OwnerCheck())
-               {
-                       if(SUB_NoImpactCheck())
-                               break;
++              // TODO also show effect while tracing
++              WarpZone_TraceBox_ThroughZone(start, '0 0 0', '0 0 0', end, FALSE, WarpZone_trace_forent, world, fireBullet_trace_callback);
++              dir = WarpZone_TransformVelocity(WarpZone_trace_transform, dir);
++              end = WarpZone_TransformOrigin(WarpZone_trace_transform, end);
++              start = trace_endpos;
++              entity hit = trace_ent;
++
++              // When hitting sky, stop.
++              if (pointcontents(start) == CONTENT_SKY)
 +                      break;
-                       // hit the player
-                       W_BallisticBullet_Hit();
-               }
-               if(proj.dmg_radius < 0) // these NEVER penetrate solid
 +
-               //   common/noimpact (is supposed to eat projectiles, but is erased farther above)
++              if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 +                      break;
 +
 +              // if we hit "weapclip", bail out
 +              //
 +              // rationale of this check:
 +              //
 +              // any shader that is solid, nodraw AND trans is meant to clip weapon
 +              // shots and players, but has no other effect!
 +              //
 +              // if it is not trans, it is caulk and should not have this side effect
 +              //
 +              // matching shaders:
 +              //   common/weapclip (intended)
-                       break;
++              //   common/noimpact (is supposed to eat projectiles, but is erased anyway)
++              float is_weapclip = 0;
 +              if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODRAW)
 +              if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NONSOLID))
 +              if (!(trace_dphitcontents & DPCONTENTS_OPAQUE))
-               // go through solid!
-               if(!W_BallisticBullet_LeaveSolid((other && (other.solid != SOLID_BSP)) ? eff : -1))
-                       break;
++                      is_weapclip = 1;
 +
-               W_BallisticBullet_LeaveSolid_think();
++              if(!hit || hit.solid == SOLID_BSP || hit.solid == SOLID_SLIDEBOX)
++                      Damage_DamageInfo(start, damage * solid_penetration_left, 0, 0, max(1, force) * dir * solid_penetration_left, dtype, hit.species, self);
 +
-               self.projectiledeathtype |= HITTYPE_BOUNCE;
-       }
-       frametime = savetime;
-       self = oldself;
++              if (hit && hit != WarpZone_trace_forent && hit != fireBullet_last_hit)  // Avoid self-damage (except after going through a warp); avoid hitting the same entity twice (engine bug).
++              {
++                      fireBullet_last_hit = hit;
++                      yoda = 0;
++                      float g = accuracy_isgooddamage(self, hit);
++                      Damage(hit, self, self, damage * solid_penetration_left, dtype, start, force * dir * solid_penetration_left);
++                      // calculate hits for ballistic weapons
++                      if(g)
++                      {
++                              // do not exceed 100%
++                              float added_damage = min(damage - total_damage, damage * solid_penetration_left);
++                              total_damage += damage * solid_penetration_left;
++                              accuracy_add(self, self.weapon, 0, added_damage);
++                      }
++              }
 +
-       if(lag)
-               FOR_EACH_PLAYER(pl)
-                       if(pl != self)
-                               antilag_restore(pl);
++              if (is_weapclip)
++                      break;
 +
-       remove(proj);
++              // go through solid!
++              // outside the world? forget it
++              if(start_x > world.maxs_x || start_y > world.maxs_y || start_z > world.maxs_z || start_x < world.mins_x || start_y < world.mins_y || start_z < world.mins_z)
++                      break;
 +
-       return;
- }
++              float maxdist;
++              if(max_solid_penetration < 0)
++                      break;
++              else if(hit.ballistics_density < -1)
++                      break; // -2: no solid penetration, ever
++              else if(hit.ballistics_density < 0)
++                      maxdist = vlen(hit.maxs - hit.mins) + 1; // -1: infinite travel distance
++              else if(hit.ballistics_density == 0)
++                      maxdist = max_solid_penetration * solid_penetration_left;
++              else
++                      maxdist = max_solid_penetration * solid_penetration_left * hit.ballistics_density;
 +
- void fireBullet (vector start, vector dir, float spread, float damage, float force, float dtype, float tracer)
- {
-       vector  end;
++              if(maxdist <= autocvar_g_ballistics_mindistance)
++                      break;
 +
-       dir = normalize(dir + randomvec() * spread);
-       end = start + dir * MAX_SHOT_DISTANCE;
-       if(self.antilag_debug)
-               traceline_antilag (self, start, end, FALSE, self, self.antilag_debug);
-       else
-               traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self));
++              // move the entity along its velocity until it's out of solid, then let it resume
++              // The previously hit entity is ignored here!
++              traceline_inverted (start, start + dir * maxdist, MOVE_NORMAL, WarpZone_trace_forent, TRUE, hit);
++              if(trace_fraction == 1) // 1: we never got out of solid
++                      break;
 +
-       end = trace_endpos;
++              float dist_taken = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - start));
++              solid_penetration_left *= (dist_taken / maxdist);
 +
-       if (pointcontents (trace_endpos) != CONTENT_SKY)
-       {
-               if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
-                       Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, trace_ent.species, self);
++              // Only show effect when going through a player (invisible otherwise)
++              if (hit && (hit.solid != SOLID_BSP))
++                      if(vlen(trace_endpos - start) > 4)
++                              trailparticles(self, fireBullet_trace_callback_eff, start, trace_endpos);
 +
-               Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force);
++              start = trace_endpos;
 +
-       trace_endpos = end;
++              if(hit.solid == SOLID_BSP)
++                      Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -solid_penetration_left, dtype, 0, self);
 +      }
++
++      if(lag)
++              FOR_EACH_PLAYER(pl)
++                      if(pl != self)
++                              antilag_restore(pl);
 +}
index 26fe295a8d1fe92a2f423c463f1488a3cc566184,0000000000000000000000000000000000000000..6565ece04ca1e4d01b4bf73bac269d2c9a0af685
mode 100644,000000..100644
--- /dev/null
@@@ -1,73 -1,0 +1,48 @@@
- .float dmg_force;
- .float dmg_radius;
- .float dmg_total;
- //.float last_yoda;
- void W_BallisticBullet_Hit (void);
- .void(void) W_BallisticBullet_LeaveSolid_think_save;
- .float W_BallisticBullet_LeaveSolid_nextthink_save;
- .vector W_BallisticBullet_LeaveSolid_origin;
- .vector W_BallisticBullet_LeaveSolid_velocity;
- void W_BallisticBullet_LeaveSolid_think();
- float W_BallisticBullet_LeaveSolid(float eff);
- void W_BallisticBullet_Touch (void);
- void endFireBallisticBullet(); /* WEAPONTODO
- {
-       endzcurveparticles();
- }*/
- entity fireBallisticBullet_trace_callback_ent;
- float fireBallisticBullet_trace_callback_eff;
- void fireBallisticBullet_trace_callback(vector start, vector hit, vector end);
- void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float force, float dtype, float tracereffects, float bulletconstant);
- void fireBullet (vector start, vector dir, float spread, float damage, float force, float dtype, float tracer);
 +.float antilag_debug;
 +
 +vector w_shotorg;
 +vector w_shotdir;
 +vector w_shotend;
 +
 +// this function calculates w_shotorg and w_shotdir based on the weapon model
 +// offset, trueaim and antilag, and won't put w_shotorg inside a wall.
 +// make sure you call makevectors first (FIXME?)
 +void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float chan, float maxdamage, float range);
 +
 +#define W_SetupShot_Dir_ProjectileSize(ent,s_forward,mi,ma,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize_Range(ent, s_forward, mi, ma, antilag, recoil, snd, chan, maxdamage, MAX_SHOT_DISTANCE)
 +#define W_SetupShot_ProjectileSize(ent,mi,ma,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, v_forward, mi, ma, antilag, recoil, snd, chan, maxdamage)
 +#define W_SetupShot_Dir(ent,s_forward,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, s_forward, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage)
 +#define W_SetupShot(ent,antilag,recoil,snd,chan,maxdamage) W_SetupShot_ProjectileSize(ent, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage)
 +#define W_SetupShot_Range(ent,antilag,recoil,snd,chan,maxdamage,range) W_SetupShot_Dir_ProjectileSize_Range(ent, v_forward, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage, range)
 +
 +vector W_CalculateProjectileVelocity(vector pvelocity, vector mvelocity, float forceAbsolute);
 +
 +#if 0
 +float mspercallsum;
 +float mspercallsstyle;
 +float mspercallcount;
 +#endif
 +void W_SetupProjectileVelocityEx(entity missile, vector dir, vector upDir, float pSpeed, float pUpSpeed, float pZSpeed, float spread, float forceAbsolute);
 +
 +#define WEP_SETUPPROJVELOCITY_UP_NONE(ent,wepname,prefix) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR(wepname, prefix##speed), WEP_CVAR(wepname, prefix##speed_up), WEP_CVAR(wepname, prefix##speed_z), WEP_CVAR(wepname, prefix##spread), FALSE)
 +#define WEP_SETUPPROJVELOCITY_UP_PRI(ent,wepname) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR_PRI(wepname, speed), WEP_CVAR_PRI(wepname, speed_up), WEP_CVAR_PRI(wepname, speed_z), WEP_CVAR_PRI(wepname, spread), FALSE)
 +#define WEP_SETUPPROJVELOCITY_UP_SEC(ent,wepname) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR_SEC(wepname, speed), WEP_CVAR_SEC(wepname, speed_up), WEP_CVAR_SEC(wepname, speed_z), WEP_CVAR_SEC(wepname, spread), FALSE)
 +#define WEP_SETUPPROJVELOCITY_UP_BOTH(ent,wepname,isprimary) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR_BOTH(wepname, isprimary, speed), WEP_CVAR_BOTH(wepname, isprimary, speed_up), WEP_CVAR_BOTH(wepname, isprimary, speed_z), WEP_CVAR_BOTH(wepname, isprimary, spread), FALSE)
 +
 +#define WEP_SETUPPROJVELOCITY_NONE(ent,wepname,prefix) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR(wepname, prefix##speed), 0, 0, WEP_CVAR(wepname, prefix##spread), FALSE)
 +#define WEP_SETUPPROJVELOCITY_PRI(ent,wepname) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR_PRI(wepname, speed), 0, 0, WEP_CVAR_PRI(wepname, spread), FALSE)
 +#define WEP_SETUPPROJVELOCITY_SEC(ent,wepname) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR_SEC(wepname, speed), 0, 0, WEP_CVAR_SEC(wepname, spread), FALSE)
 +#define WEP_SETUPPROJVELOCITY_BOTH(ent,wepname,isprimary) W_SetupProjectileVelocityEx(ent, w_shotdir, v_up, WEP_CVAR_BOTH(wepname, isprimary, speed), 0, 0, WEP_CVAR_BOTH(wepname, isprimary, spread), FALSE)
 +
 +// ====================
 +//  Ballistics Tracing
 +// ====================
 +
 +.float railgundistance;
 +.vector railgunforce;
 +void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, float deathtype);
 +
++float fireBullet_trace_callback_eff;
++entity fireBullet_last_hit;
++void fireBullet_trace_callback(vector start, vector hit, vector end);
++void fireBullet(vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, float tracereffects);