//***************************************************************************** // void JOINQUEUE_PrintQueue( void ) { if ( NETWORK_GetState( ) != NETSTATE_SERVER ) { Printf ( "Only the server can print the join queue\n" ); return; } bool bQueueEmpty = true; for ( ULONG ulIdx = 0; ulIdx < MAXPLAYERS; ulIdx++ ) { if ( g_lJoinQueue[ulIdx].ulPlayer < MAXPLAYERS ) { player_t* pPlayer = &players[ulIdx]; bQueueEmpty = false; Printf ( "%02lu - %s", ulIdx + 1, pPlayer->userinfo.netname ); if ( GAMEMODE_GetFlags( GAMEMODE_GetCurrentMode( )) & GMF_PLAYERSONTEAMS ) Printf ( " - %s", TEAM_CheckIfValid ( g_lJoinQueue[ulIdx].ulTeam ) ? TEAM_GetName ( g_lJoinQueue[ulIdx].ulTeam ) : "auto team selection" ); Printf ( "\n" ); } } if ( bQueueEmpty ) Printf ( "The join queue is empty\n" ); }
bool AArtiTeleport::Use (bool pickup) { fixed_t destX; fixed_t destY; angle_t destAngle; // [BC] Let the server decide where we go. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return ( true ); } // [BB] If this is a team game and there are valid team starts for the team // the owner is on, teleport to one of the team starts. const ULONG ownerTeam = Owner->player ? Owner->player->ulTeam : teams.Size( ); if ( ( GAMEMODE_GetFlags( GAMEMODE_GetCurrentMode( )) & GMF_PLAYERSONTEAMS ) && TEAM_CheckIfValid ( ownerTeam ) && ( teams[ownerTeam].TeamStarts.Size( ) > 0 ) ) { unsigned int selections = teams[ownerTeam].TeamStarts.Size (); unsigned int i = pr_tele() % selections; destX = teams[ownerTeam].TeamStarts[i].x; destY = teams[ownerTeam].TeamStarts[i].y; destAngle = ANG45 * (teams[ownerTeam].TeamStarts[i].angle/45); } else if (deathmatch) { unsigned int selections = deathmatchstarts.Size (); unsigned int i = pr_tele() % selections; destX = deathmatchstarts[i].x; destY = deathmatchstarts[i].y; destAngle = ANG45 * (deathmatchstarts[i].angle/45); } else { FMapThing *pSpot = NULL; // [BB] If there is a designated start for this player use it. if ( playerstarts[Owner->player - players].type != 0 ) pSpot = &playerstarts[Owner->player - players]; // [BB] Otherwise we just have to select a start at random from all available player starts. else pSpot = SelectRandomCooperativeSpot( Owner->player - players ); if ( pSpot != NULL ) { destX = pSpot->x; destY = pSpot->y; destAngle = ANG45 * (pSpot->angle/45); } else I_Error( "ArtiTeleport: No player start found!" ); } P_Teleport (Owner, destX, destY, ONFLOORZ, destAngle, true, true, false); bool canlaugh = true; if (Owner->player->morphTics && (Owner->player->MorphStyle & MORPH_UNDOBYCHAOSDEVICE)) { // Teleporting away will undo any morph effects (pig) if (!P_UndoPlayerMorph (Owner->player, Owner->player, MORPH_UNDOBYCHAOSDEVICE) && (Owner->player->MorphStyle & MORPH_FAILNOLAUGH)) { canlaugh = false; } } if (canlaugh) { // Full volume laugh S_Sound (Owner, CHAN_VOICE, "*evillaugh", 1, ATTN_NONE); // [BC] Play the laugh for clients. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( Owner, CHAN_VOICE, "*evillaugh", 1, ATTN_NONE ); } return true; }
//***************************************************************************** // void JOINQUEUE_PopQueue( LONG lNumSlots ) { ULONG ulIdx; // Nothing to do if there's nobody waiting in the queue. if ( g_lJoinQueue[0].ulPlayer == MAXPLAYERS ) return; // [BB] Players are not allowed to join. if ( GAMEMODE_PreventPlayersFromJoining() ) return; // Try to find the next person in line. ulIdx = 0; while ( 1 ) { // Found end of list. if (( ulIdx == MAXPLAYERS ) || ( g_lJoinQueue[ulIdx].ulPlayer == MAXPLAYERS ) || ( lNumSlots == 0 )) { break; } // [BB] Since we possibly just let somebody waiting in line join, check if more persons are allowed to join now. if ( GAMEMODE_PreventPlayersFromJoining() ) break; // Found a player waiting in line. They will now join the game! if ( playeringame[g_lJoinQueue[ulIdx].ulPlayer] ) { // [K6] Reset their AFK timer now - they may have been waiting in the queue silently and we don't want to kick them. SERVER_GetClient( g_lJoinQueue[ulIdx].ulPlayer )->lLastActionTic = gametic; PLAYER_SpectatorJoinsGame ( &players[g_lJoinQueue[ulIdx].ulPlayer] ); // [BB/Spleen] The "lag interval" is only half of the "spectate info send" interval. Account for this here. if (( gametic - SERVER_GetClient( g_lJoinQueue[ulIdx].ulPlayer )->ulLastCommandTic ) <= 2*TICRATE ) SERVER_GetClient( g_lJoinQueue[ulIdx].ulPlayer )->ulClientGameTic += ( gametic - SERVER_GetClient( g_lJoinQueue[ulIdx].ulPlayer )->ulLastCommandTic ); if ( GAMEMODE_GetFlags( GAMEMODE_GetCurrentMode( )) & GMF_PLAYERSONTEAMS ) { if ( TEAM_CheckIfValid ( g_lJoinQueue[ulIdx].ulTeam ) ) PLAYER_SetTeam( &players[g_lJoinQueue[ulIdx].ulPlayer], g_lJoinQueue[ulIdx].ulTeam, true ); else PLAYER_SetTeam( &players[g_lJoinQueue[ulIdx].ulPlayer], TEAM_ChooseBestTeamForPlayer( ), true ); } // Begin the duel countdown. if ( duel ) { // [BB] Skip countdown and map reset if the map is supposed to be a lobby. if ( GAMEMODE_IsLobbyMap( ) ) DUEL_SetState( DS_INDUEL ); else if ( sv_duelcountdowntime > 0 ) DUEL_StartCountdown(( sv_duelcountdowntime * TICRATE ) - 1 ); else DUEL_StartCountdown(( 10 * TICRATE ) - 1 ); } // Begin the LMS countdown. else if ( lastmanstanding ) { if ( sv_lmscountdowntime > 0 ) LASTMANSTANDING_StartCountdown(( sv_lmscountdowntime * TICRATE ) - 1 ); else LASTMANSTANDING_StartCountdown(( 10 * TICRATE ) - 1 ); } else { if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVER_Printf( PRINT_HIGH, "%s \\c-joined the game.\n", players[g_lJoinQueue[ulIdx].ulPlayer].userinfo.netname ); else Printf( "%s \\c-joined the game.\n", players[g_lJoinQueue[ulIdx].ulPlayer].userinfo.netname ); } JOINQUEUE_RemovePlayerAtPosition ( ulIdx ); if ( lNumSlots > 0 ) lNumSlots--; } else ulIdx++; } // If we're the server, tell everyone their new position in line. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetQueuePosition( ); }