]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into divVerent/crypto2
authorRudolf Polzer <divverent@alientrap.org>
Thu, 7 Oct 2010 13:40:03 +0000 (15:40 +0200)
committerRudolf Polzer <divverent@alientrap.org>
Thu, 7 Oct 2010 13:40:03 +0000 (15:40 +0200)
Conflicts:
qcsrc/server/ipban.qc

20 files changed:
balance25.cfg
balanceLeeStricklin.cfg
balanceNexSVN.cfg
balanceSamual.cfg
balanceXonotic.cfg
defaultXonotic.cfg
gfx/nex_ring.tga [new file with mode: 0644]
physicsLeeStricklin.cfg
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/miscfunctions.qc
qcsrc/common/constants.qh
qcsrc/server/bot/waypoints.qc
qcsrc/server/cl_client.qc
qcsrc/server/ctf.qc
qcsrc/server/ipban.qc
qcsrc/server/mutators/gamemode_keyhunt.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_nex.qc

index ec040c4cd321602e729398fde0deb57b903adb8a..6287460ca329849a946f1ac2e5839451f2fabb1d 100644 (file)
@@ -268,8 +268,7 @@ set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 115 // 13.1qu
 // }}}
 // {{{ mortar
-set g_balance_grenadelauncher_primary2secondary 0
-set g_balance_grenadelauncher_primary_sticky 0
+set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 70
 set g_balance_grenadelauncher_primary_edgedamage 38
 set g_balance_grenadelauncher_primary_force 400
@@ -284,7 +283,12 @@ set g_balance_grenadelauncher_primary_refire 0.8
 set g_balance_grenadelauncher_primary_animtime 0.3
 set g_balance_grenadelauncher_primary_ammo 2
 set g_balance_grenadelauncher_primary_health 25
-set g_balance_grenadelauncher_secondary_sticky 0
+set g_balance_grenadelauncher_primary_damageforcescale 4
+set g_balance_grenadelauncher_primary_bouncefactor 0.5
+set g_balance_grenadelauncher_primary_bouncestop 0.075
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+
+set g_balance_grenadelauncher_secondary_type 1
 set g_balance_grenadelauncher_secondary_damage 70
 set g_balance_grenadelauncher_secondary_edgedamage 38
 set g_balance_grenadelauncher_secondary_force 400
@@ -302,6 +306,7 @@ set g_balance_grenadelauncher_secondary_health 10
 set g_balance_grenadelauncher_secondary_damageforcescale 4
 set g_balance_grenadelauncher_secondary_bouncefactor 0.5
 set g_balance_grenadelauncher_secondary_bouncestop 0.075
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
@@ -405,6 +410,10 @@ set g_balance_nex_secondary_damagefalloff_mindist 0
 set g_balance_nex_secondary_damagefalloff_maxdist 0
 set g_balance_nex_secondary_damagefalloff_halflife 0
 set g_balance_nex_secondary_damagefalloff_forcehalflife 0
+
+set g_balance_nex_velocitydependent_halflife 0
+set g_balance_nex_velocitydependent_minspeed 400
+set g_balance_nex_velocitydependent_maxspeed 1000
 // }}}
 // {{{ minstanex
 set g_balance_minstanex_refire 1
index 6df076b18b7baa4864766ddad4ec9cfcaf80c29e..8a0ae6c46224929acbb9574496eb204d40f22db6 100644 (file)
@@ -246,7 +246,7 @@ set g_balance_laser_secondary_gauntlet 0
 // {{{ shotgun
 set g_balance_shotgun_primary_bullets 5
 set g_balance_shotgun_primary_damage 12
-set g_balance_shotgun_primary_force 60
+set g_balance_shotgun_primary_force 40
 set g_balance_shotgun_primary_spread 0.08
 set g_balance_shotgun_primary_refire 0.5
 set g_balance_shotgun_primary_animtime 0.2
@@ -266,11 +266,11 @@ set g_balance_shotgun_secondary_animtime 1
 // {{{ uzi
 set g_balance_uzi_first 1
 set g_balance_uzi_first_damage 26
-set g_balance_uzi_first_force 50
+set g_balance_uzi_first_force -30
 set g_balance_uzi_first_spread 0.01
 set g_balance_uzi_first_refire 0.2
 set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 15
+set g_balance_uzi_sustained_damage 17
 set g_balance_uzi_sustained_force 27
 set g_balance_uzi_sustained_spread 0.05
 set g_balance_uzi_sustained_refire 0.1
@@ -279,11 +279,10 @@ set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 300 // 13.1qu
 // }}}
 // {{{ mortar
-set g_balance_grenadelauncher_primary2secondary 0
-set g_balance_grenadelauncher_primary_sticky 0
+set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 65
 set g_balance_grenadelauncher_primary_edgedamage 35
-set g_balance_grenadelauncher_primary_force 400
+set g_balance_grenadelauncher_primary_force 310
 set g_balance_grenadelauncher_primary_radius 140
 set g_balance_grenadelauncher_primary_speed 2000
 set g_balance_grenadelauncher_primary_speed_up 200
@@ -295,10 +294,15 @@ set g_balance_grenadelauncher_primary_refire 0.7
 set g_balance_grenadelauncher_primary_animtime 0.3
 set g_balance_grenadelauncher_primary_ammo 2
 set g_balance_grenadelauncher_primary_health 72
-set g_balance_grenadelauncher_secondary_sticky 0
+set g_balance_grenadelauncher_primary_damageforcescale 0
+set g_balance_grenadelauncher_primary_bouncefactor 0.7
+set g_balance_grenadelauncher_primary_bouncestop 0.12
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+
+set g_balance_grenadelauncher_secondary_type 1
 set g_balance_grenadelauncher_secondary_damage 65
 set g_balance_grenadelauncher_secondary_edgedamage 35
-set g_balance_grenadelauncher_secondary_force 400
+set g_balance_grenadelauncher_secondary_force 320
 set g_balance_grenadelauncher_secondary_radius 140
 set g_balance_grenadelauncher_secondary_speed 1400
 set g_balance_grenadelauncher_secondary_speed_up 200
