]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote branch 'origin/fruitiex/fbfix'
authorRudolf Polzer <divverent@alientrap.org>
Thu, 18 Nov 2010 06:21:25 +0000 (07:21 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Thu, 18 Nov 2010 06:21:25 +0000 (07:21 +0100)
16 files changed:
balance25.cfg
balanceLeeStricklin.cfg
balanceNexSVN.cfg
balanceSamual.cfg
balanceTest.cfg
balanceXonotic.cfg
balancetZork.cfg
defaultXonotic.cfg
qcsrc/client/View.qc
qcsrc/client/csqc_constants.qc
qcsrc/common/constants.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/defs.qh
qcsrc/server/g_world.qc
qcsrc/server/w_nex.qc

index 001572fe589b5ee33f24286d85038b7df27df4e8..9ca249253593162976f5a0badcba4ecfaacd8783 100644 (file)
@@ -461,6 +461,10 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 0
 set g_balance_nex_secondary 0
 set g_balance_nex_secondary_charge 0
 set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_charge_pool 0
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 100
 set g_balance_nex_secondary_force 600
 set g_balance_nex_secondary_refire 1.5
index 62847823ff8d9849e6ab543b1ce45299992c1197..97fd210cc8f94bad17a41c777bab56fcc0f4a033 100644 (file)
@@ -472,6 +472,10 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 9999999
 set g_balance_nex_secondary 0
 set g_balance_nex_secondary_charge 0
 set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_charge_pool 0
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 80
 set g_balance_nex_secondary_force -500
 set g_balance_nex_secondary_refire 1.25
index e4c4a69d182c2c80305399538503410e2eeb7736..5108942388101cc2da3e673419226778649e6c99 100644 (file)
@@ -460,6 +460,10 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 1500
 set g_balance_nex_secondary 0
 set g_balance_nex_secondary_charge 0
 set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_charge_pool 0
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 90
 set g_balance_nex_secondary_force 200
 set g_balance_nex_secondary_refire 1.5
index b82fa6632e83386fd6359c473631ddcc4236f7c4..76b46fd652ceee6060fea45bccd191c284d985c7 100644 (file)
@@ -461,6 +461,10 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 1500
 set g_balance_nex_secondary 0
 set g_balance_nex_secondary_charge 0
 set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_charge_pool 0
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 0
 set g_balance_nex_secondary_force 0
 set g_balance_nex_secondary_refire 0
index e9b797ef59b5a44a1a988404bb451ea377a8fff3..91cfe1f3c19f49348e61af9224d0ae1ed3a255a9 100644 (file)
@@ -461,11 +461,15 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 0
 set g_balance_nex_secondary 1
 set g_balance_nex_secondary_charge 1
 set g_balance_nex_secondary_charge_rate 0.55
+set g_balance_nex_secondary_charge_pool 0
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 100
 set g_balance_nex_secondary_force 600
 set g_balance_nex_secondary_refire 1.5
 set g_balance_nex_secondary_animtime 0.3
-set g_balance_nex_secondary_ammo 5
+set g_balance_nex_secondary_ammo 0
 set g_balance_nex_secondary_damagefalloff_mindist 0
 set g_balance_nex_secondary_damagefalloff_maxdist 0
 set g_balance_nex_secondary_damagefalloff_halflife 0
index de110e3d5449f44ec48cd623c41ae85a3c5d29e7..0d79340641ec5db2d392f83465fea5cd06483cb0 100644 (file)
@@ -294,7 +294,7 @@ set g_balance_grenadelauncher_primary_damage 50
 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 1200
+set g_balance_grenadelauncher_primary_speed 1500
 set g_balance_grenadelauncher_primary_speed_up 225
 set g_balance_grenadelauncher_primary_speed_z 0
 set g_balance_grenadelauncher_primary_spread 0
@@ -312,7 +312,7 @@ set g_balance_grenadelauncher_secondary_damage 70
 set g_balance_grenadelauncher_secondary_edgedamage 32
 set g_balance_grenadelauncher_secondary_force 300
 set g_balance_grenadelauncher_secondary_radius 150
-set g_balance_grenadelauncher_secondary_speed 1200
+set g_balance_grenadelauncher_secondary_speed 1500
 set g_balance_grenadelauncher_secondary_speed_up 225
 set g_balance_grenadelauncher_secondary_speed_z 0
 set g_balance_grenadelauncher_secondary_spread 0
@@ -413,7 +413,7 @@ set g_balance_crylink_primary_joinexplode_damage 0
 set g_balance_crylink_primary_joinexplode_edgedamage 0
 set g_balance_crylink_primary_joinexplode_radius 0
 set g_balance_crylink_primary_joinexplode_force 0
-set g_balance_crylink_primary_linkexplode 0
+set g_balance_crylink_primary_linkexplode 1
 
 set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
 set g_balance_crylink_primary_middle_fadetime 5
@@ -451,36 +451,40 @@ set g_balance_crylink_secondary_line_fadetime 2
 set g_balance_nex_primary_damage 100
 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_animtime 0.4
 set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 1000
-set g_balance_nex_primary_damagefalloff_maxdist 3000
-set g_balance_nex_primary_damagefalloff_halflife 1000
-set g_balance_nex_primary_damagefalloff_forcehalflife 2000
+set g_balance_nex_primary_damagefalloff_mindist 0
+set g_balance_nex_primary_damagefalloff_maxdist 0
+set g_balance_nex_primary_damagefalloff_halflife 0
+set g_balance_nex_primary_damagefalloff_forcehalflife 0
 
 set g_balance_nex_secondary 1
 set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.125
+set g_balance_nex_secondary_charge_rate 0.55
+set g_balance_nex_secondary_charge_pool 1
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 0
 set g_balance_nex_secondary_force 0
 set g_balance_nex_secondary_refire 0
 set g_balance_nex_secondary_animtime 0
-set g_balance_nex_secondary_ammo 2
+set g_balance_nex_secondary_ammo 0.25 // full charge pool is 1, so it depletes in 4 secs
 set g_balance_nex_secondary_damagefalloff_mindist 0
 set g_balance_nex_secondary_damagefalloff_maxdist 0
 set g_balance_nex_secondary_damagefalloff_halflife 0
 set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 
 set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 40
+set g_balance_nex_charge_mindmg 30
 set g_balance_nex_charge_start 0.5
-set g_balance_nex_charge_rate 0.05
+set g_balance_nex_charge_rate 0.6
 set g_balance_nex_charge_limit 0.5
-set g_balance_nex_charge_rot_rate 0.01
-set g_balance_nex_charge_rot_pause 0 // Dont rot down untill this long after release of charge button
-set g_balance_nex_charge_shot_multiplier 0.675
-set g_balance_nex_charge_velocity_rate 0.2
-set g_balance_nex_charge_minspeed 400
+set g_balance_nex_charge_rot_rate 0.1
+set g_balance_nex_charge_rot_pause 1 // Dont rot down until this long after release of charge button
+set g_balance_nex_charge_shot_multiplier 0
+set g_balance_nex_charge_velocity_rate 0
+set g_balance_nex_charge_minspeed 600
 set g_balance_nex_charge_maxspeed 1000
 // }}}
 // {{{ minstanex
@@ -515,9 +519,9 @@ set g_balance_rocketlauncher_damage 90
 set g_balance_rocketlauncher_edgedamage 33
 set g_balance_rocketlauncher_force 350
 set g_balance_rocketlauncher_radius 125
-set g_balance_rocketlauncher_speed 1000
+set g_balance_rocketlauncher_speed 1080
 set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
+set g_balance_rocketlauncher_speedstart 1080
 set g_balance_rocketlauncher_lifetime 5
 set g_balance_rocketlauncher_refire 1
 set g_balance_rocketlauncher_animtime 0.4
index e1183bc8e51abf2253599c7d717dae196bff4e67..c4a766a3590491feb8a47b08c245245165dfae03 100644 (file)
@@ -482,6 +482,10 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 0
 set g_balance_nex_secondary 1
 set g_balance_nex_secondary_charge 1
 set g_balance_nex_secondary_charge_rate 0.55
+set g_balance_nex_secondary_charge_pool 0
+set g_balance_nex_secondary_charge_pool_regen 0.15
+set g_balance_nex_secondary_charge_pool_pause_regen 1
+set g_balance_nex_secondary_charge_pool_pause_health_regen 1
 set g_balance_nex_secondary_damage 100
 set g_balance_nex_secondary_force 600
 set g_balance_nex_secondary_refire 1.5
index fd3bd114fc2377c20629f50f32269e4240012137..0c96872bdd4382084d4cea46c71546620e99de60 100644 (file)
@@ -178,16 +178,19 @@ seta crosshair_fireball ""        "crosshair to display when wielding the fireball"
 seta crosshair_fireball_color "0.2 1.0 0.2"    "crosshair color to display when wielding the fireball"
 seta crosshair_fireball_alpha 1        "crosshair alpha value to display when wielding the fireball"
 seta crosshair_fireball_size 1 "crosshair size when wielding the fireball"
+
+// ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
 seta crosshair_ring_size 2     "bullet counter ring size for Rifle, velocity ring for Nex"
-seta crosshair_campingrifle_bulletcounter_alpha 0.15
 
-seta crosshair_nexvelocity_alpha 0.15
-seta crosshair_nexvelocity_currentcharge_scale 30
-seta crosshair_nexvelocity_currentcharge_alpha 0.15
-seta crosshair_nexvelocity_currentcharge_color_red 0.8
-seta crosshair_nexvelocity_currentcharge_color_green 0
-seta crosshair_nexvelocity_currentcharge_color_blue 0
-seta crosshair_nexvelocity_currentcharge_movingavg_rate 0.05
+seta crosshair_ring_campingrifle_alpha 0.15
+
+seta crosshair_ring_nex_outer_alpha 0.15
+seta crosshair_ring_nex_inner_alpha 0.15
+seta crosshair_ring_nex_inner_color_red 0.8
+seta crosshair_ring_nex_inner_color_green 0
+seta crosshair_ring_nex_inner_color_blue 0
+seta crosshair_ring_nex_currentcharge_scale 30
+seta crosshair_ring_nex_currentcharge_movingavg_rate 0.05
 
 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"
@@ -484,8 +487,7 @@ set g_minstagib_extralives 2        "how many extra lives you will get per powerup"
 set g_minstagib_ammo_start 10  "starting ammo"
 set g_minstagib_ammo_drop 5    "how much ammo you'll get for weapons or cells"
 set g_minstagib_invis_alpha 0.15
-set g_minstagib_speed_jumpheight 1.8 "jump height multiplier that applies while you carry the invincibility powerup"
-set g_minstagib_speed_moverate 1.25 "speed-multiplier that applies while you carry the invincibility powerup"
+set g_minstagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup"
 set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health"
 set g_weaponarena "0"  "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
 set g_weaponarena_random "0"   "if set to a number, only that weapon count is given on every spawn (randomly)"
@@ -711,12 +713,9 @@ set g_balance_rune_regen_combo_limitmod                    1
 set g_balance_rune_speed_atkrate                               0.66
 set g_balance_curse_slow_atkrate                               1.5
 set g_balance_rune_speed_combo_atkrate                 1.2
-set g_balance_rune_speed_moverate                      1.25
-set g_balance_curse_slow_moverate                      0.8
-set g_balance_rune_speed_combo_moverate                        0.9
-set g_balance_rune_speed_jumpheight                    1.4
-set g_balance_curse_slow_jumpheight                    1.0
-set g_balance_rune_speed_combo_jumpheight              1.0
+set g_balance_rune_speed_highspeed                     1.5
+set g_balance_curse_slow_highspeed                     0.6
+set g_balance_rune_speed_combo_highspeed                       0.9
 
 // domination
 set g_domination                       0 "Domination: capture and hold control points to gain points"
@@ -812,7 +811,7 @@ set g_nexball_basketball_delay_hold           20    "time before a player who ca
 set g_nexball_basketball_delay_hold_forteam   60    "time before a ball reset when a team holds the ball for too long"
 set g_nexball_basketball_teamsteal             1    "1 to allow players to steal from teammates, 0 to disallow"
 
-set g_nexball_basketball_carrier_speed         0.9  "speed multiplier for the ballcarrier"
+set g_nexball_basketball_carrier_highspeed         0.8  "speed multiplier for the ballcarrier"
 
 set g_nexball_meter_period                  1    "time to make a full cycle on the power meter"
 set g_nexball_basketball_meter              1    "use the power meter for basketball"
index 119941ad2c017ace633f6089070b4bca09ffa093..2d9bc563fb8027a70880e533ee6ea593e8e0dc90 100644 (file)
@@ -350,6 +350,7 @@ vector freeze_pmove_org, freeze_input_angles;
 entity nightvision_noise, nightvision_noise2;
 
 float pickup_crosshair_time, pickup_crosshair_size;
+float use_nex_charge_pool;
 
 void CSQC_UpdateView(float w, float h)
 {
@@ -853,8 +854,9 @@ void CSQC_UpdateView(float w, float h)
 
                        wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
 
-                       float nex_charge;
+                       float nex_charge, nex_charge_pool;
                        nex_charge = getstatf(STAT_NEX_CHARGE);
+                       nex_charge_pool = getstatf(STAT_NEX_CHARGEPOOL);
 
                        if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
                                nex_charge_movingavg = nex_charge;
@@ -865,21 +867,32 @@ void CSQC_UpdateView(float w, float h)
                                bullets = getstati(STAT_BULLETS_LOADED);
                                f = bound(0, bullets / cr_maxbullets, 1);
 
-                               a = cvar("crosshair_campingrifle_bulletcounter_alpha");
+                               a = cvar("crosshair_ring_campingrifle_alpha");
                                DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", f, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE);
                        }
                        else if (activeweapon == WEP_NEX && nex_charge) // ring around crosshair representing velocity-dependent damage for the nex
                        {
                                vector rgb;
-                               // indicate how much we're charging right now with an inner circle
-                               a = cvar("crosshair_nexvelocity_currentcharge_alpha");
-                               nex_charge_movingavg = (1 - cvar("crosshair_nexvelocity_currentcharge_movingavg_rate")) * nex_charge_movingavg + cvar("crosshair_nexvelocity_currentcharge_movingavg_rate") * nex_charge;
+                               if(nex_charge_pool || use_nex_charge_pool)
+                               {
+                                       use_nex_charge_pool = 1;
+
+                                       a = cvar("crosshair_ring_nex_inner_alpha");
+                                       rgb = eX * cvar("crosshair_ring_nex_inner_color_red") + eY * cvar("crosshair_ring_nex_inner_color_green") + eZ * cvar("crosshair_ring_nex_inner_color_blue");
+                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", nex_charge_pool, rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+                               }
+                               else
+                               {
+                                       // indicate how much we're charging right now with an inner circle
+                                       a = cvar("crosshair_ring_nex_inner_alpha");
+                                       nex_charge_movingavg = (1 - cvar("crosshair_ring_nex_currentcharge_movingavg_rate")) * nex_charge_movingavg + cvar("crosshair_ring_nex_currentcharge_movingavg_rate") * nex_charge;
 
-                               rgb = eX * cvar("crosshair_nexvelocity_currentcharge_color_red") + eY * cvar("crosshair_nexvelocity_currentcharge_color_green") + eZ * cvar("crosshair_nexvelocity_currentcharge_color_blue");
-                               DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, cvar("crosshair_nexvelocity_currentcharge_scale") * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+                                       rgb = eX * cvar("crosshair_ring_nex_inner_color_red") + eY * cvar("crosshair_ring_nex_inner_color_green") + eZ * cvar("crosshair_ring_nex_inner_color_blue");
+                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, cvar("crosshair_ring_nex_currentcharge_scale") * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+                               }
 
                                // draw the charge
-                               a = cvar("crosshair_nexvelocity_alpha");
+                               a = cvar("crosshair_ring_nex_outer_alpha");
                                DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", nex_charge, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE);
                        }
 
index 2b2e674c603a2b938aa0f30984ae861a3806be6c..93051cc4d15f423dbe1883a9fb217444437a4b04 100644 (file)
@@ -63,7 +63,6 @@ const float           STAT_MOVEVARS_TIMESCALE         = 241;
 const float            STAT_FRAGLIMIT                                  = 235;
 const float            STAT_TIMELIMIT                                  = 236;
 const float     STAT_MOVEVARS_GRAVITY           = 242;
-const float     STAT_MOVEVARS_MAXSPEED          = 244;
 
 // Sound Constants
 //const float          CHAN_AUTO                                               = 0;
index 4acf797b7dddfc7974315f23c4f5e506d2a7e500..87484cd8f31c7902cf52e2ed1f69e458b9b7193d 100644 (file)
@@ -310,12 +310,14 @@ const float STAT_SHOTORG = 46; // compressShotOrigin
 const float STAT_LEADLIMIT = 47;
 const float STAT_BULLETS_LOADED = 48;
 const float STAT_NEX_CHARGE = 49;
-const float    STAT_LAST_PICKUP = 50;
+const float STAT_LAST_PICKUP = 50;
 const float STAT_HUD = 51;
+const float STAT_NEX_CHARGEPOOL = 52;
 
 // see DP source, quakedef.h
 const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
 const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223;
+const float STAT_MOVEVARS_MAXSPEED = 244;
 const float STAT_MOVEVARS_AIRACCEL_QW = 254;
 
 const float CTF_STATE_ATTACK = 1;
index e3507d6413a8e54b4e57a4fd4fba36104916fa47..3d06f58718b22da56d8bb07432bc266df9b81a43 100644 (file)
@@ -599,6 +599,7 @@ void PutObserverInServer (void)
        }
 
        DropAllRunes(self);
+       MUTATOR_CALLHOOK(MakePlayerObserver);
 
        Portal_ClearAll(self);
 
@@ -713,8 +714,6 @@ void PutObserverInServer (void)
        }
        else
                self.frags = FRAGS_SPECTATOR;
-
-       MUTATOR_CALLHOOK(MakePlayerObserver);
 }
 
 float RestrictSkin(float s)
@@ -890,7 +889,11 @@ void PutClientInServer (void)
                self.air_finished = time + 12;
                self.dmg = 2;
                if(cvar("g_balance_nex_charge"))
+               {
+                       if(cvar("g_balance_nex_secondary_charge_pool"))
+                               self.nex_charge_pool_ammo = 1;
                        self.nex_charge = cvar("g_balance_nex_charge_start");
+               }
 
                if(inWarmupStage)
                {
index efc9118ea85eebfcfbe6b2fb199d327c34328928..e9d1932302f737db6d350019ef9b7300190ce045 100644 (file)
@@ -130,26 +130,6 @@ void PlayerJump (void)
        if(self.health <= g_bloodloss)
                return;
 
-       if(g_runematch)
-       {
-               if(self.runes & RUNE_SPEED)
-               {
-                       if(self.runes & CURSE_SLOW)
-                               mjumpheight = mjumpheight * cvar("g_balance_rune_speed_combo_jumpheight");
-                       else
-                               mjumpheight = mjumpheight * cvar("g_balance_rune_speed_jumpheight");
-               }
-               else if(self.runes & CURSE_SLOW)
-               {
-                       mjumpheight = mjumpheight * cvar("g_balance_curse_slow_jumpheight");
-               }
-       }
-
-       if(g_minstagib && (self.items & IT_INVINCIBLE))
-       {
-               mjumpheight = mjumpheight * cvar("g_minstagib_speed_jumpheight");
-       }
-
        // sv_jumpspeedcap_min/sv_jumpspeedcap_max act as baseline
        // velocity bounds.  Final velocity is bound between (jumpheight *
        // min + jumpheight) and (jumpheight * max + jumpheight);
@@ -270,8 +250,8 @@ void RaceCarPhysics()
        vector angles_save, rigvel;
 
        angles_save = self.angles;
-       accel = bound(-1, self.movement_x / sv_maxspeed, 1);
-       steer = bound(-1, self.movement_y / sv_maxspeed, 1);
+       accel = bound(-1, self.movement_x / self.stat_sv_maxspeed, 1);
+       steer = bound(-1, self.movement_y / self.stat_sv_maxspeed, 1);
 
        if(g_bugrigs_reverse_speeding)
        {
@@ -625,19 +605,19 @@ void PM_AirAccelerate(vector wishdir, float wishspeed)
 
        if(wishspeed > curspeed * 1.01)
        {
-               wishspeed = min(wishspeed, curspeed + sv_warsowbunny_airforwardaccel * sv_maxspeed * frametime);
+               wishspeed = min(wishspeed, curspeed + sv_warsowbunny_airforwardaccel * self.stat_sv_maxspeed * frametime);
        }
        else
        {
-               f = max(0, (sv_warsowbunny_topspeed - curspeed) / (sv_warsowbunny_topspeed - sv_maxspeed));
-               wishspeed = max(curspeed, sv_maxspeed) + sv_warsowbunny_accel * f * sv_maxspeed * frametime;
+               f = max(0, (sv_warsowbunny_topspeed - curspeed) / (sv_warsowbunny_topspeed - self.stat_sv_maxspeed));
+               wishspeed = max(curspeed, self.stat_sv_maxspeed) + sv_warsowbunny_accel * f * self.stat_sv_maxspeed * frametime;
        }
        wishvel = wishdir * wishspeed;
        acceldir = wishvel - curvel;
        addspeed = vlen(acceldir);
        acceldir = normalize(acceldir);
 
-       accelspeed = min(addspeed, sv_warsowbunny_turnaccel * sv_maxspeed * frametime);
+       accelspeed = min(addspeed, sv_warsowbunny_turnaccel * self.stat_sv_maxspeed * frametime);
 
        if(sv_warsowbunny_backtosideratio < 1)
        {
@@ -707,13 +687,35 @@ void SV_PlayerPhysics()
        float not_allowed_to_move;
        string c;
        
+       maxspd_mod = 1;
+       if(g_minstagib && (self.items & IT_INVINCIBLE))
+               maxspd_mod *= cvar("g_minstagib_speed_highspeed");
+       if(g_nexball && self.ballcarried)
+               maxspd_mod *= cvar("g_nexball_basketball_carrier_highspeed");
+       if(g_runematch)
+       {
+               if(self.runes & RUNE_SPEED)
+               {
+                       if(self.runes & CURSE_SLOW)
+                               maxspd_mod *= cvar("g_balance_rune_speed_combo_highspeed");
+                       else
+                               maxspd_mod *= cvar("g_balance_rune_speed_highspeed");
+               }
+               else if(self.runes & CURSE_SLOW)
+               {
+                       maxspd_mod *= cvar("g_balance_curse_slow_highspeed");
+               }
+       }
+       maxspd_mod *= autocvar_g_movement_highspeed;
+
        // fix physics stats for g_movement_highspeed
-       self.stat_sv_airaccel_qw = AdjustAirAccelQW(sv_airaccel_qw, autocvar_g_movement_highspeed);
+       self.stat_sv_airaccel_qw = AdjustAirAccelQW(sv_airaccel_qw, maxspd_mod);
        if(sv_airstrafeaccel_qw)
-               self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(sv_airstrafeaccel_qw, autocvar_g_movement_highspeed);
+               self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(sv_airstrafeaccel_qw, maxspd_mod);
        else
                self.stat_sv_airstrafeaccel_qw = 0;
-       self.stat_sv_airspeedlimit_nonqw = sv_airspeedlimit_nonqw * autocvar_g_movement_highspeed;
+       self.stat_sv_airspeedlimit_nonqw = sv_airspeedlimit_nonqw * maxspd_mod;
+       self.stat_sv_maxspeed = sv_maxspeed * maxspd_mod; // also slow walking
 
     if(self.PlayerPhysplug)
         if(self.PlayerPhysplug())
@@ -846,31 +848,6 @@ void SV_PlayerPhysics()
 
        maxspd_mod = 1;
 
-       if(g_runematch)
-       {
-               if(self.runes & RUNE_SPEED)
-               {
-                       if(self.runes & CURSE_SLOW)
-                               maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_combo_moverate");
-                       else
-                               maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_moverate");
-               }
-               else if(self.runes & CURSE_SLOW)
-               {
-                       maxspd_mod = maxspd_mod * cvar("g_balance_curse_slow_moverate");
-               }
-       }
-
-       if(g_minstagib && (self.items & IT_INVINCIBLE))
-       {
-               maxspd_mod = cvar("g_minstagib_speed_moverate");
-       }
-
-       if(g_nexball && self.ballcarried)
-       {
-               maxspd_mod = cvar("g_nexball_basketball_carrier_speed");
-       }
-
        swampspd_mod = 1;
        if(self.in_swamp) {
                swampspd_mod = self.swamp_slowdown; //cvar("g_balance_swamp_moverate");
@@ -899,7 +876,7 @@ void SV_PlayerPhysics()
                maxspd_mod = self.spectatorspeed;
        }
 
-       spd = max(sv_maxspeed, sv_maxairspeed) * maxspd_mod * swampspd_mod;
+       spd = max(self.stat_sv_maxspeed, sv_maxairspeed) * maxspd_mod * swampspd_mod;
        if(self.speed != spd)
        {
                self.speed = spd;
@@ -995,8 +972,8 @@ void SV_PlayerPhysics()
                // acceleration
                wishdir = normalize(wishvel);
                wishspeed = vlen(wishvel);
-               if (wishspeed > sv_maxspeed*maxspd_mod)
-                       wishspeed = sv_maxspeed*maxspd_mod;
+               if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+                       wishspeed = self.stat_sv_maxspeed*maxspd_mod;
                if (time >= self.teleport_time)
                        PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
        }
@@ -1013,8 +990,8 @@ void SV_PlayerPhysics()
 
                wishdir = normalize(wishvel);
                wishspeed = vlen(wishvel);
-               if (wishspeed > sv_maxspeed*maxspd_mod)
-                       wishspeed = sv_maxspeed*maxspd_mod;
+               if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+                       wishspeed = self.stat_sv_maxspeed*maxspd_mod;
                wishspeed = wishspeed * 0.7;
 
                // water friction
@@ -1059,8 +1036,8 @@ void SV_PlayerPhysics()
                // acceleration
                wishdir = normalize(wishvel);
                wishspeed = vlen(wishvel);
-               if (wishspeed > sv_maxspeed*maxspd_mod)
-                       wishspeed = sv_maxspeed*maxspd_mod;
+               if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+                       wishspeed = self.stat_sv_maxspeed*maxspd_mod;
                if (time >= self.teleport_time)
                {
                        // water acceleration
@@ -1219,8 +1196,8 @@ void SV_PlayerPhysics()
                // acceleration
                wishdir = normalize(wishvel);
                wishspeed = vlen(wishvel);
-               if (wishspeed > sv_maxspeed*maxspd_mod)
-                       wishspeed = sv_maxspeed*maxspd_mod;
+               if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+                       wishspeed = self.stat_sv_maxspeed*maxspd_mod;
                if (self.crouch)
                        wishspeed = wishspeed * 0.5;
                if (time >= self.teleport_time)
@@ -1249,8 +1226,8 @@ void SV_PlayerPhysics()
                // acceleration
                wishdir = normalize(wishvel);
                wishspeed = wishspeed0 = vlen(wishvel);
-               if (wishspeed0 > sv_maxspeed*maxspd_mod)
-                       wishspeed0 = sv_maxspeed*maxspd_mod;
+               if (wishspeed0 > self.stat_sv_maxspeed*maxspd_mod)
+                       wishspeed0 = self.stat_sv_maxspeed*maxspd_mod;
                if (wishspeed > maxairspd)
                        wishspeed = maxairspd;
                if (self.crouch)
index d369298a56cd5b679a7113934831a7878d2476ba..b99f27544a81488fc4cbbaae2a742b16eb718cad 100644 (file)
@@ -531,6 +531,7 @@ float game_starttime; //point in time when the countdown is over
 .float stat_sv_airaccel_qw;
 .float stat_sv_airstrafeaccel_qw;
 .float stat_sv_airspeedlimit_nonqw;
+.float stat_sv_maxspeed;
 
 void W_Porto_Remove (entity p);
 
@@ -655,6 +656,7 @@ string deathmessage;
 
 .float nex_charge;
 .float nex_charge_rottime;
+.float nex_charge_pool_ammo;
 
 float allowed_to_spawn; // boolean variable used by the clan arena code to determine if a player can spawn (after the round has ended)
 
index f6707b54dd6dde9a87137be9136efaedfde3a637..2ea47d81afdf483edad25bab787d7b5c5961fecd 100644 (file)
@@ -805,6 +805,7 @@ void spawnfunc_worldspawn (void)
        addstat(STAT_LAST_PICKUP, AS_FLOAT, last_pickup);
 
        addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
+       addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_charge_pool_ammo);
 
        if(g_ca)
        {
@@ -813,6 +814,7 @@ void spawnfunc_worldspawn (void)
        }
        // g_movementspeed hack
        addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
+       addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed);
        addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw);
        addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw);
 
