internal static void Join( Player player, Command cmd ) {
string worldName = cmd.Next();
if( worldName == null ) {
cdJoin.PrintUsage( player );
return;
}
World[] worlds = WorldManager.FindWorlds( worldName );
SearchingForWorldEventArgs e = new SearchingForWorldEventArgs( player, worldName, worlds.ToList(), true );
WorldManager.RaiseSearchingForWorldEvent( e );
worlds = e.Matches.ToArray();
if( worlds.Length > 1 ) {
player.ManyMatchesMessage( "world", worlds );
} else if( worlds.Length == 1 ) {
World world = worlds[0];
switch( world.AccessSecurity.CheckDetailed( player.Info ) ) {
case SecurityCheckResult.Allowed:
case SecurityCheckResult.WhiteListed:
if( world.IsFull ) {
player.Message( "Cannot join {0}&S: world is full.", world.GetClassyName() );
return;
}
player.StopSpectating();
if( !player.Session.JoinWorldNow( world, false, true ) ) {
player.Message( "ERROR: Failed to join world. See log for details." );
}
break;
case SecurityCheckResult.BlackListed:
player.Message( "Cannot join world {0}&S: you are blacklisted",
world.GetClassyName(), world.AccessSecurity.MinRank.GetClassyName() );
break;
case SecurityCheckResult.RankTooLow:
player.Message( "Cannot join world {0}&S: must be {1}+",
world.GetClassyName(), world.AccessSecurity.MinRank.GetClassyName() );
break;
}
} else {
// no worlds found - see if player meant to type in "/join" and not "/tp"
Player[] players = Server.FindPlayers( player, worldName );
if( players.Length == 1 ) {
player.StopSpectating();
player.ParseMessage( "/tp " + players[0].Name, false );
} else {
player.NoWorldMessage( worldName );
}
}
}