Merge pull request #491 from CoderCow/patch-1
Even More Region Command Improvements
This commit is contained in:
commit
86b03466a3
4 changed files with 154 additions and 40 deletions
|
|
@ -2577,6 +2577,7 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("Hit a block to get the name of the region", Color.Yellow);
|
args.Player.SendMessage("Hit a block to get the name of the region", Color.Yellow);
|
||||||
args.Player.AwaitingName = true;
|
args.Player.AwaitingName = true;
|
||||||
|
args.Player.AwaitingNameParameters = args.Parameters.Skip(1).ToArray();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -2592,7 +2593,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region set <1/2>", Color.Red);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -2626,7 +2627,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region define <name>", Color.Red);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "protect":
|
case "protect":
|
||||||
|
|
@ -2649,10 +2650,10 @@ namespace TShockAPI
|
||||||
args.Player.SendMessage("Could not find specified region", Color.Red);
|
args.Player.SendMessage("Could not find specified region", Color.Red);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect [name] [true/false]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect <name> <true/false>", Color.Red);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect [name] [true/false]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect <name> <true/false>", Color.Red);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "delete":
|
case "delete":
|
||||||
|
|
@ -2666,7 +2667,7 @@ namespace TShockAPI
|
||||||
args.Player.SendMessage("Could not find specified region", Color.Red);
|
args.Player.SendMessage("Could not find specified region", Color.Red);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete <name>", Color.Red);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "clear":
|
case "clear":
|
||||||
|
|
@ -2710,7 +2711,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow <name> <region>", Color.Red);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "remove":
|
case "remove":
|
||||||
|
|
@ -2745,7 +2746,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region remove [name] [region]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region remove <name> <region>", Color.Red);
|
||||||
break;
|
break;
|
||||||
case "allowg":
|
case "allowg":
|
||||||
{
|
{
|
||||||
|
|
@ -2780,7 +2781,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [group] [region]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region allowg <group> <region>", Color.Red);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "removeg":
|
case "removeg":
|
||||||
|
|
@ -2815,7 +2816,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region removeg [group] [region]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region removeg <group> <region>", Color.Red);
|
||||||
break;
|
break;
|
||||||
case "list":
|
case "list":
|
||||||
{
|
{
|
||||||
|
|
@ -2844,16 +2845,27 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
if (args.Parameters.Count > 1)
|
if (args.Parameters.Count > 1)
|
||||||
{
|
{
|
||||||
string regionName = args.Parameters[1];
|
if (args.Parameters.Count > 4)
|
||||||
Region region = TShock.Regions.GetRegionByName(regionName);
|
|
||||||
if (region == null)
|
|
||||||
{
|
{
|
||||||
args.Player.SendErrorMessage("Region {0} does not exist.", regionName);
|
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region info <region> [-d] [page]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string regionName = args.Parameters[1];
|
||||||
|
bool displayBoundaries = args.Parameters.Skip(2).Any(
|
||||||
|
p => p.Equals("-d", StringComparison.InvariantCultureIgnoreCase)
|
||||||
|
);
|
||||||
|
|
||||||
|
Region region = TShock.Regions.GetRegionByName(regionName);
|
||||||
|
if (region == null)
|
||||||
|
{
|
||||||
|
args.Player.SendErrorMessage("Region \"{0}\" does not exist.", regionName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pageNumberIndex = displayBoundaries ? 3 : 2;
|
||||||
int pageNumber;
|
int pageNumber;
|
||||||
if (!PaginationTools.TryParsePageNumber(args.Parameters, 2, args.Player, out pageNumber))
|
if (!PaginationTools.TryParsePageNumber(args.Parameters, pageNumberIndex, args.Player, out pageNumber))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
List<string> lines = new List<string>
|
List<string> lines = new List<string>
|
||||||
|
|
@ -2900,10 +2912,42 @@ namespace TShockAPI
|
||||||
FooterFormat = "Type /region info {0} for more information."
|
FooterFormat = "Type /region info {0} for more information."
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (displayBoundaries)
|
||||||
|
{
|
||||||
|
Rectangle regionArea = region.Area;
|
||||||
|
foreach (Point boundaryPoint in Utils.Instance.EnumerateRegionBoundaries(regionArea))
|
||||||
|
{
|
||||||
|
// Preferring dotted lines as those should easily be distinguishable from actual wires.
|
||||||
|
if ((boundaryPoint.X + boundaryPoint.Y & 1) == 0)
|
||||||
|
{
|
||||||
|
// Could be improved by sending raw tile data to the client instead but not really
|
||||||
|
// worth the effort as chances are very low that overwriting the wire for a few
|
||||||
|
// nanoseconds will cause much trouble.
|
||||||
|
Tile tile = Main.tile[boundaryPoint.X, boundaryPoint.Y];
|
||||||
|
bool oldWireState = tile.wire;
|
||||||
|
tile.wire = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
args.Player.SendTileSquare(boundaryPoint.X, boundaryPoint.Y, 1);
|
||||||
|
} finally {
|
||||||
|
tile.wire = oldWireState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new Timer((dummy) => {
|
||||||
|
foreach (Point boundaryPoint in Utils.Instance.EnumerateRegionBoundaries(regionArea))
|
||||||
|
if ((boundaryPoint.X + boundaryPoint.Y & 1) == 0)
|
||||||
|
args.Player.SendTileSquare(boundaryPoint.X, boundaryPoint.Y, 1);
|
||||||
|
},
|
||||||
|
null, 5000, Timeout.Infinite
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region info [name]");
|
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region info <name>");
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
@ -2922,10 +2966,10 @@ namespace TShockAPI
|
||||||
args.Player.SendMessage("Could not find specified region", Color.Red);
|
args.Player.SendMessage("Could not find specified region", Color.Red);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region z [name] [#]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region z <name> <#>", Color.Red);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region z [name] [#]", Color.Red);
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region z <name> <#>", Color.Red);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "resize":
|
case "resize":
|
||||||
|
|
@ -2975,13 +3019,13 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize [regionname] [u/d/l/r] [amount]",
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize <region> <u/d/l/r> <amount>",
|
||||||
Color.Red);
|
Color.Red);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize [regionname] [u/d/l/r] [amount]1",
|
args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize <region> <u/d/l/r> <amount>",
|
||||||
Color.Red);
|
Color.Red);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -2995,7 +3039,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
if (args.Parameters.Count <= 1)
|
if (args.Parameters.Count <= 1)
|
||||||
{
|
{
|
||||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region tp [region].");
|
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region tp <region>.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3022,23 +3066,23 @@ namespace TShockAPI
|
||||||
return;
|
return;
|
||||||
|
|
||||||
List<string> lines = new List<string> {
|
List<string> lines = new List<string> {
|
||||||
"set [1/2] - Sets the temporary region points.",
|
"set <1/2> - Sets the temporary region points.",
|
||||||
"clear - Clears the temporary region points.",
|
"clear - Clears the temporary region points.",
|
||||||
"define [name] - Defines the region with the given name.",
|
"define <name> - Defines the region with the given name.",
|
||||||
"delete [name] - Deletes the given region.",
|
"delete <name> - Deletes the given region.",
|
||||||
"name - Shows the name of the region at the given point.",
|
"name [-u][-z][-p] - Shows the name of the region at the given point.",
|
||||||
"list - Lists all regions.",
|
"list - Lists all regions.",
|
||||||
"resize [region] [u/d/l/r] [amount] - Resizes a region.",
|
"resize <region> <u/d/l/r> <amount> - Resizes a region.",
|
||||||
"allow [user] [region] - Allows a user to a region.",
|
"allow <user> <region> - Allows a user to a region.",
|
||||||
"remove [user] [region] - Removes a user from a region.",
|
"remove <user> <region> - Removes a user from a region.",
|
||||||
"allowg [group] [region] - Allows a user group to a region.",
|
"allowg <group> <region> - Allows a user group to a region.",
|
||||||
"removeg [group] [region] - Removes a user group from a region.",
|
"removeg <group> <region> - Removes a user group from a region.",
|
||||||
"info [region] - Displays several information about the given region.",
|
"info <region> [-d] - Displays several information about the given region.",
|
||||||
"protect [name] [true/false] - Sets whether the tiles inside the region are protected or not.",
|
"protect <name> <true/false> - Sets whether the tiles inside the region are protected or not.",
|
||||||
"z [name] [#] - Sets the z-order of the region.",
|
"z <name> <#> - Sets the z-order of the region.",
|
||||||
};
|
};
|
||||||
if (args.Player.Group.HasPermission(Permissions.tp))
|
if (args.Player.Group.HasPermission(Permissions.tp))
|
||||||
lines.Add("tp [region] - Teleports you to the given region's center.");
|
lines.Add("tp <region> - Teleports you to the given region's center.");
|
||||||
|
|
||||||
PaginationTools.SendPage(
|
PaginationTools.SendPage(
|
||||||
args.Player, pageNumber, lines,
|
args.Player, pageNumber, lines,
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Streams;
|
using System.IO.Streams;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using TShockAPI.DB;
|
||||||
using Terraria;
|
using Terraria;
|
||||||
using TShockAPI.Net;
|
using TShockAPI.Net;
|
||||||
|
|
||||||
|
|
@ -1685,18 +1687,63 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (args.Player.AwaitingName)
|
if (args.Player.AwaitingName)
|
||||||
{
|
{
|
||||||
var protectedregions = TShock.Regions.InAreaRegionName(tileX, tileY);
|
Debug.Assert(args.Player.AwaitingNameParameters != null);
|
||||||
if (protectedregions.Count == 0)
|
|
||||||
|
bool includeUnprotected = false;
|
||||||
|
bool includeZIndexes = false;
|
||||||
|
bool persistentMode = false;
|
||||||
|
foreach (string parameter in args.Player.AwaitingNameParameters)
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("Region is not protected", Color.Yellow);
|
if (parameter.Equals("-u", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
includeUnprotected = true;
|
||||||
|
if (parameter.Equals("-z", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
includeZIndexes = true;
|
||||||
|
if (parameter.Equals("-p", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
persistentMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<string> outputRegions = new List<string>();
|
||||||
|
foreach (Region region in TShock.Regions.Regions.OrderBy(r => r.Z).Reverse())
|
||||||
|
{
|
||||||
|
if (!includeUnprotected && !region.DisableBuild)
|
||||||
|
continue;
|
||||||
|
if (tileX < region.Area.Left || tileX > region.Area.Right)
|
||||||
|
continue;
|
||||||
|
if (tileY < region.Area.Top || tileY > region.Area.Bottom)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
string format = "{1}";
|
||||||
|
if (includeZIndexes)
|
||||||
|
format = "{1} (z:{0})";
|
||||||
|
|
||||||
|
outputRegions.Add(string.Format(format, region.Z, region.Name));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outputRegions.Count == 0)
|
||||||
|
{
|
||||||
|
if (includeUnprotected)
|
||||||
|
args.Player.SendMessage("There are no regions at this point.", Color.Yellow);
|
||||||
|
else
|
||||||
|
args.Player.SendMessage("There are no regions at this point or they are not protected.", Color.Yellow);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string regionlist = string.Join(",", protectedregions.ToArray());
|
if (includeUnprotected)
|
||||||
args.Player.SendMessage("Region Name(s): " + regionlist, Color.Yellow);
|
args.Player.SendSuccessMessage("Regions at this point:");
|
||||||
|
else
|
||||||
|
args.Player.SendSuccessMessage("Protected regions at this point:");
|
||||||
|
|
||||||
|
foreach (string line in PaginationTools.BuildLinesFromTerms(outputRegions))
|
||||||
|
args.Player.SendMessage(line, Color.White);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!persistentMode)
|
||||||
|
{
|
||||||
|
args.Player.AwaitingName = false;
|
||||||
|
args.Player.AwaitingNameParameters = null;
|
||||||
|
}
|
||||||
|
|
||||||
args.Player.SendTileSquare(tileX, tileY);
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
args.Player.AwaitingName = false;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,8 @@ namespace TShockAPI
|
||||||
|
|
||||||
public bool AwaitingName { get; set; }
|
public bool AwaitingName { get; set; }
|
||||||
|
|
||||||
|
public string[] AwaitingNameParameters { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The last time a player broke a grief check.
|
/// The last time a player broke a grief check.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using TShockAPI.DB;
|
||||||
using Terraria;
|
using Terraria;
|
||||||
|
|
||||||
namespace TShockAPI
|
namespace TShockAPI
|
||||||
|
|
@ -841,5 +842,25 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
return new string(returnstr);
|
return new string(returnstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enumerates boundary points of the given region's rectangle.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="regionArea">The region's area to enumerate through.</param>
|
||||||
|
/// <returns>The enumerated boundary points.</returns>
|
||||||
|
public IEnumerable<Point> EnumerateRegionBoundaries(Rectangle regionArea)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < regionArea.Width + 1; x++)
|
||||||
|
{
|
||||||
|
yield return new Point(regionArea.Left + x, regionArea.Top);
|
||||||
|
yield return new Point(regionArea.Left + x, regionArea.Bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int y = 1; y < regionArea.Height; y++)
|
||||||
|
{
|
||||||
|
yield return new Point(regionArea.Left, regionArea.Top + y);
|
||||||
|
yield return new Point(regionArea.Right, regionArea.Top + y);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue