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" ); }
// 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); } }
// 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); } }