static void WorldsHandler( Player player, Command cmd ) {
string param = cmd.Next();
World[] worlds;
string listName;
string extraParam;
int offset = 0;
if( param == null || Int32.TryParse( param, out offset ) ) {
listName = "available worlds";
extraParam = "";
worlds = WorldManager.Worlds.Where( player.CanSee ).ToArray();
} else {
switch( Char.ToLower( param[0] ) ) {
case 'a':
listName = "worlds";
extraParam = "all ";
worlds = WorldManager.Worlds;
break;
case 'h':
listName = "hidden worlds";
extraParam = "hidden ";
worlds = WorldManager.Worlds.Where( w => !player.CanSee( w ) ).ToArray();
break;
case 'p':
listName = "populated worlds";
extraParam = "populated ";
worlds = WorldManager.Worlds.Where( w => w.Players.Any( player.CanSee ) ).ToArray();
break;
case '@':
if( param.Length == 1 ) {
CdWorlds.PrintUsage( player );
return;
}
string rankName = param.Substring( 1 );
Rank rank = RankManager.FindRank( rankName );
if( rank == null ) {
player.MessageNoRank( rankName );
return;
}
listName = String.Format( "worlds where {0}&S+ can build", rank.ClassyName );
extraParam = "@" + rank.Name + " ";
worlds = WorldManager.Worlds.Where( w => (w.BuildSecurity.MinRank <= rank) && player.CanSee( w ) )
.ToArray();
break;
default:
CdWorlds.PrintUsage( player );
return;
}
if( cmd.HasNext && !cmd.NextInt( out offset ) ) {
CdWorlds.PrintUsage( player );
return;
}
}
if( worlds.Length == 0 ) {
player.Message( "There are no {0}.", listName );
} else if( worlds.Length <= WorldNamesPerPage || player.IsSuper ) {
player.MessagePrefixed( "&S ", "&SThere are {0} {1}: {2}",
worlds.Length, listName, worlds.JoinToClassyString() );
} else {
if( offset >= worlds.Length ) {
offset = Math.Max( 0, worlds.Length - WorldNamesPerPage );
}
World[] worldsPart = worlds.Skip( offset ).Take( WorldNamesPerPage ).ToArray();
player.MessagePrefixed( "&S ", "&S{0}: {1}",
listName.UppercaseFirst(), worldsPart.JoinToClassyString() );
if( offset + worldsPart.Length < worlds.Length ) {
player.Message( "Showing {0}-{1} (out of {2}). Next: &H/Worlds {3}{1}",
offset + 1, offset + worldsPart.Length, worlds.Length, extraParam );
} else {
player.Message( "Showing worlds {0}-{1} (out of {2}).",
offset + 1, offset + worldsPart.Length, worlds.Length );
}
}
}