From: Juhu <5894800-Juhu_@users.noreply.gitlab.com> Date: Wed, 25 Jan 2023 20:35:47 +0000 (+0100) Subject: make new cts scoreboard entries update on fastest run only, not on best individual... X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=28cb45ab96f166b9e81ed76789f8f58d05e0bf49;p=xonotic%2Fxonotic-data.pk3dir.git make new cts scoreboard entries update on fastest run only, not on best individual stat, affects strafe efficiency and start / average / top speed --- diff --git a/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc b/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc index 4e087f551..defeb6863 100644 --- a/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc +++ b/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc @@ -16,14 +16,6 @@ bool autocvar_g_cts_drop_monster_items; // legacy bot roles .float race_checkpoint; -.float race_oldcheckpoint; -.bool startspeed_recorded; -.float startspeed; -.float race_avgspeed_sum; -.float race_avgspeed_time; -.float race_avgspeed_best; -.float race_topspeed; -.float race_topspeed_best; void havocbot_role_cts(entity this) { if(IS_DEAD(this)) @@ -156,31 +148,18 @@ MUTATOR_HOOKFUNCTION(cts, PlayerPhysics) player.strafe_efficiency_sum += calculate_strafe_efficiency(player, CS(player).movement, dt) * dt; if(player.race_started) { - if(!player.startspeed_recorded && player.race_checkpoint != 0 && player.race_oldcheckpoint == 0) - { - float new_startspeed = vlen(vec2(player.velocity)); - player.startspeed_recorded = true; - if(new_startspeed > player.startspeed) - { - player.startspeed = new_startspeed; - PlayerScore_Set(player, SP_CTS_STARTSPEED, player.startspeed * 100); - } - } - - float current_speed = vlen(vec2(player.velocity)); - if(player.race_topspeed < current_speed) - { - player.race_topspeed = current_speed; - } - player.race_avgspeed_sum += current_speed * dt; - player.race_avgspeed_time += dt; + float current_speed = vlen(vec2(player.velocity)); + if(player.race_topspeed < current_speed) + { + player.race_topspeed = current_speed; + } + player.race_avgspeed_sum += current_speed * dt; + player.race_avgspeed_time += dt; } else { - player.startspeed_recorded = false; - player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0; + player.race_startspeed = player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0; } - player.race_oldcheckpoint = player.race_checkpoint; } MUTATOR_HOOKFUNCTION(cts, reset_map_global) @@ -194,14 +173,13 @@ MUTATOR_HOOKFUNCTION(cts, reset_map_global) FOREACH_CLIENT(true, { it.strafe_efficiency_best = -2; + it.strafe_efficiency_sum = it.strafe_efficiency_time = 0; PlayerScore_Set(it, SP_CTS_STRAFE, -20000); - it.startspeed_recorded = false; - it.race_oldcheckpoint = 0; + it.race_startspeed_best = it.race_avgspeed_best = it.race_topspeed_best = -1; + it.race_startspeed = it.race_avgspeed_sum = it.race_avgspeed_time = it.race_topspeed = 0; PlayerScore_Set(it, SP_CTS_STARTSPEED, -1); - it.race_avgspeed_sum = it.race_avgspeed_time = it.race_topspeed = 0; - it.race_avgspeed_best = it.race_topspeed_best = -1; - PlayerScore_Set(it, SP_CTS_AVGSPEED, -1); - PlayerScore_Set(it, SP_CTS_TOPSPEED, -1); + PlayerScore_Set(it, SP_CTS_AVGSPEED, -1); + PlayerScore_Set(it, SP_CTS_TOPSPEED, -1); if(it.race_place) { @@ -229,16 +207,14 @@ MUTATOR_HOOKFUNCTION(cts, ClientConnect) race_PreparePlayer(player); player.race_checkpoint = -1; - player.strafe_efficiency_sum = player.strafe_efficiency_time = 0; player.strafe_efficiency_best = -2; + player.strafe_efficiency_sum = player.strafe_efficiency_time = 0; PlayerScore_Set(player, SP_CTS_STRAFE, -20000); - player.startspeed_recorded = false; - player.race_oldcheckpoint = 0; + player.race_startspeed_best = player.race_avgspeed_best = player.race_topspeed_best = -1; + player.race_startspeed = player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0; PlayerScore_Set(player, SP_CTS_STARTSPEED, -1); - player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0; - player.race_avgspeed_best = player.race_topspeed_best = -1; - PlayerScore_Set(player, SP_CTS_AVGSPEED, -1); - PlayerScore_Set(player, SP_CTS_TOPSPEED, -1); + PlayerScore_Set(player, SP_CTS_AVGSPEED, -1); + PlayerScore_Set(player, SP_CTS_TOPSPEED, -1); race_SendAll(player, false); } @@ -309,8 +285,7 @@ MUTATOR_HOOKFUNCTION(cts, PlayerDies) race_AbandonRaceCheck(frag_target); frag_target.strafe_efficiency_sum = frag_target.strafe_efficiency_time = 0; - frag_target.startspeed_recorded = false; - frag_target.race_avgspeed_sum = frag_target.race_avgspeed_time = frag_target.race_topspeed = 0; + frag_target.race_startspeed = frag_target.race_avgspeed_sum = frag_target.race_avgspeed_time = frag_target.race_topspeed = 0; if(autocvar_g_cts_removeprojectiles) { @@ -405,26 +380,6 @@ MUTATOR_HOOKFUNCTION(cts, ClientKill) MUTATOR_HOOKFUNCTION(cts, Race_FinalCheckpoint) { entity player = M_ARGV(0, entity); - float strafe_efficiency_average = player.strafe_efficiency_sum / player.strafe_efficiency_time; - - if(player.strafe_efficiency_best < strafe_efficiency_average) - { - player.strafe_efficiency_best = strafe_efficiency_average; - PlayerScore_Set(player, SP_CTS_STRAFE, player.strafe_efficiency_best * 10000); - } - - float race_speed_average = player.race_avgspeed_sum / player.race_avgspeed_time; - if(player.race_avgspeed_best < race_speed_average) - { - player.race_avgspeed_best = race_speed_average; - PlayerScore_Set(player, SP_CTS_AVGSPEED, player.race_avgspeed_best * 100); - } - - if(player.race_topspeed_best < player.race_topspeed) - { - player.race_topspeed_best = player.race_topspeed; - PlayerScore_Set(player, SP_CTS_TOPSPEED, player.race_topspeed_best * 100); - } // useful to prevent cheating by running back to the start line and starting out with more speed if(autocvar_g_cts_finish_kill_delay) diff --git a/qcsrc/server/race.qc b/qcsrc/server/race.qc index 63e6efa8c..45ed1c837 100644 --- a/qcsrc/server/race.qc +++ b/qcsrc/server/race.qc @@ -30,9 +30,18 @@ #include #include #include +#include .string stored_netname; // TODO: store this information independently of race-based gamemodes +.float race_startspeed; +.float race_startspeed_best; +.float race_avgspeed_sum; +.float race_avgspeed_time; +.float race_avgspeed_best; +.float race_topspeed; +.float race_topspeed_best; + string uid2name(string myuid) { string s = db_get(ServerProgsDB, strcat("/uid2name/", myuid)); @@ -486,7 +495,21 @@ void race_SendTime(entity e, float cp, float t, float tvalid) { int s = GameRules_scoring_add(e, RACE_FASTEST, 0); if(!s || t < s) + { GameRules_scoring_add(e, RACE_FASTEST, t - s); + + e.strafe_efficiency_best = e.strafe_efficiency_sum / e.strafe_efficiency_time; + PlayerScore_Set(e, SP_CTS_STRAFE, e.strafe_efficiency_best * 10000); + + e.race_startspeed_best = e.race_startspeed; + PlayerScore_Set(e, SP_CTS_STARTSPEED, e.race_startspeed_best * 100); + + e.race_avgspeed_best = e.race_avgspeed_sum / e.race_avgspeed_time; + PlayerScore_Set(e, SP_CTS_AVGSPEED, e.race_avgspeed_best * 100); + + e.race_topspeed_best = e.race_topspeed; + PlayerScore_Set(e, SP_CTS_TOPSPEED, e.race_topspeed_best * 100); + } if(!g_race_qualifying) { s = GameRules_scoring_add(e, RACE_TIME, 0); @@ -771,6 +794,7 @@ void checkpoint_passed(entity this, entity player) if(!this.race_checkpoint) // start line { + player.race_startspeed = vlen(vec2(player.velocity)); player.race_laptime = time; player.race_movetime = player.race_movetime_frac = player.race_movetime_count = 0; player.race_penalty_accumulator = 0;