@@ -313,25 +317,26 @@ set g_balance_grenadelauncher_secondary_health 40
 set g_balance_grenadelauncher_secondary_damageforcescale 0
 set g_balance_grenadelauncher_secondary_bouncefactor 0.7
 set g_balance_grenadelauncher_secondary_bouncestop 0.12
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
-set g_balance_electro_primary_damage 80
-set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 550
+set g_balance_electro_primary_damage 55
+set g_balance_electro_primary_edgedamage 5
+set g_balance_electro_primary_force 267
 set g_balance_electro_primary_force_up 125
 set g_balance_electro_primary_radius 150
 set g_balance_electro_primary_comboradius 75
 set g_balance_electro_primary_speed 2000
 set g_balance_electro_primary_spread 0
 set g_balance_electro_primary_lifetime 30
-set g_balance_electro_primary_refire 0.6
-set g_balance_electro_primary_animtime 0.74
+set g_balance_electro_primary_refire 0.78
+set g_balance_electro_primary_animtime 0.4
 set g_balance_electro_primary_ammo 2
 set g_balance_electro_primary_range 800
-set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
+set g_balance_electro_primary_falloff_mindist 255
 set g_balance_electro_primary_falloff_maxdist 850
-set g_balance_electro_primary_falloff_halflifedist 425
+set g_balance_electro_primary_falloff_halflifedist 0
 set g_balance_electro_secondary_damage 60
 set g_balance_electro_secondary_edgedamage 0
 set g_balance_electro_secondary_force 200
@@ -356,7 +361,7 @@ set g_balance_electro_combo_comboradius 70
 set g_balance_electro_combo_speed 400
 // }}}
 // {{{ crylink
-set g_balance_crylink_primary_damage 16
+set g_balance_crylink_primary_damage 23
 set g_balance_crylink_primary_edgedamage 0
 set g_balance_crylink_primary_force -55
 set g_balance_crylink_primary_radius 80
@@ -366,7 +371,7 @@ set g_balance_crylink_primary_shots 4
 set g_balance_crylink_primary_bounces 2
 set g_balance_crylink_primary_refire 0.4
 set g_balance_crylink_primary_animtime 0.30008
-set g_balance_crylink_primary_ammo 1
+set g_balance_crylink_primary_ammo 3
 set g_balance_crylink_primary_bouncedamagefactor 0.2
 
 set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
@@ -377,7 +382,7 @@ set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
 set g_balance_crylink_primary_other_fadetime 0.25
 
 set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 12
+set g_balance_crylink_secondary_damage 19
 set g_balance_crylink_secondary_edgedamage 0
 set g_balance_crylink_secondary_force -55
 set g_balance_crylink_secondary_radius 3
@@ -387,7 +392,7 @@ set g_balance_crylink_secondary_shots 7
 set g_balance_crylink_secondary_bounces 0
 set g_balance_crylink_secondary_refire 0.5
 set g_balance_crylink_secondary_animtime 0.3
-set g_balance_crylink_secondary_ammo 2
+set g_balance_crylink_secondary_ammo 3
 set g_balance_crylink_secondary_bouncedamagefactor 0.5
 
 set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
@@ -396,11 +401,11 @@ set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 80
 set g_balance_crylink_secondary_line_fadetime 2
 // }}}
 // {{{ nex
-set g_balance_nex_primary_ammo 7
+set g_balance_nex_primary_ammo 13
 set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_damage 140
+set g_balance_nex_primary_damage 78
 set g_balance_nex_primary_force 600
-set g_balance_nex_primary_refire 1.5
+set g_balance_nex_primary_refire 1.505
 set g_balance_nex_primary_damagefalloff_mindist 9999999
 set g_balance_nex_primary_damagefalloff_maxdist 9999999
 set g_balance_nex_primary_damagefalloff_halflife 9999999
@@ -416,6 +421,10 @@ set g_balance_nex_secondary_damagefalloff_mindist 9999999
 set g_balance_nex_secondary_damagefalloff_maxdist 9999999
 set g_balance_nex_secondary_damagefalloff_halflife 9999999
 set g_balance_nex_secondary_damagefalloff_forcehalflife 9999999
+
+set g_balance_nex_velocitydependent_halflife 0
+set g_balance_nex_velocitydependent_minspeed 400
+set g_balance_nex_velocitydependent_maxspeed 1000
 // }}}
 // {{{ minstanex
 set g_balance_minstanex_refire 1
@@ -425,13 +434,13 @@ set g_balance_minstanex_ammo 10
 // {{{ hagar
 set g_balance_hagar_primary_damage 43
 set g_balance_hagar_primary_edgedamage 15
-set g_balance_hagar_primary_force 100
+set g_balance_hagar_primary_force 94
 set g_balance_hagar_primary_radius 70
 set g_balance_hagar_primary_spread 0.010
 set g_balance_hagar_primary_speed 3000
 set g_balance_hagar_primary_lifetime 30
 set g_balance_hagar_primary_refire 0.15
-set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_primary_ammo 2
 set g_balance_hagar_secondary 1
 set g_balance_hagar_secondary_damage 43
 set g_balance_hagar_secondary_edgedamage 15
@@ -442,12 +451,12 @@ set g_balance_hagar_secondary_speed 1400
 set g_balance_hagar_secondary_lifetime_min 5
 set g_balance_hagar_secondary_lifetime_rand 0
 set g_balance_hagar_secondary_refire 0.15
-set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_secondary_ammo 2
 // }}}
 // {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 130
-set g_balance_rocketlauncher_edgedamage 50
-set g_balance_rocketlauncher_force 597
+set g_balance_rocketlauncher_damage 65
+set g_balance_rocketlauncher_edgedamage 25
+set g_balance_rocketlauncher_force 360
 set g_balance_rocketlauncher_radius 185
 set g_balance_rocketlauncher_speed 900
 set g_balance_rocketlauncher_speedaccel 0
@@ -455,11 +464,11 @@ set g_balance_rocketlauncher_speedstart 850
 set g_balance_rocketlauncher_lifetime 30
 set g_balance_rocketlauncher_refire 1
 set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 3
+set g_balance_rocketlauncher_ammo 7
 set g_balance_rocketlauncher_health 40
 set g_balance_rocketlauncher_damageforcescale 4
 set g_balance_rocketlauncher_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 140 // max degrees per second
+set g_balance_rocketlauncher_guiderate 65 // max degrees per second
 set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
@@ -508,7 +517,7 @@ set g_balance_hlac_primary_spread_max 0.25
 set g_balance_hlac_primary_spread_add 0.0045
 set g_balance_hlac_primary_spread_crouchmod 0.25
 
