void G_ProposeFireTeamPlayer(int entityNum, int otherEntityNum) { fireteamData_t *ft; gentity_t *leader; if (entityNum == otherEntityNum) { return; // ok, stop being silly :p } if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_ProposeFireTeamPlayer: invalid client\n"); } if ((otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS) || !g_entities[otherEntityNum].client) { G_Error("G_ProposeFireTeamPlayer: invalid client\n"); } if (G_IsOnFireteam(otherEntityNum, NULL)) { G_ClientPrint(entityNum, "The other player is already on a fireteam"); return; } if (!G_IsOnFireteam(entityNum, &ft)) { G_ClientPrint(entityNum, "You are not on a fireteam"); return; } if (ft->joinOrder[0] == entityNum) { // you are the leader so just invite them G_InviteToFireTeam(entityNum, otherEntityNum); return; } leader = &g_entities[(int)ft->joinOrder[0]]; if (!leader->client) { G_Error("G_ProposeFireTeamPlayer: invalid client\n"); } trap_SendServerCommand(entityNum, va("proposition -1")); trap_SendServerCommand(leader - g_entities, va("proposition %i %i", otherEntityNum, entityNum)); leader->client->pers.propositionClient = otherEntityNum; leader->client->pers.propositionClient2 = entityNum; leader->client->pers.propositionEndTime = level.time + 20000; #ifdef FEATURE_OMNIBOT Bot_Event_FireTeam_Proposal(leader - g_entities, otherEntityNum); #endif }
// The only way a client should ever apply to join a team void G_ApplyToFireTeam( int entityNum, int fireteamNum ) { gentity_t *leader; fireteamData_t* ft; if ( ( entityNum < 0 || entityNum >= MAX_CLIENTS ) || !g_entities[entityNum].client ) { G_Error( "G_AddClientToFireteam: invalid client" ); } if ( G_IsOnFireteam( entityNum, NULL ) ) { G_ClientPrintAndReturn( entityNum, "You are already on a fireteam" ); } ft = &level.fireTeams[fireteamNum]; if ( !ft->inuse ) { G_ClientPrintAndReturn( entityNum, "The Fireteam you requested does not exist" ); } if ( ft->joinOrder[0] < 0 || ft->joinOrder[0] >= MAX_CLIENTS ) { G_Error( "G_ApplyToFireTeam: Fireteam leader is invalid\n" ); } leader = &g_entities[(int)ft->joinOrder[0]]; if ( !leader->client ) { G_Error( "G_ApplyToFireTeam: Fireteam leader client is NULL\n" ); } // TEMP // G_AddClientToFireteam( entityNum, ft->joinOrder[0] ); trap_SendServerCommand( entityNum, va( "application -1" ) ); trap_SendServerCommand( leader - g_entities, va( "application %i", entityNum ) ); leader->client->pers.applicationClient = entityNum; leader->client->pers.applicationEndTime = level.time + 20000; }
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" ); } G_RemoveClientFromFireteams( otherEntityNum, qtrue, qfalse ); G_ClientPrintAndReturn( otherEntityNum, "You have been kicked from the fireteam" ); }
// The only way a client should ever be invitied to join a team void G_InviteToFireTeam( int entityNum, int otherEntityNum ) { fireteamData_t* ft; if ( ( entityNum < 0 || entityNum >= MAX_CLIENTS ) || !g_entities[entityNum].client ) { G_Error( "G_InviteToFireTeam: invalid client" ); } if ( ( otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS ) || !g_entities[otherEntityNum].client ) { G_Error( "G_InviteToFireTeam: invalid client" ); } if ( !G_IsFireteamLeader( entityNum, &ft ) ) { G_ClientPrintAndReturn( entityNum, "You are not the leader of a fireteam" ); } if ( g_entities[entityNum].client->sess.sessionTeam != g_entities[otherEntityNum].client->sess.sessionTeam ) { G_ClientPrintAndReturn( entityNum, "You are not on the same team as the other player" ); } if ( G_IsOnFireteam( otherEntityNum, NULL ) ) { G_ClientPrintAndReturn( entityNum, "The other player is already on a fireteam" ); } if ( g_entities[otherEntityNum].r.svFlags & SVF_BOT ) { // Gordon: bots auto join G_AddClientToFireteam( otherEntityNum, entityNum ); } else { trap_SendServerCommand( entityNum, va( "invitation -1" ) ); trap_SendServerCommand( otherEntityNum, va( "invitation %i", entityNum ) ); g_entities[otherEntityNum].client->pers.invitationClient = entityNum; g_entities[otherEntityNum].client->pers.invitationEndTime = level.time + 20500; } }
void G_WarnFireTeamPlayer( 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_WarnFireTeamPlayer: invalid client" ); } if ( ( otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS ) || !g_entities[otherEntityNum].client ) { G_Error( "G_WarnFireTeamPlayer: 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" ); } trap_SendServerCommand( otherEntityNum, "cpm \"You have been warned by your Fireteam Commander\n\"" ); }
// Should be the only function that ever creates a fireteam void G_RegisterFireteam( /*const char* name,*/ int entityNum ) { fireteamData_t* ft; gentity_t* leader; int count, ident; if ( entityNum < 0 || entityNum >= MAX_CLIENTS ) { G_Error( "G_RegisterFireteam: invalid client" ); } leader = &g_entities[entityNum]; if ( !leader->client ) { G_Error( "G_RegisterFireteam: attempting to register a Fireteam to an entity with no client\n" ); } if ( G_IsOnFireteam( entityNum, NULL ) ) { G_ClientPrintAndReturn( entityNum, "You are already on a fireteam, leave it first" ); } /* if(!name || !*name) { G_ClientPrintAndReturn(entityNum, "You must choose a name for your fireteam"); }*/ if ( ( ft = G_FindFreeFireteam() ) == NULL ) { G_ClientPrintAndReturn( entityNum, "No free fireteams available" ); } if ( leader->client->sess.sessionTeam != TEAM_AXIS && leader->client->sess.sessionTeam != TEAM_ALLIES ) { G_ClientPrintAndReturn( entityNum, "Only players on a team can create a fireteam" ); } count = G_CountTeamFireteams( leader->client->sess.sessionTeam ); if ( count >= MAX_FIRETEAMS / 2 ) { G_ClientPrintAndReturn( entityNum, "Your team already has the maximum number of fireteams allowed" ); } ident = G_FindFreeFireteamIdent( leader->client->sess.sessionTeam ) + 1; if ( ident == 0 ) { G_ClientPrintAndReturn( entityNum, "Um, something is broken, spoink Gordon" ); } // good to go now, i hope! ft->inuse = qtrue; memset( ft->joinOrder, -1, sizeof( level.fireTeams[0].joinOrder ) ); ft->joinOrder[0] = leader - g_entities; ft->ident = ident; if ( g_autoFireteams.integer ) { ft->priv = qfalse; trap_SendServerCommand( entityNum, "aft -1" ); leader->client->pers.autofireteamEndTime = level.time + 20500; } else { ft->priv = qfalse; } // Q_strncpyz(ft->name, name, 32); G_UpdateFireteamConfigString( ft ); }
// only way a client should ever join a fireteam, other than creating one void G_AddClientToFireteam(int entityNum, int leaderNum) { fireteamData_t *ft; int i; if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_AddClientToFireteam: invalid client\n"); } if ((leaderNum < 0 || leaderNum >= MAX_CLIENTS) || !g_entities[leaderNum].client) { G_Error("G_AddClientToFireteam: invalid client\n"); } if (g_entities[leaderNum].client->sess.sessionTeam != g_entities[entityNum].client->sess.sessionTeam) { G_ClientPrint(entityNum, "You are not on the same team as that fireteam"); return; } if (!G_IsFireteamLeader(leaderNum, &ft)) { G_ClientPrint(entityNum, "The leader has now left the fireteam you applied to"); return; } if (G_IsOnFireteam(entityNum, NULL)) { G_ClientPrint(entityNum, "You are already on a fireteam"); return; } if (G_CountFireteamMembers(ft) >= MAX_FIRETEAM_MEMBERS) { G_ClientPrint(entityNum, "Too many players already on this fireteam"); return; } for (i = 0; i < MAX_CLIENTS; i++) { if (ft->joinOrder[i] == -1) { // found a free position ft->joinOrder[i] = entityNum; #ifdef FEATURE_OMNIBOT Bot_Event_JoinedFireTeam(entityNum, &g_entities[leaderNum]); #endif G_UpdateFireteamConfigString(ft); return; } } }
void G_GiveAdminOfFireTeam(int entityNum, int otherEntityNum) { fireteamData_t *ft, *ft2; char tempArray[MAX_CLIENTS]; int i, x; if (entityNum == otherEntityNum) { return; } if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_KickFireTeamPlayer: invalid client\n"); } if ((otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS) || !g_entities[otherEntityNum].client) { G_Error("G_KickFireTeamPlayer: invalid client\n"); } if (!G_IsFireteamLeader(entityNum, &ft)) { G_ClientPrint(entityNum, "You must be a fireteam admin to give admin rights to someone else"); return; } if ((!G_IsOnFireteam(otherEntityNum, &ft2)) || ft != ft2) { G_ClientPrint(entityNum, "The other player must be on the same fireteam for you to give admin rights to"); return; } tempArray[0] = otherEntityNum; tempArray[1] = entityNum; x = 2; for (i = 1; i < MAX_FIRETEAM_MEMBERS; i++) { if (ft->joinOrder[i] != otherEntityNum || ft->joinOrder[i] == -1) { tempArray[x++] = ft->joinOrder[i]; continue; } } for (i = 0; i < MAX_FIRETEAM_MEMBERS; i++) { ft->joinOrder[i] = tempArray[i]; } ft->leader = otherEntityNum; G_UpdateFireteamConfigString(ft); G_ClientPrint(otherEntityNum, "You have been given fireteam admin rights"); G_ClientPrint(entityNum, "You have been been stripped of fireteam admin rights"); }
// The only way a client should ever be invited to join a team void G_InviteToFireTeam(int entityNum, int otherEntityNum) { fireteamData_t *ft; if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_InviteToFireTeam: invalid client\n"); } if ((otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS) || !g_entities[otherEntityNum].client) { G_Error("G_InviteToFireTeam: invalid client\n"); } if (!G_IsFireteamLeader(entityNum, &ft)) { G_ClientPrint(entityNum, "You are not the leader of a fireteam"); return; } if (g_entities[entityNum].client->sess.sessionTeam != g_entities[otherEntityNum].client->sess.sessionTeam) { G_ClientPrint(entityNum, "You are not on the same team as the other player"); return; } if (G_IsOnFireteam(otherEntityNum, NULL)) { G_ClientPrint(entityNum, "The other player is already on a fireteam"); return; } if (G_CountFireteamMembers(ft) >= MAX_FIRETEAM_MEMBERS) { G_ClientPrint(entityNum, "Too many players already on this fireteam"); return; } if (g_entities[otherEntityNum].r.svFlags & SVF_BOT) { // bots auto join G_AddClientToFireteam(otherEntityNum, entityNum); } else { trap_SendServerCommand(entityNum, va("invitation -1")); trap_SendServerCommand(otherEntityNum, va("invitation %i", entityNum)); g_entities[otherEntityNum].client->pers.invitationClient = entityNum; g_entities[otherEntityNum].client->pers.invitationEndTime = level.time + 20500; } #ifdef FEATURE_OMNIBOT Bot_Event_InviteFireTeam(entityNum, otherEntityNum); #endif }
// only way a client should ever join a fireteam, other than creating one void G_AddClientToFireteam(int entityNum, int leaderNum) { fireteamData_t *ft; int i; if((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_AddClientToFireteam: invalid client"); } if((leaderNum < 0 || leaderNum >= MAX_CLIENTS) || !g_entities[leaderNum].client) { G_Error("G_AddClientToFireteam: invalid client"); } if(g_entities[leaderNum].client->sess.sessionTeam != g_entities[entityNum].client->sess.sessionTeam) { G_ClientPrintAndReturn(entityNum, "You are not on the same team as that fireteam"); } if(!G_IsFireteamLeader(leaderNum, &ft)) { G_ClientPrintAndReturn(entityNum, "The leader has now left the Fireteam you applied to"); } if(G_IsOnFireteam(entityNum, NULL)) { G_ClientPrintAndReturn(entityNum, "You are already on a fireteam"); } for(i = 0; i < MAX_CLIENTS; i++) { if(i >= 6) { G_ClientPrintAndReturn(entityNum, "Too many players already on this Fireteam"); return; } if(ft->joinOrder[i] == -1) { // found a free position ft->joinOrder[i] = entityNum; // Omni-bot BEGIN Bot_Event_JoinedFireTeam(entityNum, &g_entities[leaderNum]); // Omni-bot END G_UpdateFireteamConfigString(ft); return; } } }
// 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, 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; } } for (j = i; j < MAX_CLIENTS - 1; j++) { ft->joinOrder[j] = ft->joinOrder[j + 1]; } ft->joinOrder[MAX_CLIENTS - 1] = -1; break; } } } else { return; } if (print) { for (i = 0; i < MAX_CLIENTS; i++) { if (ft->joinOrder[i] == -1) { break; } trap_SendServerCommand(ft->joinOrder[i], va("cpm \"%s has left the Fireteam\"\n", level.clients[entityNum].pers.netname)); } } if (update) { G_UpdateFireteamConfigString(ft); } }
// Should be the only function that ever creates a fireteam void G_RegisterFireteam(int entityNum, qboolean priv) { fireteamData_t *ft; gentity_t *leader; int count, ident; if (entityNum < 0 || entityNum >= MAX_CLIENTS) { G_Error("G_RegisterFireteam: invalid client"); } leader = &g_entities[entityNum]; if (!leader->client) { G_Error("G_RegisterFireteam: attempting to register a Fireteam to an entity with no client\n"); } if (G_IsOnFireteam(entityNum, NULL)) { G_ClientPrintAndReturn(entityNum, "You are already on a fireteam, leave it first"); } if ((ft = G_FindFreeFireteam()) == NULL) { G_ClientPrintAndReturn(entityNum, "No free fireteams available"); } // Nico, allow cross-team fireteams count = G_CountFireteams(); if (count >= MAX_FIRETEAMS) { G_ClientPrintAndReturn(entityNum, "Your team already has the maximum number of fireteams allowed"); } ident = G_FindFreeFireteamIdent() + 1; if (ident == 0) { G_ClientPrintAndReturn(entityNum, "Um, something is broken, spoink Gordon"); } // good to go now, i hope! ft->inuse = qtrue; memset(ft->joinOrder, -1, sizeof (level.fireTeams[0].joinOrder)); ft->joinOrder[0] = leader - g_entities; ft->ident = ident; ft->priv = priv; G_UpdateFireteamConfigString(ft); }
void G_WarnFireTeamPlayer(int entityNum, int otherEntityNum) { fireteamData_t *ft, *ft2; if (entityNum == otherEntityNum) { return; // stop being silly } if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_WarnFireTeamPlayer: invalid client\n"); } if ((otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS) || !g_entities[otherEntityNum].client) { G_Error("G_WarnFireTeamPlayer: invalid client\n"); } if (!G_IsFireteamLeader(entityNum, &ft)) { G_ClientPrint(entityNum, "You are not the leader of a fireteam"); return; } if ((!G_IsOnFireteam(otherEntityNum, &ft2)) || ft != ft2) { G_ClientPrint(entityNum, "You are not on the same fireteam as the other player"); return; } trap_SendServerCommand(otherEntityNum, "cpm \"You have been warned by your fireteam leader\""); #ifdef FEATURE_OMNIBOT Bot_Event_FireTeam_Warn(entityNum, otherEntityNum); #endif }
// The only way a client should ever be invitied to join a team void G_InviteToFireTeam(int entityNum, int otherEntityNum) { fireteamData_t *ft; if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client) { G_Error("G_InviteToFireTeam: invalid client"); } if ((otherEntityNum < 0 || otherEntityNum >= MAX_CLIENTS) || !g_entities[otherEntityNum].client) { G_Error("G_InviteToFireTeam: invalid client"); } if (!G_IsFireteamLeader(entityNum, &ft)) { G_ClientPrintAndReturn(entityNum, "You are not the leader of a fireteam"); } if (G_IsOnFireteam(otherEntityNum, NULL)) { G_ClientPrintAndReturn(entityNum, "The other player is already on a fireteam"); } trap_SendServerCommand(entityNum, va("invitation -1")); trap_SendServerCommand(otherEntityNum, va("invitation %i", entityNum)); g_entities[otherEntityNum].client->pers.invitationClient = entityNum; g_entities[otherEntityNum].client->pers.invitationEndTime = level.time + 20500; }
// 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); } }
// Should be the only function that ever creates a fireteam void G_RegisterFireteam(int entityNum) { fireteamData_t *ft; gentity_t *leader; int count, ident; if (entityNum < 0 || entityNum >= MAX_CLIENTS) { G_Error("G_RegisterFireteam: invalid client\n"); } leader = &g_entities[entityNum]; if (!leader->client) { G_Error("G_RegisterFireteam: attempting to register a fireteam to an entity with no client\n"); } if (G_IsOnFireteam(entityNum, NULL)) { G_ClientPrint(entityNum, "You are already on a fireteam, leave it first"); return; } if ((ft = G_FindFreeFireteam()) == NULL) { G_ClientPrint(entityNum, "No free fireteams available"); return; } if (leader->client->sess.sessionTeam != TEAM_AXIS && leader->client->sess.sessionTeam != TEAM_ALLIES) { G_ClientPrint(entityNum, "Only players on a team can create a fireteam"); return; } count = G_CountTeamFireteams(leader->client->sess.sessionTeam); if (count >= MAX_FIRETEAMS / 2) { G_ClientPrint(entityNum, "Your team already has the maximum number of fireteams allowed"); return; } ident = G_FindFreeFireteamIdent(leader->client->sess.sessionTeam) + 1; if (ident == 0) { G_Error("G_RegisterFireteam: free fireteam is invalid\n"); return; } // good to go now ft->inuse = qtrue; memset(ft->joinOrder, -1, sizeof(level.fireTeams[0].joinOrder)); ft->joinOrder[0] = leader - g_entities; ft->ident = ident; if (g_autoFireteams.integer) { ft->priv = qfalse; trap_SendServerCommand(entityNum, "aft -1"); leader->client->pers.autofireteamEndTime = level.time + 20500; } else { ft->priv = qfalse; } #ifdef FEATURE_OMNIBOT Bot_Event_FireTeamCreated(entityNum, ft->ident); Bot_Event_JoinedFireTeam(leader - g_entities, leader); #endif G_UpdateFireteamConfigString(ft); }