X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcommand%2Fsv_cmd.qc;h=3a776f05472531a06815c4012d9b3df4a2c6081d;hp=f5569c08f2697d4baf879ff63dc659efaaa88e74;hb=13832240e226eba119844d7bd02ca51b617e586a;hpb=7ff985ed6aa644a01d2520ec06603f32f9dd4074 diff --git a/qcsrc/server/command/sv_cmd.qc b/qcsrc/server/command/sv_cmd.qc index f5569c08f..3a776f054 100644 --- a/qcsrc/server/command/sv_cmd.qc +++ b/qcsrc/server/command/sv_cmd.qc @@ -20,7 +20,8 @@ #include "../bot/api.qh" -#include "../mutators/_mod.qh" +#include +#include #include #include @@ -31,13 +32,6 @@ #include - -void PutObserverInServer(entity this); - -// ===================================================== -// Server side game commands code, reworked by Samual -// ===================================================== - // used by GameCommand_make_mapinfo() void make_mapinfo_Think(entity this) { @@ -1064,6 +1058,7 @@ void GameCommand_moveplayer(float request, float argc) // find the team to move the player to team_id = Team_ColorToTeam(destination); + entity balance; if (team_id == client.team) // already on the destination team { // keep the forcing undone @@ -1072,30 +1067,72 @@ void GameCommand_moveplayer(float request, float argc) } else if (team_id == 0) // auto team { - CheckAllowedTeams(client); - team_id = Team_NumberToTeam(FindSmallestTeam(client, false)); + balance = TeamBalance_CheckAllowedTeams(client); + team_id = Team_IndexToTeam(TeamBalance_FindBestTeam(balance, client, false)); } else { - CheckAllowedTeams(client); + balance = TeamBalance_CheckAllowedTeams(client); } client.team_forced = save; // Check to see if the destination team is even available switch (team_id) { - case NUM_TEAM_1: if (c1 == -1) { LOG_INFO("Sorry, can't move player to red team if it doesn't exist."); return; } break; - case NUM_TEAM_2: if (c2 == -1) { LOG_INFO("Sorry, can't move player to blue team if it doesn't exist."); return; } break; - case NUM_TEAM_3: if (c3 == -1) { LOG_INFO("Sorry, can't move player to yellow team if it doesn't exist."); return; } break; - case NUM_TEAM_4: if (c4 == -1) { LOG_INFO("Sorry, can't move player to pink team if it doesn't exist."); return; } break; - - default: LOG_INFO("Sorry, can't move player here if team ", destination, " doesn't exist."); + case NUM_TEAM_1: + { + if (!TeamBalance_IsTeamAllowed(balance, 1)) + { + LOG_INFO("Sorry, can't move player to red team if it doesn't exist."); + TeamBalance_Destroy(balance); + return; + } + TeamBalance_Destroy(balance); + break; + } + case NUM_TEAM_2: + { + if (!TeamBalance_IsTeamAllowed(balance, 2)) + { + LOG_INFO("Sorry, can't move player to blue team if it doesn't exist."); + TeamBalance_Destroy(balance); + return; + } + TeamBalance_Destroy(balance); + break; + } + case NUM_TEAM_3: + { + if (!TeamBalance_IsTeamAllowed(balance, 3)) + { + LOG_INFO("Sorry, can't move player to yellow team if it doesn't exist."); + TeamBalance_Destroy(balance); + return; + } + TeamBalance_Destroy(balance); + break; + } + case NUM_TEAM_4: + { + if (!TeamBalance_IsTeamAllowed(balance, 4)) + { + LOG_INFO("Sorry, can't move player to pink team if it doesn't exist."); + TeamBalance_Destroy(balance); + return; + } + TeamBalance_Destroy(balance); + break; + } + default: + { + LOG_INFO("Sorry, can't move player here if team ", destination, " doesn't exist."); return; + } } // If so, lets continue and finally move the player client.team_forced = 0; - if (MoveToTeam(client, team_id, 6)) + if (MoveToTeam(client, Team_TeamToIndex(team_id), 6)) { successful = strcat(successful, (successful ? ", " : ""), playername(client, false)); LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", playername(client, false), ") has been moved to the ", Team_ColoredFullName(team_id), "^7."); @@ -1366,16 +1403,23 @@ void GameCommand_shuffleteams(float request) }); int number_of_teams = 0; - CheckAllowedTeams(NULL); - if (c1 >= 0) number_of_teams = max(1, number_of_teams); - if (c2 >= 0) number_of_teams = max(2, number_of_teams); - if (c3 >= 0) number_of_teams = max(3, number_of_teams); - if (c4 >= 0) number_of_teams = max(4, number_of_teams); + entity balance = TeamBalance_CheckAllowedTeams(NULL); + for (int i = 1; i <= NUM_TEAMS; ++i) + { + if (TeamBalance_IsTeamAllowed(balance, i)) + { + number_of_teams = max(i, number_of_teams); + } + } + TeamBalance_Destroy(balance); int team_index = 0; FOREACH_CLIENT_RANDOM(IS_PLAYER(it) || it.caplayer, { - int target_team_number = Team_NumberToTeam(team_index + 1); - if (it.team != target_team_number) MoveToTeam(it, target_team_number, 6); + int target_team_index = team_index + 1; + if (Entity_GetTeamIndex(it) != target_team_index) + { + MoveToTeam(it, target_team_index, 6); + } team_index = (team_index + 1) % number_of_teams; }); @@ -1574,11 +1618,16 @@ void GameCommand_trace(float request, float argc) case "walk": { - if (argc == 4) + if (argc == 4 || argc == 5) { e = nextent(NULL); - if (tracewalk(e, stov(argv(2)), e.mins, e.maxs, stov(argv(3)), MOVE_NORMAL)) LOG_INFO("can walk"); - else LOG_INFO("cannot walk"); + int dphitcontentsmask_save = e.dphitcontentsmask; + e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP; + if (tracewalk(e, stov(argv(2)), e.mins, e.maxs, stov(argv(3)), stof(argv(4)), MOVE_NORMAL)) + LOG_INFO("can walk"); + else + LOG_INFO("cannot walk"); + e.dphitcontentsmask = dphitcontentsmask_save; return; } } @@ -1604,7 +1653,9 @@ void GameCommand_trace(float request, float argc) LOG_INFO("Incorrect parameters for ^2trace^7"); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd trace command (startpos endpos)"); + LOG_INFO("Usage:^3 sv_cmd trace command [startpos endpos] [endpos_height]"); + LOG_INFO(" Where startpos and endpos are parameters for 'walk' and 'showline' commands,"); + LOG_INFO(" 'endpos_height' is an optional parameter for 'walk' command,"); LOG_INFO(" Full list of commands here: \"debug, debug2, walk, showline.\""); LOG_INFO("See also: ^2bbox, gettaginfo^7"); return;