-set g_balance_hlac_primary_damage 19
+set g_balance_hlac_primary_damage 17
 set g_balance_hlac_primary_edgedamage 10
 set g_balance_hlac_primary_force 45
 set g_balance_hlac_primary_radius 70
@@ -517,7 +526,7 @@ set g_balance_hlac_primary_lifetime 5
 
 set g_balance_hlac_primary_refire 0.1
 set g_balance_hlac_primary_animtime 0.3
-set g_balance_hlac_primary_ammo 1
+set g_balance_hlac_primary_ammo 3
 
 set g_balance_hlac_secondary 1
 set g_balance_hlac_secondary_spread 0.15
@@ -532,7 +541,7 @@ set g_balance_hlac_secondary_lifetime 5
 
 set g_balance_hlac_secondary_refire 1
 set g_balance_hlac_secondary_animtime 0.3
-set g_balance_hlac_secondary_ammo 10
+set g_balance_hlac_secondary_ammo 11
 set g_balance_hlac_secondary_shots 6
 // }}}
 // {{{ campingrifle
index 6c5a74655d5a26dab09ad8476b01ed06c388ffb8..36615d790cbb7c6d12e55c5ba3ac076b61d6fb75 100644 (file)
@@ -268,8 +268,7 @@ set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 115 // 13.1qu
 // }}}
 // {{{ mortar
-set g_balance_grenadelauncher_primary2secondary 0
-set g_balance_grenadelauncher_primary_sticky 0
+set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 70
 set g_balance_grenadelauncher_primary_edgedamage 38
 set g_balance_grenadelauncher_primary_force 400
@@ -284,7 +283,11 @@ set g_balance_grenadelauncher_primary_refire 0.8
 set g_balance_grenadelauncher_primary_animtime 0.3
 set g_balance_grenadelauncher_primary_ammo 2
 set g_balance_grenadelauncher_primary_health 25
-set g_balance_grenadelauncher_secondary_sticky 0
+set g_balance_grenadelauncher_primary_damageforcescale 4
+set g_balance_grenadelauncher_primary_bouncefactor 0.5
+set g_balance_grenadelauncher_primary_bouncestop 0.075
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+set g_balance_grenadelauncher_secondary_type 1
 set g_balance_grenadelauncher_secondary_damage 70
 set g_balance_grenadelauncher_secondary_edgedamage 38
 set g_balance_grenadelauncher_secondary_force 400
@@ -302,6 +305,7 @@ set g_balance_grenadelauncher_secondary_health 10
 set g_balance_grenadelauncher_secondary_damageforcescale 4
 set g_balance_grenadelauncher_secondary_bouncefactor 0.5
 set g_balance_grenadelauncher_secondary_bouncestop 0.075
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
@@ -405,6 +409,10 @@ set g_balance_nex_secondary_damagefalloff_mindist 1000
 set g_balance_nex_secondary_damagefalloff_maxdist 3000
 set g_balance_nex_secondary_damagefalloff_halflife 1500
 set g_balance_nex_secondary_damagefalloff_forcehalflife 1500
+
+set g_balance_nex_velocitydependent_halflife 0
+set g_balance_nex_velocitydependent_minspeed 400
+set g_balance_nex_velocitydependent_maxspeed 1000
 // }}}
 // {{{ minstanex
 set g_balance_minstanex_refire 1
index 17c3e1410587e6e09948741758c83a820f65c653..aeed47e8986b05e972cc96bc387cf511d8a20a7d 100644 (file)
@@ -268,8 +268,7 @@ set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 115 // 13.1qu
 // }}}
 // {{{ mortar
-set g_balance_grenadelauncher_primary2secondary 0
-set g_balance_grenadelauncher_primary_sticky 0
+set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 50
 set g_balance_grenadelauncher_primary_edgedamage 38
 set g_balance_grenadelauncher_primary_force 400
@@ -284,7 +283,12 @@ set g_balance_grenadelauncher_primary_refire 0.8
 set g_balance_grenadelauncher_primary_animtime 0.3
 set g_balance_grenadelauncher_primary_ammo 2
 set g_balance_grenadelauncher_primary_health 25
-set g_balance_grenadelauncher_secondary_sticky 0
+set g_balance_grenadelauncher_primary_damageforcescale 4
+set g_balance_grenadelauncher_primary_bouncefactor 0.5
+set g_balance_grenadelauncher_primary_bouncestop 0.075
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+
+set g_balance_grenadelauncher_secondary_type 1
 set g_balance_grenadelauncher_secondary_damage 60
 set g_balance_grenadelauncher_secondary_edgedamage 38
 set g_balance_grenadelauncher_secondary_force 400
@@ -302,6 +306,7 @@ set g_balance_grenadelauncher_secondary_health 70
 set g_balance_grenadelauncher_secondary_damageforcescale 4
 set g_balance_grenadelauncher_secondary_bouncefactor 0.5
 set g_balance_grenadelauncher_secondary_bouncestop 0.075
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 1
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
@@ -405,6 +410,10 @@ set g_balance_nex_secondary_damagefalloff_mindist 1000
 set g_balance_nex_secondary_damagefalloff_maxdist 3000
 set g_balance_nex_secondary_damagefalloff_halflife 1500
 set g_balance_nex_secondary_damagefalloff_forcehalflife 1500
+
+set g_balance_nex_velocitydependent_halflife 0
+set g_balance_nex_velocitydependent_minspeed 400
+set g_balance_nex_velocitydependent_maxspeed 1000
 // }}}
 // {{{ minstanex
 set g_balance_minstanex_refire 1
index 076a4935b6404b5fe2a7a40dc4bec0a767754b71..e28bd844dec4d0d9214cdd7f5bdaa54f4c522232 100644 (file)
@@ -259,22 +259,21 @@ set g_balance_uzi_first_force 35
 set g_balance_uzi_first_spread 0.03
 set g_balance_uzi_first_refire 0.2
 set g_balance_uzi_first_ammo 2
-set g_balance_uzi_sustained_damage 9
+set g_balance_uzi_sustained_damage 12
 set g_balance_uzi_sustained_force 7.5
 set g_balance_uzi_sustained_spread 0.1
