Example #1
0
void G_KickFireTeamPlayer( int entityNum, int otherEntityNum ) {
	fireteamData_t *ft, *ft2;;

	if(entityNum == otherEntityNum) {
		return; // ok, stop being silly :p
	}

	if((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) {
		G_Error("G_KickFireTeamPlayer: invalid client");
	}

	if((otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS) || !g_entities[otherEntityNum].client) {
		G_Error("G_KickFireTeamPlayer: invalid client");
	}

	if(!G_IsFireteamLeader( entityNum, &ft )) {
		G_ClientPrintAndReturn( entityNum, "You are not the leader of a fireteam" );
	}

	if((!G_IsOnFireteam( otherEntityNum, &ft2 )) || ft != ft2) {
		G_ClientPrintAndReturn( entityNum, "You are not on the same Fireteam as the other player" );
	}


	Bot_Event_LeftFireTeam(otherEntityNum);
	G_RemoveClientFromFireteams( otherEntityNum, qtrue, qfalse );

	G_ClientPrintAndReturn( otherEntityNum, "You have been kicked from the fireteam" );
}
Example #2
0
// The only way a client should be removed from a fireteam
void G_RemoveClientFromFireteams( int entityNum, qboolean update, qboolean print ) {
	fireteamData_t* ft;
	int i, j;

	if((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) {
		G_Error("G_RemoveClientFromFireteams: invalid client");
	}

	if(G_IsOnFireteam( entityNum, &ft )) {
		for(i = 0; i < MAX_CLIENTS; i++) {
			if(ft->joinOrder[i] == entityNum) {
				if(i == 0) {
					if(ft->joinOrder[1] == -1) {
						ft->inuse = qfalse;
						ft->ident = -1;
					} else {
						// TODO: Inform client of promotion to leader
					}
				}
				for(j = i; j < MAX_CLIENTS-1; j++) {
					ft->joinOrder[j] = ft->joinOrder[j+1];
				}
				ft->joinOrder[MAX_CLIENTS-1] = -1;

				break;
			}
		}
	} else {
		return;
	}

	Bot_Event_LeftFireTeam(entityNum);

	/*if( ft->joinOrder[0] != -1 ) {
		if( g_entities[(int)ft->joinOrder[0]].r.svFlags & SVF_BOT ) {
			G_RemoveClientFromFireteams( ft->joinOrder[0], qfalse, qfalse );
		}
	}*/

	if( print ) {
		for( i = 0; i < MAX_CLIENTS; i++ ) {
			if( ft->joinOrder[i] == -1 ) {
				break;
			}
			trap_SendServerCommand( ft->joinOrder[i], va( "cpm \"%s ^7has left the Fireteam\"\n", level.clients[entityNum].pers.netname ) );
		}
	}

	if( update ) {
		G_UpdateFireteamConfigString(ft);
	}
}
Example #3
0
// The only way a client should be removed from a fireteam
void G_RemoveClientFromFireteams(int entityNum, qboolean update, qboolean print)
{
	fireteamData_t *ft;
	int            i;

	if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client)
	{
		G_Error("G_RemoveClientFromFireteams: invalid client\n");
	}

	if (G_IsOnFireteam(entityNum, &ft))
	{
		int j, firstHuman;

		for (i = 0; i < MAX_FIRETEAM_MEMBERS && i < g_maxclients.integer; ++i)
		{
			if (ft->joinOrder[i] == entityNum)
			{
				if (i == 0)
				{
					if (ft->joinOrder[1] == -1)
					{
						ft->inuse = qfalse;
						ft->ident = -1;
					}
					else
					{
						// disband the fireteam if only bots left in
						if (G_OnlyBotsInFireteam(ft, entityNum, &firstHuman))
						{
							// empty the fireteam
							for (j = 0; j < g_maxclients.integer - 1; j++)
							{
#ifdef FEATURE_OMNIBOT
								Bot_Event_LeftFireTeam(ft->joinOrder[j]);
#endif
								ft->joinOrder[j] = -1;
							}
							ft->inuse = qfalse;
							ft->ident = -1;
							G_UpdateFireteamConfigString(ft);
							return;
						}
						else
						{
							// try to pick a bot as fireteam leader
							if (g_entities[(int)(ft->joinOrder[1])].r.svFlags & SVF_BOT)
							{
								if (firstHuman != -1)
								{
									// swap first human with first bot
									int tmp = ft->joinOrder[1];

									ft->joinOrder[1]          = ft->joinOrder[firstHuman];
									ft->joinOrder[firstHuman] = tmp;
								}
							}
							else
							{
								firstHuman = 1;
							}
							// inform client of promotion to leader
							if (firstHuman != -1)
							{
								trap_SendServerCommand(ft->joinOrder[firstHuman], "cpm \"You are now the leader of your fireteam\"");
							}
						}
					}
				}
				for (j = i; j < g_maxclients.integer - 1; j++)
				{
					ft->joinOrder[j] = ft->joinOrder[j + 1];
				}
				ft->joinOrder[g_maxclients.integer - 1] = -1;

				break;
			}
		}
	}
	else
	{
		return;
	}

#ifdef FEATURE_OMNIBOT
	Bot_Event_LeftFireTeam(entityNum);
#endif

	if (print)
	{
		for (i = 0; i < MAX_CLIENTS; i++)
		{
			if (ft->joinOrder[i] == -1)
			{
				break;
			}

			trap_SendServerCommand(ft->joinOrder[i], va("cpm \"%s ^7has left the fireteam\"", level.clients[entityNum].pers.netname));
		}
	}

	if (update)
	{
		G_UpdateFireteamConfigString(ft);
	}
}