]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
create round_enddelay for CA, FT and Surv, default 1s, whitelisted drjaska/round_enddelay 1187/head
authordrjaska <drjaska83@gmail.com>
Sun, 4 Jun 2023 00:22:22 +0000 (03:22 +0300)
committerdrjaska <drjaska83@gmail.com>
Sun, 4 Jun 2023 00:22:22 +0000 (03:22 +0300)
gamemodes-server.cfg
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/common/gamemodes/gamemode/survival/sv_survival.qc
qcsrc/server/round_handler.qc
qcsrc/server/round_handler.qh
qcsrc/server/world.qc

index 01d297e084a27827809150fc6aa2cfd705b9bc7b..12c25a4cc6f6db9e013ff186dede998cb8aa2c2e 100644 (file)
@@ -262,6 +262,7 @@ set g_ca_spectate_enemies 0 "allow eliminated players to spectate enemy players
 set g_ca_warmup 10 "time players get to run around before the round starts"
 set g_ca_damage2score 100  "every this amount of damage done give players 1 point"
 set g_ca_round_timelimit 180 "round time limit in seconds"
+set g_ca_round_enddelay 1 "seconds of delay for score evaluation after round could end"
 set g_ca_teams_override 0
 set g_ca_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
 set g_ca_teams 0
@@ -412,6 +413,7 @@ set g_freezetag_revive_nade 1 "Enable reviving from own nade explosion"
 set g_freezetag_revive_nade_health 40 "Amount of health player has if they revived from their own nade explosion"
 set g_freezetag_revive_time_to_score 1.5 "every this amount of seconds give players reviving a frozen teammate 1 point"
 set g_freezetag_round_timelimit 360 "round time limit in seconds"
+set g_freezetag_round_enddelay 1 "seconds of delay for score evaluation after round could end"
 set g_freezetag_revive_auto 1 "automatically revive frozen players after some time (g_freezetag_frozen_maxtime)"
 set g_freezetag_revive_auto_progress 1 "start the automatic reviving progress as soon as the player gets frozen"
 set g_freezetag_revive_auto_reducible 1 "reduce auto-revival time when frozen players are hit by enemies; set to -1 to reduce it even when they are hit by teammates"
@@ -697,3 +699,4 @@ set g_survival_punish_teamkill 1 "kill the player when they kill an ally"
 set g_survival_reward_survival 1 "give a point to all surviving players if the round timelimit is reached, in addition to the points given for kills"
 set g_survival_warmup 10 "how long the players will have time to run around the map before the round starts"
 set g_survival_round_timelimit 120 "round time limit in seconds"
+set g_survival_round_enddelay 1 "seconds of delay for score evaluation after round could end"
index 7a16141fc8ebbe89409b947cdfd9b979da571233..d31d45e191bcc447881f17f5e6d0561ac4644548 100644 (file)
@@ -122,6 +122,7 @@ int CA_PreventStalemate()
                return -2; // Equality. Can't avoid the stalemate.
 }
 
+float autocvar_g_ca_round_enddelay = 1;
 float CA_CheckWinner()
 {
        int winner_team = 0;
@@ -138,7 +139,29 @@ float CA_CheckWinner()
        if (!winner_team)
                winner_team = Team_GetWinnerAliveTeam();
        if (!winner_team)
+       {
+               // Dr. Jaska:
+               // reset delay time here only for consistency
+               // CA players currently have no known ways to resurrect
+               round_handler_ResetEndDelayTime();
                return 0;
+       }
+
+       // delay round ending a bit
+       if (autocvar_g_ca_round_enddelay
+               && round_handler_GetEndTime() > 0
+               && round_handler_GetEndTime() - time > 0) // don't delay past timelimit
+       {
+               if (round_handler_GetEndDelayTime() == -1)
+               {
+                       round_handler_SetEndDelayTime(time + autocvar_g_ca_round_enddelay);
+                       return 0;
+               }
+               else if (round_handler_GetEndDelayTime() >= time)
+               {
+                       return 0;
+               }
+       }
 
        if(winner_team > 0)
        {
index f1e6b1ce2ec0f5b7fb3f361f9674806459d525e6..c5a82e2f0e08f295e60177e3a67f781411d5a6c1 100644 (file)
@@ -86,9 +86,11 @@ bool freezetag_CheckTeams()
 void nades_Clear(entity);
 void nades_GiveBonus(entity player, float score);
 
+float autocvar_g_freezetag_round_enddelay = 1;
 bool freezetag_CheckWinner()
 {
-       if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
+       if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0
+               && round_handler_GetEndDelayTime() == -1)
        {
                Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
                Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
@@ -104,7 +106,26 @@ bool freezetag_CheckWinner()
 
        int winner_team = Team_GetWinnerAliveTeam();
        if (!winner_team)
+       {
+               round_handler_ResetEndDelayTime();
                return false;
+       }
+
+       // delay round ending a bit
+       if (autocvar_g_freezetag_round_enddelay
+               && round_handler_GetEndTime() > 0
+               && round_handler_GetEndTime() - time > 0) // don't delay past timelimit
+       {
+               if (round_handler_GetEndDelayTime() == -1)
+               {
+                       round_handler_SetEndDelayTime(time + autocvar_g_freezetag_round_enddelay);
+                       return 0;
+               }
+               else if (round_handler_GetEndDelayTime() >= time)
+               {
+                       return 0;
+               }
+       }
 
        if(winner_team > 0)
        {
index 6414686e0bcc67638503f6aaeda15ecb9e67754b..5f86e642ad41d3983a6df0d0aeacfef9ca1402a5 100644 (file)
@@ -30,9 +30,11 @@ void Surv_UpdateScores(bool timed_out)
        });
 }
 
+float autocvar_g_survival_round_enddelay = 1;
 float Surv_CheckWinner()
 {
-       if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
+       if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0
+               && autocvar_g_survival_round_enddelay == -1)
        {
                // if the match times out, survivors win too!
                Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
@@ -61,9 +63,29 @@ float Surv_CheckWinner()
        });
        if(survivor_count > 0 && hunter_count > 0)
        {
+               // Dr. Jaska:
+               // reset delay time here only for consistency
+               // Survival players currently have no known ways to resurrect
+               round_handler_ResetEndDelayTime();
                return 0;
        }
 