-set g_balance_uzi_sustained_refire 0.075
+set g_balance_uzi_sustained_refire 0.1
 set g_balance_uzi_sustained_ammo 1
 set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 115 // 13.1qu
 // }}}
 // {{{ mortar // TODO
-set g_balance_grenadelauncher_primary2secondary 0
-set g_balance_grenadelauncher_primary_sticky 0
+set g_balance_grenadelauncher_primary_type 1
 set g_balance_grenadelauncher_primary_damage 60
 set g_balance_grenadelauncher_primary_edgedamage 25
 set g_balance_grenadelauncher_primary_force 300
 set g_balance_grenadelauncher_primary_radius 100
-set g_balance_grenadelauncher_primary_speed 1400
+set g_balance_grenadelauncher_primary_speed 1000
 set g_balance_grenadelauncher_primary_speed_up 225
 set g_balance_grenadelauncher_primary_speed_z 0
 set g_balance_grenadelauncher_primary_spread 0
@@ -284,7 +283,12 @@ set g_balance_grenadelauncher_primary_refire 0.8
 set g_balance_grenadelauncher_primary_animtime 0.4
 set g_balance_grenadelauncher_primary_ammo 2
 set g_balance_grenadelauncher_primary_health 72
-set g_balance_grenadelauncher_secondary_sticky 1
+set g_balance_grenadelauncher_primary_damageforcescale 0
+set g_balance_grenadelauncher_primary_bouncefactor 0.5
+set g_balance_grenadelauncher_primary_bouncestop 0.12
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 1
+
+set g_balance_grenadelauncher_secondary_type 0
 set g_balance_grenadelauncher_secondary_damage 90
 set g_balance_grenadelauncher_secondary_edgedamage 32
 set g_balance_grenadelauncher_secondary_force 300
@@ -300,14 +304,15 @@ set g_balance_grenadelauncher_secondary_animtime 0.4
 set g_balance_grenadelauncher_secondary_ammo 2
 set g_balance_grenadelauncher_secondary_health 40
 set g_balance_grenadelauncher_secondary_damageforcescale 0
-set g_balance_grenadelauncher_secondary_bouncefactor 0.7
+set g_balance_grenadelauncher_secondary_bouncefactor 0.5
 set g_balance_grenadelauncher_secondary_bouncestop 0.12
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 1
 // }}}
 // {{{ electro // TODO
 set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 90
+set g_balance_electro_primary_damage 85
 set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 550
+set g_balance_electro_primary_force 425
 set g_balance_electro_primary_force_up 125
 set g_balance_electro_primary_radius 850
 set g_balance_electro_primary_comboradius 75
@@ -385,26 +390,30 @@ set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 80
 set g_balance_crylink_secondary_line_fadetime 2
 // }}}
 // {{{ nex
-set g_balance_nex_primary_damage 80
-set g_balance_nex_primary_force 400
-set g_balance_nex_primary_refire 1.25
+set g_balance_nex_primary_damage 125
+set g_balance_nex_primary_force 500
+set g_balance_nex_primary_refire 1
 set g_balance_nex_primary_animtime 0.75
 set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 0
-set g_balance_nex_primary_damagefalloff_maxdist 4000
+set g_balance_nex_primary_damagefalloff_mindist 500
+set g_balance_nex_primary_damagefalloff_maxdist 4500
 set g_balance_nex_primary_damagefalloff_halflife 2000
 set g_balance_nex_primary_damagefalloff_forcehalflife 2000
 
 set g_balance_nex_secondary 1
-set g_balance_nex_secondary_damage 80
-set g_balance_nex_secondary_force -500
-set g_balance_nex_secondary_refire 1.25
+set g_balance_nex_secondary_damage 125
+set g_balance_nex_secondary_force -700
+set g_balance_nex_secondary_refire 1
 set g_balance_nex_secondary_animtime 0.75
 set g_balance_nex_secondary_ammo 5
-set g_balance_nex_secondary_damagefalloff_mindist 0
-set g_balance_nex_secondary_damagefalloff_maxdist 4000
+set g_balance_nex_secondary_damagefalloff_mindist 500
+set g_balance_nex_secondary_damagefalloff_maxdist 4500
 set g_balance_nex_secondary_damagefalloff_halflife 2000
 set g_balance_nex_secondary_damagefalloff_forcehalflife 2000
+
+set g_balance_nex_velocitydependent_halflife -500
+set g_balance_nex_velocitydependent_minspeed 400
+set g_balance_nex_velocitydependent_maxspeed 1000
 // }}}
 // {{{ minstanex
 set g_balance_minstanex_refire 1.25
@@ -530,14 +539,14 @@ 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 50
-set g_balance_campingrifle_primary_headshotaddeddamage 50
+set g_balance_campingrifle_primary_damage 75
+set g_balance_campingrifle_primary_headshotaddeddamage 75
 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.8
+set g_balance_campingrifle_primary_refire 1.5
+set g_balance_campingrifle_primary_animtime 1.4
 set g_balance_campingrifle_primary_ammo 10
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
 set g_balance_campingrifle_primary_burstcost 0
index 555da4afad130949e43b810bf22a302fb6b93a76..7312a34e4aed51515b0c52ef1c62b623f97a0a58 100644 (file)
@@ -198,6 +198,10 @@ seta crosshair_fireball_color_green 1.0    "crosshair color green component to disp
 seta crosshair_fireball_color_blue 0.2 "crosshair color blue component to display when wielding the fireball"
 seta crosshair_fireball_color_alpha 1  "crosshair alpha value to display when wielding the fireball"
 seta crosshair_fireball_size 1 "crosshair size when wielding the fireball"
+seta crosshair_nexvelocity_color_red 0.8
+seta crosshair_nexvelocity_color_green 0
+seta crosshair_nexvelocity_color_blue 0
+seta crosshair_nexvelocity_alpha 0.25
 seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)"
 seta cl_reticle_item_nex 1 "draw aiming recticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
 seta cl_reticle_item_normal 1 "draw recticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha"
@@ -521,6 +525,7 @@ set g_player_brightness 0   "set to 2 for brighter players"
 seta g_balance_cloaked_alpha 0.25
 
 set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
+set g_botclip_collisions 1 "0 = disable collision testing against botclips, might be useful on some defrag maps"
 
 set welcome_message_time 8
 
@@ -1255,7 +1260,7 @@ set g_keyhunt_teams 0
 set cl_gravity 800     "but ignored anyway"
 
 set g_ban_default_bantime 5400 "90 minutes"
-set g_ban_default_masksize 3   "whole 255.255.255.0 networks (set to 4 for single IPs); when UID support is compiled in, masksize 0 means banning by UID"
+set g_ban_default_masksize 3   "masksize 0 means banning by UID only, 1 means banning by /8 (IPv6: /32) network, 2 means banning by /16 (IPv6: /48) network, 3 means banning by /24 (IPv6: /56) network, 4 means banning by single IP (IPv6: /64 network)"
 set g_banned_list ""   "format: IP remainingtime IP remainingtime ..."
 set g_banned_list_idmode "1"   "when set, the IP banning system always uses the ID over the IP address (so a user in a banned IP range can connect if they have a valid signed ID)"
 alias bans "sv_cmd bans"
diff --git a/gfx/nex_ring.tga b/gfx/nex_ring.tga
new file mode 100644 (file)
index 0000000..22e3514
Binary files /dev/null and b/gfx/nex_ring.tga differ
index 03c3e5d6384fbe16e846eb2eccdce2effa1308b1..5d9a1280b6ae7d4bb21adef218a4edcc5aada830 100644 (file)
@@ -1,23 +1,25 @@
 // These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file and a bunch of other crap div0 threw on here :P
 // DO NOT SCREW WITH friction on land, edge friction, step height, or sv_airaccel_qw
-
-sv_gravity 818
+sv_gravity 819
 sv_maxspeed 420
 sv_maxairspeed 283
+
 sv_stopspeed 100
-sv_accelerate 14
-sv_airaccelerate 8
+sv_accelerate 13
+sv_airaccelerate 6
 sv_friction 9.6 // higher values make you slide less
 edgefriction 1 // div0 says no! lol
-sv_stepheight 34 // was told by divVerent not to mess with this, possibly to avoid breaking maps
-sv_jumpvelocity 308
+sv_stepheight 26
+sv_jumpvelocity 304
 sv_wateraccelerate -1
 sv_waterfriction -1
 sv_airaccel_sideways_friction 0 // pain in the ass to tweak without screwing up the strafing
 sv_airaccel_qw -0.93 //given a negative value to combat potential cheats, was told by divVerent not to mess with it
+
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
 sv_aircontrol_penalty 0
 sv_aircontrol_power 2
@@ -26,9 +28,8 @@ sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0 //Was told not to mess with this by divVerent, can cause hell for anti-lag
+sv_friction_on_land 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max 0.38
-sv_jumpspeedcap_max_disable_on_ramps 1
-
+sv_jumpspeedcap_max_disable_on_ramps 0
index fbed63fc40b671ffb09f0d43d11eb5a9eecf5bad..1bd911aafb12b890f30152d8a1e17ead239fd11c 100644 (file)
@@ -260,3 +260,6 @@ vector w_org, w_backoff;
 
 float campingrifle_scope;
 float nex_scope;
+
+float nex_minvelocity;
+float nex_maxvelocity;
index 320ed94727aed077678eda54eade821b53ece437..8b053cfd38fd553477a140ade161e159aef20dff 100644 (file)
@@ -1334,6 +1334,11 @@ float CSQC_Parse_TempEntity()
                        Net_WeaponComplain();
                        bHandled = true;
                        break;
+               case TE_CSQC_NEX_VELOCITY:
+                       nex_minvelocity = ReadShort();
+                       nex_maxvelocity = ReadShort();
+                       bHandled = true;
+                       break;
                default:
                        // No special logic for this temporary entity; return 0 so the engine can handle it
                        bHandled = false;
index 0b7dcac792ec61d61f3dba40a2af3260f6b646c6..6fc94ca4346d1ebfa395510f9270ad9234ad841b 100644 (file)
@@ -566,7 +566,7 @@ void CSQC_UpdateView(float w, float h)
        // next R_RenderScene call
        drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0);
 
-       if(cvar("r_fakelight") >= 2)
+       if(cvar("r_fakelight") >= 2 || cvar("r_fullbright"))
        {
                // apply night vision effect
                vector rgb, tc_00, tc_01, tc_10, tc_11;
@@ -697,6 +697,24 @@ void CSQC_UpdateView(float w, float h)
                        if(cvar("viewsize") < 120)
                                CSQC_common_hud();
 
+
+               // ring around crosshair representing velocity-dependent damage for the nex
+               if (activeweapon == WEP_NEX)
+               {
+                       float f, a, curvel;
+                       vector rgb;
+
+                       rgb_x = cvar("crosshair_nexvelocity_color_red");
+                       rgb_y = cvar("crosshair_nexvelocity_color_green");
+                       rgb_z = cvar("crosshair_nexvelocity_color_blue");
+                       a = cvar("crosshair_nexvelocity_alpha");
+
+                       curvel = vlen('1 0 0' * pmove_vel_x + '0 1 0' * pmove_vel_y);
+                       f = bound(0, (curvel - nex_minvelocity) / (nex_maxvelocity - nex_minvelocity), 1);
+
+                       DrawCircleClippedPic('0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight, 0.1 * vid_conheight, "gfx/nex_ring.tga", f, rgb, a, DRAWFLAG_ADDITIVE);
+               }
+
                // crosshair goes VERY LAST
                if(!scoreboard_active && !camera_active && intermission != 2) {
                        // TrueAim check
index ed8f84fc28bf128c3b2e340cb0e9c2233bb5307f..5c377bffadb8ade59c381071def85021d3181ba8 100644 (file)
@@ -650,3 +650,153 @@ void PolyDrawModel(entity e)
                }
        }
 }
+
+void DrawCircleClippedPic(vector centre, float radius, string pic, float f, vector rgb, float a, float drawflag)
+{
+       float x, y, q, d;
+       vector ringsize, v, t;
+       ringsize = radius * '1 1 0';
+
+       x = cos(f * 2 * M_PI);
+       y = sin(f * 2 * M_PI);
+       q = fabs(x) + fabs(y);
+       x /= q;
+       y /= q;
+
+       if(f >= 1)
+       {
+               // draw full rectangle
+               R_BeginPolygon(pic, drawflag);
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x += 0.5 * ringsize_x;        t += '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_y += 0.5 * ringsize_y;        t += '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x -= 0.5 * ringsize_x;        t -= '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_y -= 0.5 * ringsize_y;        t -= '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+               R_EndPolygon();
+
+               d = q - 1;
+               if(d > 0)
+               {
+                       R_BeginPolygon(pic, drawflag);
+                               v = centre;                     t = '0.5 0.5 0';
+                               R_PolygonVertex(v, t, rgb, a);
+
+                               v = centre;                     t = '0.5 0.5 0';
+                               v_x += 0.5 * ringsize_x;        t += '0.5 0.5 0';
+                               R_PolygonVertex(v, t, rgb, a);
+               }
+       }
+       else if(f > 0.75)
+       {
+               // draw upper and first triangle
+               R_BeginPolygon(pic, drawflag);
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x += 0.5 * ringsize_x;        t += '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_y += 0.5 * ringsize_y;        t += '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x -= 0.5 * ringsize_x;        t -= '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+               R_EndPolygon();
+               R_BeginPolygon(pic, drawflag);
+                       v = centre;                     t = '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x -= 0.5 * ringsize_x;        t -= '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_y -= 0.5 * ringsize_y;        t -= '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+               d = q - 0.75;
+               if(d <= 0)
+                       R_EndPolygon();
+       }
+       else if(f > 0.5)
+       {
+               // draw upper triangle
+               R_BeginPolygon(pic, drawflag);
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x += 0.5 * ringsize_x;        t += '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_y += 0.5 * ringsize_y;        t += '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x -= 0.5 * ringsize_x;        t -= '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+               R_EndPolygon();
+
+               d = q - 0.5;
+               if(d > 0)
+               {
+                       R_BeginPolygon(pic, drawflag);
+                               v = centre;                     t = '0.5 0.5 0';
+                               R_PolygonVertex(v, t, rgb, a);
+
+                               v = centre;                     t = '0.5 0.5 0';
+                               v_x -= 0.5 * ringsize_x;        t -= '0.5 0.5 0';
+                               R_PolygonVertex(v, t, rgb, a);
+               }
+       }
+       else if(f > 0.25)
+       {
+               // draw first triangle
+               R_BeginPolygon(pic, drawflag);
+                       v = centre;                     t = '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x += 0.5 * ringsize_x;        t += '0.5 0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_y += 0.5 * ringsize_y;        t += '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+
+               d = q - 0.25;
+               if(d <= 0)
+                       R_EndPolygon();
+       }
+       else
+       {
+               d = q;
+               if(d > 0)
+               {
+                       R_BeginPolygon(pic, drawflag);
+                               v = centre;                     t = '0.5 0.5 0';
+                               R_PolygonVertex(v, t, rgb, a);
+
+                               v = centre;                     t = '0.5 0.5 0';
+                               v_x += 0.5 * ringsize_x;        t += '0.5 0.5 0';
+                               R_PolygonVertex(v, t, rgb, a);
+               }
+       }
+
+       if(d > 0)
+       {
+                       v = centre;                     t = '0.5 0.5 0';
+                       v_x += x * 0.5 * ringsize_x;    t += x * '0.5 0.5 0';
+                       v_y += y * 0.5 * ringsize_y;    t += y * '0.5 -0.5 0';
+                       R_PolygonVertex(v, t, rgb, a);
+               R_EndPolygon();
+       }
+}
index 5ebeb54659e4ba7e936c0666077f967fa5cd22b5..ddd24ed6bc887322941d6503ab314f0f9a0b7ab4 100644 (file)
@@ -61,6 +61,7 @@ const float TE_CSQC_NOTIFY = 112;
 const float TE_CSQC_WEAPONCOMPLAIN = 113;
 const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115;
 const float TE_CSQC_NEX_SCOPE = 116;
+const float TE_CSQC_NEX_VELOCITY = 117;
 
 const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const float RACE_NET_CHECKPOINT_CLEAR = 1;
index 3cbec876133800b150f002fbc6b6ca7f5fb7dcd6..4f3640e26eac35786e17dea56cdb15bdef6c97c7 100644 (file)
@@ -16,7 +16,7 @@ entity waypoint_spawn(vector m1, vector m2, float f)
        }
 
        w = spawn();
-       w.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+       w.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
        w.classname = "waypoint";
        w.wpflags = f;
        setorigin(w, (m1 + m2) * 0.5);
index 06fbb72895acf2cfd9628d30f1241d0cb329a89f..bf542ab34f8a4f8dc012a369d0dcf41a684a9dd0 100644 (file)
@@ -6,6 +6,14 @@ void send_CSQC_teamnagger() {
        WriteByte(0, TE_CSQC_TEAMNAGGER);
 }
 
