void _CheckScrambleVote (void) { int i, numvotes, playernum, team; float votes; edict_t *ent, *other; char buf[128]; _CalcScrambleVotes(&playernum, &numvotes, &votes); if (numvotes > 0) { sprintf (buf, "Scramble: %d votes (%.1f%%), need %.1f%%\n", numvotes, votes, scramblevote_pass->value); gi.bprintf (PRINT_HIGH, strtostr2 (buf)); } if (playernum < scramblevote_min->value) return; if (numvotes < scramblevote_need->value) return; if (votes < scramblevote_pass->value) return; MakeAllLivePlayersObservers (); for (i = 1; i <= game.maxclients; i++) { ent = &g_edicts[i]; if (ent->client && ent->inuse && ent->client->resp.team != NOTEAM) { other = _RandomTeamPlayer(); if(other != NULL && rand() % 2) { team = other->client->resp.team; other->client->resp.team = ent->client->resp.team; ent->client->resp.team = team; ent->client->resp.scramblevote = false; } } } CenterPrintAll("The teams have been scrambled!"); }
qboolean ScrambleTeams(void) { int i, j, numplayers, newteam; edict_t *ent, *players[MAX_CLIENTS], *oldCaptains[TEAM_TOP] = {NULL}; numplayers = 0; for (i = 0, ent = &g_edicts[1]; i < game.maxclients; i++, ent++) { if (!ent->inuse || !ent->client || !ent->client->resp.team || ent->client->resp.subteam) continue; players[numplayers++] = ent; } if (numplayers <= teamCount) return false; for (i = numplayers - 1; i > 0; i--) { j = rand() % (i + 1); ent = players[j]; players[j] = players[i]; players[i] = ent; } MakeAllLivePlayersObservers(); team_round_going = 0; if (matchmode->value) { for (i = TEAM1; i <= teamCount; i++) { oldCaptains[i] = teams[i].captain; teams[i].captain = NULL; } } for (i = 0; i < numplayers; i++) { ent = players[i]; newteam = (i % teamCount) + 1; if (oldCaptains[ent->client->resp.team] == ent && !teams[newteam].captain) teams[newteam].captain = ent; ent->client->resp.team = newteam; const char *s = Info_ValueForKey( ent->client->pers.userinfo, "skin" ); AssignSkin( ent, s, false ); } teams_changed = true; CenterPrintAll("The teams have been scrambled!"); //Clear voting for (i = 0, ent = &g_edicts[1]; i < game.maxclients; i++, ent++) { if (!ent->inuse || !ent->client) continue; ent->client->resp.scramblevote = 0; } return true; }