From c93b0e073eae22de6dbe646355cb4cf52e8f7b15 Mon Sep 17 00:00:00 2001 From: Juhu <5894800-Juhu_@users.noreply.gitlab.com> Date: Sat, 20 Mar 2021 19:00:59 +0100 Subject: [PATCH] add start speed field for CTS scoreboard --- .gitlab-ci.yml | 2 +- qcsrc/client/hud/panel/scoreboard.qc | 10 +++++++- qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc | 23 +++++++++++++++++++ qcsrc/common/scores.qh | 1 + 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3010a5deb..b92272292 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,7 +32,7 @@ test_sv_game: - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache - make - - EXPECT=ae4d27dd465e976cd5afa35365eea0d7 + - EXPECT=028dcf7335482c5bf83e4a8835f2d66b - HASH=$(${ENGINE} -noconfig -nohome +timestamps 1 +exec serverbench.cfg | tee /dev/stderr | sed -e 's,^\[[^]]*\] ,,' diff --git a/qcsrc/client/hud/panel/scoreboard.qc b/qcsrc/client/hud/panel/scoreboard.qc index f60210da5..e04b40ca8 100644 --- a/qcsrc/client/hud/panel/scoreboard.qc +++ b/qcsrc/client/hud/panel/scoreboard.qc @@ -149,6 +149,7 @@ string Label_getInfo(string label, int mode) case "revivals": if (!mode) return CTX(_("SCO^revivals")); else LOG_HELP(strcat("^3", "revivals", " ^7", _("Number of revivals"))); case "rounds": if (!mode) return CTX(_("SCO^rounds won")); else LOG_HELP(strcat("^3", "rounds", " ^7", _("Number of rounds won"))); case "score": if (!mode) return CTX(_("SCO^score")); else LOG_HELP(strcat("^3", "score", " ^7", _("Total score"))); + case "startspeed": if (!mode) return CTX(_("SCO^start speed")); else LOG_HELP(strcat("^3", "startspeed", " ^7", _("Start speed (CTS)"))); case "strafe": if (!mode) return CTX(_("SCO^strafe")); else LOG_HELP(strcat("^3", "strafe", " ^7", _("Strafe efficiency (CTS)"))); case "suicides": if (!mode) return CTX(_("SCO^suicides")); else LOG_HELP(strcat("^3", "suicides", " ^7", _("Number of suicides"))); case "sum": if (!mode) return CTX(_("SCO^sum")); else LOG_HELP(strcat("^3", "sum", " ^7", _("Number of kills minus deaths"))); @@ -386,7 +387,7 @@ void Cmd_Scoreboard_Help() " +ctf/pickups +ctf/fckills +ctf/returns +ctf/caps +ons/takes +ons/caps" \ " +lms/lives +lms/rank" \ " +kh/kckills +kh/losses +kh/caps" \ -" ?+rc/laps ?+rc/time ?+cts/strafe +rc,cts/fastest" \ +" ?+rc/laps ?+rc/time ?+cts/strafe ?+cts/startspeed +rc,cts/fastest" \ " +as/objectives +nb/faults +nb/goals" \ " +ka/pickups +ka/bckills +ka/bctime +ft/revivals" \ " +dom/ticks +dom/takes" \ @@ -728,6 +729,13 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field) return sprintf("%.2f%%", strafe_efficiency * 100); } + case SP_CTS_STARTSPEED: + { + float startspeed = pl.(scores(field)) / 100; + if(startspeed < 0) return ""; + return sprintf("%.2f qu/s", startspeed); + } + default: case SP_SCORE: tmp = pl.(scores(field)); f = scores_flags(field); diff --git a/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc b/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc index 31988cb10..7a31f7c76 100644 --- a/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc +++ b/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc @@ -15,6 +15,9 @@ bool autocvar_g_cts_removeprojectiles; // legacy bot roles .float race_checkpoint; +.float race_oldcheckpoint; +.bool startspeed_recorded; +.float startspeed; void havocbot_role_cts(entity this) { if(IS_DEAD(this)) @@ -57,6 +60,7 @@ void cts_ScoreRules() GameRules_scoring(0, 0, 0, { if (g_race_qualifying) { field(SP_CTS_STRAFE, "strafe", 0); + field(SP_CTS_STARTSPEED, "startspeed", 0); field(SP_RACE_FASTEST, "fastest", SFL_SORT_PRIO_PRIMARY | SFL_LOWER_IS_BETTER | SFL_TIME); } else { field(SP_RACE_LAPS, "laps", SFL_SORT_PRIO_PRIMARY); @@ -142,6 +146,18 @@ MUTATOR_HOOKFUNCTION(cts, PlayerPhysics) } } player.strafe_efficiency_sum += calculate_strafe_efficiency(player, CS(player).movement); + if(!player.race_started) player.startspeed_recorded = false; + if(player.race_started && !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); + } + } + player.race_oldcheckpoint = player.race_checkpoint; } MUTATOR_HOOKFUNCTION(cts, reset_map_global) @@ -156,6 +172,9 @@ MUTATOR_HOOKFUNCTION(cts, reset_map_global) FOREACH_CLIENT(true, { it.strafe_efficiency_best = -2; PlayerScore_Set(it, SP_CTS_STRAFE, -20000); + it.startspeed_recorded = false; + it.race_oldcheckpoint = 0; + PlayerScore_Set(it, SP_CTS_STARTSPEED, -1); if(it.race_place) { @@ -186,6 +205,9 @@ MUTATOR_HOOKFUNCTION(cts, ClientConnect) player.strafe_efficiency_sum = player.strafe_efficiency_tics = 0; player.strafe_efficiency_best = -2; PlayerScore_Set(player, SP_CTS_STRAFE, -20000); + player.startspeed_recorded = false; + player.race_oldcheckpoint = 0; + PlayerScore_Set(player, SP_CTS_STARTSPEED, -1); race_SendAll(player, false); } @@ -251,6 +273,7 @@ MUTATOR_HOOKFUNCTION(cts, PlayerDies) race_AbandonRaceCheck(frag_target); frag_target.strafe_efficiency_sum = frag_target.strafe_efficiency_tics = 0; + frag_target.startspeed_recorded = false; if(autocvar_g_cts_removeprojectiles) { diff --git a/qcsrc/common/scores.qh b/qcsrc/common/scores.qh index deb168fed..c10dbc316 100644 --- a/qcsrc/common/scores.qh +++ b/qcsrc/common/scores.qh @@ -52,6 +52,7 @@ REGISTER_SP(RACE_FASTEST); //REGISTER_SP(CTS_LAPS); //REGISTER_SP(CTS_FASTEST); REGISTER_SP(CTS_STRAFE); +REGISTER_SP(CTS_STARTSPEED); REGISTER_SP(ASSAULT_OBJECTIVES); -- 2.39.2