X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fteamplay.qc;h=ba1b4e6eedacb91412044bd0529c472ac3ffb977;hb=165d542813201a21cb6152ea5d22454e43e117c7;hp=33d3ebd3603a030a6eb6b934e2708478e544ebef;hpb=90efb5467fe733b53d89c0b32da3dca8252e7f19;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index 33d3ebd36..ba1b4e6ee 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -1,21 +1,10 @@ -string cache_mutatormsg; -string cache_lastmutatormsg; - -// client counts for each team -float c1, c2, c3, c4; -// # of bots on those teams -float cb1, cb2, cb3, cb4; - -//float audit_teams_time; +#include "teamplay.qh" void TeamchangeFrags(entity e) { PlayerScore_Clear(e); } -void tdm_init(); -void entcs_init(); - void LogTeamchange(float player_id, float team_number, float type) { if(!autocvar_sv_eventlog) @@ -83,9 +72,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,8 +84,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) @@ -102,8 +95,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) @@ -120,9 +113,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) @@ -138,16 +131,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) @@ -167,11 +160,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); } @@ -180,16 +196,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) @@ -228,31 +245,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); } @@ -285,7 +277,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"); @@ -509,7 +501,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 @@ -593,11 +585,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)) { @@ -611,10 +603,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); @@ -659,16 +651,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 @@ -741,7 +725,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) { @@ -818,12 +802,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 } @@ -833,7 +817,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; } } @@ -846,7 +830,7 @@ void SV_ChangeTeam(float _color) TeamchangeFrags(self); } - SetPlayerTeam(self, dteam, steam, FALSE); + SetPlayerTeam(self, dteam, steam, false); if(IS_PLAYER(self) && steam != dteam) { @@ -990,50 +974,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); }