]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/teamplay.qc
Remove `-Wno-double-declaration`
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / teamplay.qc
index 62c9ce8ad2212376b180060f5ce5b3dd9d279dbb..91eb7cebda3ff9d5a22bc7039551a6ccc22ff844 100644 (file)
@@ -2,7 +2,7 @@ string cache_mutatormsg;
 string cache_lastmutatormsg;
 
 // client counts for each team
-float c1, c2, c3, c4;
+//float c1, c2, c3, c4;
 // # of bots on those teams
 float cb1, cb2, cb3, cb4;
 
@@ -13,7 +13,6 @@ void TeamchangeFrags(entity e)
        PlayerScore_Clear(e);
 }
 
-void tdm_init();
 void entcs_init();
 
 void LogTeamchange(float player_id, float team_number, float type)
@@ -83,9 +82,11 @@ void InitGameplayMode()
        if(g_tdm)
        {
                ActivateTeamplay();
-               tdm_init();
+               fraglimit_override = autocvar_g_tdm_point_limit;
+               leadlimit_override = autocvar_g_tdm_point_leadlimit;
                if(autocvar_g_tdm_team_spawns)
                        have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_tdm);
        }
 
        if(g_domination)
@@ -93,12 +94,10 @@ void InitGameplayMode()
                ActivateTeamplay();
                fraglimit_override = autocvar_g_domination_point_limit;
                leadlimit_override = autocvar_g_domination_point_leadlimit;
-               MUTATOR_ADD(gamemode_domination);
-
                if(autocvar_g_domination_roundbased && autocvar_g_domination_roundbased_point_limit)
                        fraglimit_override = autocvar_g_domination_roundbased_point_limit;
-
                have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_domination);
        }
 
        if(g_ctf)
@@ -106,8 +105,8 @@ void InitGameplayMode()
                ActivateTeamplay();
                fraglimit_override = autocvar_capturelimit_override;
                leadlimit_override = autocvar_captureleadlimit_override;
-               MUTATOR_ADD(gamemode_ctf);
                have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_ctf);
        }
 
        if(g_lms)
@@ -124,9 +123,9 @@ void InitGameplayMode()
                ActivateTeamplay();
                fraglimit_override = autocvar_g_ca_point_limit;
                leadlimit_override = autocvar_g_ca_point_leadlimit;
-               MUTATOR_ADD(gamemode_ca);
                if(autocvar_g_ca_team_spawns)
                        have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_ca);
        }
 
        if(g_keyhunt)
@@ -142,16 +141,16 @@ void InitGameplayMode()
                ActivateTeamplay();
                fraglimit_override = autocvar_g_freezetag_point_limit;
                leadlimit_override = autocvar_g_freezetag_point_leadlimit;
-               MUTATOR_ADD(gamemode_freezetag);
                if(autocvar_g_freezetag_team_spawns)
                        have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_freezetag);
        }
 
        if(g_assault)
        {
                ActivateTeamplay();
-               MUTATOR_ADD(gamemode_assault);
                have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_assault);
        }
 
        if(g_onslaught)
@@ -171,11 +170,34 @@ void InitGameplayMode()
                }
                else
                        race_teams = 0;
-
                qualifying_override = autocvar_g_race_qualifying_timelimit_override;
                fraglimit_override = autocvar_g_race_laps_limit;
                leadlimit_override = 0; // currently not supported by race
 
+               // we need to find out the correct value for g_race_qualifying
+               float want_qualifying = ((qualifying_override >= 0) ? qualifying_override : autocvar_g_race_qualifying_timelimit) > 0;
+
+               if(autocvar_g_campaign)
+               {
+                       g_race_qualifying = 1;
+                       independent_players = 1;
+               }
+               else if(!autocvar_g_campaign && want_qualifying)
+               {
+                       g_race_qualifying = 2;
+                       independent_players = 1;
+                       race_fraglimit = (race_fraglimit >= 0) ? fraglimit_override : autocvar_fraglimit;
+                       race_leadlimit = (race_leadlimit >= 0) ? leadlimit_override : autocvar_leadlimit;
+                       race_timelimit = (race_timelimit >= 0) ? timelimit_override : autocvar_timelimit;
+                       fraglimit_override = 0;
+                       leadlimit_override = 0;
+                       timelimit_override = autocvar_g_race_qualifying_timelimit;
+               }
+               else
+               {
+                       g_race_qualifying = 0;
+               }
+
                MUTATOR_ADD(gamemode_race);
        }
 
@@ -184,16 +206,17 @@ void InitGameplayMode()
                g_race_qualifying = 1;
                fraglimit_override = 0;
                leadlimit_override = 0;
+               independent_players = 1;
                MUTATOR_ADD(gamemode_cts);
        }
 
        if(g_nexball)
        {
-        fraglimit_override = autocvar_g_nexball_goallimit;
-        leadlimit_override = autocvar_g_nexball_goalleadlimit;
-        ActivateTeamplay();
-        have_team_spawns = -1; // request team spawns
-           MUTATOR_ADD(gamemode_nexball);
+               fraglimit_override = autocvar_g_nexball_goallimit;
+               leadlimit_override = autocvar_g_nexball_goalleadlimit;
+               ActivateTeamplay();
+               have_team_spawns = -1; // request team spawns
+               MUTATOR_ADD(gamemode_nexball);
        }
 
        if(g_keepaway)
@@ -232,31 +255,6 @@ void InitGameplayMode()
                        cvar_set("g_race_qualifying_timelimit", ftos(qualifying_override));
        }
 
-       if(g_race)
-       {
-               // we need to find out the correct value for g_race_qualifying
-               if(autocvar_g_campaign)
-               {
-                       g_race_qualifying = 1;
-               }
-               else if(!autocvar_g_campaign && autocvar_g_race_qualifying_timelimit > 0)
-               {
-                       g_race_qualifying = 2;
-                       race_fraglimit = autocvar_fraglimit;
-                       race_leadlimit = autocvar_leadlimit;
-                       race_timelimit = autocvar_timelimit;
-                       cvar_set("fraglimit", "0");
-                       cvar_set("leadlimit", "0");
-                       cvar_set("timelimit", ftos(autocvar_g_race_qualifying_timelimit));
-               }
-               else
-                       g_race_qualifying = 0;
-       }
-
-       if(g_race || g_cts)
-       if(g_race_qualifying)
-               independent_players = 1;
-
        InitializeEntity(world, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK);
 }
 
@@ -289,7 +287,7 @@ string getwelcomemessage(void)
                else
                        modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena");
        }
-       if(autocvar_g_start_weapon_laser == 0)
+       if(cvar("g_balance_blaster_weaponstart") == 0)
                modifications = strcat(modifications, ", No start weapons");
        if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
                modifications = strcat(modifications, ", Low gravity");
@@ -319,6 +317,9 @@ string getwelcomemessage(void)
        if (g_grappling_hook)
                s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n");
 
