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

index e395278,0000000..277809b
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
 +// }}}
Simple merge
index 633bd96,0000000..e32b459
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
 +// }}}
index a10d8b5,0000000..844bdd5
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
 +// }}}
index f408bf8,0000000..3e8f0d2
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
 +// }}}
index 9c90e04,0000000..65e3a79
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
 +// }}}
Simple merge
Simple merge
@@@ -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;
index d1dacd5,0000000..4ac5fe3
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 3f8ee02,0000000..e8d7ee3
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 a142aa4,0000000..c00d678
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
@@@ -178,9 -618,63 +178,8 @@@ float autocvar_g_balance_selfdamageperc
  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;
Simple merge
Simple merge
Simple merge
index b709889,0000000..961335d
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 26fe295,0000000..6565ece
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);