static void ZoneInfoHandler(Player player, CommandReader cmd) { string zoneName = cmd.Next(); if (zoneName == null) { player.Message("No zone name specified. See &H/Help ZInfo"); return; } Zone zone = player.WorldMap.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } player.Message("About zone \"{0}\": size {1} x {2} x {3}, contains {4} blocks, editable by {5}+.", zone.Name, zone.Bounds.Width, zone.Bounds.Length, zone.Bounds.Height, zone.Bounds.Volume, zone.Controller.MinRank.ClassyName); player.Message(" Zone center is at ({0},{1},{2}).", (zone.Bounds.XMin + zone.Bounds.XMax) / 2, (zone.Bounds.YMin + zone.Bounds.YMax) / 2, (zone.Bounds.ZMin + zone.Bounds.ZMax) / 2); if (zone.CreatedBy != null) { player.Message(" Zone created by {0}&S on {1:MMM d} at {1:h:mm} ({2} ago).", zone.CreatedByClassy, zone.CreatedDate, DateTime.UtcNow.Subtract(zone.CreatedDate).ToMiniString()); } if (zone.EditedBy != null) { player.Message(" Zone last edited by {0}&S on {1:MMM d} at {1:h:mm} ({2}d {3}h ago).", zone.EditedByClassy, zone.EditedDate, DateTime.UtcNow.Subtract(zone.EditedDate).Days, DateTime.UtcNow.Subtract(zone.EditedDate).Hours); } PlayerExceptions zoneExceptions = zone.ExceptionList; if (zoneExceptions.Included.Length > 0) { player.Message(" Zone whitelist includes: {0}", zoneExceptions.Included.JoinToClassyString()); } if (zoneExceptions.Excluded.Length > 0) { player.Message(" Zone blacklist excludes: {0}", zoneExceptions.Excluded.JoinToClassyString()); } }
static void ZoneMarkHandler(Player player, CommandReader cmd) { if (player.SelectionMarksExpected == 0) { player.MessageNow("Cannot use ZMark - no selection in progress."); } else if (player.SelectionMarksExpected == 2) { string zoneName = cmd.Next(); if (zoneName == null) { CdZoneMark.PrintUsage(player); return; } Zone zone = player.WorldMap.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } player.SelectionResetMarks(); player.SelectionAddMark(zone.Bounds.MinVertex, false); player.SelectionAddMark(zone.Bounds.MaxVertex, true); } else { player.MessageNow("ZMark can only be used for 2-block selection."); } }
static void ZoneMarkHandler([NotNull] Player player, [NotNull] CommandReader cmd) { switch (player.SelectionMarksExpected) { case 0: player.MessageNow("Cannot use ZMark - no selection in progress."); break; case 2: { string zoneName = cmd.Next(); if (zoneName == null) { CdZoneMark.PrintUsage(player); return; } Zone zone = player.WorldMap.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } player.SelectionResetMarks(); player.SelectionAddMark(zone.Bounds.MinVertex, false, false); player.SelectionAddMark(zone.Bounds.MaxVertex, false, true); } break; default: player.MessageNow("ZMark can only be used with 2-block/2-click selections."); break; } }
private static void ZoneRemoveHandler(Player player, Command cmd) { string zoneName = cmd.Next(); if (zoneName == null) { CdZoneRemove.PrintUsage(player); return; } ZoneCollection zones = player.WorldMap.Zones; Zone zone = zones.Find(zoneName); if (zone != null) { if (!player.Info.Rank.AllowSecurityCircumvention) { switch (zone.Controller.CheckDetailed(player.Info)) { case SecurityCheckResult.BlackListed: player.Message("You are not allowed to remove zone {0}: you are blacklisted.", zone.ClassyName); return; case SecurityCheckResult.RankTooLow: player.Message("You are not allowed to remove zone {0}.", zone.ClassyName); return; } } if (!cmd.IsConfirmed) { player.Confirm(cmd, "Remove zone {0}&S?", zone.ClassyName); return; } if (zones.Remove(zone.Name)) { player.Message("Zone \"{0}\" removed.", zone.Name); } } else { player.MessageNoZone(zoneName); } }
static void ZoneRenameHandler(Player player, CommandReader cmd) { World playerWorld = player.World; if (playerWorld == null) { PlayerOpException.ThrowNoWorld(player); } // make sure that both parameters are given string oldName = cmd.Next(); string newName = cmd.Next(); if (oldName == null || newName == null) { CdZoneRename.PrintUsage(player); return; } // make sure that the new name is valid if (!World.IsValidName(newName)) { player.Message("\"{0}\" is not a valid zone name", newName); return; } // find the old zone var zones = player.WorldMap.Zones; Zone oldZone = zones.Find(oldName); if (oldZone == null) { player.MessageNoZone(oldName); return; } // Check if a zone with "newName" name already exists Zone newZone = zones.FindExact(newName); if (newZone != null && newZone != oldZone) { player.Message("A zone with the name \"{0}\" already exists.", newName); return; } // check if any change is needed string fullOldName = oldZone.Name; if (fullOldName == newName) { player.Message("The zone is already named \"{0}\"", fullOldName); return; } // actually rename the zone zones.Rename(oldZone, newName); // announce the rename playerWorld.Players.Message("&SZone \"{0}\" was renamed to \"{1}&S\" by {2}", fullOldName, oldZone.ClassyName, player.ClassyName); Logger.Log(LogType.UserActivity, "Player {0} renamed zone \"{1}\" to \"{2}\" on world {3}", player.Name, fullOldName, newName, playerWorld.Name); }
static void ZoneRemoveHandler(Player player, CommandReader cmd) { if (player.World == null) { PlayerOpException.ThrowNoWorld(player); } string zoneName = cmd.Next(); if (zoneName == null || cmd.HasNext) { CdZoneRemove.PrintUsage(player); return; } if (zoneName == "*") { if (!cmd.IsConfirmed) { Logger.Log(LogType.UserActivity, "ZRemove: Asked {0} to confirm removing all zones on world {1}", player.Name, player.World.Name); player.Confirm(cmd, "&WRemove ALL zones on this world ({0}&W)? This cannot be undone.&S", player.World.ClassyName); return; } player.WorldMap.Zones.Clear(); Logger.Log(LogType.UserActivity, "Player {0} removed all zones on world {1}", player.Name, player.World.Name); Server.Message("Player {0}&S removed all zones on world {1}", player.ClassyName, player.World.ClassyName); return; } ZoneCollection zones = player.WorldMap.Zones; Zone zone = zones.Find(zoneName); if (zone != null) { if (!player.Info.Rank.AllowSecurityCircumvention) { switch (zone.Controller.CheckDetailed(player.Info)) { case SecurityCheckResult.BlackListed: player.Message("You are not allowed to remove zone {0}: you are blacklisted.", zone.ClassyName); return; case SecurityCheckResult.RankTooLow: player.Message("You are not allowed to remove zone {0}.", zone.ClassyName); return; } } if (!cmd.IsConfirmed) { Logger.Log(LogType.UserActivity, "ZRemove: Asked {0} to confirm removing zone {1} from world {2}", player.Name, zone.Name, player.World.Name); player.Confirm(cmd, "Remove zone {0}&S?", zone.ClassyName); return; } if (zones.Remove(zone.Name)) { Logger.Log(LogType.UserActivity, "Player {0} removed zone {1} from world {2}", player.Name, zone.Name, player.World.Name); player.Message("Zone \"{0}\" removed.", zone.Name); } } else { player.MessageNoZone(zoneName); } }
static void ZoneEditHandler( Player player, CommandReader cmd ) { if( player.World == null ) PlayerOpException.ThrowNoWorld( player ); bool changesWereMade = false; string zoneName = cmd.Next(); if( zoneName == null ) { player.Message( "No zone name specified. See &H/Help ZEdit" ); return; } Zone zone = player.WorldMap.Zones.Find( zoneName ); if( zone == null ) { player.MessageNoZone( zoneName ); return; } if (!canManageSpecialZone(zone.Name.ToLower(), player)) { return; } if (zone.Name.ToLower().StartsWith("command_")) { if (player.Info.Rank != RankManager.HighestRank) { player.Message("You cannot affect command zones."); return; } } //player.Message(cmd.RawMessage); //player.Message(cmd.RawMessage.Substring(cmd.Offset)); if (cmd.RawMessage.Substring(cmd.Offset + 1).StartsWith("#")) { zone.Sign = cmd.NextAll().Substring(1); if (zone.Sign.Length == 0 || zone.Sign == null) { if (!Directory.Exists("./Signs/")) Directory.CreateDirectory("./Signs/"); if (!Directory.Exists("./Signs/" + player.World.Name + "/")) Directory.CreateDirectory("./Signs/" + player.World.Name + "/"); if (File.Exists("./Signs/" + player.World.Name + "/" + zone.Name + ".txt")) File.Delete("./Signs/" + player.World.Name + "/" + zone.Name + ".txt"); player.Message("&SSign Text for zone {0}&S was removed.", zone.ClassyName); zone.Sign = null; } else { if (!Directory.Exists("./Signs/")) Directory.CreateDirectory("./Signs/"); if (!Directory.Exists("./Signs/" + player.World.Name + "/")) Directory.CreateDirectory("./Signs/" + player.World.Name + "/"); File.WriteAllText("./Signs/" + player.World.Name + "/" + zone.Name + ".txt", cmd.NextAll().Substring(1).Replace("%n", "/n")); player.Message("&SSign Text for zone {0}&S changed to {1}", zone.ClassyName, zone.Sign); zone.Sign = null; } return; } string nextToken; while( (nextToken = cmd.Next()) != null ) { // Clear whitelist if( nextToken.Equals( "-*" ) ) { PlayerInfo[] oldWhitelist = zone.Controller.ExceptionList.Included; if( oldWhitelist.Length > 0 ) { zone.Controller.ResetIncludedList(); player.Message( "Whitelist of zone {0}&S cleared: {1}", zone.ClassyName, oldWhitelist.JoinToClassyString() ); Logger.Log( LogType.UserActivity, "{0} {1} &scleared whitelist of zone {2} on world {3}: {4}", player.Info.Rank.Name, player.Name, zone.Name, player.World.Name, oldWhitelist.JoinToString( pi => pi.Name ) ); } else { player.Message( "Whitelist of zone {0}&S is empty.", zone.ClassyName ); } continue; } // Clear blacklist if( nextToken.Equals( "+*" ) ) { PlayerInfo[] oldBlacklist = zone.Controller.ExceptionList.Excluded; if( oldBlacklist.Length > 0 ) { zone.Controller.ResetExcludedList(); player.Message( "Blacklist of zone {0}&S cleared: {1}", zone.ClassyName, oldBlacklist.JoinToClassyString() ); Logger.Log( LogType.UserActivity, "{0} {1} &scleared blacklist of zone {2} on world {3}: {4}", player.Info.Rank.Name, player.Name, zone.Name, player.World.Name, oldBlacklist.JoinToString( pi => pi.Name ) ); } else { player.Message( "Blacklist of zone {0}&S is empty.", zone.ClassyName ); } continue; } if( nextToken.StartsWith( "+" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, nextToken.Substring( 1 ), SearchOptions.IncludeSelf ); if( info == null ) return; // prevent players from whitelisting themselves to bypass protection if (!player.Info.Rank.AllowSecurityCircumvention && player.Info == info) { switch( zone.Controller.CheckDetailed( info ) ) { case SecurityCheckResult.BlackListed: player.Message( "You are not allowed to remove yourself from the blacklist of zone {0}", zone.ClassyName ); continue; case SecurityCheckResult.RankTooLow: player.Message( "You must be {0}+&S to add yourself to the whitelist of zone {1}", zone.Controller.MinRank.ClassyName, zone.ClassyName ); continue; } } switch( zone.Controller.Include( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is no longer excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.None: player.Message( "{0}&S is now included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is already included in zone {1}", info.ClassyName, zone.ClassyName ); break; } } else if( nextToken.StartsWith( "-" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches(player, nextToken.Substring(1), SearchOptions.Default); if( info == null ) return; if (!player.Info.Rank.AllowSecurityCircumvention && player.Info == info) { switch (zone.Controller.CheckDetailed(info)) { case SecurityCheckResult.WhiteListed: player.Message("You are not allowed to remove yourself from the whitelist of zone {0}", zone.ClassyName); continue; case SecurityCheckResult.RankTooLow: player.Message("You must be {0}+&S to add yourself to the blacklist of zone {1}", zone.Controller.MinRank.ClassyName, zone.ClassyName); continue; } } switch( zone.Controller.Exclude( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is already excluded from zone {1}", info.ClassyName, zone.ClassyName ); break; case PermissionOverride.None: player.Message( "{0}&S is now excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is no longer included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; } } else { Rank minRank = RankManager.FindRank( nextToken ); 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.ClassyName ); changesWereMade = true; } } else { player.MessageNoRank( nextToken ); } } if( changesWereMade ) { zone.Edit( player.Info ); } else { player.Message( "No changes were made to the zone." ); } } }
static void ZoneRemoveHandler( Player player, Command cmd ) { string zoneName = cmd.Next(); if( zoneName == null ) { CdZoneRemove.PrintUsage( player ); return; } ZoneCollection zones = player.WorldMap.Zones; Zone zone = zones.Find( zoneName ); if( zone != null ) { if( !player.Info.Rank.AllowSecurityCircumvention ) { switch( zone.Controller.CheckDetailed( player.Info ) ) { case SecurityCheckResult.BlackListed: player.Message( "You are not allowed to remove zone {0}: you are blacklisted.", zone.ClassyName ); return; case SecurityCheckResult.RankTooLow: player.Message( "You are not allowed to remove zone {0}.", zone.ClassyName ); return; } } if( !cmd.IsConfirmed ) { player.Confirm( cmd, "You are about to remove zone {0}&S.", zone.ClassyName ); return; } if( zones.Remove( zone.Name ) ) { player.Message( "Zone \"{0}\" removed.", zone.Name ); } } else { player.MessageNoZone( zoneName ); } }
static void ZoneInfoHandler( Player player, Command cmd ) { string zoneName = cmd.Next(); if( zoneName == null ) { player.Message( "No zone name specified. See &H/Help ZInfo" ); return; } Zone zone = player.WorldMap.Zones.Find( zoneName ); if( zone == null ) { player.MessageNoZone( zoneName ); return; } player.Message( "About zone \"{0}\": size {1} x {2} x {3}, contains {4} blocks, editable by {5}+.", zone.Name, zone.Bounds.Width, zone.Bounds.Length, zone.Bounds.Height, zone.Bounds.Volume, zone.Controller.MinRank.ClassyName ); player.Message( " Zone center is at ({0},{1},{2}).", (zone.Bounds.XMin + zone.Bounds.XMax) / 2, (zone.Bounds.YMin + zone.Bounds.YMax) / 2, (zone.Bounds.ZMin + zone.Bounds.ZMax) / 2 ); if( zone.CreatedBy != null ) { player.Message( " Zone created by {0}&S on {1:MMM d} at {1:h:mm} ({2} ago).", zone.CreatedBy.ClassyName, zone.CreatedDate, DateTime.UtcNow.Subtract( zone.CreatedDate ).ToMiniString() ); } if( zone.EditedBy != null ) { player.Message( " Zone last edited by {0}&S on {1:MMM d} at {1:h:mm} ({2}d {3}h ago).", zone.EditedBy.ClassyName, zone.EditedDate, DateTime.UtcNow.Subtract( zone.EditedDate ).Days, DateTime.UtcNow.Subtract( zone.EditedDate ).Hours ); } PlayerExceptions zoneExceptions = zone.ExceptionList; if( zoneExceptions.Included.Length > 0 ) { player.Message( " Zone whitelist includes: {0}", zoneExceptions.Included.JoinToClassyString() ); } if( zoneExceptions.Excluded.Length > 0 ) { player.Message( " Zone blacklist excludes: {0}", zoneExceptions.Excluded.JoinToClassyString() ); } }
static void ZoneEditHandler( Player player, CommandReader cmd ) { World playerWorld = player.World; if( playerWorld == null ) PlayerOpException.ThrowNoWorld( player ); bool changesWereMade = false; string zoneName = cmd.Next(); if( zoneName == null ) { player.Message( "No zone name specified. See &H/Help ZEdit" ); return; } Zone zone = player.WorldMap.Zones.Find( zoneName ); if( zone == null ) { player.MessageNoZone( zoneName ); return; } string nextToken; while( (nextToken = cmd.Next()) != null ) { // Clear whitelist if( nextToken.Equals( "-*" ) ) { PlayerInfo[] oldWhitelist = zone.Controller.ExceptionList.Included; if( oldWhitelist.Length > 0 ) { zone.Controller.ResetIncludedList(); player.Message( "Whitelist of zone {0}&S cleared: {1}", zone.ClassyName, oldWhitelist.JoinToClassyString() ); Logger.Log( LogType.UserActivity, "Player {0} cleared whitelist of zone {1} on world {2}: {3}", player.Name, zone.Name, playerWorld.Name, oldWhitelist.JoinToString( pi => pi.Name ) ); } else { player.Message( "Whitelist of zone {0}&S is empty.", zone.ClassyName ); } continue; } // Clear blacklist if( nextToken.Equals( "+*" ) ) { PlayerInfo[] oldBlacklist = zone.Controller.ExceptionList.Excluded; if( oldBlacklist.Length > 0 ) { zone.Controller.ResetExcludedList(); player.Message( "Blacklist of zone {0}&S cleared: {1}", zone.ClassyName, oldBlacklist.JoinToClassyString() ); Logger.Log( LogType.UserActivity, "Player {0} cleared blacklist of zone {1} on world {2}: {3}", player.Name, zone.Name, playerWorld.Name, oldBlacklist.JoinToString( pi => pi.Name ) ); } else { player.Message( "Blacklist of zone {0}&S is empty.", zone.ClassyName ); } continue; } if( nextToken.StartsWith( "+" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, nextToken.Substring( 1 ), SearchOptions.IncludeSelf ); if( info == null ) return; // prevent players from whitelisting themselves to bypass protection if( !player.Info.Rank.AllowSecurityCircumvention && player.Info == info ) { switch( zone.Controller.CheckDetailed( info ) ) { case SecurityCheckResult.BlackListed: player.Message( "You are not allowed to remove yourself from the blacklist of zone {0}", zone.ClassyName ); continue; case SecurityCheckResult.RankTooLow: player.Message( "You must be {0}+&S to add yourself to the whitelist of zone {1}", zone.Controller.MinRank.ClassyName, zone.ClassyName ); continue; } } switch( zone.Controller.Include( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is no longer excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.None: player.Message( "{0}&S is now included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is already included in zone {1}", info.ClassyName, zone.ClassyName ); break; } } else if( nextToken.StartsWith( "-" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, nextToken.Substring( 1 ), SearchOptions.IncludeSelf ); if( info == null ) return; switch( zone.Controller.Exclude( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is already excluded from zone {1}", info.ClassyName, zone.ClassyName ); break; case PermissionOverride.None: player.Message( "{0}&S is now excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is no longer included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; } } else { Rank minRank = RankManager.FindRank( nextToken ); 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.ClassyName ); changesWereMade = true; } } else { player.MessageNoRank( nextToken ); } } if( changesWereMade ) { zone.OnEdited( player.Info.Name ); } else { player.Message( "No changes were made to the zone." ); } } }
static void ZoneEditHandler(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.WorldMap.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } string name; while ((name = cmd.Next()) != null) { if (name.StartsWith("+")) { if (name.Length == 1) { CdZoneEdit.PrintUsage(player); break; } PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches(player, name.Substring(1)); if (info == null) { 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.ClassyName); continue; } } switch (zone.Controller.Include(info)) { case PermissionOverride.Deny: player.Message("{0}&S is no longer excluded from zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; case PermissionOverride.None: player.Message("{0}&S is now included in zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; case PermissionOverride.Allow: player.Message("{0}&S is already included in zone {1}", info.ClassyName, zone.ClassyName); break; } } else if (name.StartsWith("-")) { if (name.Length == 1) { CdZoneEdit.PrintUsage(player); break; } PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches(player, name.Substring(1)); if (info == null) { return; } switch (zone.Controller.Exclude(info)) { case PermissionOverride.Deny: player.Message("{0}&S is already excluded from zone {1}", info.ClassyName, zone.ClassyName); break; case PermissionOverride.None: player.Message("{0}&S is now excluded from zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; case PermissionOverride.Allow: player.Message("{0}&S is no longer included in zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; } } else { Rank minRank = RankManager.FindRank(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.ClassyName); changesWereMade = true; } } else { player.MessageNoRank(name); } } if (changesWereMade) { zone.Edit(player.Info); } else { player.Message("No changes were made to the zone."); } } }
static void TPZone(Player player, Command cmd) { string zoneName = cmd.Next(); if (zoneName == null) { player.Message("No zone name specified. See &Z/help tpzone"); return; } else { Zone zone = player.World.Map.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } TPHandler2(player, new Command("/tp " + ((zone.Bounds.XMin + zone.Bounds.XMax) / 2) + " " + ((zone.Bounds.YMin + zone.Bounds.YMax) / 2) + " " + (((zone.Bounds.ZMin + zone.Bounds.ZMax) / 2) + 2))); } }
static void SignRemoveHandler(Player player, CommandReader cmd) { if (player.World == null) PlayerOpException.ThrowNoWorld(player); string zoneName = "Sign_" + cmd.Next(); if (zoneName == "Sign_") { CdSignRemove.PrintUsage(player); return; } ZoneCollection zones = player.WorldMap.Zones; Zone zone = zones.Find(zoneName); if (zone != null) { if (!cmd.IsConfirmed) { Logger.Log(LogType.UserActivity, "SRemove: Asked {0} to confirm removing Sign {1} from world {2}", player.Name, zone.Name, player.World.Name); player.Confirm(cmd, "Remove Sign {0}&S?", zone.ClassyName); return; } if (zones.Remove(zone.Name)) { Logger.Log(LogType.UserActivity, "{0} {1} &sremoved Sign {2} from world {3}", player.Info.Rank.Name, player.Name, zone.Name, player.World.Name); player.Message("Sign \"{0}\" removed.", zone.Name); } } else { player.MessageNoZone(zoneName); } }
static void ZoneRemoveHandler( Player player, CommandReader cmd ) { if( player.World == null ) PlayerOpException.ThrowNoWorld( player ); string zoneName = cmd.Next(); if( zoneName == null || cmd.HasNext ) { CdZoneRemove.PrintUsage( player ); return; } if( zoneName == "*" ) { if( !cmd.IsConfirmed ) { Logger.Log( LogType.UserActivity, "ZRemove: Asked {0} to confirm removing all zones on world {1}", player.Name, player.World.Name ); player.Confirm( cmd, "&WRemove ALL zones on this world ({0}&W)? This cannot be undone.&S", player.World.ClassyName ); return; } player.WorldMap.Zones.Clear(); Logger.Log( LogType.UserActivity, "{0} {1} &sremoved all zones on world {2}", player.Info.Rank.Name, player.Name, player.World.Name ); Server.Message( "{0} {1}&S removed all zones on world {2}", player.Info.Rank.Name, player.ClassyName, player.World.ClassyName ); return; } ZoneCollection zones = player.WorldMap.Zones; Zone zone = zones.Find( zoneName ); if (zone == null) { player.MessageNoZone(zoneName); return; } if (!canManageSpecialZone(zone.Name.ToLower(), player)) { return; } if (zone.Name.ToLower().StartsWith("command_")) { if (player.Info.Rank != RankManager.HighestRank) { player.Message("You cannot affect command zones."); return; } } if( zone != null ) { if( !player.Info.Rank.AllowSecurityCircumvention ) { switch( zone.Controller.CheckDetailed( player.Info ) ) { case SecurityCheckResult.BlackListed: player.Message( "You are not allowed to remove zone {0}: you are blacklisted.", zone.ClassyName ); return; case SecurityCheckResult.RankTooLow: player.Message( "You are not allowed to remove zone {0}.", zone.ClassyName ); return; } } if( !cmd.IsConfirmed ) { Logger.Log( LogType.UserActivity, "ZRemove: Asked {0} to confirm removing zone {1} from world {2}", player.Name, zone.Name, player.World.Name ); player.Confirm( cmd, "Remove zone {0}&S?", zone.ClassyName ); return; } if( zones.Remove( zone.Name ) ) { foreach (Player p in player.World.Players.Where(a => a.Supports(CpeExtension.SelectionCuboid))) { p.Send(Packet.MakeRemoveSelection(zone.ZoneID)); } Logger.Log( LogType.UserActivity, "{0} {1} &sremoved zone {2} from world {3}", player.Info.Rank.Name, player.Name, zone.Name, player.World.Name ); player.Message( "Zone \"{0}\" removed.", zone.Name ); } } else { player.MessageNoZone( zoneName ); } }
static void TPZone(Player player, Command cmd) { string zoneName = cmd.Next(); if (zoneName == null){ player.Message("No zone name specified. See &W/Help tpzone"); return; }else{ Zone zone = player.World.Map.Zones.Find(zoneName); if (zone == null){ player.MessageNoZone(zoneName); return; } Position zPos = new Position((((zone.Bounds.XMin + zone.Bounds.XMax) / 2) * 32), (((zone.Bounds.YMin + zone.Bounds.YMax) / 2) * 32), (((zone.Bounds.ZMin + zone.Bounds.ZMax) / 2) + 2) * 32); player.TeleportTo((zPos)); player.Message("&WTeleporting you to zone " + zone.ClassyName); } }
static void ZoneEditHandler( 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.WorldMap.Zones.Find( zoneName ); if( zone == null ) { player.MessageNoZone( zoneName ); return; } string name; while( (name = cmd.Next()) != null ) { if( name.Length < 2 ) continue; if( name.StartsWith( "+" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, name.Substring( 1 ) ); if( info == null ) 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.ClassyName ); continue; } } switch( zone.Controller.Include( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is no longer excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.None: player.Message( "{0}&S is now included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is already included in zone {1}", info.ClassyName, zone.ClassyName ); break; } } else if( name.StartsWith( "-" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, name.Substring( 1 ) ); if( info == null ) return; switch( zone.Controller.Exclude( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is already excluded from zone {1}", info.ClassyName, zone.ClassyName ); break; case PermissionOverride.None: player.Message( "{0}&S is now excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is no longer included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; } } else { Rank minRank = RankManager.FindRank( 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.ClassyName ); changesWereMade = true; } } else { player.MessageNoRank( name ); } } if( changesWereMade ) { zone.Edit( player.Info ); } else { player.Message( "No changes were made to the zone." ); } } }
static void ZoneRemoveHandler( Player player, CommandReader cmd ) { if( player.World == null ) PlayerOpException.ThrowNoWorld( player ); string zoneName = cmd.Next(); if( zoneName == null || cmd.HasNext ) { CdZoneRemove.PrintUsage( player ); return; } if( zoneName == "*" ) { if( !cmd.IsConfirmed ) { Logger.Log( LogType.UserActivity, "ZRemove: Asked {0} to confirm removing all zones on world {1}", player.Name, player.World.Name ); player.Confirm( cmd, "&WRemove ALL zones on this world ({0}&W)? This cannot be undone.&S", player.World.ClassyName ); return; } player.WorldMap.Zones.Clear(); Logger.Log( LogType.UserActivity, "Player {0} removed all zones on world {1}", player.Name, player.World.Name ); Server.Message( "Player {0}&S removed all zones on world {1}", player.ClassyName, player.World.ClassyName ); return; } ZoneCollection zones = player.WorldMap.Zones; Zone zone = zones.Find( zoneName ); if( zone != null ) { if( !player.Info.Rank.AllowSecurityCircumvention ) { switch( zone.Controller.CheckDetailed( player.Info ) ) { case SecurityCheckResult.BlackListed: player.Message( "You are not allowed to remove zone {0}: you are blacklisted.", zone.ClassyName ); return; case SecurityCheckResult.RankTooLow: player.Message( "You are not allowed to remove zone {0}.", zone.ClassyName ); return; } } if( !cmd.IsConfirmed ) { Logger.Log( LogType.UserActivity, "ZRemove: Asked {0} to confirm removing zone {1} from world {2}", player.Name, zone.Name, player.World.Name ); player.Confirm( cmd, "Remove zone {0}&S?", zone.ClassyName ); return; } if( zones.Remove( zone.Name ) ) { Logger.Log( LogType.UserActivity, "Player {0} removed zone {1} from world {2}", player.Name, zone.Name, player.World.Name ); player.Message( "Zone \"{0}\" removed.", zone.Name ); } } else { player.MessageNoZone( zoneName ); } }
static void ZoneMarkHandler( Player player, Command cmd ) { if( player.SelectionMarksExpected == 0 ) { player.MessageNow( "Cannot use ZMark - no selection in progress." ); } else if( player.SelectionMarksExpected == 2 ) { string zoneName = cmd.Next(); if( zoneName == null ) { CdZoneMark.PrintUsage( player ); return; } Zone zone = player.WorldMap.Zones.Find( zoneName ); if( zone == null ) { player.MessageNoZone( zoneName ); return; } player.SelectionResetMarks(); player.SelectionAddMark( zone.Bounds.MinVertex, false ); player.SelectionAddMark( zone.Bounds.MaxVertex, true ); } else { player.MessageNow( "ZMark can only be used for 2-block selection." ); } }
private static void TeleportHandler(Player player, CommandReader cmd) { string name = cmd.Next(); if (name == null) { CdTeleport.PrintUsage(player); return; } if (player.World.Name.ToLower() == "maze") { player.Message("Hey no cheating!"); return; } if (name == "zone") { string zoneName = cmd.Next(); if (zoneName == null) { player.Message("No zone name specified. See &H/Help tpzone"); return; } else { Zone zone = player.World.Map.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } int zoneX = (zone.Bounds.XMin + zone.Bounds.XMax)/2; int zoneY = (zone.Bounds.YMin + zone.Bounds.YMax)/2; int zoneZ = (zone.Bounds.ZMin + zone.Bounds.ZMax)/2; retry2: if (player.World.map.GetBlock(zoneX, zoneY, zoneZ - 1) == Block.Air) { zoneZ = zoneZ - 1; goto retry2; } retry: if (player.World.map.GetBlock(zoneX, zoneY, zoneZ) != Block.Air || player.World.map.GetBlock(zoneX, zoneY, zoneZ + 1) != Block.Air) { zoneZ = zoneZ + 1; goto retry; } Position zPos = new Position((zoneX) * 32 + 16, (zoneY) * 32 + 16, (zoneZ) * 32 + 64); if (player.World != null) { player.LastWorld = player.World; player.LastPosition = player.Position; } player.TeleportTo((zPos)); player.Message("&sTeleporting you to zone " + zone.ClassyName); return; } } if (name == "random" || name == "rand") { Random rand = new Random(); int x = rand.Next(0, player.WorldMap.Width); int y = rand.Next(0, player.WorldMap.Length); int z = player.Position.Z/32 + 1; retry2: if (player.World.map.GetBlock(x, y, z - 3) == Block.Air) { z = z - 1; goto retry2; } retry: if (player.World.map.GetBlock(x, y, z - 2) != Block.Air || player.World.map.GetBlock(x, y, z - 1) != Block.Air) { z = z + 1; goto retry; } if (player.World != null) { player.LastWorld = player.World; player.LastPosition = player.Position; } player.TeleportTo(new Position { X = (short) (x*32 + 16), Y = (short) (y*32 + 16), Z = (short) (z*32 + 16), R = player.Position.R, L = player.Position.L }); player.Message("Teleported to: ({0}, {1}, {2})", x, y, z); return; } if (cmd.Next() != null) { cmd.Rewind(); int x, y, z, rot, lot; rot = player.Position.R; lot = player.Position.L; if (cmd.NextInt(out x) && cmd.NextInt(out y) && cmd.NextInt(out z)) { if (cmd.HasNext) { if (cmd.HasNext) { if (cmd.NextInt(out rot) && cmd.NextInt(out lot)) { if (rot > 255 || rot < 0) { player.Message("R must be inbetween 0 and 255. Set to player R"); } if (lot > 255 || lot < 0) { player.Message("L must be inbetween 0 and 255. Set to player L"); } } } } if (x <= -1024 || x >= 1024 || y <= -1024 || y >= 1024 || z <= -1024 || z >= 1024) { player.Message("Coordinates are outside the valid range!"); } else { if (player.World != null) { player.LastWorld = player.World; player.LastPosition = player.Position; } player.TeleportTo(new Position { X = (short) (x*32 + 16), Y = (short) (y*32 + 16), Z = (short) (z*32 + 48), R = (byte) rot, L = (byte) lot }); } } else { CdTeleport.PrintUsage(player); } } else { if (name == "-") { if (player.LastUsedPlayerName != null) { name = player.LastUsedPlayerName; } else { player.Message("Cannot repeat player name: you haven't used any names yet."); return; } } Player[] matches = Server.FindPlayers(player, name, SearchOptions.Default); if (matches.Length == 1) { Player target = matches[0]; World targetWorld = target.World; if (targetWorld == null) PlayerOpException.ThrowNoWorld(target); if (target.Info.TPDeny && target.Info.Rank >= player.Info.Rank) { player.Message("&CThis player does not want people teleporting to them"); player.Message("Cannot teleport to {0}&S.", target.ClassyName, targetWorld.ClassyName, targetWorld.AccessSecurity.MinRank.ClassyName); return; } if (targetWorld == player.World) { if (player.World != null) { player.LastWorld = player.World; player.LastPosition = player.Position; } player.TeleportTo(target.Position); } else { if (targetWorld.Name.StartsWith("PW_") && !targetWorld.AccessSecurity.ExceptionList.Included.Contains(player.Info)) { player.Message( "You cannot join due to that player being in a personal world that you cannot access."); return; } switch (targetWorld.AccessSecurity.CheckDetailed(player.Info)) { case SecurityCheckResult.Allowed: case SecurityCheckResult.WhiteListed: if (player.Info.Rank.Name == "Banned") { player.Message("&CYou can not change worlds while banned."); player.Message("Cannot teleport to {0}&S.", target.ClassyName, targetWorld.ClassyName, targetWorld.AccessSecurity.MinRank.ClassyName); break; } if (targetWorld.IsFull) { player.Message("Cannot teleport to {0}&S because world {1}&S is full.", target.ClassyName, targetWorld.ClassyName); player.Message("Cannot teleport to {0}&S.", target.ClassyName, targetWorld.ClassyName, targetWorld.AccessSecurity.MinRank.ClassyName); break; } player.StopSpectating(); player.JoinWorld(targetWorld, WorldChangeReason.Tp, target.Position); break; case SecurityCheckResult.BlackListed: player.Message("Cannot teleport to {0}&S because you are blacklisted on world {1}", target.ClassyName, targetWorld.ClassyName); break; case SecurityCheckResult.RankTooLow: if (player.Info.Rank.Name == "Banned") { player.Message("&CYou can not change worlds while banned."); player.Message("Cannot teleport to {0}&S.", target.ClassyName, targetWorld.ClassyName, targetWorld.AccessSecurity.MinRank.ClassyName); break; } if (targetWorld.IsFull) { if (targetWorld.IsFull) { player.Message("Cannot teleport to {0}&S because world {1}&S is full.", target.ClassyName, targetWorld.ClassyName); player.Message("Cannot teleport to {0}&S.", target.ClassyName, targetWorld.ClassyName, targetWorld.AccessSecurity.MinRank.ClassyName); break; } player.StopSpectating(); player.JoinWorld(targetWorld, WorldChangeReason.Tp, target.Position); break; } player.Message("Cannot teleport to {0}&S because world {1}&S requires {2}+&S to join.", target.ClassyName, targetWorld.ClassyName, targetWorld.AccessSecurity.MinRank.ClassyName); break; } } } else if (matches.Length > 1) { player.MessageManyMatches("player", matches); } } }
static void ZoneRenameHandler( Player player, Command cmd ) { World playerWorld = player.World; if(playerWorld==null)PlayerOpException.ThrowNoWorld( player ); // make sure that both parameters are given string oldName = cmd.Next(); string newName = cmd.Next(); if( oldName == null || newName == null ) { CdZoneRename.PrintUsage( player ); return; } // make sure that the new name is valid if( !World.IsValidName( newName ) ) { player.Message( "\"{0}\" is not a valid zone name", newName ); return; } // find the old zone var zones = player.WorldMap.Zones; Zone oldZone = zones.Find( oldName ); if( oldZone == null ) { player.MessageNoZone( oldName ); return; } // Check if a zone with "newName" name already exists Zone newZone = zones.FindExact( newName ); if( newZone != null && newZone != oldZone ) { player.Message( "A zone with the name \"{0}\" already exists.", newName ); return; } // check if any change is needed string fullOldName = oldZone.Name; if( fullOldName == newName ) { player.Message( "The zone is already named \"{0}\"", fullOldName ); return; } // actually rename the zone zones.Rename( oldZone, newName ); // announce the rename playerWorld.Players.Message( "&SZone \"{0}\" was renamed to \"{1}&S\" by {2}", fullOldName, oldZone.ClassyName, player.ClassyName ); Logger.Log( LogType.UserActivity, "Player {0} renamed zone \"{1}\" to \"{2}\" on world {3}", player.Name, fullOldName, newName, playerWorld.Name ); }
static void ZoneEditHandler(Player player, CommandReader cmd) { if (player.World == null) { PlayerOpException.ThrowNoWorld(player); } bool changesWereMade = false; string zoneName = cmd.Next(); if (zoneName == null) { player.Message("No zone name specified. See &H/Help ZEdit"); return; } Zone zone = player.WorldMap.Zones.Find(zoneName); if (zone == null) { player.MessageNoZone(zoneName); return; } string nextToken; while ((nextToken = cmd.Next()) != null) { // Clear whitelist if (nextToken.Equals("-*")) { PlayerInfo[] oldWhitelist = zone.Controller.ExceptionList.Included; if (oldWhitelist.Length > 0) { zone.Controller.ResetIncludedList(); player.Message("Whitelist of zone {0}&S cleared: {1}", zone.ClassyName, oldWhitelist.JoinToClassyString()); Logger.Log(LogType.UserActivity, "Player {0} cleared whitelist of zone {1} on world {2}: {3}", player.Name, zone.Name, player.World.Name, oldWhitelist.JoinToString(pi => pi.Name)); } else { player.Message("Whitelist of zone {0}&S is empty.", zone.ClassyName); } continue; } // Clear blacklist if (nextToken.Equals("+*")) { PlayerInfo[] oldBlacklist = zone.Controller.ExceptionList.Excluded; if (oldBlacklist.Length > 0) { zone.Controller.ResetExcludedList(); player.Message("Blacklist of zone {0}&S cleared: {1}", zone.ClassyName, oldBlacklist.JoinToClassyString()); Logger.Log(LogType.UserActivity, "Player {0} cleared blacklist of zone {1} on world {2}: {3}", player.Name, zone.Name, player.World.Name, oldBlacklist.JoinToString(pi => pi.Name)); } else { player.Message("Blacklist of zone {0}&S is empty.", zone.ClassyName); } continue; } if (nextToken.StartsWith("+")) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches(player, nextToken.Substring(1)); if (info == null) { return; } // prevent players from whitelisting themselves to bypass protection if (!player.Info.Rank.AllowSecurityCircumvention && player.Info == info) { switch (zone.Controller.CheckDetailed(info)) { case SecurityCheckResult.BlackListed: player.Message("You are not allowed to remove yourself from the blacklist of zone {0}", zone.ClassyName); continue; case SecurityCheckResult.RankTooLow: player.Message("You must be {0}+&S to add yourself to the whitelist of zone {1}", zone.Controller.MinRank.ClassyName, zone.ClassyName); continue; } } switch (zone.Controller.Include(info)) { case PermissionOverride.Deny: player.Message("{0}&S is no longer excluded from zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; case PermissionOverride.None: player.Message("{0}&S is now included in zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; case PermissionOverride.Allow: player.Message("{0}&S is already included in zone {1}", info.ClassyName, zone.ClassyName); break; } } else if (nextToken.StartsWith("-")) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches(player, nextToken.Substring(1)); if (info == null) { return; } switch (zone.Controller.Exclude(info)) { case PermissionOverride.Deny: player.Message("{0}&S is already excluded from zone {1}", info.ClassyName, zone.ClassyName); break; case PermissionOverride.None: player.Message("{0}&S is now excluded from zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; case PermissionOverride.Allow: player.Message("{0}&S is no longer included in zone {1}", info.ClassyName, zone.ClassyName); changesWereMade = true; break; } } else { Rank minRank = RankManager.FindRank(nextToken); 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.ClassyName); changesWereMade = true; } } else { player.MessageNoRank(nextToken); } } if (changesWereMade) { zone.Edit(player.Info); } else { player.Message("No changes were made to the zone."); } } }