]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
make new cts scoreboard entries update on fastest run only, not on best individual...
authorJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Wed, 25 Jan 2023 20:35:47 +0000 (21:35 +0100)
committerJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Wed, 25 Jan 2023 20:35:47 +0000 (21:35 +0100)
qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc
qcsrc/server/race.qc

index 4e087f551ee3206dd5ca55ace40d0d8d50c2be68..defeb686345f41da4ff1825d169d64beb61a0f1d 100644 (file)
@@ -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)
index 63e6efa8c6f31197bf0a58c23f2c1b243ea2dae1..45ed1c8376a2f71b46db9a2ff086ef90ae651b1f 100644 (file)
 #include <server/spawnpoints.qh>
 #include <server/weapons/common.qh>
 #include <server/world.qh>
+#include <server/strafe.qh>
 
 .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;