+       if (cvar("g_nades"))
+               s = strcat(s, "\n\n^3nades^8 are enabled, press 'g' to use them\n");
+
        if(cache_lastmutatormsg != autocvar_g_mutatormsg)
        {
                if(cache_lastmutatormsg)
@@ -510,7 +511,7 @@ void GetTeamCounts(entity ignore)
        FOR_EACH_CLIENT(head)
        {
                float t;
-               if(IS_PLAYER(head))
+               if(IS_PLAYER(head) || head.caplayer)
                        t = head.team;
                else if(head.team_forced > 0)
                        t = head.team_forced; // reserve the spot
@@ -594,11 +595,11 @@ float TeamSmallerEqThanTeam(float ta, float tb, entity e)
 
        // invalid
        if(ca < 0 || cb < 0)
-               return FALSE;
+               return false;
 
        // equal
        if(ta == tb)
-               return TRUE;
+               return true;
 
        if(IS_REAL_CLIENT(e))
        {
@@ -612,10 +613,10 @@ float TeamSmallerEqThanTeam(float ta, float tb, entity e)
        // keep teams alive (teams of size 0 always count as smaller, ignoring score)
        if(ca < 1)
                if(cb >= 1)
-                       return TRUE;
+                       return true;
        if(ca >= 1)
                if(cb < 1)
-                       return FALSE;
+                       return false;
 
        // first, normalize
        f = max(ca, cb, 1);
@@ -660,16 +661,8 @@ float FindSmallestTeam(entity pl, float ignore_pl)
        {
                if(autocvar_g_campaign && pl && IS_REAL_CLIENT(pl))
                        return 1; // special case for campaign and player joining
-               else if(g_domination)
-                       error("Too few teams available for domination\n");
-               else if(g_ctf)
-                       error("Too few teams available for ctf\n");
-               else if(g_keyhunt)
-                       error("Too few teams available for key hunt\n");
-               else if(g_freezetag)
-                       error("Too few teams available for freeze tag\n");
                else
-                       error("Too few teams available for team deathmatch\n");
+                       error(sprintf("Too few teams available for %s\n", MapInfo_Type_ToString(MapInfo_CurrentGametype())));
        }
 
        // count how many players are in each team
@@ -742,7 +735,7 @@ float JoinBestTeam(entity pl, float only_return_best, float forcebestteam)
                // otherwise end up on the smallest team (handled below)
        }
 
-       smallest = FindSmallestTeam(pl, TRUE);
+       smallest = FindSmallestTeam(pl, true);
 
        if(!only_return_best && !pl.bot_forced_team)
        {
@@ -819,12 +812,12 @@ void SV_ChangeTeam(float _color)
        if(scolor == dcolor)
        {
                //bprint("same team change\n");
-               SetPlayerTeam(self, dteam, steam, TRUE);
+               SetPlayerTeam(self, dteam, steam, true);
                return;
        }
 
        if((autocvar_g_campaign) || (autocvar_g_changeteam_banned && self.wasplayer)) {
-               sprint(self, "Team changes not allowed\n");
+               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_TEAMCHANGE_NOTALLOWED);
                return; // changing teams is not allowed
        }
 
@@ -834,7 +827,7 @@ void SV_ChangeTeam(float _color)
                GetTeamCounts(self);
                if(!TeamSmallerEqThanTeam(dteam, steam, self))
                {
-                       sprint(self, "Cannot change to a larger/better/shinier team\n");
+                       Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM);
                        return;
                }
        }
@@ -847,7 +840,7 @@ void SV_ChangeTeam(float _color)
                TeamchangeFrags(self);
        }
 
-       SetPlayerTeam(self, dteam, steam, FALSE);
+       SetPlayerTeam(self, dteam, steam, false);
 
        if(IS_PLAYER(self) && steam != dteam)
        {
@@ -991,50 +984,9 @@ void ShufflePlayerOutOfTeam (float source_team)
 
        // move the player to the new team
        TeamchangeFrags(selected);
-       SetPlayerTeam(selected, smallestteam, source_team, FALSE);
+       SetPlayerTeam(selected, smallestteam, source_team, false);
 
        if(selected.deadflag == DEAD_NO)
                Damage(selected, selected, selected, 100000, DEATH_AUTOTEAMCHANGE, selected.origin, '0 0 0');
-       centerprint(selected, strcat("You have been moved into a different team to improve team balance\nYou are now on: ", Team_ColoredFullName(selected.team)));
-}
-
-// code from here on is just to support maps that don't have team entities
-void tdm_spawnteam (string teamname, float teamcolor)
-{
-       entity e;
-       e = spawn();
-       e.classname = "tdm_team";
-       e.netname = teamname;
-       e.cnt = teamcolor;
-       e.team = e.cnt + 1;
-}
-
-// spawn some default teams if the map is not set up for tdm
-void tdm_spawnteams()
-{
-       float numteams;
-
-       numteams = autocvar_g_tdm_teams_override;
-       if(numteams < 2)
-               numteams = autocvar_g_tdm_teams;
-       numteams = bound(2, numteams, 4);
-
-       tdm_spawnteam("Red", NUM_TEAM_1-1);
-       tdm_spawnteam("Blue", NUM_TEAM_2-1);
-       if(numteams >= 3)
-               tdm_spawnteam("Yellow", NUM_TEAM_3-1);
-       if(numteams >= 4)
-               tdm_spawnteam("Pink", NUM_TEAM_4-1);
-}
-
-void tdm_delayedinit()
-{
-       // if no teams are found, spawn defaults
-       if (find(world, classname, "tdm_team") == world)
-               tdm_spawnteams();
-}
-
-void tdm_init()
-{
-       InitializeEntity(world, tdm_delayedinit, INITPRIO_GAMETYPE);
+       Send_Notification(NOTIF_ONE, selected, MSG_CENTER, CENTER_DEATH_SELF_AUTOTEAMCHANGE, selected.team);
 }