index d152a6e083949b56586aa4179f46556090841b84..31998e5092a632d0a30ceaae5c2f88847e3e6d54 100644 (file)
@@ -75,6 +75,7 @@ void W_Nex_Attack (float issecondary)
 
 void spawnfunc_weapon_nex (void); // defined in t_items.qc
 
+.float nex_charge_pool_pauseregen_finished;
 float w_nex(float req)
 {
        float dt;
@@ -88,6 +89,14 @@ float w_nex(float req)
                if(cvar("g_balance_nex_charge") && self.nex_charge < cvar("g_balance_nex_charge_limit"))
                        self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_rate") * frametime / W_TICSPERFRAME);
 
+               if(cvar("g_balance_nex_secondary_charge_pool"))
+               if(self.nex_charge_pool_ammo < 1)
+               {
+                       if(self.nex_charge_pool_pauseregen_finished < time)
+                               self.nex_charge_pool_ammo = min(1, self.nex_charge_pool_ammo + cvar("g_balance_nex_secondary_charge_pool_regen") * frametime / W_TICSPERFRAME);
+                       self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_nex_secondary_charge_pool_pause_health_regen"));
+               }
+
                if (self.BUTTON_ATCK)
                {
                        if (weapon_prepareattack(0, cvar("g_balance_nex_primary_refire")))
@@ -102,12 +111,29 @@ float w_nex(float req)
                        {
                                self.nex_charge_rottime = time + cvar("g_balance_nex_charge_rot_pause");
                                dt = frametime / W_TICSPERFRAME;
-                               if(self.nex_charge < 1)
+
+                               if(cvar("g_balance_nex_secondary_charge_pool"))
                                {
-                                       dt = min(dt, (1 - self.nex_charge) / cvar("g_balance_nex_secondary_charge_rate"));
-                                       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+                                       if(cvar("g_balance_nex_secondary_ammo"))
                                        {
-                                               if(cvar("g_balance_nex_secondary_ammo"))
+                                               // always deplete if secondary is held
+                                               self.nex_charge_pool_ammo = max(0, self.nex_charge_pool_ammo - cvar("g_balance_nex_secondary_ammo") * dt);
+
+                                               dt = min(dt, (1 - self.nex_charge) / cvar("g_balance_nex_secondary_charge_rate"));
+                                               self.nex_charge_pool_pauseregen_finished = time + cvar("g_balance_nex_secondary_charge_pool_pause_regen");
+                                               dt = min(dt, self.nex_charge_pool_ammo);
+                                               dt = max(0, dt);
+
+                                               self.nex_charge += dt * cvar("g_balance_nex_secondary_charge_rate");
+                                       }
+                               }
+
+                               else if(cvar("g_balance_nex_secondary_ammo"))
+                               {
+                                       if(self.nex_charge < 1)
+                                       {
+                                               dt = min(dt, (1 - self.nex_charge) / cvar("g_balance_nex_secondary_charge_rate"));
+                                               if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
                                                {
                                                        dt = min(dt, (self.ammo_cells - cvar("g_balance_nex_primary_ammo")) / cvar("g_balance_nex_secondary_ammo"));
                                                        dt = max(0, dt);
@@ -116,8 +142,8 @@ float w_nex(float req)
                                                                self.ammo_cells = max(cvar("g_balance_nex_secondary_ammo"), self.ammo_cells - cvar("g_balance_nex_secondary_ammo") * dt);
                                                        }
                                                }
+                                               self.nex_charge += dt * cvar("g_balance_nex_secondary_charge_rate");
                                        }
-                                       self.nex_charge += dt * cvar("g_balance_nex_secondary_charge_rate");
                                }
                        }
                        else if(cvar("g_balance_nex_secondary"))
@@ -146,11 +172,7 @@ float w_nex(float req)
        else if (req == WR_CHECKAMMO1)
                return self.ammo_cells >= cvar("g_balance_nex_primary_ammo");
        else if (req == WR_CHECKAMMO2)
-       {
-               if(cvar("g_balance_nex_secondary_charge"))
-                       return self.ammo_cells >= cvar("g_balance_nex_primary_ammo");
-               return self.ammo_cells >= cvar("g_balance_nex_secondary_ammo");
-       }
+               return self.ammo_cells >= cvar("g_balance_nex_primary_ammo"); // don't allow charging if we don't have enough ammo
        return TRUE;
 };
 #endif