From: Lyberta Date: Mon, 30 Jul 2018 22:59:47 +0000 (+0300) Subject: Teamplay: More polish. X-Git-Tag: xonotic-v0.8.5~1899^2~6 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=f238acd9dadf2cc2898e7cc60663b816e156b098;p=xonotic%2Fxonotic-data.pk3dir.git Teamplay: More polish. --- diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index a43534dc7..9207d9ce3 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -923,7 +923,10 @@ void ClientKill_Now_TeamChange(entity this) PutObserverInServer(this); } else - SV_ChangeTeam(this, this.killindicator_teamchange - 1); + { + Player_SetTeamIndexChecked(this, Team_TeamToIndex( + this.killindicator_teamchange)); + } this.killindicator_teamchange = 0; } @@ -2095,7 +2098,6 @@ void Join(entity this) if(IS_PLAYER(this)) if(teamplay && this.team != -1) { - //Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_JOIN_PLAY_TEAM), this.netname); } else Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_JOIN_PLAY, this.netname); diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index 588432996..b373d9f15 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -234,6 +234,57 @@ bool SetPlayerTeam(entity player, int team_index, int type) return true; } +void Player_SetTeamIndexChecked(entity player, int team_index) +{ + if (!teamplay) + { + return; + } + if (!Team_IsValidIndex(team_index)) + { + return; + } + if ((autocvar_g_campaign) || (autocvar_g_changeteam_banned && + CS(player).wasplayer)) + { + Send_Notification(NOTIF_ONE, player, MSG_INFO, + INFO_TEAMCHANGE_NOTALLOWED); + return; + } + entity balance = TeamBalance_CheckAllowedTeams(player); + if (team_index == 1 && !TeamBalance_IsTeamAllowedInternal(balance, 1)) + { + team_index = 4; + } + if (team_index == 4 && !TeamBalance_IsTeamAllowedInternal(balance, 4)) + { + team_index = 3; + } + if (team_index == 3 && !TeamBalance_IsTeamAllowedInternal(balance, 3)) + { + team_index = 2; + } + if (team_index == 2 && !TeamBalance_IsTeamAllowedInternal(balance, 2)) + { + team_index = 1; + } + // autocvar_g_balance_teams_prevent_imbalance only makes sense if autocvar_g_balance_teams is on, as it makes the team selection dialog pointless + if (autocvar_g_balance_teams && autocvar_g_balance_teams_prevent_imbalance) + { + TeamBalance_GetTeamCounts(balance, player); + if ((Team_IndexToBit(team_index) & TeamBalance_FindBestTeams(balance, + player, false)) == 0) + { + Send_Notification(NOTIF_ONE, player, MSG_INFO, + INFO_TEAMCHANGE_LARGERTEAM); + TeamBalance_Destroy(balance); + return; + } + } + TeamBalance_Destroy(balance); + SetPlayerTeam(player, team_index, TEAM_CHANGE_MANUAL); +} + bool MoveToTeam(entity client, int team_index, int type) { //PrintToChatAll(sprintf("MoveToTeam: %s, %f", client.netname, team_index)); @@ -1060,89 +1111,24 @@ int TeamBalance_CompareTeamsInternal(entity team_a, entity team_b, return TEAMS_COMPARE_EQUAL; } -// Called when the player connects or when they change their color with "color" -// command. -void SV_ChangeTeam(entity this, float _color) +void SV_ChangeTeam(entity player, int new_color) { - //PrintToChatAll(sprintf("SV_ChangeTeam: %s, %f", this.netname, _color)); - - // in normal deathmatch we can just apply the color and we're done - if(!teamplay) - SetPlayerColors(this, _color); - - if(!IS_CLIENT(this)) + if (!teamplay) { - //PrintToChatAll("Not a client yet"); - // since this is an engine function, and gamecode doesn't have any calls earlier than this, do the connecting message here - Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_CONNECTING, this.netname); - return; + SetPlayerColors(player, new_color); } - - if(!teamplay) - return; - - int source_color, destination_color; - int source_team_index, destination_team_index; - - source_color = this.clientcolors & 0x0F; - destination_color = _color & 0x0F; - - source_team_index = Team_TeamToIndex(source_color + 1); - destination_team_index = Team_TeamToIndex(destination_color + 1); - - if (destination_team_index == -1) + // TODO: Should we really bother with this? + if(!IS_CLIENT(player)) { + // since this is an engine function, and gamecode doesn't have any calls earlier than this, do the connecting message here + Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_CONNECTING, + player.netname); return; } - - entity balance = TeamBalance_CheckAllowedTeams(this); - - if (destination_team_index == 1 && !TeamBalance_IsTeamAllowedInternal( - balance, 1)) - { - destination_team_index = 4; - } - if (destination_team_index == 4 && !TeamBalance_IsTeamAllowedInternal( - balance, 4)) - { - destination_team_index = 3; - } - if (destination_team_index == 3 && !TeamBalance_IsTeamAllowedInternal( - balance, 3)) - { - destination_team_index = 2; - } - if (destination_team_index == 2 && !TeamBalance_IsTeamAllowedInternal( - balance, 2)) - { - destination_team_index = 1; - } - - // not changing teams - if (source_color == destination_color) + if (!teamplay) { - SetPlayerTeam(this, destination_team_index, TEAM_CHANGE_MANUAL); - TeamBalance_Destroy(balance); return; } - - if((autocvar_g_campaign) || (autocvar_g_changeteam_banned && CS(this).wasplayer)) { - Send_Notification(NOTIF_ONE, this, MSG_INFO, INFO_TEAMCHANGE_NOTALLOWED); - return; // changing teams is not allowed - } - - // autocvar_g_balance_teams_prevent_imbalance only makes sense if autocvar_g_balance_teams is on, as it makes the team selection dialog pointless - if (autocvar_g_balance_teams && autocvar_g_balance_teams_prevent_imbalance) - { - TeamBalance_GetTeamCounts(balance, this); - if ((Team_IndexToBit(destination_team_index) & - TeamBalance_FindBestTeams(balance, this, false)) == 0) - { - Send_Notification(NOTIF_ONE, this, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM); - TeamBalance_Destroy(balance); - return; - } - } - TeamBalance_Destroy(balance); - SetPlayerTeam(this, destination_team_index, TEAM_CHANGE_MANUAL); + Player_SetTeamIndexChecked(player, Team_TeamToIndex((new_color & 0x0F) + + 1)); } diff --git a/qcsrc/server/teamplay.qh b/qcsrc/server/teamplay.qh index c03690949..477d24ee1 100644 --- a/qcsrc/server/teamplay.qh +++ b/qcsrc/server/teamplay.qh @@ -97,6 +97,11 @@ enum /// \return True if team switch was successful, false otherwise. bool SetPlayerTeam(entity player, int team_index, int type); +/// \brief Sets the team of the player with all sanity checks. +/// \param[in,out] player Player to adjust. +/// \param[in] team_index Index of the team to set. +void Player_SetTeamIndexChecked(entity player, int team_index); + /// \brief Moves player to the specified team. /// \param[in,out] client Client to move. /// \param[in] team_index Index of the team. @@ -305,3 +310,9 @@ int TeamBalanceTeam_GetNumberOfBots(entity team_ent); /// function. int TeamBalance_CompareTeamsInternal(entity team_a, entity team_index_b, entity player, bool use_score); + +/// \brief Called when the player connects or when they change their color with +/// the "color" command. +/// \param[in,out] player Player that requested a new color. +/// \param[in] new_color Requested color. +void SV_ChangeTeam(entity player, int new_color);