Merge remote branch 'origin/fruitiex/fruitbalance' into divVerent/fruitbalance
authorRudolf Polzer <divverent@alientrap.org>
Wed, 21 Jul 2010 18:31:12 +0000 (20:31 +0200)
committerRudolf Polzer <divverent@alientrap.org>
Wed, 21 Jul 2010 18:31:12 +0000 (20:31 +0200)
57 files changed:
balance.cfg
balance25.cfg
balanceFruit.cfg
balanceSamual.cfg
balanceXPM.cfg
models/weapons/h_shotgun.iqm
models/weapons/h_shotgun.iqm.framegroups
particles/gauntletbeam.tga [new file with mode: 0644]
particles/lgbeam.tga
physics10.cfg
physics11.cfg
physics151.cfg
physics151b.cfg
physics16rc1.cfg
physics20.cfg
physics25.cfg
physics26.cfg
physicsCPMA.cfg
physicsHavoc.cfg
physicsLeeStricklin.cfg
physicsLzd.cfg
physicsNoQWBunny-XPM.cfg [new file with mode: 0644]
physicsNoQWBunny.cfg
physicsNoQWBunny_easy.cfg
physicsQ.cfg
physicsQ2.cfg
physicsQ2a.cfg
physicsQ3.cfg
physicsQBF.cfg
physicsQBFplus.cfg
physicsSamual.cfg
physicsWarsow.cfg
physicsWarsowClassicBunny.cfg
physicsWarsowDev.cfg
physicsXPM.cfg
physicsXPMLight.cfg [new file with mode: 0644]
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/hook.qc
qcsrc/common/constants.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/g_world.qc
qcsrc/server/progs.src
qcsrc/server/sv_main.qc
qcsrc/server/w_campingrifle.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_laser.qc
qcsrc/server/w_laser.qh [new file with mode: 0644]
qcsrc/server/w_shotgun.qc
sound/weapons/gauntlet_fire.ogg
sound/weapons/gauntletbeam_fly.ogg [new file with mode: 0644]
sound/weapons/lgbeam_fire.ogg [new file with mode: 0644]
sound/weapons/lgbeam_fly.ogg
sound/weapons/shotgun_melee.ogg [new file with mode: 0644]

index 941f232..123c242 100644 (file)
@@ -217,7 +217,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.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
@@ -230,6 +230,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_gauntlet 0
 // }}}
 // {{{ shotgun
 set g_balance_shotgun_primary_bullets 6
@@ -242,6 +243,11 @@ 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 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
@@ -527,6 +533,7 @@ set g_balance_campingrifle_primary_ammo 10
 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
index 82f958e..46b3daf 100644 (file)
@@ -217,7 +217,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
-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
@@ -230,6 +230,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_gauntlet 0
 // }}}
 // {{{ shotgun
 set g_balance_shotgun_primary_bullets 6
@@ -242,6 +243,11 @@ 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 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
@@ -527,6 +533,7 @@ 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 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
index 9615f33..a2bfdfb 100644 (file)
@@ -33,7 +33,7 @@ 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 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
@@ -58,7 +58,7 @@ set g_pickup_shells 10
 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
@@ -206,30 +206,31 @@ set g_balance_grapplehook_health 130
 
 // {{{ 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
@@ -241,14 +242,19 @@ set g_balance_shotgun_primary_animtime 0.4
 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
 // }}}
@@ -274,9 +280,9 @@ set g_balance_grenadelauncher_primary_damage 100
 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
@@ -288,11 +294,11 @@ set g_balance_grenadelauncher_secondary_damage 100
 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
@@ -305,10 +311,10 @@ set g_balance_grenadelauncher_secondary_bouncestop 0.075
 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
@@ -316,29 +322,29 @@ set g_balance_electro_primary_refire 0.03333333
 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
@@ -403,7 +409,7 @@ set g_balance_hagar_primary_force 70
 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
@@ -413,7 +419,7 @@ set g_balance_hagar_secondary_force 70
 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
@@ -426,7 +432,7 @@ set g_balance_rocketlauncher_radius 100
 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
@@ -452,7 +458,7 @@ set g_balance_rocketlauncher_remote_force 350
 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
 // }}}
@@ -468,7 +474,7 @@ 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_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...
@@ -510,25 +516,26 @@ set g_balance_hlac_secondary_ammo 10
 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
index 715ae6f..6cdcb8a 100644 (file)
@@ -217,7 +217,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.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
@@ -230,6 +230,7 @@ set g_balance_laser_secondary_animtime 0.3
 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
@@ -242,6 +243,11 @@ set g_balance_shotgun_primary_ammo 1
 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
@@ -527,6 +533,7 @@ set g_balance_campingrifle_primary_ammo 10
 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
index 2eb8abb..acca206 100644 (file)
@@ -217,7 +217,7 @@ set g_balance_laser_primary_animtime 0.066
 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
@@ -230,6 +230,7 @@ set g_balance_laser_secondary_animtime 0
 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
@@ -242,6 +243,11 @@ 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_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
@@ -527,6 +533,7 @@ 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 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
index 1fb76f8..89b121b 100644 (file)
Binary files a/models/weapons/h_shotgun.iqm and b/models/weapons/h_shotgun.iqm differ
index 0a59625..1c95207 100644 (file)
@@ -1,4 +1,6 @@
 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
diff --git a/particles/gauntletbeam.tga b/particles/gauntletbeam.tga
new file mode 100644 (file)
index 0000000..20a6ee5
Binary files /dev/null and b/particles/gauntletbeam.tga differ
index cb9a696..331f2a8 100644 (file)
Binary files a/particles/lgbeam.tga and b/particles/lgbeam.tga differ
index 4631d5e..6e112b9 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 8c8219a..d4e1f54 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 9707f6f..6cb19f1 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 475875b..4796765 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 68a8f19..c4d60c7 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index b2e056e..d317514 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 85e4841..af5f386 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 0e4de39..8fa5abc 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index d572e6d..5660a33 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 70
 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
index eb63775..f328f89 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 4a959db..b162e5f 100644 (file)
@@ -19,6 +19,7 @@ sv_airstrafeaccelerate 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
index 2b437d3..0644990 100644 (file)
@@ -19,6 +19,7 @@ sv_airstrafeaccelerate 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
diff --git a/physicsNoQWBunny-XPM.cfg b/physicsNoQWBunny-XPM.cfg
new file mode 100644 (file)
index 0000000..1beaeda
--- /dev/null
@@ -0,0 +1,36 @@
+// 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
index d70bc1b..5a8732b 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 24
 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
index ff8cd3b..721f819 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index ea8e1ac..6fb02af 100644 (file)
@@ -19,6 +19,7 @@ sv_airstrafeaccelerate 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
index 1d08ae8..927fef3 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 7409ae4..7828cc6 100644 (file)
@@ -19,6 +19,7 @@ sv_airstrafeaccelerate 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
index 1951bec..37973ae 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 4bbb9be..2f32558 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index 6c17ad6..03be62d 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index e03363a..7492b41 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 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
index b1b0655..811084d 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 70
 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
index 06e7c1a..467c421 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 70
 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
index cb07a48..8a62f3e 100644 (file)
@@ -18,6 +18,7 @@ sv_airstrafeaccelerate 70
 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
index 2a60b65..74a20a4 100644 (file)
@@ -22,6 +22,7 @@ sv_airstrafeaccelerate 70
 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
@@ -31,5 +32,5 @@ sv_warsowbunny_backtosideratio 0.8
 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
diff --git a/physicsXPMLight.cfg b/physicsXPMLight.cfg
new file mode 100644 (file)
index 0000000..db9c617
--- /dev/null
@@ -0,0 +1,36 @@
+// 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
index 2aaf9cb..1b019d5 100644 (file)
@@ -234,6 +234,7 @@ float tempdb;
 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;
@@ -257,3 +258,4 @@ float w_deathtype, w_issilent, w_random;
 string w_deathtypestring;
 vector w_org, w_backoff;
 
+float campingrifle_scope;
index 9fb86a6..ed851b9 100644 (file)
@@ -1031,6 +1031,10 @@ void Ent_Init()
        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);
@@ -1270,6 +1274,10 @@ void Net_WeaponComplain() {
        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.
@@ -1344,6 +1352,10 @@ float CSQC_Parse_TempEntity()
                        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;
index 8c64241..05c038e 100644 (file)
@@ -137,7 +137,7 @@ vector GetCurrentFov(float fov)
                        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())
        {
@@ -567,7 +567,7 @@ void CSQC_UpdateView(float w, float h)
                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"))
index 8644847..9f690d5 100644 (file)
@@ -6,6 +6,12 @@
 .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)
 {
@@ -138,6 +144,38 @@ void Draw_GrapplingHook()
                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)
@@ -154,6 +192,23 @@ void Draw_GrapplingHook()
                        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()
@@ -201,10 +256,18 @@ 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");
 }
