]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/shuffleteams_delay' into 'master'
authorMario <zacjardine@y7mail.com>
Sun, 11 Aug 2019 12:05:32 +0000 (12:05 +0000)
committerMario <zacjardine@y7mail.com>
Sun, 11 Aug 2019 12:05:32 +0000 (12:05 +0000)
Shuffleteams delay

See merge request xonotic/xonotic-data.pk3dir!641

qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh
qcsrc/server/command/sv_cmd.qc
qcsrc/server/command/sv_cmd.qh
qcsrc/server/command/vote.qc
qcsrc/server/constants.qh

index 4105f7ce8c53cc14eb544a5c7df59cedb484f4fe..0a8370899dea2bce50728c5f674b623240e446e9 100644 (file)
@@ -505,3 +505,9 @@ MUTATOR_HOOKFUNCTION(ca, SetWeaponArena)
        // most weapons arena
        if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") M_ARGV(0, string) = "most";
 }
+
+MUTATOR_HOOKFUNCTION(ca, SV_ParseServerCommand)
+{
+       shuffleteams_on_reset_map = !allowed_to_spawn;
+       return false;
+}
index c4755feee9a32e9560a27321698fb0fdf0e6a99d..e383687fcf44dd2ed3a69efa5b4c357e1e91e746 100644 (file)
@@ -3,6 +3,7 @@
 #include <common/mutators/base.qh>
 #include <server/round_handler.qh>
 #include <server/miscfunctions.qh>
+#include <server/command/sv_cmd.qh>
 
 int autocvar_g_ca_point_limit;
 int autocvar_g_ca_point_leadlimit;
index c42c7443ba252a997d778f9c731132a292bc3857..2dfcf48112447ad1a5411a60b3c5f925e567b3b2 100644 (file)
@@ -361,7 +361,9 @@ MUTATOR_HOOKFUNCTION(ft, PlayerDies)
                if (STAT(FROZEN, frag_target) == FROZEN_NORMAL)
                        Unfreeze(frag_target, true);
                freezetag_count_alive_players();
-               return true; // let the player die so that he can respawn whenever he wants
+               frag_target.respawn_time = time;
+               frag_target.respawn_flags |= RESPAWN_FORCE;
+               return true;
        }
 
        // Cases DEATH_TEAMCHANGE and DEATH_AUTOTEAMCHANGE are needed to fix a bug whe
@@ -608,6 +610,12 @@ MUTATOR_HOOKFUNCTION(ft, FragCenterMessage)
        return true;
 }
 
+MUTATOR_HOOKFUNCTION(ft, SV_ParseServerCommand)
+{
+       shuffleteams_on_reset_map = !(round_handler_IsActive() && !round_handler_IsRoundStarted());
+       return false;
+}
+
 void freezetag_Initialize()
 {
        freezetag_teams = autocvar_g_freezetag_teams_override;
index d637ae46f6a52f934f2d806adc5c1cdb49334098..df138a93d84f011bf29a51f2cf6135872773e0bb 100644 (file)
@@ -1,6 +1,8 @@
 #pragma once
 
 #include <common/mutators/base.qh>
+#include <server/command/sv_cmd.qh>
+
 int autocvar_g_freezetag_point_limit;
 int autocvar_g_freezetag_point_leadlimit;
 bool autocvar_g_freezetag_team_spawns;
index e8fc1b13f1bbd5b5e897060ebd402ae5eec457da..5ff2d3472ae22ebbf2d3d898e0ecbd5f4ae4c910 100644 (file)
@@ -1274,50 +1274,61 @@ void GameCommand_setbots(int request, int argc)
        }
 }
 
+void shuffleteams()
+{
+       if (!teamplay)
+       {
+               LOG_INFO("Can't shuffle teams when currently not playing a team game.");
+               return;
+       }
+
+       FOREACH_CLIENT(IS_PLAYER(it) || it.caplayer, {
+               if (Player_HasRealForcedTeam(it)) {
+                       // we could theoretically assign forced players to their teams
+                       // and shuffle the rest to fill the empty spots but in practise
+                       // either all players or none are gonna have forced teams
+                       LOG_INFO("Can't shuffle teams because at least one player has a forced team.");
+                       return;
+               }
+       });
+
+       int number_of_teams = 0;
+       entity balance = TeamBalance_CheckAllowedTeams(NULL);
+       for (int i = 1; i <= NUM_TEAMS; ++i)
+       {
+               if (TeamBalance_IsTeamAllowed(balance, i))
+               {
+                       number_of_teams = max(i, number_of_teams);
+               }
+       }
+       TeamBalance_Destroy(balance);
+
+       int team_index = 0;
+       FOREACH_CLIENT_RANDOM(IS_PLAYER(it) || it.caplayer, {
+               int target_team_index = team_index + 1;
+               if (Entity_GetTeamIndex(it) != target_team_index)
+               {
+                       MoveToTeam(it, target_team_index, 6);
+               }
+               team_index = (team_index + 1) % number_of_teams;
+       });
+
+       bprint("Successfully shuffled the players around randomly.\n");
+}
+
 void GameCommand_shuffleteams(int request)
 {
        switch (request)
        {
                case CMD_REQUEST_COMMAND:
                {
-                       if (!teamplay)
+                       if (shuffleteams_on_reset_map)
                        {
-                               LOG_INFO("Can't shuffle teams when currently not playing a team game.");
-                               return;
+                               bprint("Players will be shuffled when this round is over.\n");
+                               shuffleteams_on_reset_map = true;
                        }
-
-                       FOREACH_CLIENT(IS_PLAYER(it) || it.caplayer, {
-                               if (Player_HasRealForcedTeam(it)) {
-                                       // we could theoretically assign forced players to their teams
-                                       // and shuffle the rest to fill the empty spots but in practise
-                                       // either all players or none are gonna have forced teams
-                                       LOG_INFO("Can't shuffle teams because at least one player has a forced team.");
-                                       return;
-                               }
-                       });
-
-                       int number_of_teams = 0;
-                       entity balance = TeamBalance_CheckAllowedTeams(NULL);
-                       for (int i = 1; i <= NUM_TEAMS; ++i)
-                       {
-                               if (TeamBalance_IsTeamAllowed(balance, i))
-                               {
-                                       number_of_teams = max(i, number_of_teams);
-                               }
-                       }
-                       TeamBalance_Destroy(balance);
-
-                       int team_index = 0;
-                       FOREACH_CLIENT_RANDOM(IS_PLAYER(it) || it.caplayer, {
-                               int target_team_index = team_index + 1;
-                               if (Entity_GetTeamIndex(it) != target_team_index)
-                               {
-                                       MoveToTeam(it, target_team_index, 6);
-                               }
-                               team_index = (team_index + 1) % number_of_teams;
-                       });
-
-                       bprint("Successfully shuffled the players around randomly.\n");
+                       else
+                               shuffleteams();
                        return;
                }
 
index 00e216c921855757b9a5aa87c23cfe5362fdbf9b..bf0dafa9cfffe0698723624f29088e4fc2c37c74 100644 (file)
@@ -4,6 +4,9 @@
 //  Declarations for server side game commands
 // =================================================
 
+bool shuffleteams_on_reset_map;
+void shuffleteams();
+
 string GotoMap(string m);
 
 void race_deleteTime(string map, float pos);
index 51cf55ce3a1de3ee3c83cc027348ae803f7e072e..d79c2418d7adec421473ee7534ea01b9fe553c8c 100644 (file)
@@ -345,6 +345,11 @@ void reset_map(bool dorespawn)
                        round_handler_Reset(game_starttime);
        }
 
+       if (shuffleteams_on_reset_map)
+       {
+               shuffleteams();
+               shuffleteams_on_reset_map = false;
+       }
        MUTATOR_CALLHOOK(reset_map_global);
 
        FOREACH_ENTITY_FLOAT_ORDERED(pure_data, false,
index f98d586fb504cf389b764fb704360713d5a2148f..62a15f680c1cb8117c68385a5f6e4119a50c16d3 100644 (file)
@@ -10,9 +10,9 @@ const int FL_PICKUPITEMS = BIT(19);
 
 const int SVC_SETVIEW = 5;
 
-const int RESPAWN_FORCE = 1;
-const int RESPAWN_SILENT = 2;
-const int RESPAWN_DENY = 4;
+const int RESPAWN_FORCE = BIT(0);
+const int RESPAWN_SILENT = BIT(1);
+const int RESPAWN_DENY = BIT(2);
 
 #define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT)