set g_balance_laser_primary_lifetime 30
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0.03
-set g_balance_laser_gauntlet 0
+set g_balance_laser_primary_gauntlet 0
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 35
set g_balance_laser_secondary_edgedamage 10
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_gauntlet 0
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 6
set g_balance_shotgun_primary_speed 12000
set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee 0 // ew, bad! Still uses the melee anim!
+set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
+set g_balance_shotgun_secondary_melee_range 60
+set g_balance_shotgun_secondary_melee_swing 50
+set g_balance_shotgun_secondary_melee_time 0.4
set g_balance_shotgun_secondary_bullets 6
set g_balance_shotgun_secondary_damage 9
set g_balance_shotgun_secondary_force 60
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
set g_balance_campingrifle_primary_bullethail 0
+set g_balance_campingrifle_secondary 1
set g_balance_campingrifle_secondary_damage 15
set g_balance_campingrifle_secondary_headshotaddeddamage 25
set g_balance_campingrifle_secondary_spread 0.02
set g_balance_laser_primary_lifetime 30
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0
-set g_balance_laser_gauntlet 0
+set g_balance_laser_primary_gauntlet 0
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 35
set g_balance_laser_secondary_edgedamage 10
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_gauntlet 0
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 6
set g_balance_shotgun_primary_speed 12000
set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee 0 // ew, bad! Still uses the melee anim!
+set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
+set g_balance_shotgun_secondary_melee_range 60
+set g_balance_shotgun_secondary_melee_swing 50
+set g_balance_shotgun_secondary_melee_time 0.4
set g_balance_shotgun_secondary_bullets 6
set g_balance_shotgun_secondary_damage 9
set g_balance_shotgun_secondary_force 60
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0
set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_campingrifle_secondary 1
set g_balance_campingrifle_secondary_damage 35
set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
set g_balance_campingrifle_secondary_spread 0.008
set g_lms_start_health 250
set g_lms_start_armor 100
set g_lms_start_ammo_shells 30
-set g_lms_start_ammo_nails 300
+set g_lms_start_ammo_nails 250
set g_lms_start_ammo_rockets 100
set g_lms_start_ammo_cells 200
set g_lms_start_ammo_fuel 0
set g_pickup_shells_max 30
set g_pickup_nails 120
set g_pickup_nails_max 300
-set g_pickup_rockets 15
+set g_pickup_rockets 25
set g_pickup_rockets_max 150
set g_pickup_cells 25
set g_pickup_cells_max 200
// {{{ weapon properties
// {{{ laser
-set g_balance_laser_primary_damage 20
-set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 200
+set g_balance_laser_primary_damage 30 // dps 50, hope that's not too high
+set g_balance_laser_primary_edgedamage 30
+set g_balance_laser_primary_force 235
set g_balance_laser_primary_radius 70
-set g_balance_laser_primary_speed 9000
+set g_balance_laser_primary_speed 4500
set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.8
-set g_balance_laser_primary_animtime 0.4
-set g_balance_laser_primary_lifetime 30
+set g_balance_laser_primary_refire 0.6
+set g_balance_laser_primary_animtime 0.6
+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_gauntlet 0
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-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_primary_gauntlet 0
+set g_balance_laser_secondary 1 // when 1, a secondary laser mode exists
+set g_balance_laser_secondary_damage 110 // dps
+set g_balance_laser_secondary_edgedamage 0
+set g_balance_laser_secondary_force 500
+set g_balance_laser_secondary_radius 45
+set g_balance_laser_secondary_speed 0
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_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_gauntlet 1
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 16
set g_balance_shotgun_primary_ammo 1
set g_balance_shotgun_primary_speed 12000
set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
-set g_balance_shotgun_secondary 0
+set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee 1
+set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
+set g_balance_shotgun_secondary_melee_range 60
+set g_balance_shotgun_secondary_melee_swing 50
+set g_balance_shotgun_secondary_melee_time 0.1
set g_balance_shotgun_secondary_bullets 6 // one more per shot than 15/3 (primary bullets/amount of shots = 3)
-set g_balance_shotgun_secondary_damage 7
-set g_balance_shotgun_secondary_force 20
-set g_balance_shotgun_secondary_spread 0.20
-set g_balance_shotgun_secondary_refire 1.35
-set g_balance_shotgun_secondary_animtime 0.33
-set g_balance_shotgun_secondary_ammo 1
+set g_balance_shotgun_secondary_damage 115
+set g_balance_shotgun_secondary_force 150
+set g_balance_shotgun_secondary_spread 0
+set g_balance_shotgun_secondary_refire 1.1
+set g_balance_shotgun_secondary_animtime 1
+set g_balance_shotgun_secondary_ammo 0
set g_balance_shotgun_secondary_speed 12000
set g_balance_shotgun_secondary_bulletconstant 75 // 3.8qu
// }}}
set g_balance_grenadelauncher_primary_edgedamage 30
set g_balance_grenadelauncher_primary_force 300
set g_balance_grenadelauncher_primary_radius 200
-set g_balance_grenadelauncher_primary_speed 1000
+set g_balance_grenadelauncher_primary_speed 800
set g_balance_grenadelauncher_primary_speed_up 0
-set g_balance_grenadelauncher_primary_speed_z 200
+set g_balance_grenadelauncher_primary_speed_z 350
set g_balance_grenadelauncher_primary_spread 0
set g_balance_grenadelauncher_primary_lifetime 5
set g_balance_grenadelauncher_primary_lifetime2 0.8
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 600
+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_speed_z 350
set g_balance_grenadelauncher_secondary_spread 0
-set g_balance_grenadelauncher_secondary_lifetime 1.5
+set g_balance_grenadelauncher_secondary_lifetime 2
set g_balance_grenadelauncher_secondary_refire 0.8
set g_balance_grenadelauncher_secondary_animtime 0.2
set g_balance_grenadelauncher_secondary_ammo 2
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 800
+set g_balance_electro_primary_force 600
set g_balance_electro_primary_force_up 125
set g_balance_electro_primary_radius 850
-set g_balance_electro_primary_comboradius 45
+set g_balance_electro_primary_comboradius 75
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_animtime 0.03333333
set g_balance_electro_primary_ammo 6
set g_balance_electro_primary_range 800
-set g_balance_electro_secondary_damage 50
+set g_balance_electro_secondary_damage 40
set g_balance_electro_secondary_spread 0
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 800
+set g_balance_electro_secondary_speed 500
set g_balance_electro_secondary_speed_up 0
-set g_balance_electro_secondary_speed_z 200
+set g_balance_electro_secondary_speed_z 300
set g_balance_electro_secondary_spread 0.08
-set g_balance_electro_secondary_lifetime 3
-set g_balance_electro_secondary_refire 0.6
+set g_balance_electro_secondary_lifetime 3.5
+set g_balance_electro_secondary_refire 0.5
set g_balance_electro_secondary_refire2 0
-set g_balance_electro_secondary_animtime 0.6
+set g_balance_electro_secondary_animtime 0.5
set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 5
+set g_balance_electro_secondary_health 10
set g_balance_electro_secondary_damageforcescale 4
-set g_balance_electro_secondary_count 3
-set g_balance_electro_combo_damage 50
+set g_balance_electro_secondary_count 1
+set g_balance_electro_combo_damage 40
set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 150
+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 2000
+set g_balance_electro_combo_speed 400
// }}}
// {{{ crylink
set g_balance_crylink_primary_damage 12
set g_balance_hagar_primary_radius 70
set g_balance_hagar_primary_spread 0.1
set g_balance_hagar_primary_speed 1800
-set g_balance_hagar_primary_lifetime 30
+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_radius 50
set g_balance_hagar_secondary_spread 0.15
set g_balance_hagar_secondary_speed 1800
-set g_balance_hagar_secondary_lifetime_min 30
+set g_balance_hagar_secondary_lifetime_min 5
set g_balance_hagar_secondary_lifetime_rand 0
set g_balance_hagar_secondary_refire 0.12
set g_balance_hagar_secondary_ammo 1
set g_balance_rocketlauncher_speed 1000
set g_balance_rocketlauncher_speedaccel 0
set g_balance_rocketlauncher_speedstart 1000
-set g_balance_rocketlauncher_lifetime 30
+set g_balance_rocketlauncher_lifetime 5
set g_balance_rocketlauncher_refire 1
set g_balance_rocketlauncher_animtime 0.2
set g_balance_rocketlauncher_ammo 3
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_primary_lifetime 5
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
// }}}
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_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_hlac_secondary_shots 6
// }}}
// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 8
+set g_balance_campingrifle_magazinecapacity 0
set g_balance_campingrifle_reloadtime 2 // matches reload anim
set g_balance_campingrifle_auto_reload_after_changing_weapons 0
set g_balance_campingrifle_bursttime 0
set g_balance_campingrifle_tracer 1
-set g_balance_campingrifle_primary_damage 60
-set g_balance_campingrifle_primary_headshotaddeddamage 100
+set g_balance_campingrifle_primary_damage 50
+set g_balance_campingrifle_primary_headshotaddeddamage 35
set g_balance_campingrifle_primary_spread 0
set g_balance_campingrifle_primary_force 2
set g_balance_campingrifle_primary_speed 35000
set g_balance_campingrifle_primary_lifetime 5
set g_balance_campingrifle_primary_refire 0.8
-set g_balance_campingrifle_primary_animtime 0.3
+set g_balance_campingrifle_primary_animtime 0.8
set g_balance_campingrifle_primary_ammo 10
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0
set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_campingrifle_secondary_damage 35
-set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
+set g_balance_campingrifle_secondary 0
+set g_balance_campingrifle_secondary_damage 15
+set g_balance_campingrifle_secondary_headshotaddeddamage 25 // 50 damage only on head
set g_balance_campingrifle_secondary_spread 0.008
set g_balance_campingrifle_secondary_force 1
set g_balance_campingrifle_secondary_speed 20000
set g_balance_laser_primary_lifetime 30
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0.03
-set g_balance_laser_gauntlet 0
+set g_balance_laser_primary_gauntlet 0
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 25
set g_balance_laser_secondary_edgedamage 10
set g_balance_laser_secondary_lifetime 30
set g_balance_laser_secondary_shotangle -90
set g_balance_laser_secondary_delay 0
+set g_balance_laser_secondary_gauntlet 0
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 6
set g_balance_shotgun_primary_speed 8000
set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee 0 // ew, bad! Still uses the melee anim!
+set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
+set g_balance_shotgun_secondary_melee_range 60
+set g_balance_shotgun_secondary_melee_swing 50
+set g_balance_shotgun_secondary_melee_time 0.4
set g_balance_shotgun_secondary_bullets 6
set g_balance_shotgun_secondary_damage 8
set g_balance_shotgun_secondary_force 15
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
set g_balance_campingrifle_primary_bullethail 0
+set g_balance_campingrifle_secondary 1
set g_balance_campingrifle_secondary_damage 15
set g_balance_campingrifle_secondary_headshotaddeddamage 25
set g_balance_campingrifle_secondary_spread 0.02
set g_balance_laser_primary_lifetime 0
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0
-set g_balance_laser_gauntlet 1
+set g_balance_laser_primary_gauntlet 1
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 35
set g_balance_laser_secondary_edgedamage 10
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_gauntlet 0
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 16
set g_balance_shotgun_primary_speed 12000
set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
set g_balance_shotgun_secondary 0
+set g_balance_shotgun_secondary_melee 0 // ew, bad! Still uses the melee anim!
+set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
+set g_balance_shotgun_secondary_melee_range 60
+set g_balance_shotgun_secondary_melee_swing 50
+set g_balance_shotgun_secondary_melee_time 0.4
set g_balance_shotgun_secondary_bullets 6 // one more per shot than 15/3 (primary bullets/amount of shots = 3)
set g_balance_shotgun_secondary_damage 7
set g_balance_shotgun_secondary_force 20
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0
set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_campingrifle_secondary 1
set g_balance_campingrifle_secondary_damage 35
set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
set g_balance_campingrifle_secondary_spread 0.008
1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
+9 23 20 0 // fire2
+32 200 20 1 // idle
+232 40 20 0 // reload
+// compile opts used in the iqm exporter (apparently needed to prevent insane ram usage):
+// fire:1:8, fire2:1:23, idle:1:200, reload:1:40
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 30
sv_airstrafeaccel_qw 0
sv_aircontrol 150
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
--- /dev/null
+// 2.0-2.4.2 physics minus QW-bunnyhopping-bug, faster onground accel, CPMA air control
+sv_gravity 800
+sv_maxspeed 320
+
+sv_maxairspeed 320
+
+sv_stopspeed 100
+sv_accelerate 15
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
+sv_stepheight 34
+
+sv_jumpvelocity 300
+sv_wateraccelerate 4
+sv_waterfriction 1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw -0.937
+
+sv_airstopaccelerate 3
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.979
+sv_aircontrol 125
+sv_aircontrol_penalty 100
+sv_aircontrol_power 2.5
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 1
sv_maxairstrafespeed 100
sv_airstrafeaccel_qw -0.9825
sv_aircontrol 125
+sv_aircontrol_penalty 0
sv_aircontrol_power 2.5
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 125
+sv_aircontrol_penalty 0
sv_aircontrol_power 2.5
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 0
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 30
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 9 // activates warsow movement mode
sv_maxairstrafespeed 30
sv_airstrafeaccel_qw 0
sv_aircontrol 150
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_maxairstrafespeed 30
sv_airstrafeaccel_qw 0
sv_aircontrol 0
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 6 // activates warsow movement mode
sv_maxairstrafespeed 30
sv_airstrafeaccel_qw 1
sv_aircontrol 150
+sv_aircontrol_penalty 0
sv_aircontrol_power 2
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_friction_on_land 0
sv_doublejump 1
sv_jumpspeedcap_min 0
-sv_jumpspeedcap_max 1
+sv_jumpspeedcap_max 0.5
sv_jumpspeedcap_max_disable_on_ramps 1
--- /dev/null
+// Nexrun tweaked to suit CPM
+sv_gravity 800
+sv_maxspeed 320
+// CPMA: 320
+sv_maxairspeed 320
+// CPMA: 320
+sv_stopspeed 100
+sv_accelerate 15
+sv_airaccelerate 1
+sv_friction 8
+edgefriction 1
+sv_stepheight 34
+// CPMA: 18
+sv_jumpvelocity 270
+sv_wateraccelerate 4
+sv_waterfriction 1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw -0.9146875
+// CPMA: 1
+sv_airstopaccelerate 6.5625 // matches strafe-stopping speed
+sv_airstrafeaccelerate 14
+sv_maxairstrafespeed 150
+sv_airstrafeaccel_qw -0.987
+sv_aircontrol 100
+sv_aircontrol_penalty 100
+sv_aircontrol_power 2.5
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 1
float ClientProgsDB;
vector hook_shotorigin[4];
vector electro_shotorigin[4];
+vector gauntlet_shotorigin[4];
#ifdef BLURTEST
float blurtest_time0, blurtest_time1, blurtest_radius, blurtest_power;
string w_deathtypestring;
vector w_org, w_backoff;
+float campingrifle_scope;
electro_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
electro_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
electro_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
+ gauntlet_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
+ gauntlet_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
+ gauntlet_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
+ gauntlet_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
if(forcefog)
strunzone(forcefog);
complain_weapon_time = time;
}
+void Net_CampingrifleScope() {
+ campingrifle_scope = TRUE;
+}
+
// CSQC_Parse_TempEntity : Handles all temporary entity network data in the CSQC layer.
// You must ALWAYS first acquire the temporary ID, which is sent as a byte.
// Return value should be 1 if CSQC handled the temporary entity, otherwise return 0 to have the engine process the event.
Net_WeaponComplain();
bHandled = true;
break;
+ case TE_CSQC_CAMPINGRIFLE_SCOPE:
+ Net_CampingrifleScope();
+ bHandled = true;
+ break;
default:
// No special logic for this temporary entity; return 0 so the engine can handle it
bHandled = false;
zoomspeed = 3.5;
zoomdir = button_zoom;
- if(getstati(STAT_ACTIVEWEAPON) == WEP_NEX) // do NOT use switchweapon here
+ if(getstati(STAT_ACTIVEWEAPON) == WEP_NEX || getstati(STAT_ACTIVEWEAPON) == WEP_CAMPINGRIFLE && campingrifle_scope) // do NOT use switchweapon here
zoomdir += button_attack2;
if(spectatee_status > 0 || isdemo())
{
reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
else if(button_zoom)
reticle_type = 1; // normal zoom
- else if(activeweapon == WEP_NEX && button_attack2)
+ else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_CAMPINGRIFLE && button_attack2)
reticle_type = 2; // nex zoom
if(cvar("cl_reticle_stretch"))
.float LGBeamKillTime;
.float LGBeamSound;
.float LGBeamSilent;
+.vector GauntletBeamStart;
+.vector GauntletBeamEnd;
+.float GauntletBeamKillTime;
+.float GauntletBeamSound;
+.float GauntletBeamSilent;
+
void Draw_CylindricLine(vector from, vector to, float thickness, string texture, float aspect, float shift, vector rgb, float alpha, float drawflag)
{
setorigin(self, a);
}
+ if(time < self.GauntletBeamKillTime)
+ {
+ s = cvar("cl_gunalign");
+ if(s != 1 && s != 2 && s != 4)
+ s = 3; // default value
+ --s;
+ vs = gauntlet_shotorigin[s];
+
+ if(self.sv_entnum == player_localentnum - 1)
+ {
+ b = view_origin + view_forward * MAX_SHOT_DISTANCE;
+ WarpZone_TraceLine(view_origin, b, MOVE_NORMAL, world);
+ a = view_origin + view_forward * vs_x + view_right * -vs_y + view_up * vs_z;
+ }
+ else
+ {
+ a = self.GauntletBeamStart;
+ b = self.GauntletBeamEnd;
+ }
+
+ tex = "particles/gauntletbeam";
+ rgb = '1 1 1';
+
+ Draw_GrapplingHook_trace_callback_tex = tex;
+ Draw_GrapplingHook_trace_callback_rnd = random();
+ WarpZone_TraceBox_ThroughZone(a, '0 0 0', '0 0 0', b, MOVE_NORMAL, world, world, Draw_GrapplingHook_trace_callback);
+ Draw_GrapplingHook_trace_callback_tex = string_null;
+
+ // helps the sound
+ setorigin(self, a);
+ }
+
if(time < self.LGBeamKillTime && !self.LGBeamSilent)
{
if(!self.LGBeamSound)
self.LGBeamSound = 0;
}
}
+
+ if(time < self.GauntletBeamKillTime && !self.GauntletBeamSilent)
+ {
+ if(!self.GauntletBeamSound)
+ {
+ sound (self, CHAN_PROJECTILE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
+ self.GauntletBeamSound = 1;
+ }
+ }
+ else
+ {
+ if(self.GauntletBeamSound)
+ {
+ sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+ self.GauntletBeamSound = 0;
+ }
+ }
}
void Net_GrapplingHook()
p.LGBeamSilent = 1;
p.draw = Draw_GrapplingHook;
break;
+ case 3: // gauntlet beam
+ p.GauntletBeamKillTime = time + 0.1;
+ p.GauntletBeamStart = start;
+ p.GauntletBeamEnd = end;
+ p.GauntletBeamSilent = 0;
+ p.draw = Draw_GrapplingHook;
+ break;
}
}
void Hook_Precache()
{
precache_sound("weapons/lgbeam_fly.wav");
+ precache_sound("weapons/gauntletbeam_fly.wav");
}
const float TE_CSQC_NOTIFY = 112;
const float TE_CSQC_WEAPONCOMPLAIN = 113;
const float TE_CSQC_BEAM = 114;
+const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115;
const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
const float RACE_NET_CHECKPOINT_CLEAR = 1;
WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[1]));
WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[2]));
WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[3]));
+ WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[0]));
+ WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[1]));
+ WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[2]));
+ WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[3]));
if(sv_foginterval && world.fog != "")
WriteString(MSG_ENTITY, world.fog);
else
}
if(!zoomstate_set)
- SetZoomState(self.BUTTON_ZOOM || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX));
+ SetZoomState(self.BUTTON_ZOOM || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_CAMPINGRIFLE && cvar("g_balance_campingrifle_secondary") == 0));
float oldspectatee_status;
oldspectatee_status = self.spectatee_status;
float sv_airstrafeaccel_qw;
float sv_aircontrol;
float sv_aircontrol_power;
+float sv_aircontrol_penalty;
float sv_warsowbunny_airforwardaccel;
float sv_warsowbunny_accel;
float sv_warsowbunny_topspeed;
if(dot > 0) // we can't change direction while slowing down
{
- k *= fabs(sv_aircontrol)*pow(dot, sv_aircontrol_power)*frametime;
+ k *= pow(dot, sv_aircontrol_power)*frametime;
+ xyspeed = max(0, xyspeed - sv_aircontrol_penalty * sqrt(max(0, 1 - dot*dot)) * k/32);
+ k *= sv_aircontrol;
self.velocity = normalize(self.velocity * xyspeed + wishdir * k);
}
// CPM
if(sv_airstopaccelerate)
- if(self.velocity * wishdir < 0)
- airaccel = sv_airstopaccelerate*maxspd_mod;
+ {
+ vector curdir;
+ curdir = self.velocity;
+ curdir_z = 0;
+ curdir = normalize(curdir);
+ airaccel = airaccel + (sv_airstopaccelerate*maxspd_mod - airaccel) * max(0, -(curdir * wishdir));
+ }
// note that for straight forward jumping:
// step = accel * frametime * wishspeed0;
// accel = bound(0, wishspeed - vel_xy_current, step) * accelqw + step * (1 - accelqw);
readlevelcvars();
GrappleHookInit();
ElectroInit();
+ LaserInit();
player_count = 0;
bot_waypoints_for_items = cvar("g_waypoints_for_items");
g_hook.qh
w_electro.qh
+w_laser.qh
scores.qh
sv_maxairstrafespeed = cvar("sv_maxairstrafespeed");
sv_airstrafeaccel_qw = cvar("sv_airstrafeaccel_qw");
sv_aircontrol = cvar("sv_aircontrol");
+ sv_aircontrol_penalty = cvar("sv_aircontrol_penalty");
sv_aircontrol_power = cvar("sv_aircontrol_power");
sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel");
sv_warsowbunny_accel = cvar("sv_warsowbunny_accel");
}
.float bot_secondary_campingriflemooth;
+.float sent_campingrifle_scope;
float w_campingrifle(float req)
{
float full;
self.campingrifle_accumulator += cvar("g_balance_campingrifle_primary_burstcost");
}
if (self.BUTTON_ATCK2)
- if (weapon_prepareattack_check(1, cvar("g_balance_campingrifle_secondary_refire")))
- if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_secondary_burstcost"))
- {
- weapon_prepareattack_do(1, cvar("g_balance_campingrifle_secondary_refire"));
- W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_secondary_bullethail"), W_CampingRifle_Attack2, WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
- self.campingrifle_accumulator += cvar("g_balance_campingrifle_secondary_burstcost");
+ {
+ if (cvar("g_balance_campingrifle_secondary"))
+ {
+ if (weapon_prepareattack_check(1, cvar("g_balance_campingrifle_secondary_refire")))
+ if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_secondary_burstcost"))
+ {
+ weapon_prepareattack_do(1, cvar("g_balance_campingrifle_secondary_refire"));
+ W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_secondary_bullethail"), W_CampingRifle_Attack2, WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
+ self.campingrifle_accumulator += cvar("g_balance_campingrifle_secondary_burstcost");
+ }
+ }
+ else
+ {
+ if(clienttype(self) == CLIENTTYPE_REAL)
+ if(!self.sent_campingrifle_scope)
+ {
+ msg_entity = self;
+ WriteByte(MSG_ONE, SVC_TEMPENTITY);
+ WriteByte(MSG_ONE, TE_CSQC_CAMPINGRIFLE_SCOPE);
+ self.sent_campingrifle_scope = 1;
+ }
+ }
}
}
}
else if (req == WR_PRECACHE)
- {
+ {
precache_model ("models/weapons/g_campingrifle.md3");
precache_model ("models/weapons/v_campingrifle.md3");
precache_model ("models/weapons/h_campingrifle.iqm");
CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound
}
-.entity lgbeam, exteriorlgbeam;
-.float nextdamagethink;
+.entity lgbeam;
+.float prevlgfire;
void lgbeam_think()
{
+ self.owner.prevlgfire = time;
if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self != self.owner.lgbeam || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK)
{
remove(self);
vector angle;
angle = v_forward;
- traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_electro_primary_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+ WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_electro_primary_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
self.owner.ammo_cells = max(0, self.owner.ammo_cells - cvar("g_balance_electro_primary_ammo") * frametime);
// experimental lightning gun
void W_Electro_Attack3 (void)
{
+ // only play fire sound if 0.5 sec has passed since player let go the fire button
+ if(time - self.prevlgfire > 0.5)
+ {
+ sound (self, CHAN_WEAPON, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
+ }
+
entity beam, oldself;
self.lgbeam = beam = spawn();
precache_sound ("weapons/electro_impact.wav");
precache_sound ("weapons/electro_impact_combo.wav");
if(cvar("g_balance_electro_lightning"))
- precache_sound ("weapons/crylink_fire2.wav");
+ {
+ precache_sound ("weapons/lgbeam_fire.wav");
+ }
}
else if (req == WR_SETUP)
weapon_setup(WEP_ELECTRO);
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
+
+ if(self.movetype == MOVETYPE_NONE)
+ self.velocity = self.oldvelocity;
+
RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), self.projectiledeathtype, other);
remove (self);
spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
// let it stick whereever it is
+ self.oldvelocity = self.velocity;
self.velocity = '0 0 0';
self.movetype = MOVETYPE_NONE; // also disables gravity
self.gravity = 0; // nope, it does NOT! maybe a bug in CSQC code? TODO
}
}
-void W_Laser_Attack2 (void) // gauntlet
+.entity gauntletbeam;
+.float prevgauntletfire;
+void gauntletbeam_think()
{
- W_SetupShot (self, TRUE, 0, "weapons/gauntlet_fire.wav", cvar("g_balance_laser_primary_damage"));
+ float damage, myforce, myradius;
+ if(self.cnt)
+ {
+ damage = cvar("g_balance_laser_secondary_damage");
+ myforce = cvar("g_balance_laser_secondary_force");
+ myradius = cvar("g_balance_laser_secondary_radius");
+ }
+ else
+ {
+ damage = cvar("g_balance_laser_primary_damage");
+ myforce = cvar("g_balance_laser_primary_force");
+ myradius = cvar("g_balance_laser_primary_radius");
+ }
+
+ self.owner.prevgauntletfire = time;
+ if (self.owner.weaponentity.state != WS_INUSE || self != self.owner.gauntletbeam || self.owner.deadflag != DEAD_NO || (!self.owner.BUTTON_ATCK2 && self.cnt) || (!self.owner.BUTTON_ATCK && !self.cnt))
+ {
+ remove(self);
+ return;
+ }
+
+ self.nextthink = time;
+
+ makevectors(self.owner.v_angle);
+ vector angle;
+ angle = v_forward;
+
+ WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * myradius, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+
+ // apply the damage
+ if(trace_fraction < 1)
+ {
+ vector force;
+ force = angle * myforce;
+ Damage (trace_ent, self.owner, self.owner, damage * frametime, WEP_ELECTRO, trace_endpos, force * frametime);
+ }
- WarpZone_traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * (cvar("g_balance_laser_primary_radius") + vlen(eX * self.velocity_x + eY * self.velocity_y)/5), FALSE, self, ANTILAG_LATENCY(self));
+ // draw effect
+ vector vecs, org;
+ if(self.owner.weaponentity.movedir_x > 0)
+ {
+ vecs = self.owner.weaponentity.movedir;
+ vecs_y = -vecs_y;
+ }
+ else
+ vecs = '0 0 0';
+ org = self.owner.origin + self.owner.view_ofs + v_forward * vecs_x + v_right * vecs_y + v_up * vecs_z;
+
+ // TODO turn into a csqc entity
+ WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte(MSG_BROADCAST, TE_CSQC_BEAM);
+ WriteByte(MSG_BROADCAST, num_for_edict(self.owner));
+ WriteByte(MSG_BROADCAST, 3);
+ WriteCoord(MSG_BROADCAST, trace_endpos_x);
+ WriteCoord(MSG_BROADCAST, trace_endpos_y);
+ WriteCoord(MSG_BROADCAST, trace_endpos_z);
+ WriteCoord(MSG_BROADCAST, org_x);
+ WriteCoord(MSG_BROADCAST, org_y);
+ WriteCoord(MSG_BROADCAST, org_z);
+}
- pointparticles(particleeffectnum("laser_gauntletmuzzleflash"), w_shotorg, w_shotdir * 1000, 1);
- pointparticles(particleeffectnum("laser_gauntlet"), w_shotorg + w_shotdir * (cvar("g_balance_laser_primary_radius") + vlen(eX * self.velocity_x + eY * self.velocity_y)/5), w_shotdir * 1000, 1);
- pointparticles(particleeffectnum("laser_gauntlet"), w_shotorg + w_shotdir * (cvar("g_balance_laser_primary_radius") + vlen(eX * self.velocity_x + eY * self.velocity_y)/5) * 0.5, w_shotdir * 1000, 1);
+// experimental gauntlet
+void W_Laser_Attack2 (float issecondary)
+{
+ // only play fire sound if 0.5 sec has passed since player let go the fire button
+ if(time - self.prevgauntletfire > 0.5)
+ {
+ sound (self, CHAN_WEAPON, "weapons/gauntlet_fire.wav", VOL_BASE, ATTN_NORM);
+ }
+
+ entity beam, oldself;
+
+ self.gauntletbeam = beam = spawn();
+ beam.solid = SOLID_NOT;
+ beam.think = gauntletbeam_think;
+ beam.owner = self;
+ beam.movetype = MOVETYPE_NONE;
+ beam.shot_spread = 0;
+ beam.bot_dodge = TRUE;
+ beam.bot_dodgerating = cvar("g_balance_laser_primary_damage");
+ beam.cnt = issecondary;
- if (trace_fraction < 1)
- Damage(trace_ent, self, self, cvar("g_balance_laser_primary_damage"), WEP_LASER | HITTYPE_SECONDARY, trace_endpos, cvar("g_balance_laser_primary_force") * w_shotdir);
+ oldself = self;
+ self = beam;
+ self.think();
+ self = oldself;
+}
+
+void LaserInit()
+{
+ weapon_action(WEP_LASER, WR_PRECACHE);
+ gauntlet_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 1);
+ gauntlet_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 2);
+ gauntlet_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 3);
+ gauntlet_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 4);
}
void spawnfunc_weapon_laser (void)
if (self.BUTTON_ATCK)
if (weapon_prepareattack(0, cvar("g_balance_laser_primary_refire")))
{
- if(cvar("g_balance_laser_gauntlet"))
- W_Laser_Attack2();
+ if(cvar("g_balance_laser_primary_gauntlet"))
+ W_Laser_Attack2(0);
else
W_Laser_Attack(0);
weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_laser_primary_animtime"), w_ready);
{
if (weapon_prepareattack(0, cvar("g_balance_laser_secondary_refire")))
{
- W_Laser_Attack(1);
+ if(cvar("g_balance_laser_secondary_gauntlet"))
+ W_Laser_Attack2(1);
+ else
+ W_Laser_Attack(1);
weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_laser_secondary_animtime"), w_ready);
}
}
--- /dev/null
+void LaserInit();
+vector gauntlet_shotorigin[4];
W_AttachToShotorg(flash, '5 0 0');
}
+void shotgun_meleethink (void)
+{
+ // store time when we started swinging down inside self.cnt
+ if(!self.cnt)
+ self.cnt = time;
+
+ makevectors(self.owner.v_angle);
+ vector angle;
+ angle = v_forward;
+
+ // perform trace
+ float f;
+ f = (self.cnt + cvar("g_balance_shotgun_secondary_melee_time") - time) / cvar("g_balance_shotgun_secondary_melee_time") * 2 - 1;
+ vector targpos;
+ targpos = self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_shotgun_secondary_melee_range") + v_right * f * cvar("g_balance_shotgun_secondary_melee_swing") + v_up * f * cvar("g_balance_shotgun_secondary_melee_swing");
+ WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, targpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+
+ // apply the damage, also remove self
+ if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && trace_ent.classname == "player")
+ {
+ vector force;
+ force = angle * cvar("g_balance_shotgun_secondary_force");
+ Damage (trace_ent, self.owner, self.owner, cvar("g_balance_shotgun_secondary_damage") * ((f + 1) / 2), WEP_SHOTGUN, self.owner.origin + self.owner.view_ofs, force);
+ remove(self);
+ }
+ else if(time >= self.cnt + cvar("g_balance_shotgun_secondary_melee_time")) // missed, remove ent
+ remove(self);
+ else // continue swinging the weapon in hope of hitting someone :)
+ self.nextthink = time;
+}
+
+void W_Shotgun_Attack3 (void)
+{
+ sound (self, CHAN_PROJECTILE, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
+ weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), w_ready);
+
+ entity meleetemp;
+ meleetemp = spawn();
+ meleetemp.owner = self;
+ meleetemp.think = shotgun_meleethink;
+ meleetemp.nextthink = time + cvar("g_balance_shotgun_secondary_melee_delay");
+}
+
// weapon frames
void shotgun_fire2_03()
{
if (self.BUTTON_ATCK2 && cvar("g_balance_shotgun_secondary"))
if (weapon_prepareattack(1, cvar("g_balance_shotgun_secondary_refire")))
{
- W_Shotgun_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), shotgun_fire2_02);
+ if(cvar("g_balance_shotgun_secondary_melee"))
+ {
+ // force playback of the anim by switching to another anim (that we never play) here...
+ weapon_thinkf(WFRAME_FIRE1, 0, W_Shotgun_Attack3);
+ }
+ else
+ {
+ W_Shotgun_Attack2();
+ weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), shotgun_fire2_02);
+ }
}
}
else if (req == WR_PRECACHE)
precache_model ("models/weapons/h_shotgun.iqm");
precache_sound ("misc/itempickup.wav");
precache_sound ("weapons/shotgun_fire.wav");
+ precache_sound ("weapons/shotgun_melee.wav");
}
else if (req == WR_SETUP)
weapon_setup(WEP_SHOTGUN);
else if (req == WR_CHECKAMMO1)
return self.ammo_shells >= cvar("g_balance_shotgun_primary_ammo");
else if (req == WR_CHECKAMMO2)
+ {
+ if(cvar("g_balance_shotgun_secondary_melee"))
+ return TRUE;
return self.ammo_shells >= cvar("g_balance_shotgun_secondary_ammo") * 3;
+ }
return TRUE;
};
#endif