Beispiel #1
0
// 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;
}
Beispiel #2
0
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\"" );
}
Beispiel #3
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" );
	}


	G_RemoveClientFromFireteams( otherEntityNum, qtrue, qfalse );

	G_ClientPrintAndReturn( otherEntityNum, "You have been kicked from the fireteam" );
}
Beispiel #4
0
// 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;
	}
}
Beispiel #5
0
// 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 );
}
Beispiel #6
0
// 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;
		}
	}
}
Beispiel #7
0
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");
	}

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

	if(G_IsOnFireteam(otherEntityNum, NULL))
	{
		G_ClientPrintAndReturn(entityNum, "The other player is already on a fireteam");
	}

	if(!G_IsOnFireteam(entityNum, &ft))
	{
		G_ClientPrintAndReturn(entityNum, "You are not on a fireteam");
	}

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

	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;

// Omni-bot BEGIN
	Bot_Event_FireTeam_Proposal(leader - g_entities, otherEntityNum);
// Omni-bot END
}
Beispiel #8
0
void G_DestroyFireteam(int entityNum)
{
	fireteamData_t *ft;

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

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

	while(ft->joinOrder[0] != -1)
	{
		if(ft->joinOrder[0] != entityNum)
		{
			// Omni-bot BEGIN
			Bot_Event_FireTeamDestroyed(ft->joinOrder[0]);
			// Omni-bot END

			trap_SendServerCommand(ft->joinOrder[0], "cpm \"The Fireteam you are on has been disbanded\"\n");
		}

		G_RemoveClientFromFireteams(ft->joinOrder[0], qfalse, qfalse);
	}

	G_UpdateFireteamConfigString(ft);
}
Beispiel #9
0
// 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);
}
Beispiel #10
0
// 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;
}
Beispiel #11
0
// Command handler
void Cmd_FireTeam_MP_f( gentity_t* ent ) {
	char command[32];
	int i;

	if ( trap_Argc() < 2 ) {
		G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam <create|leave|apply|invite>" );
	}

	trap_Argv( 1, command, 32 );

	if ( !Q_stricmp( command, "create" ) ) {
		G_RegisterFireteam( ent - g_entities );
	} else if ( !Q_stricmp( command, "disband" ) ) {
		G_DestroyFireteam( ent - g_entities );
	} else if ( !Q_stricmp( command, "leave" ) ) {
		G_RemoveClientFromFireteams( ent - g_entities, qtrue, qtrue );
	} else if ( !Q_stricmp( command, "apply" ) ) {
		char namebuffer[32];
		int fireteam;

		if ( trap_Argc() < 3 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam apply <fireteamname|fireteamnumber>" );
		}

		trap_Argv( 2, namebuffer, 32 );
		fireteam = G_FireteamNumberForString( namebuffer, ent->client->sess.sessionTeam );

		if ( fireteam <= 0 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam apply <fireteamname|fireteamnumber>" );
		}

		G_ApplyToFireTeam( ent - g_entities, fireteam - 1 );
	} else if ( !Q_stricmp( command, "invite" ) ) {
		char namebuffer[32];
		int clientnum = 0;

		if ( trap_Argc() < 3 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam invite <clientname|clientnumber>" );
		}

		trap_Argv( 2, namebuffer, 32 );
		for ( i = 0; i < MAX_CLIENTS; i++ ) {
			if ( !g_entities[i].inuse || !g_entities[i].client ) {
				continue;
			}

			if ( !Q_stricmp( g_entities[i].client->pers.netname, namebuffer ) ) {
				clientnum = i + 1;
			}
		}

		if ( clientnum <= 0 ) {
			clientnum = atoi( namebuffer );

			if ( ( clientnum <= 0 || clientnum > MAX_CLIENTS ) || !g_entities[clientnum - 1].inuse || !g_entities[clientnum - 1].client ) {
				G_ClientPrintAndReturn( ent - g_entities, "Invalid client selected" );
			}
		}

		if ( clientnum <= 0 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam invite <clientname|clientnumber>" );
		}

		G_InviteToFireTeam( ent - g_entities, clientnum - 1 );
	} else if ( !Q_stricmp( command, "warn" ) ) {
		char namebuffer[32];
		int clientnum = 0;

		if ( trap_Argc() < 3 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam warn <clientname|clientnumber>" );
		}

		trap_Argv( 2, namebuffer, 32 );
		for ( i = 0; i < MAX_CLIENTS; i++ ) {
			if ( !g_entities[i].inuse || !g_entities[i].client ) {
				continue;
			}

			if ( !Q_stricmp( g_entities[i].client->pers.netname, namebuffer ) ) {
				clientnum = i + 1;
			}
		}

		if ( clientnum <= 0 ) {
			clientnum = atoi( namebuffer );

			if ( ( clientnum <= 0 || clientnum > MAX_CLIENTS ) || !g_entities[clientnum - 1].inuse || !g_entities[clientnum - 1].client ) {
				G_ClientPrintAndReturn( ent - g_entities, "Invalid client selected" );
			}
		}

		if ( clientnum <= 0 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam warn <clientname|clientnumber>" );
		}

		G_WarnFireTeamPlayer( ent - g_entities, clientnum - 1 );
	} else if ( !Q_stricmp( command, "kick" ) ) {
		char namebuffer[32];
		int clientnum = 0;

		if ( trap_Argc() < 3 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam kick <clientname|clientnumber>" );
		}

		trap_Argv( 2, namebuffer, 32 );
		for ( i = 0; i < MAX_CLIENTS; i++ ) {
			if ( !g_entities[i].inuse || !g_entities[i].client ) {
				continue;
			}

			if ( !Q_stricmp( g_entities[i].client->pers.netname, namebuffer ) ) {
				clientnum = i + 1;
			}
		}

		if ( clientnum <= 0 ) {
			clientnum = atoi( namebuffer );

			if ( ( clientnum <= 0 || clientnum > MAX_CLIENTS ) || !g_entities[clientnum - 1].inuse || !g_entities[clientnum - 1].client ) {
				G_ClientPrintAndReturn( ent - g_entities, "Invalid client selected" );
			}
		}

		if ( clientnum <= 0 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam kick <clientname|clientnumber>" );
		}

		G_KickFireTeamPlayer( ent - g_entities, clientnum - 1 );
	} else if ( !Q_stricmp( command, "propose" ) ) {
		char namebuffer[32];
		int clientnum = 0;

		if ( trap_Argc() < 3 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam propose <clientname|clientnumber>" );
		}

		trap_Argv( 2, namebuffer, 32 );
		for ( i = 0; i < MAX_CLIENTS; i++ ) {
			if ( !g_entities[i].inuse || !g_entities[i].client ) {
				continue;
			}

			if ( !Q_stricmp( g_entities[i].client->pers.netname, namebuffer ) ) {
				clientnum = i + 1;
			}
		}

		if ( clientnum <= 0 ) {
			clientnum = atoi( namebuffer );

			if ( ( clientnum <= 0 || clientnum > MAX_CLIENTS ) || !g_entities[clientnum - 1].inuse || !g_entities[clientnum - 1].client ) {
				G_ClientPrintAndReturn( ent - g_entities, "Invalid client selected" );
			}
		}

		if ( clientnum <= 0 ) {
			G_ClientPrintAndReturn( ent - g_entities, "usage: fireteam propose <clientname|clientnumber>" );
		}

		G_ProposeFireTeamPlayer( ent - g_entities, clientnum - 1 );
	}
}