+ return g_team_entities[Team_TeamToIndex(team_num) - 1];
+}
+
+float Team_GetTeamScore(entity team_ent)
+{
+ return team_ent.m_team_score;
+}
+
+void Team_SetTeamScore(entity team_ent, float score)
+{
+ team_ent.m_team_score = score;
+}
+
+int Team_GetNumberOfAlivePlayers(entity team_ent)
+{
+ return team_ent.m_num_players_alive;
+}
+
+void Team_SetNumberOfAlivePlayers(entity team_ent, int number)
+{
+ team_ent.m_num_players_alive = number;
+}
+
+int Team_GetNumberOfAliveTeams()
+{
+ int result = 0;
+ for (int i = 0; i < NUM_TEAMS; ++i)
+ {
+ if (g_team_entities[i].m_num_players_alive > 0)
+ {
+ ++result;
+ }
+ }
+ return result;
+}
+
+int Team_GetNumberOfControlPoints(entity team_ent)
+{
+ return team_ent.m_num_control_points;
+}
+
+void Team_SetNumberOfControlPoints(entity team_ent, int number)
+{
+ team_ent.m_num_control_points = number;
+}
+
+int Team_GetNumberOfTeamsWithControlPoints()
+{
+ int result = 0;
+ for (int i = 0; i < NUM_TEAMS; ++i)
+ {
+ if (g_team_entities[i].m_num_control_points > 0)
+ {
+ ++result;
+ }
+ }
+ return result;
+}
+
+void setcolor(entity this, int clr)
+{
+#if 0
+ this.clientcolors = clr;
+ this.team = (clr & 15) + 1;
+#else
+ builtin_setcolor(this, clr);
+#endif
+}
+
+bool Entity_HasValidTeam(entity this)
+{
+ return Team_IsValidTeam(this.team);
+}
+
+int Entity_GetTeamIndex(entity this)
+{
+ return Team_TeamToIndex(this.team);
+}
+
+entity Entity_GetTeam(entity this)
+{
+ int index = Entity_GetTeamIndex(this);
+ if (!Team_IsValidIndex(index))
+ {
+ return NULL;
+ }
+ return Team_GetTeamFromIndex(index);
+}
+
+void SetPlayerColors(entity player, float _color)
+{
+ float pants = _color & 0x0F;
+ float shirt = _color & 0xF0;
+ if (teamplay)
+ {
+ setcolor(player, 16 * pants + pants);
+ }
+ else
+ {
+ setcolor(player, shirt + pants);
+ }
+}
+
+bool Player_SetTeamIndex(entity player, int index)
+{
+ int new_team = Team_IndexToTeam(index);
+ if (player.team == new_team)
+ {
+ if (new_team != -1)
+ {
+ // This is important when players join the game and one of their
+ // color matches the team color while other doesn't. For example
+ // [BOT]Lion.
+ SetPlayerColors(player, new_team - 1);
+ }
+ return true;
+ }
+ int old_index = Team_TeamToIndex(player.team);
+ if (MUTATOR_CALLHOOK(Player_ChangeTeam, player, old_index, index) == true)
+ {
+ // Mutator has blocked team change.
+ return false;
+ }
+ if (new_team == -1)
+ {
+ player.team = -1;
+ }
+ else
+ {
+ SetPlayerColors(player, new_team - 1);
+ }
+ MUTATOR_CALLHOOK(Player_ChangedTeam, player, old_index, index);
+ return true;
+}
+
+bool SetPlayerTeam(entity player, int team_index, int type)
+{
+ int old_team_index = Entity_GetTeamIndex(player);
+ if (!Player_SetTeamIndex(player, team_index))
+ {
+ return false;
+ }
+ LogTeamchange(player.playerid, player.team, type);
+ if (team_index != old_team_index)
+ {
+ Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(player.team,
+ INFO_JOIN_PLAY_TEAM), player.netname);
+ KillPlayerForTeamChange(player);
+ }
+ return true;
+}
+
+bool MoveToTeam(entity client, int team_index, int type)
+{
+ //PrintToChatAll(sprintf("MoveToTeam: %s, %f", client.netname, team_index));
+ int lockteams_backup = lockteams; // backup any team lock
+ lockteams = 0; // disable locked teams
+ PlayerScore_Clear(client);
+ if (!SetPlayerTeam(client, team_index, type))
+ {
+ lockteams = lockteams_backup; // restore the team lock
+ return false;
+ }
+ lockteams = lockteams_backup; // restore the team lock
+ return true;