Пример #1
0
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!");
}
Пример #2
0
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;
}