+void send_CSQC_nexvelocity(entity e) {
+       msg_entity = e;
+       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+       WriteByte(MSG_ONE, TE_CSQC_NEX_VELOCITY);
+       WriteShort(MSG_ONE, cvar("g_balance_nex_velocitydependent_minspeed"));
+       WriteShort(MSG_ONE, cvar("g_balance_nex_velocitydependent_maxspeed"));
+}
+
 void Announce(string snd) {
        WriteByte(MSG_ALL, SVC_TEMPENTITY);
        WriteByte(MSG_ALL, TE_CSQC_ANNOUNCE);
@@ -866,10 +874,11 @@ void PutClientInServer (void)
                self.iscreature = TRUE;
                self.movetype = MOVETYPE_WALK;
                self.solid = SOLID_SLIDEBOX;
+               self.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID;
                if(cvar("g_playerclip_collisions"))
-                       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
-               else
-                       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY;
+                       self.dphitcontentsmask |= DPCONTENTS_PLAYERCLIP;
+               if(clienttype(self) == CLIENTTYPE_BOT && cvar("g_botclip_collisions"))
+                       self.dphitcontentsmask |= DPCONTENTS_BOTCLIP;
                self.frags = FRAGS_PLAYER;
                if(independent_players)
                        MAKE_INDEPENDENT_PLAYER(self);
@@ -1587,6 +1596,8 @@ void ClientConnect (void)
        else if(cvar("sv_teamnagger") && !(cvar("bot_vs_human") && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca
                send_CSQC_teamnagger();
 
+       send_CSQC_nexvelocity(self);
+
        CheatInitClient();
 }
 
index 6e314c88efd50f223f1c6ef15a8a1ae2a7c721e6..8c0844b2246f26107bfccc482bfaed52909f65ce 100644 (file)
@@ -188,7 +188,7 @@ void place_flag()
        self.nextthink = time + 0.1;
        self.cnt = FLAG_BASE;
        self.mangle = self.angles;
-       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
        //self.effects = self.effects | EF_DIMLIGHT;
        if(self.noalign)
        {
index 1240aea6e977b615fc270d1ab38cd361d6416a9e..293a9b4e40497cf4a2302ecf3da74bd1e11c500d 100644 (file)
@@ -345,29 +345,45 @@ float Ban_GetClientIP(entity client)
 
        i1 = strstrofs(s, ".", 0);
        if(i1 < 0)
-               i1 = strstrofs(s, ":", 0);
-       if(i1 < 0)
-               return FALSE;
+               goto ipv6;
        i2 = strstrofs(s, ".", i1 + 1);
-       if(i2 < 0)
-               i2 = strstrofs(s, ":", i1 + 1);
        if(i2 < 0)
                return FALSE;
        i3 = strstrofs(s, ".", i2 + 1);
-       if(i3 < 0)
-               i3 = strstrofs(s, ":", i2 + 1);
        if(i3 < 0)
                return FALSE;
        i4 = strstrofs(s, ".", i3 + 1);
-       if(i4 < 0)
-               i4 = strstrofs(s, ":", i3 + 1);
        if(i4 >= 0)
                s = substring(s, 0, i4);
+       
+       ban_ip1 = substring(s, 0, i1); // 8
+       ban_ip2 = substring(s, 0, i2); // 16
+       ban_ip3 = substring(s, 0, i3); // 24
+       ban_ip4 = strcat1(s); // 32
+       return TRUE;
 
-       ban_ip1 = substring(s, 0, i1);
-       ban_ip2 = substring(s, 0, i2);
-       ban_ip3 = substring(s, 0, i3);
-       ban_ip4 = strcat1(s);
+:ipv6
+       i1 = strstrofs(s, ":", 0);
+       if(i1 < 0)
+               return FALSE;
+       i1 = strstrofs(s, ":", i1 + 1);
+       if(i1 < 0)
+               return FALSE;
+       i2 = strstrofs(s, ":", i1 + 1);
+       if(i2 < 0)
+               return FALSE;
+       i3 = strstrofs(s, ":", i2 + 1);
+       if(i3 < 0)
+               return FALSE;
+
+       ban_ip1 = strcat(substring(s, 0, i1), "::/32"); // 32
+       ban_ip2 = strcat(substring(s, 0, i2), "::/48"); // 48
+       ban_ip4 = strcat(substring(s, 0, i3), "::/64"); // 64
+
+       if(i3 - i2 > 3) // means there is more than 2 digits and a : in the range
+               ban_ip3 = strcat(substring(s, 0, i2), ":", substring(s, i2 + 1, i3 - i2 - 3), "00::/56");
+       else
+               ban_ip3 = strcat(substring(s, 0, i2), ":0::/56");
 
        return TRUE;
 }
index cdc4a076f6c5ae5014255b8095852eb6333d5c9f..2b6f54780e51ff98fea12f6c6527e541eba307e5 100644 (file)
@@ -750,7 +750,7 @@ void kh_Key_Spawn(entity initial_owner, float angle, float i)  // runs every tim
        key.modelindex = kh_key_dropped;
        key.model = "key";
        key.kh_dropperteam = 0;
-       key.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+       key.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
        setsize(key, KH_KEY_MIN, KH_KEY_MAX);
        key.colormod = TeamColor(initial_owner.team) * KH_KEY_BRIGHTNESS;
        key.reset = key_reset;
index 84b98b525cd3bec1be709072ffc73478cf8f951d..0bc08b8de77f2b2a6d84c9603d571bac6188421e 100644 (file)
@@ -2,6 +2,9 @@
 REGISTER_WEAPON(GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "gl", "grenadelauncher", "Mortar");
 #else
 #ifdef SVQC
+.float gl_detonate_later;
+.float gl_bouncecnt;
+
 void W_Grenade_Explode (void)
 {
        if(other.takedamage == DAMAGE_AIM)
@@ -52,10 +55,47 @@ void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float de
        }
 }
 
+void W_Grenade_Think1 (void)
+{
+       self.nextthink = time;
+       if (time > self.cnt)
+       {
+               other = world;
+               self.projectiledeathtype |= HITTYPE_BOUNCE;
+               W_Grenade_Explode ();
+               return;
+       }
+       if(self.gl_detonate_later && self.gl_bouncecnt >= cvar("g_balance_grenadelauncher_primary_remote_minbouncecnt"))
+               W_Grenade_Explode();
+}
+
 void W_Grenade_Touch1 (void)
 {
        PROJECTILE_TOUCH;
-       if(cvar("g_balance_grenadelauncher_primary_sticky") && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE)))
+       if (other.takedamage == DAMAGE_AIM || cvar("g_balance_grenadelauncher_primary_type") == 0) // always explode when hitting a player, or if normal mortar projectile
+       {
+               self.use ();
+       }
+       else if (cvar("g_balance_grenadelauncher_primary_type") == 1) // bounce
+       {
+               float r;
+               r = random() * 6;
+               if(r < 1)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 2)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 3)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 4)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 5)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
+               else
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
+               self.projectiledeathtype |= HITTYPE_BOUNCE;
+               self.gl_bouncecnt += 1;
+       }
+       else if(cvar("g_balance_grenadelauncher_primary_type") == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
        {
                spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
 
@@ -71,14 +111,35 @@ void W_Grenade_Touch1 (void)
 
                self.nextthink = min(self.nextthink, time + cvar("g_balance_grenadelauncher_primary_lifetime2"));
        }
-       else
-               W_Grenade_Explode ();
 }
 
 void W_Grenade_Touch2 (void)
 {
        PROJECTILE_TOUCH;
-       if(cvar("g_balance_grenadelauncher_secondary_sticky") && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE)))
+       if (other.takedamage == DAMAGE_AIM || cvar("g_balance_grenadelauncher_secondary_type") == 0) // always explode when hitting a player, or if normal mortar projectile
+       {
+               self.use ();
+       }
+       else if (cvar("g_balance_grenadelauncher_secondary_type") == 1) // bounce
+       {
+               float r;
+               r = random() * 6;
+               if(r < 1)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 2)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 3)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 4)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
+               else if(r < 5)
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
+               else
+                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
+               self.projectiledeathtype |= HITTYPE_BOUNCE;
+               self.gl_bouncecnt += 1;
+       }
+       else if(cvar("g_balance_grenadelauncher_secondary_type") == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
        {
                spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
 
@@ -94,31 +155,6 @@ void W_Grenade_Touch2 (void)
 
                self.nextthink = min(self.nextthink, time + cvar("g_balance_grenadelauncher_secondary_lifetime2"));
        }
-       else
-       {
-               if (cvar("g_balance_grenadelauncher_secondary_sticky") || other.takedamage == DAMAGE_AIM)
-               {
-                       self.use ();
-               }
-               else
-               {
-                       float r;
-                       r = random() * 6;
-                       if(r < 1)
-                               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
-                       else if(r < 2)
-                               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
-                       else if(r < 3)
-                               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
-                       else if(r < 4)
-                               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
-                       else if(r < 5)
-                               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
-                       else
-                               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
-                       self.projectiledeathtype |= HITTYPE_BOUNCE;
-               }
-       }
 }
 
 void W_Grenade_Attack (void)