index 5e96ce3..8a74e96 100644 (file)
@@ -60,6 +60,7 @@ const float TE_CSQC_TARGET_MUSIC = 111;
 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;
index 8b95a3a..fda3e90 100644 (file)
@@ -1071,6 +1071,10 @@ float ClientInit_SendEntity(entity to, float sf)
        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
@@ -2781,7 +2785,7 @@ void PlayerPreThink (void)
        }
 
        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;
index ac67895..70e7025 100644 (file)
@@ -16,6 +16,7 @@ float sv_maxairstrafespeed;
 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;
@@ -470,7 +471,9 @@ void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
 
        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);
        }
 
@@ -1202,8 +1205,13 @@ void SV_PlayerPhysics()
 
                        // 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);
index 020c24b..07898df 100644 (file)
@@ -513,6 +513,7 @@ void spawnfunc_worldspawn (void)
        readlevelcvars();
        GrappleHookInit();
        ElectroInit();
+       LaserInit();
 
        player_count = 0;
        bot_waypoints_for_items = cvar("g_waypoints_for_items");
index 929b0df..adf4b4a 100644 (file)
@@ -44,6 +44,7 @@ portals.qh
 
 g_hook.qh
 w_electro.qh
+w_laser.qh
 
 scores.qh
 
index a79f9a4..44a47c9 100644 (file)
@@ -191,6 +191,7 @@ void StartFrame (void)
        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");
index 8fc8d83..96dc36f 100644 (file)
@@ -173,6 +173,7 @@ void W_CampingRifle_BulletHail(float mode, void(void) AttackFunc, float fr, floa
 }
 
 .float bot_secondary_campingriflemooth;
+.float sent_campingrifle_scope;
 float w_campingrifle(float req)
 {
        float full;
@@ -219,17 +220,33 @@ float w_campingrifle(float req)
                                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");
index c2e57d2..3a54cf3 100644 (file)
@@ -184,10 +184,11 @@ void W_Electro_Attack2()
        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);
@@ -200,7 +201,7 @@ void lgbeam_think()
        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);
@@ -241,6 +242,12 @@ void lgbeam_think()
 // 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();
@@ -359,7 +366,9 @@ float w_electro(float req)
                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);
index 551acf3..f6851af 100644 (file)
@@ -13,6 +13,10 @@ void W_Grenade_Explode (void)
 
        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);
@@ -52,6 +56,7 @@ void W_Grenade_Touch1 (void)
                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
index 00e0fff..8633297 100644 (file)
@@ -101,18 +101,105 @@ void W_Laser_Attack (float issecondary)
        }
 }
 
-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)
@@ -143,8 +230,8 @@ float w_laser(float req)
                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);
@@ -155,7 +242,10 @@ float w_laser(float req)
                        {
                                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);
                                }
                        }
diff --git a/qcsrc/server/w_laser.qh b/qcsrc/server/w_laser.qh
new file mode 100644 (file)
index 0000000..0f2c137
--- /dev/null
@@ -0,0 +1,2 @@
+void LaserInit();
+vector gauntlet_shotorigin[4];
index c347648..9d1d8fb 100644 (file)
@@ -89,6 +89,49 @@ void W_Shotgun_Attack2 (void)
        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()
 {
@@ -121,8 +164,16 @@ float w_shotgun(float req)
                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)
@@ -133,13 +184,18 @@ float w_shotgun(float req)
                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
index 0190693..03802f6 100644 (file)
Binary files a/sound/weapons/gauntlet_fire.ogg and b/sound/weapons/gauntlet_fire.ogg differ
diff --git a/sound/weapons/gauntletbeam_fly.ogg b/sound/weapons/gauntletbeam_fly.ogg
new file mode 100644 (file)
index 0000000..874d246
Binary files /dev/null and b/sound/weapons/gauntletbeam_fly.ogg differ
diff --git a/sound/weapons/lgbeam_fire.ogg b/sound/weapons/lgbeam_fire.ogg
new file mode 100644 (file)
index 0000000..d3cd355
Binary files /dev/null and b/sound/weapons/lgbeam_fire.ogg differ
index 183ec30..3531310 100644 (file)
Binary files a/sound/weapons/lgbeam_fly.ogg and b/sound/weapons/lgbeam_fly.ogg differ
diff --git a/sound/weapons/shotgun_melee.ogg b/sound/weapons/shotgun_melee.ogg
new file mode 100644 (file)
index 0000000..0562b55
Binary files /dev/null and b/sound/weapons/shotgun_melee.ogg differ