X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_physics.qc;h=297e16771268949909a7c3bfe7c58f5d1350b96b;hp=cb94429d97b071df8ad2a5bc0ec13567dab8478c;hb=7eb1015823c7b86bd36ad10be79701239e695dec;hpb=a6c13a4f9db7b316d577d93acd586b8c85b386f9 diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc index cb94429d9..297e16771 100644 --- a/qcsrc/server/cl_physics.qc +++ b/qcsrc/server/cl_physics.qc @@ -37,9 +37,6 @@ float sv_airspeedlimit_nonqw; .float multijump_ready; .float prevjumpbutton; -.float prevtopspeed; // store the top speed during the last 0.25 seconds to make dodging at full speeds easier -.float prevtopspeed_time; - /* ============= PlayerJump @@ -81,32 +78,48 @@ void PlayerJump (void) self.multijump_ready = FALSE; } - if(self.multijump_ready && self.multijump_count < cvar("g_multijump") && self.velocity_z > cvar("g_multijump_speed")) + if(!doublejump && self.multijump_ready && self.multijump_count < cvar("g_multijump") && self.velocity_z > cvar("g_multijump_speed")) { + // doublejump = FALSE; // checked above in the if if (cvar("g_multijump") > 0) { if (cvar("g_multijump_add") == 0) // in this case we make the z velocity == jumpvelocity - self.velocity_z = 0; - - if(self.movement_x != 0 || self.movement_y != 0) // don't remove all speed if player isnt pressing any movement keys { - float curspeed; - vector wishvel, wishdir; - - curspeed = max(vlen(self.velocity - '0 0 1' * self.velocity_z), self.prevtopspeed); - makevectors(self.v_angle); - wishvel = v_forward * self.movement_x + v_right * self.movement_y; - wishdir = normalize(wishvel); + if (self.velocity_z < mjumpheight) + { + doublejump = TRUE; + self.velocity_z = 0; + } + } + else + doublejump = TRUE; - self.velocity_x = wishdir_x * curspeed; // allow "dodging" at a multijump - self.velocity_y = wishdir_y * curspeed; - // keep velocity_z unchanged! + if(doublejump) + { + if(self.movement_x != 0 || self.movement_y != 0) // don't remove all speed if player isnt pressing any movement keys + { + float curspeed; + vector wishvel, wishdir; + + curspeed = max( + vlen(vec2(self.velocity)), // current xy speed + vlen(vec2(antilag_takebackavgvelocity(self, max(self.lastteleporttime + sys_frametime, time - 0.25), time))) // average xy topspeed over the last 0.25 secs + ); + makevectors(self.v_angle_y * '0 1 0'); + wishvel = v_forward * self.movement_x + v_right * self.movement_y; + wishdir = normalize(wishvel); + + self.velocity_x = wishdir_x * curspeed; // allow "dodging" at a multijump + self.velocity_y = wishdir_y * curspeed; + // keep velocity_z unchanged! + } + self.multijump_count += 1; } - self.multijump_count += 1; } self.multijump_ready = FALSE; // require releasing and pressing the jump button again for the next jump } - else if (!doublejump) + + if (!doublejump) if (!(self.flags & FL_ONGROUND)) return; @@ -117,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); @@ -253,12 +246,12 @@ void RaceCarPhysics() // using this move type for "big rigs" // the engine does not push the entity! - float accel, steer, f; + float accel, steer, f, myspeed, steerfactor; 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) { @@ -279,7 +272,7 @@ void RaceCarPhysics() if(self.flags & FL_ONGROUND || g_bugrigs_air_steering) { - float myspeed, upspeed, steerfactor, accelfactor; + float upspeed, accelfactor; myspeed = self.velocity * v_forward; upspeed = self.velocity * v_up; @@ -612,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) { @@ -658,6 +651,7 @@ void SpecialCommand() float speedaward_speed; string speedaward_holder; +string speedaward_uid; void race_send_speedaward(float msg) { // send the best speed of the round @@ -670,6 +664,7 @@ void race_send_speedaward(float msg) float speedaward_alltimebest; string speedaward_alltimebest_holder; +string speedaward_alltimebest_uid; void race_send_speedaward_alltimebest(float msg) { // send the best speed @@ -692,13 +687,39 @@ 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(self.ballcarried) + if(g_nexball) + maxspd_mod *= cvar("g_nexball_basketball_carrier_highspeed"); + else if(g_keepaway) + maxspd_mod *= cvar("g_keepaway_ballcarrier_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()) @@ -831,31 +852,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"); @@ -884,7 +880,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; @@ -944,12 +940,6 @@ void SV_PlayerPhysics() self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller } - if(vlen(self.velocity) >= self.prevtopspeed || time - self.prevtopspeed_time > 0.25) - { - self.prevtopspeed_time = time; - self.prevtopspeed = vlen(self.velocity - '0 0 1' * self.velocity_z); - } - if (self.BUTTON_JUMP) PlayerJump (); else @@ -986,8 +976,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); } @@ -1004,8 +994,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 @@ -1050,8 +1040,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 @@ -1210,8 +1200,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) @@ -1240,8 +1230,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) @@ -1297,6 +1287,7 @@ void SV_PlayerPhysics() if(vlen(self.velocity - self.velocity_z * '0 0 1') > speedaward_speed) { speedaward_speed = vlen(self.velocity - self.velocity_z * '0 0 1'); speedaward_holder = self.netname; + speedaward_uid = self.crypto_idfp; speedaward_lastupdate = time; } if(speedaward_speed > speedaward_lastsent && time - speedaward_lastupdate > 1) { @@ -1307,15 +1298,27 @@ void SV_PlayerPhysics() rr = RACE_RECORD; race_send_speedaward(MSG_ALL); speedaward_lastsent = speedaward_speed; - if (speedaward_speed > speedaward_alltimebest) { + if (speedaward_speed > speedaward_alltimebest && speedaward_uid != "") { speedaward_alltimebest = speedaward_speed; speedaward_alltimebest_holder = speedaward_holder; + speedaward_alltimebest_uid = speedaward_uid; db_put(ServerProgsDB, strcat(GetMapname(), rr, "speed/speed"), ftos(speedaward_alltimebest)); - db_put(ServerProgsDB, strcat(GetMapname(), rr, "speed/netname"), speedaward_alltimebest_holder); + db_put(ServerProgsDB, strcat(GetMapname(), rr, "speed/crypto_idfp"), speedaward_alltimebest_uid); race_send_speedaward_alltimebest(MSG_ALL); } } } + + float xyspeed; + xyspeed = vlen('1 0 0' * self.velocity_x + '0 1 0' * self.velocity_y); + if(self.weapon == WEP_NEX && cvar("g_balance_nex_charge") && cvar("g_balance_nex_charge_velocity_rate") && xyspeed > cvar("g_balance_nex_charge_minspeed")) + { + // add a maximum of charge_velocity_rate when going fast (f = 1), gradually increasing from minspeed (f = 0) to maxspeed + xyspeed = min(xyspeed, cvar("g_balance_nex_charge_maxspeed")); + f = (xyspeed - cvar("g_balance_nex_charge_minspeed")) / (cvar("g_balance_nex_charge_maxspeed") - cvar("g_balance_nex_charge_minspeed")); + // add the extra charge + self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_velocity_rate") * f * frametime); + } :end if(self.flags & FL_ONGROUND) self.lastground = time;