@@ -138,25 +174,32 @@ void W_Grenade_Attack (void)
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage");
        gren.movetype = MOVETYPE_BOUNCE;
+       gren.bouncefactor = cvar("g_balance_grenadelauncher_primary_bouncefactor");
+       gren.bouncestop = cvar("g_balance_grenadelauncher_primary_bouncestop");
        PROJECTILE_MAKETRIGGER(gren);
        gren.projectiledeathtype = WEP_GRENADE_LAUNCHER;
        setorigin(gren, w_shotorg);
        setsize(gren, '-3 -3 -3', '3 3 3');
 
-       gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime");
-       gren.think = adaptor_think2use_hittype_splash;
+       gren.cnt = time + cvar("g_balance_grenadelauncher_primary_lifetime");
+       gren.nextthink = time;
+       gren.think = W_Grenade_Think1;
        gren.use = W_Grenade_Explode;
        gren.touch = W_Grenade_Touch1;
 
        gren.takedamage = DAMAGE_YES;
        gren.health = cvar("g_balance_grenadelauncher_primary_health");
+       gren.damageforcescale = cvar("g_balance_grenadelauncher_primary_damageforcescale");
        gren.event_damage = W_Grenade_Damage;
        W_SETUPPROJECTILEVELOCITY_UP(gren, g_balance_grenadelauncher_primary);
 
        gren.angles = vectoangles (gren.velocity);
        gren.flags = FL_PROJECTILE;
 
-       CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);   
+       if(cvar("g_balance_grenadelauncher_primary_type") == 0 || cvar("g_balance_grenadelauncher_primary_type") == 2)
+               CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
+       else
+               CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
 }
 
 void W_Grenade_Attack2 (void)
@@ -197,7 +240,7 @@ void W_Grenade_Attack2 (void)
        gren.angles = vectoangles (gren.velocity);
        gren.flags = FL_PROJECTILE;
 
-       if(cvar("g_balance_grenadelauncher_secondary_sticky"))
+       if(cvar("g_balance_grenadelauncher_secondary_type") == 0 || cvar("g_balance_grenadelauncher_secondary_type") == 2)
                CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
        else
                CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
@@ -211,6 +254,9 @@ void spawnfunc_weapon_grenadelauncher (void)
 .float bot_secondary_grenademooth;
 float w_glauncher(float req)
 {
+       entity nade;
+       float nadefound;
+
        if (req == WR_AIM)
        {
                self.BUTTON_ATCK = FALSE;
@@ -237,17 +283,30 @@ float w_glauncher(float req)
                if (self.BUTTON_ATCK)
                if (weapon_prepareattack(0, cvar("g_balance_grenadelauncher_primary_refire")))
                {
-                       if(cvar("g_balance_grenadelauncher_primary2secondary"))
-                               W_Grenade_Attack2();
-                       else
-                               W_Grenade_Attack();
+                       W_Grenade_Attack();
                        weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_grenadelauncher_primary_animtime"), w_ready);
                }
-               if (self.BUTTON_ATCK2 && !cvar("g_balance_grenadelauncher_primary2secondary"))
-               if (weapon_prepareattack(1, cvar("g_balance_grenadelauncher_secondary_refire")))
+               if (self.BUTTON_ATCK2)
                {
-                       W_Grenade_Attack2();
-                       weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grenadelauncher_secondary_animtime"), w_ready);
+                       if (cvar("g_balance_grenadelauncher_secondary_remote_detonateprimary"))
+                       {
+                               nadefound = 0;
+                               for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.owner == self)
+                               {
+                                       if(!nade.gl_detonate_later)
+                                       {
+                                               nade.gl_detonate_later = TRUE;
+                                               nadefound = 1;
+                                       }
+                               }
+                               if(nadefound)
+                                       sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
+                       }
+                       else if (weapon_prepareattack(1, cvar("g_balance_grenadelauncher_secondary_refire")))
+                       {
+                               W_Grenade_Attack2();
+                               weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grenadelauncher_secondary_animtime"), w_ready);
+                       }
                }
        }
        else if (req == WR_PRECACHE)
index a6ec07d6a819791392f8716325d6556900668445..8acf9f4c6b12c90727bf1d357f3e06eb8f873e93 100644 (file)
@@ -18,7 +18,7 @@ void SendCSQCNexBeamParticle() {
 
 void W_Nex_Attack (float issecondary)
 {
-       float mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, myammo;
+       float mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, myammo, f;
        if(issecondary)
        {
                mydmg = cvar("g_balance_nex_secondary_damage");
@@ -43,6 +43,12 @@ void W_Nex_Attack (float issecondary)
        float flying;
        flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
 
+       f = ExponentialFalloff(cvar("g_balance_nex_velocitydependent_minspeed"), cvar("g_balance_nex_velocitydependent_maxspeed"), cvar("g_balance_nex_velocitydependent_halflife"), vlen('1 0 0' * self.velocity_x + '0 1 0' * self.velocity_y));
+
+       // TODO: make it more obvious (through effects, indicator on weapon) that damage increases when speed increases
+       mydmg *= f;
+       myforce *= f;
+
        W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", mydmg);
 
        yoda = 0;