X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fteamplay.qc;h=7bd44fec82401c29a41533a9b50f85b224406db1;hb=1471179ee293a17194be4e25c1e387bd451370a6;hp=ee91a9dcceac97b094d7da6b385c0faf60c247e3;hpb=a8adc0d6f831cbad3f3255bcb8c74cdf35a70d76;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index ee91a9dcc..7bd44fec8 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -1,20 +1,25 @@ -string cache_mutatormsg; -string cache_lastmutatormsg; +#include "teamplay.qh" +#include "_all.qh" -// client counts for each team -float c1, c2, c3, c4; -// # of bots on those teams -float cb1, cb2, cb3, cb4; +#include "cl_client.qh" +#include "race.qh" +#include "scores.qh" +#include "scores_rules.qh" -//float audit_teams_time; +#include "bot/bot.qh" + +#include "command/vote.qh" + +#include "mutators/mutators_include.qh" + +#include "../common/deathtypes.qh" +#include "../common/teams.qh" void TeamchangeFrags(entity e) { PlayerScore_Clear(e); } -void entcs_init(); - void LogTeamchange(float player_id, float team_number, float type) { if(!autocvar_sv_eventlog) @@ -84,10 +89,9 @@ void InitGameplayMode() ActivateTeamplay(); fraglimit_override = autocvar_g_tdm_point_limit; leadlimit_override = autocvar_g_tdm_point_leadlimit; - MUTATOR_ADD(gamemode_tdm); - if(autocvar_g_tdm_team_spawns) have_team_spawns = -1; // request team spawns + MUTATOR_ADD(gamemode_tdm); } if(g_domination) @@ -95,12 +99,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) @@ -108,8 +110,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) @@ -126,9 +128,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) @@ -144,16 +146,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) @@ -173,11 +175,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); } @@ -186,16 +211,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) @@ -234,31 +260,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); } @@ -291,7 +292,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"); @@ -515,7 +516,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 @@ -599,11 +600,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)) { @@ -617,10 +618,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); @@ -665,16 +666,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 @@ -747,7 +740,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) { @@ -824,12 +817,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 } @@ -839,7 +832,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; } } @@ -852,7 +845,7 @@ void SV_ChangeTeam(float _color) TeamchangeFrags(self); } - SetPlayerTeam(self, dteam, steam, FALSE); + SetPlayerTeam(self, dteam, steam, false); if(IS_PLAYER(self) && steam != dteam) { @@ -996,9 +989,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))); + Send_Notification(NOTIF_ONE, selected, MSG_CENTER, CENTER_DEATH_SELF_AUTOTEAMCHANGE, selected.team); }