+       // delay round ending a bit
+       if (autocvar_g_survival_round_enddelay
+               && round_handler_GetEndTime() > 0
+               && round_handler_GetEndTime() - time > 0) // don't delay past timelimit
+       {
+               if (round_handler_GetEndDelayTime() == -1)
+               {
+                       round_handler_SetEndDelayTime(time + autocvar_g_survival_round_enddelay);
+                       return 0;
+               }
+               else if (round_handler_GetEndDelayTime() >= time)
+               {
+                       return 0;
+               }
+       }
+
        if(hunter_count > 0) // hunters win
        {
                Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_HUNTER_WIN);
index bb890e980a628738d1cf96ec9d74a81bf84089c8..1046176ffeda7730bc1d1609ea54709f4dad06dc 100644 (file)
@@ -66,6 +66,7 @@ void round_handler_Think(entity this)
                        // schedule a new round
                        this.wait = true;
                        this.nextthink = time + this.delay;
+                       round_handler_ResetEndDelayTime();
                }
                else
                {
@@ -107,6 +108,7 @@ void round_handler_Spawn(bool() canRoundStart_func, bool() canRoundEnd_func, voi
        this.canRoundEnd = canRoundEnd_func;
        this.roundStart = roundStart_func;
        this.wait = false;
+       round_handler_ResetEndDelayTime();
        round_handler_Init(5, 5, 180);
        this.nextthink = time;
 }
@@ -115,6 +117,7 @@ void round_handler_Reset(float next_think)
 {
        entity this = round_handler;
        this.wait = false;
+       round_handler_ResetEndDelayTime();
        if (this.count)
                if (this.cnt < this.count + 1) this.cnt = this.count + 1;
        this.nextthink = next_think;
index 5979eb5c33f810faeb55f2add99f7574533fc121..96e63a621ef9e33e47c549113d4875a98825832a 100644 (file)
@@ -8,6 +8,7 @@ entity round_handler;
                        // reaches 0 when the round starts
 .float round_timelimit;
 .float round_endtime;
+.float round_enddelaytime;
 .bool() canRoundStart;
 .bool() canRoundEnd;
 .void() roundStart;
@@ -22,3 +23,6 @@ void round_handler_Remove();
 #define round_handler_CountdownRunning() (!round_handler.wait && round_handler.cnt)
 #define round_handler_IsRoundStarted() (!round_handler.wait && !round_handler.cnt)
 #define round_handler_GetEndTime() (round_handler.round_endtime)
+#define round_handler_GetEndDelayTime() (round_handler.round_enddelaytime)
+#define round_handler_SetEndDelayTime(t) (round_handler.round_enddelaytime = t)
+#define round_handler_ResetEndDelayTime() (round_handler.round_enddelaytime = -1)
index 8b38b06fe2fe51af63cbf251d0504e4fb1827ac6..21e95848b9b0ab38ff9acd0ef5d2601b79e2bc7b 100644 (file)
@@ -432,6 +432,7 @@ void cvar_changes_init()
                BADPREFIX("sv_vote_");
                BADPREFIX("timelimit_");
                BADPRESUFFIX("g_", "_round_timelimit");
+               BADPRESUFFIX("g_", "_round_enddelay");
 
                // allowed changes to server admins (please sync this to server.cfg)
                // vi commands: