X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fteamplay.qc;h=c26a0b16550ac51062a40c742468d5f93f214076;hb=39ff67006e98371c2961166ea52984024d9d3fab;hp=a7c7205c1fb5781bec8edf30adc0dfa5a2a3fc12;hpb=bac31b218e747443d2e4c1f8d6b26b2bb71dddb8;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index a7c7205c1..c26a0b165 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -1,19 +1,19 @@ #include "teamplay.qh" -#include "client.qh" -#include "race.qh" -#include "scores.qh" -#include "scores_rules.qh" - -#include "bot/api.qh" - -#include "command/vote.qh" - -#include - -#include "../common/deathtypes/all.qh" +#include #include -#include "../common/teams.qh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /// \brief Describes a state of team balance entity. enum @@ -28,8 +28,6 @@ enum /// \brief Indicates that the player is not allowed to join a team. const int TEAM_NOT_ALLOWED = -1; -.float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator - .int m_team_balance_state; ///< Holds the state of the team balance entity. .entity m_team_balance_team[NUM_TEAMS]; ///< ??? @@ -46,11 +44,13 @@ string autocvar_g_forced_team_pink; entity g_team_entities[NUM_TEAMS]; ///< Holds global team entities. -STATIC_INIT(g_team_entities) +void Team_InitTeams() { + if (g_team_entities[0]) + return; for (int i = 0; i < NUM_TEAMS; ++i) { - g_team_entities[i] = spawn(); + g_team_entities[i] = new_pure(team_entity); } } @@ -207,38 +207,39 @@ bool Player_SetTeamIndex(entity player, int index) 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) { - PlayerScore_Clear(player); - if (team_index != -1) - { - Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM( - player.team, INFO_JOIN_PLAY_TEAM), player.netname); - } - else - { - if (!CS(player).just_joined) - { - Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_SPECTATE, - player.netname); - } - } KillPlayerForTeamChange(player); + PlayerScore_Clear(player); + CS(player).parm_idlesince = time; + if (!IS_BOT_CLIENT(player)) - { TeamBalance_AutoBalanceBots(); - } + + if (team_index != -1) + Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(player.team, INFO_JOIN_PLAY_TEAM), player.netname); } - else if (team_index == -1) + + if (team_index == -1) { - if (!CS(player).just_joined && player.frags != FRAGS_SPECTATOR) + if (autocvar_sv_maxidle_playertospectator > 0 && CS(player).idlekick_lasttimeleft) + { + // this done here so it happens even when manually speccing during the countdown + Kill_Notification(NOTIF_ONE_ONLY, player, MSG_CENTER, CPID_IDLING); + CS(player).idlekick_lasttimeleft = 0; + } + else if (!CS(player).just_joined && player.frags != FRAGS_SPECTATOR) + { Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_SPECTATE, player.netname); + } } + return true; } @@ -464,6 +465,7 @@ entity TeamBalance_CheckAllowedTeams(entity for_whom) team_ent.m_num_bots = 0; } setthink(balance, TeamBalance_Destroy); + balance.nextthink = time; int teams_mask = 0; string teament_name = string_null; @@ -1122,18 +1124,13 @@ void SV_ChangeTeam(entity player, int new_color) { SetPlayerColors(player, new_color); } - // 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; } if (!teamplay) { return; } - Player_SetTeamIndexChecked(player, Team_TeamToIndex((new_color & 0x0F) + - 1)); + Player_SetTeamIndexChecked(player, Team_TeamToIndex((new_color & 0x0F) + 1)); }