-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)
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)
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)
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)
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)
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)
}
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);
}
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)
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);
}
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");
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
// invalid
if(ca < 0 || cb < 0)
- return FALSE;
+ return false;
// equal
if(ta == tb)
- return TRUE;
+ return true;
if(IS_REAL_CLIENT(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);
{
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
// 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)
{
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
}
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;
}
}
TeamchangeFrags(self);
}
- SetPlayerTeam(self, dteam, steam, FALSE);
+ SetPlayerTeam(self, dteam, steam, false);
if(IS_PLAYER(self) && steam != dteam)
{
// 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);
}