internal static void ZoneAdd(Player player, Command cmd) { string zoneName = cmd.Next(); if (zoneName == null) { cdZoneAdd.PrintUsage(player); return; } Zone zone = new Zone(); if (zoneName.StartsWith("+")) { PlayerInfo info; if (!PlayerDB.FindPlayerInfo(zoneName.Substring(1), out info)) { player.Message("More than one player found matching \"{0}\"", zoneName.Substring(1)); return; } if (info == null) { player.NoPlayerMessage(zoneName.Substring(1)); return; } zone.Name = info.Name; zone.Controller.MinRank = info.Rank.NextRankUp ?? info.Rank; zone.Controller.Include(info); player.Message("Zone: Creating a {0}+&S zone for player {1}&S. Place a block or type /mark to use your location.", zone.Controller.MinRank.GetClassyName(), info.GetClassyName()); player.SetCallback(2, ZoneAddCallback, zone, cdZoneAdd.Permissions); } else { if (!World.IsValidName(zoneName)) { player.Message("\"{0}\" is not a valid zone name", zoneName); return; } if (player.World.Map.FindZone(zoneName) != null) { player.Message("A zone with this name already exists. Use &H/zedit&S to edit."); return; } zone.Name = zoneName; string rankName = cmd.Next(); if (rankName == null) { player.Message("No rank was specified. See &H/help zone"); return; } Rank minRank = RankManager.ParseRank(rankName); if (minRank != null) { string name; while ((name = cmd.Next()) != null) { if (name.Length == 0) { continue; } PlayerInfo info; if (!PlayerDB.FindPlayerInfo(name.Substring(1), out info)) { player.Message("More than one player found matching \"{0}\"", name.Substring(1)); return; } if (info == null) { player.NoPlayerMessage(name.Substring(1)); return; } if (name.StartsWith("+")) { zone.Controller.Include(info); } else if (name.StartsWith("-")) { zone.Controller.Exclude(info); } } zone.Controller.MinRank = minRank; player.SetCallback(2, ZoneAddCallback, zone, cdZoneAdd.Permissions); player.Message("Zone: Place a block or type /mark to use your location."); } else { player.NoRankMessage(rankName); } } }
internal static void ZoneEdit(Player player, Command cmd) { bool changesWereMade = false; string zoneName = cmd.Next(); if (zoneName == null) { player.Message("No zone name specified. See &H/help zedit"); return; } Zone zone = player.World.Map.FindZone(zoneName); if (zone == null) { player.Message("No zone found with the name \"{0}\". See &H/zones", zoneName); return; } string name; while ((name = cmd.Next()) != null) { if (name.Length < 2) { continue; } if (name.StartsWith("+")) { PlayerInfo info; if (!PlayerDB.FindPlayerInfo(name.Substring(1), out info)) { player.Message("More than one player found matching \"{0}\"", name.Substring(1)); return; } if (info == null) { player.NoPlayerMessage(name.Substring(1)); return; } // prevent players from whitelisting themselves to bypass protection if (!player.Info.Rank.AllowSecurityCircumvention && player.Info == info) { if (!zone.Controller.Check(info)) { player.Message("You must be {0}+&S to add yourself to this zone's whitelist.", zone.Controller.MinRank.GetClassyName()); continue; } } switch (zone.Controller.Include(info)) { case PermissionOverride.Deny: player.Message("{0}&S is no longer excluded from zone {1}", info.GetClassyName(), zone.GetClassyName()); changesWereMade = true; break; case PermissionOverride.None: player.Message("{0}&S is now included in zone {1}", info.GetClassyName(), zone.GetClassyName()); changesWereMade = true; break; case PermissionOverride.Allow: player.Message("{0}&S is already included in zone {1}", info.GetClassyName(), zone.GetClassyName()); break; } } else if (name.StartsWith("-")) { PlayerInfo info; if (!PlayerDB.FindPlayerInfo(name.Substring(1), out info)) { player.Message("More than one player found matching \"{0}\"", name.Substring(1)); return; } if (info == null) { player.NoPlayerMessage(name.Substring(1)); return; } switch (zone.Controller.Exclude(info)) { case PermissionOverride.Deny: player.Message("{0}&S is already excluded from zone {1}", info.GetClassyName(), zone.GetClassyName()); break; case PermissionOverride.None: player.Message("{0}&S is now excluded from zone {1}", info.GetClassyName(), zone.GetClassyName()); changesWereMade = true; break; case PermissionOverride.Allow: player.Message("{0}&S is no longer included in zone {1}", info.GetClassyName(), zone.GetClassyName()); changesWereMade = true; break; } } else { Rank minRank = RankManager.ParseRank(name); if (minRank != null) { // prevent players from lowering rank so bypass protection if (!player.Info.Rank.AllowSecurityCircumvention && zone.Controller.MinRank > player.Info.Rank && minRank <= player.Info.Rank) { player.Message("You are not allowed to lower the zone's rank."); continue; } if (zone.Controller.MinRank != minRank) { zone.Controller.MinRank = minRank; player.Message("Permission for zone \"{0}\" changed to {1}+", zone.Name, minRank.GetClassyName()); changesWereMade = true; } } else { player.NoRankMessage(name); } } if (changesWereMade) { zone.Edit(player.Info); player.World.Map.ChangedSinceSave = true; } else { player.Message("No changes were made to the zone."); } } }
internal static void ZoneAdd( Player player, Command cmd ) { string zoneName = cmd.Next(); if( zoneName == null ) { cdZoneAdd.PrintUsage( player ); return; } Zone zone = new Zone(); if( zoneName.StartsWith( "+" ) ) { PlayerInfo info; if( !PlayerDB.FindPlayerInfo( zoneName.Substring( 1 ), out info ) ) { player.Message( "More than one player found matching \"{0}\"", zoneName.Substring( 1 ) ); return; } if( info == null ) { player.NoPlayerMessage( zoneName.Substring( 1 ) ); return; } zone.Name = info.Name; zone.Controller.MinRank = info.Rank.NextRankUp ?? info.Rank; zone.Controller.Include( info ); player.Message( "Zone: Creating a {0}+&S zone for player {1}&S. Place a block or type /mark to use your location.", zone.Controller.MinRank.GetClassyName(), info.GetClassyName() ); player.SetCallback( 2, ZoneAddCallback, zone, cdZoneAdd.Permissions ); } else { if( !World.IsValidName( zoneName ) ) { player.Message( "\"{0}\" is not a valid zone name", zoneName ); return; } if( player.World.Map.FindZone( zoneName ) != null ) { player.Message( "A zone with this name already exists. Use &H/zedit&S to edit." ); return; } zone.Name = zoneName; string rankName = cmd.Next(); if( rankName == null ) { player.Message( "No rank was specified. See &H/help zone" ); return; } Rank minRank = RankManager.ParseRank( rankName ); if( minRank != null ) { string name; while( (name = cmd.Next()) != null ) { if( name.Length == 0 ) continue; PlayerInfo info; if( !PlayerDB.FindPlayerInfo( name.Substring( 1 ), out info ) ) { player.Message( "More than one player found matching \"{0}\"", name.Substring( 1 ) ); return; } if( info == null ) { player.NoPlayerMessage( name.Substring( 1 ) ); return; } if( name.StartsWith( "+" ) ) { zone.Controller.Include( info ); } else if( name.StartsWith( "-" ) ) { zone.Controller.Exclude( info ); } } zone.Controller.MinRank = minRank; player.SetCallback( 2, ZoneAddCallback, zone, cdZoneAdd.Permissions ); player.Message( "Zone: Place a block or type /mark to use your location." ); } else { player.NoRankMessage( rankName ); } } }
internal static void ZoneEdit( Player player, Command cmd ) { bool changesWereMade = false; string zoneName = cmd.Next(); if( zoneName == null ) { player.Message( "No zone name specified. See &H/help zedit" ); return; } Zone zone = player.World.Map.FindZone( zoneName ); if( zone == null ) { player.Message( "No zone found with the name \"{0}\". See &H/zones", zoneName ); return; } string name; while( (name = cmd.Next()) != null ) { if( name.Length < 2 ) continue; if( name.StartsWith( "+" ) ) { PlayerInfo info; if( !PlayerDB.FindPlayerInfo( name.Substring( 1 ), out info ) ) { player.Message( "More than one player found matching \"{0}\"", name.Substring( 1 ) ); return; } if( info == null ) { player.NoPlayerMessage( name.Substring( 1 ) ); return; } // prevent players from whitelisting themselves to bypass protection if( !player.Info.Rank.AllowSecurityCircumvention && player.Info == info ) { if( !zone.Controller.Check( info ) ) { player.Message( "You must be {0}+&S to add yourself to this zone's whitelist.", zone.Controller.MinRank.GetClassyName() ); continue; } } switch( zone.Controller.Include( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is no longer excluded from zone {1}", info.GetClassyName(), zone.GetClassyName() ); changesWereMade = true; break; case PermissionOverride.None: player.Message( "{0}&S is now included in zone {1}", info.GetClassyName(), zone.GetClassyName() ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is already included in zone {1}", info.GetClassyName(), zone.GetClassyName() ); break; } } else if( name.StartsWith( "-" ) ) { PlayerInfo info; if( !PlayerDB.FindPlayerInfo( name.Substring( 1 ), out info ) ) { player.Message( "More than one player found matching \"{0}\"", name.Substring( 1 ) ); return; } if( info == null ) { player.NoPlayerMessage( name.Substring( 1 ) ); return; } switch( zone.Controller.Exclude( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is already excluded from zone {1}", info.GetClassyName(), zone.GetClassyName() ); break; case PermissionOverride.None: player.Message( "{0}&S is now excluded from zone {1}", info.GetClassyName(), zone.GetClassyName() ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is no longer included in zone {1}", info.GetClassyName(), zone.GetClassyName() ); changesWereMade = true; break; } } else { Rank minRank = RankManager.ParseRank( name ); if( minRank != null ) { // prevent players from lowering rank so bypass protection if( !player.Info.Rank.AllowSecurityCircumvention && zone.Controller.MinRank > player.Info.Rank && minRank <= player.Info.Rank ) { player.Message( "You are not allowed to lower the zone's rank." ); continue; } if( zone.Controller.MinRank != minRank ) { zone.Controller.MinRank = minRank; player.Message( "Permission for zone \"{0}\" changed to {1}+", zone.Name, minRank.GetClassyName() ); changesWereMade = true; } } else { player.NoRankMessage( name ); } } if( changesWereMade ) { zone.Edit( player.Info ); player.World.Map.ChangedSinceSave = true; } else { player.Message( "No changes were made to the zone." ); } } }
internal static void WorldBuild( Player player, Command cmd ) { string worldName = cmd.Next(); // Print information about the current world if( worldName == null ) { if( player == Player.Console ) { player.Message( "When calling /wbuild from console, you must specify a world name." ); } else { player.World.BuildSecurity.PrintDescription( player, player.World, "world", "modified" ); } return; } // Find a world by name World world = WorldManager.FindWorldOrPrintMatches( player, worldName ); if( world == null ) return; string name = cmd.Next(); if( name == null ) { world.BuildSecurity.PrintDescription( player, world, "world", "modified" ); return; } bool changesWereMade = false; do { if( name.Length < 2 ) continue; // Whitelisting individuals if( name.StartsWith( "+" ) ) { PlayerInfo info; if( !PlayerDB.FindPlayerInfo( name.Substring( 1 ), out info ) ) { player.Message( "More than one player found matching \"{0}\"", name.Substring( 1 ) ); continue; } else if( info == null ) { player.NoPlayerMessage( name.Substring( 1 ) ); continue; } // prevent players from whitelisting themselves to bypass protection if( player.Info == info && !player.Info.Rank.AllowSecurityCircumvention ) { switch( world.BuildSecurity.CheckDetailed( player.Info ) ) { case SecurityCheckResult.RankTooLow: player.Message( "&WYou must be {0}&W+ to add yourself to the build whitelist of {0}", world.BuildSecurity.MinRank.GetClassyName(), world.GetClassyName() ); continue; // TODO: RankTooHigh case SecurityCheckResult.BlackListed: player.Message( "&WYou cannot remove yourself from the build blacklist of {0}", world.GetClassyName() ); continue; } } if( world.BuildSecurity.CheckDetailed( info ) == SecurityCheckResult.Allowed ) { player.Message( "{0}&S is already allowed to build in {1}&S (by rank)", info.GetClassyName(), world.GetClassyName() ); continue; } Player target = Server.FindPlayerExact( info ); if( target == player ) target = null; // to avoid duplicate messages switch( world.BuildSecurity.Include( info ) ) { case PermissionOverride.Deny: if( world.BuildSecurity.Check( info ) ) { player.Message( "{0}&S is no longer barred from building in {1}", info.GetClassyName(), world.GetClassyName() ); if( target != null ) { target.Message( "You can now build in world {0}&S (removed from blacklist by {1}&S).", world.GetClassyName(), player.GetClassyName() ); } } else { player.Message( "{0}&S was removed from the build blacklist of {1}&S. " + "Player is still NOT allowed to build (by rank).", info.GetClassyName(), world.GetClassyName() ); if( target != null ) { target.Message( "You were removed from the build blacklist of world {0}&S by {1}&S. " + "You are still NOT allowed to build (by rank).", player.GetClassyName(), world.GetClassyName() ); } } Logger.Log( "{0} removed {1} from the build blacklist of {2}", LogType.UserActivity, player.Name, info.Name, world.Name ); changesWereMade = true; break; case PermissionOverride.None: player.Message( "{0}&S is now allowed to build in {1}", info.GetClassyName(), world.GetClassyName() ); if( target != null ) { target.Message( "You can now build in world {0}&S (whitelisted by {1}&S).", world.GetClassyName(), player.GetClassyName() ); } Logger.Log( "{0} added {1} to the build whitelist on world {2}", LogType.UserActivity, player.Name, info.Name, world.Name ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is already on the build whitelist of {1}", info.GetClassyName(), world.GetClassyName() ); break; } // Blacklisting individuals } else if( name.StartsWith( "-" ) ) { PlayerInfo info; if( !PlayerDB.FindPlayerInfo( name.Substring( 1 ), out info ) ) { player.Message( "More than one player found matching \"{0}\"", name.Substring( 1 ) ); continue; } else if( info == null ) { player.NoPlayerMessage( name.Substring( 1 ) ); continue; } if( world.BuildSecurity.CheckDetailed( info ) == SecurityCheckResult.RankTooHigh || world.BuildSecurity.CheckDetailed( info ) == SecurityCheckResult.RankTooLow ) { player.Message( "{0}&S is already barred from building in {1}&S (by rank)", info.GetClassyName(), world.GetClassyName() ); continue; } Player target = Server.FindPlayerExact( info ); if( target == player ) target = null; // to avoid duplicate messages switch( world.BuildSecurity.Exclude( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is already on build blacklist of {1}", info.GetClassyName(), world.GetClassyName() ); break; case PermissionOverride.None: player.Message( "{0}&S is now barred from building in {1}", info.GetClassyName(), world.GetClassyName() ); if( target != null ) { target.Message( "&WYou were barred by {0}&W from building in world {1}", player.GetClassyName(), world.GetClassyName() ); } Logger.Log( "{0} added {1} to the build blacklist on world {2}", LogType.UserActivity, player.Name, info.Name, world.Name ); changesWereMade = true; break; case PermissionOverride.Allow: if( world.BuildSecurity.Check( info ) ) { player.Message( "{0}&S is no longer on the build whitelist of {1}&S. " + "Player is still allowed to build (by rank).", info.GetClassyName(), world.GetClassyName() ); if( target != null ) { target.Message( "You were removed from the build whitelist of world {0}&S by {1}&S. " + "You are still allowed to build (by rank).", player.GetClassyName(), world.GetClassyName() ); } } else { player.Message( "{0}&S is no longer allowed to build in {1}", info.GetClassyName(), world.GetClassyName() ); if( target != null ) { target.Message( "&WYou can no longer build in world {0}&W (removed from whitelist by {1}&W).", world.GetClassyName(), player.GetClassyName() ); } } Logger.Log( "{0} removed {1} from the build whitelist on world {2}", LogType.UserActivity, player.Name, info.Name, world.Name ); changesWereMade = true; break; } // Setting minimum rank } else { Rank rank = RankManager.FindRank( name ); if( rank == null ) { player.NoRankMessage( name ); } else if( !player.Info.Rank.AllowSecurityCircumvention && world.BuildSecurity.MinRank > rank && world.BuildSecurity.MinRank > player.Info.Rank ) { player.Message( "&WYou must be ranked {0}&W+ to lower build restrictions for world {1}", world.BuildSecurity.MinRank.GetClassyName(), world.GetClassyName() ); } else { // list players who are redundantly blacklisted SecurityController.PlayerListCollection lists = world.BuildSecurity.ExceptionList; PlayerInfo[] noLongerExcluded = lists.Excluded.Where( excludedPlayer => excludedPlayer.Rank < rank ).ToArray(); if( noLongerExcluded.Length > 0 ) { player.Message( "Following players no longer need to be blacklisted on world {0}&S: {1}", world.GetClassyName(), noLongerExcluded.JoinToClassyString() ); } // list players who are redundantly whitelisted PlayerInfo[] noLongerIncluded = lists.Included.Where( includedPlayer => includedPlayer.Rank >= rank ).ToArray(); if( noLongerIncluded.Length > 0 ) { player.Message( "Following players no longer need to be whitelisted on world {0}&S: {1}", world.GetClassyName(), noLongerIncluded.JoinToClassyString() ); } // apply changes world.BuildSecurity.MinRank = rank; changesWereMade = true; if( world.BuildSecurity.MinRank == RankManager.LowestRank ) { Server.SendToAll( "{0}&S allowed anyone to build on world {1}", player.GetClassyName(), world.GetClassyName() ); } else { Server.SendToAll( "{0}&S allowed only {1}+&S to build in world {2}", player.GetClassyName(), world.BuildSecurity.MinRank.GetClassyName(), world.GetClassyName() ); } Logger.Log( "{0} set build rank for world {1} to {2}+", LogType.UserActivity, player.Name, world.Name, world.BuildSecurity.MinRank.Name ); } } } while( (name = cmd.Next()) != null ); if( changesWereMade ) { WorldManager.SaveWorldList(); } }
static void ImportRanks( Player player, Command cmd ) { string serverName = cmd.Next(); string fileName = cmd.Next(); string rankName = cmd.Next(); bool silent = (cmd.Next() != null); // Make sure all parameters are specified if( rankName == null ) { cdImportRanks.PrintUsage( player ); return; } // Check if file exists if( !File.Exists( fileName ) ) { player.Message( "File not found: {0}", fileName ); return; } Rank targetRank = RankManager.ParseRank( rankName ); if( targetRank == null ) { player.NoRankMessage( rankName ); return; } string[] names; switch( serverName.ToLower() ) { case "mcsharp": case "mczall": case "mclawl": try { names = File.ReadAllLines( fileName ); } catch( Exception ex ) { Logger.Log( "Could not open \"{0}\" to import ranks: {1}", LogType.Error, fileName, ex ); return; } break; default: player.Message( "fCraft does not support importing from {0}", serverName ); return; } if( !cmd.IsConfirmed ) { player.AskForConfirmation( cmd, "You are about to import {0} player ranks.", names.Length ); return; } string reason = "(import from " + serverName + ")"; foreach( string name in names ) { PlayerInfo info = PlayerDB.FindPlayerInfoExact( name ) ?? PlayerDB.AddFakeEntry( name, RankChangeType.Promoted ); ModerationCommands.DoChangeRank( player, info, targetRank, reason, silent, false ); } PlayerDB.Save(); }
internal static void SetInfo( Player player, Command cmd ) { string targetName = cmd.Next(); string propertyName = cmd.Next(); string valName = cmd.NextAll(); if( targetName == null || propertyName == null ) { cdSetInfo.PrintUsage( player ); return; } PlayerInfo info; if( !PlayerDB.FindPlayerInfo( targetName, out info ) ) { player.Message( "More than one player found matching \"{0}\"", targetName ); } else if( info == null ) { player.NoPlayerMessage( targetName ); } else { switch( propertyName.ToLower() ) { case "timeskicked": int oldTimesKicked = info.TimesKicked; if( ValidateInt( valName, 0, 1000 ) ) { info.TimesKicked = Int32.Parse( valName ); player.Message( "TimesKicked for {0}&S changed from {1} to {2}", info.GetClassyName(), oldTimesKicked, info.TimesKicked ); } else { player.Message( "Value not in valid range (0...1000)" ); } return; case "previousrank": Rank newPreviousRank = RankManager.ParseRank( valName ); Rank oldPreviousRank = info.PreviousRank; if( newPreviousRank != null ) { info.PreviousRank = newPreviousRank; player.Message( "PreviousRank for {0}&S changed from {1}&S to {2}", info.GetClassyName(), oldPreviousRank.GetClassyName(), info.PreviousRank.GetClassyName() ); } else { player.NoRankMessage( valName ); } return; case "totaltime": TimeSpan newTotalTime; TimeSpan oldTotalTime = info.TotalTime; if( TimeSpan.TryParse( valName, out newTotalTime ) ) { info.TotalTime = newTotalTime; player.Message( "TotalTime for {0}&S changed from {1} to {2}", info.GetClassyName(), oldTotalTime.ToCompactString(), info.TotalTime.ToCompactString() ); } else { player.Message( "Could not parse time. Expected format: Days.HH:MM:SS" ); } return; case "rankchangetype": RankChangeType oldType = info.RankChangeType; foreach( string val in Enum.GetNames( typeof( RankChangeType ) ) ) { if( val.Equals( valName, StringComparison.OrdinalIgnoreCase ) ) { info.RankChangeType = (RankChangeType)Enum.Parse( typeof( RankChangeType ), valName, true ); player.Message( "RankChangeType for {0}&S changed from {1} to {2}", info.GetClassyName(), oldType, info.RankChangeType ); return; } } player.Message( "Could not parse RankChangeType. Allowed values: {0}", String.Join( ", ", Enum.GetNames( typeof( RankChangeType ) ) ) ); return; case "banreason": string oldBanReason = info.BanReason; info.BanReason = valName; player.Message( "BanReason for {0}&S changed from \"{1}\" to \"{2}\"", info.GetClassyName(), oldBanReason, info.BanReason ); return; case "unbanreason": string oldUnbanReason = info.UnbanReason; info.UnbanReason = valName; player.Message( "UnbanReason for {0}&S changed from \"{1}\" to \"{2}\"", info.GetClassyName(), oldUnbanReason, info.UnbanReason ); return; case "rankchangereason": string oldRankChangeReason = info.RankChangeReason; info.RankChangeReason = valName; player.Message( "RankChangeReason for {0}&S changed from \"{1}\" to \"{2}\"", info.GetClassyName(), oldRankChangeReason, info.RankChangeReason ); return; case "lastkickreason": string oldLastKickReason = info.LastKickReason; info.LastKickReason = valName; player.Message( "LastKickReason for {0}&S changed from \"{1}\" to \"{2}\"", info.GetClassyName(), oldLastKickReason, info.LastKickReason ); return; default: player.Message( "Only the following properties are editable: " + "TimesKicked, PreviousRank, TotalTime, RankChangeType, " + "BanReason, UnbanReason, RankChangeReason, LastKickReason" ); return; } } }
internal static void MassRank( Player player, Command cmd ) { string fromRankName = cmd.Next(); string toRankName = cmd.Next(); bool silent = (cmd.Next() != null); if( toRankName == null ) { cdMassRank.PrintUsage( player ); return; } Rank fromRank = RankManager.ParseRank( fromRankName ); if( fromRank == null ) { player.NoRankMessage( fromRankName ); return; } Rank toRank = RankManager.ParseRank( toRankName ); if( toRank == null ) { player.NoRankMessage( toRankName ); return; } if( fromRank == toRank ) { player.Message( "Ranks must be different" ); return; } int playerCount = PlayerDB.CountPlayersByRank( fromRank ); string verb = (fromRank > toRank ? "demot" : "promot"); if( !cmd.IsConfirmed ) { player.AskForConfirmation( cmd, "About to {0}e {1} players.", verb, playerCount ); return; } player.Message( "MassRank: {0}ing {1} players...", verb, playerCount ); int affected = PlayerDB.MassRankChange( player, fromRank, toRank, silent ); player.Message( "MassRank: done.", affected ); }
internal static void AutoRankAll( Player player, Command cmd ) { bool silent = (cmd.Next() != null); string rankName = cmd.Next(); Rank rank = null; if( rankName != null ) { rank = RankManager.ParseRank( rankName ); if( rank == null ) { player.NoRankMessage( rankName ); return; } } PlayerInfo[] list; if( rank == null ) { list = PlayerDB.GetPlayerListCopy(); } else { list = PlayerDB.GetPlayerListCopy( rank ); } DoAutoRankAll( player, list, silent, "~AutoRankAll" ); }