commit
e5d01b19d6
11 changed files with 598 additions and 146 deletions
|
|
@ -2032,8 +2032,9 @@ namespace TShockAPI
|
|||
int pageNumber;
|
||||
if (!PaginationTools.TryParsePageNumber(args.Parameters, 1, args.Player, out pageNumber))
|
||||
return;
|
||||
IEnumerable<string> warpNames = from warp in TShock.Warps.ListAllPublicWarps(Main.worldID.ToString())
|
||||
select warp.WarpName;
|
||||
IEnumerable<string> warpNames = from warp in TShock.Warps.Warps
|
||||
where !warp.IsPrivate
|
||||
select warp.Name;
|
||||
PaginationTools.SendPage(args.Player, pageNumber, PaginationTools.BuildLinesFromTerms(warpNames),
|
||||
new PaginationTools.Settings
|
||||
{
|
||||
|
|
@ -2053,9 +2054,14 @@ namespace TShockAPI
|
|||
{
|
||||
args.Player.SendErrorMessage("Name reserved, use a different name.");
|
||||
}
|
||||
else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldID.ToString()))
|
||||
else if (TShock.Warps.Add(args.Player.TileX, args.Player.TileY, warpName))
|
||||
{
|
||||
args.Player.SendSuccessMessage("Warp added: " + warpName);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.managewarp))
|
||||
tsplr.SendRaptorWarp(TShock.Warps.Find(warpName));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2072,10 +2078,17 @@ namespace TShockAPI
|
|||
if (args.Parameters.Count == 2)
|
||||
{
|
||||
string warpName = args.Parameters[1];
|
||||
if (TShock.Warps.RemoveWarp(warpName))
|
||||
args.Player.SendSuccessMessage("Warp deleted: " + warpName);
|
||||
else
|
||||
args.Player.SendErrorMessage("Could not find the specified warp.");
|
||||
if (TShock.Warps.Remove(warpName))
|
||||
{
|
||||
args.Player.SendSuccessMessage("Warp deleted: " + warpName);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.managewarp))
|
||||
tsplr.SendRaptorWarpDeletion(warpName);
|
||||
}
|
||||
}
|
||||
else
|
||||
args.Player.SendErrorMessage("Could not find the specified warp.");
|
||||
}
|
||||
else
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /warp del [name]");
|
||||
|
|
@ -2090,7 +2103,7 @@ namespace TShockAPI
|
|||
bool state = false;
|
||||
if (Boolean.TryParse(args.Parameters[2], out state))
|
||||
{
|
||||
if (TShock.Warps.HideWarp(args.Parameters[1], state))
|
||||
if (TShock.Warps.Hide(args.Parameters[1], state))
|
||||
{
|
||||
if (state)
|
||||
args.Player.SendSuccessMessage("Warp " + warpName + " is now private.");
|
||||
|
|
@ -2127,30 +2140,31 @@ namespace TShockAPI
|
|||
TShock.Utils.SendMultipleMatchError(args.Player, foundplr.Select(p => p.Name));
|
||||
return;
|
||||
}
|
||||
|
||||
string warpName = args.Parameters[2];
|
||||
var warp = TShock.Warps.FindWarp(warpName);
|
||||
var warp = TShock.Warps.Find(warpName);
|
||||
var plr = foundplr[0];
|
||||
if (warp.WarpPos != Vector2.Zero)
|
||||
{
|
||||
if (plr.Teleport((int)warp.WarpPos.X*16, (int)warp.WarpPos.Y*16 ))
|
||||
{
|
||||
plr.SendSuccessMessage(string.Format("{0} warped you to {1}.", args.Player.Name, warpName));
|
||||
args.Player.SendSuccessMessage(string.Format("You warped {0} to {1}.", plr.Name, warpName));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
args.Player.SendErrorMessage("Specified warp not found.");
|
||||
}
|
||||
if (warp.Position != Point.Zero)
|
||||
{
|
||||
if (plr.Teleport(warp.Position.X * 16, warp.Position.Y * 16))
|
||||
{
|
||||
plr.SendSuccessMessage(String.Format("{0} warped you to {1}.", args.Player.Name, warpName));
|
||||
args.Player.SendSuccessMessage(String.Format("You warped {0} to {1}.", plr.Name, warpName));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
args.Player.SendErrorMessage("Specified warp not found.");
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
else
|
||||
{
|
||||
string warpName = String.Join(" ", args.Parameters);
|
||||
var warp = TShock.Warps.FindWarp(warpName);
|
||||
if (warp.WarpPos != Vector2.Zero)
|
||||
var warp = TShock.Warps.Find(warpName);
|
||||
if (warp != null)
|
||||
{
|
||||
if (args.Player.Teleport((int)warp.WarpPos.X*16, (int)warp.WarpPos.Y*16 ))
|
||||
if (args.Player.Teleport(warp.Position.X * 16, warp.Position.Y * 16))
|
||||
args.Player.SendSuccessMessage("Warped to " + warpName + ".");
|
||||
}
|
||||
else
|
||||
|
|
@ -3017,6 +3031,12 @@ namespace TShockAPI
|
|||
args.Player.TempPoints[0] = Point.Zero;
|
||||
args.Player.TempPoints[1] = Point.Zero;
|
||||
args.Player.SendMessage("Set region " + regionName, Color.Yellow);
|
||||
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.manageregion))
|
||||
tsplr.SendRaptorRegion(TShock.Regions.GetRegionByName(regionName));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3064,19 +3084,26 @@ namespace TShockAPI
|
|||
{
|
||||
string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1));
|
||||
if (TShock.Regions.DeleteRegion(regionName))
|
||||
args.Player.SendMessage("Deleted region " + regionName, Color.Yellow);
|
||||
{
|
||||
args.Player.SendInfoMessage("Deleted region \"{0}\".", regionName);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.manageregion))
|
||||
tsplr.SendRaptorRegionDeletion(regionName);
|
||||
}
|
||||
}
|
||||
else
|
||||
args.Player.SendMessage("Could not find specified region", Color.Red);
|
||||
args.Player.SendErrorMessage("Could not find the specified region!");
|
||||
}
|
||||
else
|
||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete <name>", Color.Red);
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region delete <name>");
|
||||
break;
|
||||
}
|
||||
case "clear":
|
||||
{
|
||||
args.Player.TempPoints[0] = Point.Zero;
|
||||
args.Player.TempPoints[1] = Point.Zero;
|
||||
args.Player.SendMessage("Cleared temp area", Color.Yellow);
|
||||
args.Player.SendInfoMessage("Cleared temporary points.");
|
||||
args.Player.AwaitingTempPoint = 0;
|
||||
break;
|
||||
}
|
||||
|
|
@ -3415,19 +3442,18 @@ namespace TShockAPI
|
|||
if (TShock.Regions.resizeRegion(args.Parameters[1], addAmount, direction))
|
||||
{
|
||||
args.Player.SendMessage("Region Resized Successfully!", Color.Yellow);
|
||||
TShock.Regions.ReloadAllRegions();
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.manageregion))
|
||||
tsplr.SendRaptorRegion(TShock.Regions.GetRegionByName(args.Parameters[1]));
|
||||
}
|
||||
TShock.Regions.Reload();
|
||||
}
|
||||
else
|
||||
{
|
||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize <region> <u/d/l/r> <amount>",
|
||||
Color.Red);
|
||||
}
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region resize <region> <u/d/l/r> <amount>");
|
||||
}
|
||||
else
|
||||
{
|
||||
args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize <region> <u/d/l/r> <amount>",
|
||||
Color.Red);
|
||||
}
|
||||
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region resize <region> <u/d/l/r> <amount>");
|
||||
break;
|
||||
}
|
||||
case "tp":
|
||||
|
|
@ -3452,7 +3478,6 @@ namespace TShockAPI
|
|||
}
|
||||
|
||||
args.Player.Teleport(region.Area.Center.X * 16, region.Area.Center.Y * 16);
|
||||
|
||||
break;
|
||||
}
|
||||
case "help":
|
||||
|
|
|
|||
|
|
@ -27,11 +27,14 @@ namespace TShockAPI.DB
|
|||
{
|
||||
public class RegionManager
|
||||
{
|
||||
/// <summary>
|
||||
/// The list of regions.
|
||||
/// </summary>
|
||||
public List<Region> Regions = new List<Region>();
|
||||
|
||||
private IDbConnection database;
|
||||
|
||||
public RegionManager(IDbConnection db)
|
||||
internal RegionManager(IDbConnection db)
|
||||
{
|
||||
database = db;
|
||||
var table = new SqlTable("Regions",
|
||||
|
|
@ -52,11 +55,12 @@ namespace TShockAPI.DB
|
|||
? (IQueryBuilder) new SqliteQueryCreator()
|
||||
: new MysqlQueryCreator());
|
||||
creator.EnsureExists(table);
|
||||
|
||||
ReloadAllRegions();
|
||||
}
|
||||
|
||||
public void ReloadAllRegions()
|
||||
/// <summary>
|
||||
/// Reloads all regions.
|
||||
/// </summary>
|
||||
public void Reload()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -419,6 +423,33 @@ namespace TShockAPI.DB
|
|||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the position of a region.
|
||||
/// </summary>
|
||||
/// <param name="regionName">The region name.</param>
|
||||
/// <param name="x">The X position.</param>
|
||||
/// <param name="y">The Y position.</param>
|
||||
/// <param name="height">The height.</param>
|
||||
/// <param name="width">The width.</param>
|
||||
/// <returns>Whether the operation succeeded.</returns>
|
||||
public bool PositionRegion(string regionName, int x, int y, int width, int height)
|
||||
{
|
||||
try
|
||||
{
|
||||
Region region = Regions.First(r => String.Equals(regionName, r.Name, StringComparison.OrdinalIgnoreCase));
|
||||
region.Area = new Rectangle(x, y, width, height);
|
||||
|
||||
if (database.Query("UPDATE Regions SET X1 = @0, Y1 = @1, width = @2, height = @3 WHERE RegionName = @4 AND WorldID = @5",
|
||||
x, y, width, height, regionName, Main.worldID.ToString()) > 0)
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets all the regions names from world
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using MySql.Data.MySqlClient;
|
||||
using Terraria;
|
||||
|
||||
|
|
@ -28,9 +29,13 @@ namespace TShockAPI.DB
|
|||
public class WarpManager
|
||||
{
|
||||
private IDbConnection database;
|
||||
/// <summary>
|
||||
/// The list of warps.
|
||||
/// </summary>
|
||||
public List<Warp> Warps = new List<Warp>();
|
||||
|
||||
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
|
||||
public WarpManager(IDbConnection db)
|
||||
internal WarpManager(IDbConnection db)
|
||||
{
|
||||
database = db;
|
||||
|
||||
|
|
@ -48,12 +53,23 @@ namespace TShockAPI.DB
|
|||
creator.EnsureExists(table);
|
||||
}
|
||||
|
||||
public bool AddWarp(int x, int y, string name, string worldid)
|
||||
/// <summary>
|
||||
/// Adds a warp.
|
||||
/// </summary>
|
||||
/// <param name="x">The X position.</param>
|
||||
/// <param name="y">The Y position.</param>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Whether the opration succeeded.</returns>
|
||||
public bool Add(int x, int y, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
database.Query("INSERT INTO Warps (X, Y, WarpName, WorldID) VALUES (@0, @1, @2, @3);", x, y, name, worldid);
|
||||
return true;
|
||||
if (database.Query("INSERT INTO Warps (X, Y, WarpName, WorldID) VALUES (@0, @1, @2, @3);",
|
||||
x, y, name, Main.worldID.ToString()) > 0)
|
||||
{
|
||||
Warps.Add(new Warp(new Point(x, y), name));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
@ -62,12 +78,41 @@ namespace TShockAPI.DB
|
|||
return false;
|
||||
}
|
||||
|
||||
public bool RemoveWarp(string name)
|
||||
/// <summary>
|
||||
/// Reloads all warps.
|
||||
/// </summary>
|
||||
public void ReloadWarps()
|
||||
{
|
||||
Warps.Clear();
|
||||
|
||||
using (var reader = database.QueryReader("SELECT * FROM Warps WHERE WorldID = @0",
|
||||
Main.worldID.ToString()))
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
Warps.Add(new Warp(
|
||||
new Point(reader.Get<int>("X"), reader.Get<int>("Y")),
|
||||
reader.Get<string>("WarpName"),
|
||||
(reader.Get<string>("Private") ?? "0") != "0"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes a warp.
|
||||
/// </summary>
|
||||
/// <param name="warpName">The warp name.</param>
|
||||
/// <returns>Whether the operation succeeded.</returns>
|
||||
public bool Remove(string warpName)
|
||||
{
|
||||
try
|
||||
{
|
||||
database.Query("DELETE FROM Warps WHERE WarpName=@0 AND WorldID=@1", name, Main.worldID.ToString());
|
||||
return true;
|
||||
if (database.Query("DELETE FROM Warps WHERE WarpName = @0 AND WorldID = @1",
|
||||
warpName, Main.worldID.ToString()) > 0)
|
||||
{
|
||||
Warps.RemoveAll(w => String.Equals(w.Name, warpName, StringComparison.OrdinalIgnoreCase));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
@ -76,113 +121,96 @@ namespace TShockAPI.DB
|
|||
return false;
|
||||
}
|
||||
|
||||
public Warp FindWarp(string name)
|
||||
/// <summary>
|
||||
/// Finds the warp with the given name.
|
||||
/// </summary>
|
||||
/// <param name="warpName">The name.</param>
|
||||
/// <returns>The warp, if it exists, or else null.</returns>
|
||||
public Warp Find(string warpName)
|
||||
{
|
||||
return Warps.FirstOrDefault(w => String.Equals(w.Name, warpName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the position of a warp.
|
||||
/// </summary>
|
||||
/// <param name="warpName">The warp name.</param>
|
||||
/// <param name="x">The X position.</param>
|
||||
/// <param name="y">The Y position.</param>
|
||||
/// <returns>Whether the operation suceeded.</returns>
|
||||
public bool PositionWarp(string warpName, int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (
|
||||
var reader = database.QueryReader("SELECT * FROM Warps WHERE WarpName=@0 AND WorldID=@1", name,
|
||||
Main.worldID.ToString()))
|
||||
if (database.Query("UPDATE Warps SET X = @0, Y = @1 WHERE WarpName = @2 AND WorldID = @3",
|
||||
x, y, warpName, Main.worldID.ToString()) > 0)
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
try
|
||||
{
|
||||
return new Warp(new Vector2(reader.Get<int>("X"), reader.Get<int>("Y")), reader.Get<string>("WarpName"),
|
||||
reader.Get<string>("WorldID"), reader.Get<string>("Private"));
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new Warp(new Vector2(reader.Get<int>("X"), reader.Get<int>("Y")), reader.Get<string>("WarpName"),
|
||||
reader.Get<string>("WorldID"), "0");
|
||||
}
|
||||
}
|
||||
Warps.Find(w => String.Equals(w.Name, warpName, StringComparison.OrdinalIgnoreCase)).Position = new Point(x, y);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex.ToString());
|
||||
}
|
||||
return new Warp();
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets all the warps names from world
|
||||
/// Sets the hidden state of a warp.
|
||||
/// </summary>
|
||||
/// <param name="worldid">World name to get warps from</param>
|
||||
/// <returns>List of warps with only their names</returns>
|
||||
public List<Warp> ListAllPublicWarps(string worldid)
|
||||
/// <param name="warpName">The warp name.</param>
|
||||
/// <param name="state">The state.</param>
|
||||
/// <returns>Whether the operation suceeded.</returns>
|
||||
public bool Hide(string warpName, bool state)
|
||||
{
|
||||
var warps = new List<Warp>();
|
||||
try
|
||||
{
|
||||
using (var reader = database.QueryReader("SELECT * FROM Warps WHERE WorldID=@0", worldid))
|
||||
if (database.Query("UPDATE Warps SET Private = @0 WHERE WarpName = @1 AND WorldID = @2",
|
||||
state ? "1" : "0", warpName, Main.worldID.ToString()) > 0)
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
try
|
||||
{
|
||||
if (reader.Get<String>("Private") == "0" || reader.Get<String>("Private") == null)
|
||||
warps.Add(new Warp {WarpName = reader.Get<string>("WarpName")});
|
||||
}
|
||||
catch
|
||||
{
|
||||
warps.Add(new Warp {WarpName = reader.Get<string>("WarpName")});
|
||||
}
|
||||
}
|
||||
Warps.Find(w => String.Equals(w.Name, warpName, StringComparison.OrdinalIgnoreCase)).IsPrivate = state;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex.ToString());
|
||||
}
|
||||
return warps;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets all the warps names from world
|
||||
/// </summary>
|
||||
/// <param name="worldid">World name to get warps from</param>
|
||||
/// <returns>List of warps with only their names</returns>
|
||||
public bool HideWarp(string warp, bool state)
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = "UPDATE Warps SET Private=@0 WHERE WarpName=@1 AND WorldID=@2";
|
||||
|
||||
database.Query(query, state ? "1" : "0", warp, Main.worldID.ToString());
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex.ToString());
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a warp.
|
||||
/// </summary>
|
||||
public class Warp
|
||||
{
|
||||
public Vector2 WarpPos { get; set; }
|
||||
public string WarpName { get; set; }
|
||||
public string WorldWarpID { get; set; }
|
||||
public string Private { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the name.
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the warp's privacy state.
|
||||
/// </summary>
|
||||
public bool IsPrivate { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the position.
|
||||
/// </summary>
|
||||
public Point Position { get; set; }
|
||||
|
||||
public Warp(Vector2 warppos, string name, string worldid, string hidden)
|
||||
public Warp(Point position, string name, bool isPrivate = false)
|
||||
{
|
||||
WarpPos = warppos;
|
||||
WarpName = name;
|
||||
WorldWarpID = worldid;
|
||||
Private = hidden;
|
||||
Name = name;
|
||||
Position = position;
|
||||
IsPrivate = isPrivate;
|
||||
}
|
||||
|
||||
public Warp()
|
||||
{
|
||||
WarpPos = Vector2.Zero;
|
||||
WarpName = null;
|
||||
WorldWarpID = string.Empty;
|
||||
Private = "0";
|
||||
Position = Point.Zero;
|
||||
Name = "";
|
||||
IsPrivate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -24,9 +24,10 @@ using System.IO;
|
|||
using System.IO.Streams;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TShockAPI.DB;
|
||||
using Terraria;
|
||||
using TShockAPI.Net;
|
||||
using Terraria;
|
||||
|
||||
namespace TShockAPI
|
||||
{
|
||||
|
|
@ -1240,7 +1241,8 @@ namespace TShockAPI
|
|||
{PacketTypes.SpawnBossorInvasion, HandleSpawnBoss},
|
||||
{PacketTypes.Teleport, HandleTeleport},
|
||||
{PacketTypes.PaintTile, HandlePaintTile},
|
||||
{PacketTypes.PaintWall, HandlePaintWall}
|
||||
{PacketTypes.PaintWall, HandlePaintWall},
|
||||
{PacketTypes.Placeholder, HandleRaptor}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -3446,5 +3448,125 @@ namespace TShockAPI
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool HandleRaptor(GetDataHandlerArgs args)
|
||||
{
|
||||
var type = (RaptorPacketTypes)args.Data.ReadInt8();
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case RaptorPacketTypes.Acknowledge:
|
||||
args.Player.IsRaptor = true;
|
||||
// Send these if the player was logged in before this packet arrives
|
||||
if (args.Player.IsLoggedIn)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
args.Player.SendRaptorPermissions();
|
||||
if (args.Player.Group.HasPermission(Permissions.manageregion))
|
||||
{
|
||||
for (int i = 0; i < TShock.Regions.Regions.Count; i++)
|
||||
args.Player.SendRaptorRegion(TShock.Regions.Regions[i]);
|
||||
}
|
||||
if (args.Player.Group.HasPermission(Permissions.managewarp))
|
||||
{
|
||||
for (int i = 0; i < TShock.Warps.Warps.Count; i++)
|
||||
args.Player.SendRaptorWarp(TShock.Warps.Warps[i]);
|
||||
}
|
||||
});
|
||||
}
|
||||
return true;
|
||||
case RaptorPacketTypes.Region:
|
||||
if (args.Player.Group.HasPermission(Permissions.manageregion))
|
||||
{
|
||||
int x = args.Data.ReadInt32();
|
||||
int y = args.Data.ReadInt32();
|
||||
int width = args.Data.ReadInt32();
|
||||
int height = args.Data.ReadInt32();
|
||||
string regionName = args.Data.ReadString();
|
||||
|
||||
Region region;
|
||||
if ((region = TShock.Regions.GetRegionByName(regionName)) == null)
|
||||
{
|
||||
TShock.Regions.AddRegion(x, y, width, height, regionName, args.Player.UserAccountName, Main.worldID.ToString());
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.manageregion) && tsplr != args.Player)
|
||||
tsplr.SendRaptorRegion(TShock.Regions.GetRegionByName(regionName));
|
||||
}
|
||||
Log.Info("{0} added region \"{1}\".", args.Player.UserAccountName, regionName);
|
||||
}
|
||||
else
|
||||
{
|
||||
TShock.Regions.PositionRegion(regionName, x, y, width, height);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.manageregion) && tsplr != args.Player)
|
||||
tsplr.SendRaptorRegion(region);
|
||||
}
|
||||
Log.Info("{0} moved region \"{1}\".", args.Player.UserAccountName, regionName);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
case RaptorPacketTypes.RegionDelete:
|
||||
if (args.Player.Group.HasPermission(Permissions.manageregion))
|
||||
{
|
||||
string regionName = args.Data.ReadString();
|
||||
TShock.Regions.DeleteRegion(regionName);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.manageregion) && tsplr != args.Player)
|
||||
tsplr.SendRaptorRegionDeletion(regionName);
|
||||
}
|
||||
Log.Info("{0} deleted region \"{1}\".", args.Player.UserAccountName, regionName);
|
||||
}
|
||||
return true;
|
||||
case RaptorPacketTypes.Warp:
|
||||
if (args.Player.Group.HasPermission(Permissions.managewarp))
|
||||
{
|
||||
int x = args.Data.ReadInt32();
|
||||
int y = args.Data.ReadInt32();
|
||||
string warpName = args.Data.ReadString();
|
||||
|
||||
Warp warp = TShock.Warps.Find(warpName);
|
||||
if (warp == null)
|
||||
{
|
||||
TShock.Warps.Add(x, y, warpName);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.managewarp) && tsplr != args.Player)
|
||||
tsplr.SendRaptorWarp(TShock.Warps.Find(warpName));
|
||||
}
|
||||
Log.Info("{0} added warp \"{1}\".", args.Player.UserAccountName, warpName);
|
||||
}
|
||||
else
|
||||
{
|
||||
TShock.Warps.PositionWarp(warpName, x, y);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.managewarp) && tsplr != args.Player)
|
||||
tsplr.SendRaptorWarp(warp);
|
||||
}
|
||||
Log.Info("{0} moved warp \"{1}\".", args.Player.UserAccountName, warpName);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
case RaptorPacketTypes.WarpDelete:
|
||||
if (args.Player.Group.HasPermission(Permissions.managewarp))
|
||||
{
|
||||
string warpName = args.Data.ReadString();
|
||||
TShock.Warps.Remove(warpName);
|
||||
foreach (TSPlayer tsplr in TShock.Players)
|
||||
{
|
||||
if (tsplr != null && tsplr.IsRaptor && tsplr.Group.HasPermission(Permissions.managewarp) && tsplr != args.Player)
|
||||
tsplr.SendRaptorWarpDeletion(warpName);
|
||||
}
|
||||
Log.Info("{0} deleted warp \"{1}\".", args.Player.UserAccountName, warpName);
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ namespace TShockAPI
|
|||
/// <summary>
|
||||
/// The permissions of this group and all that it inherits from.
|
||||
/// </summary>
|
||||
public List<string> TotalPermissions
|
||||
public virtual List<string> TotalPermissions
|
||||
{
|
||||
get
|
||||
{
|
||||
|
|
@ -235,6 +235,12 @@ namespace TShockAPI
|
|||
negatedpermissions.Add(permission);
|
||||
permissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions
|
||||
}
|
||||
|
||||
for (int i = 0; i < TShock.Players.Length; i++)
|
||||
{
|
||||
if (TShock.Players[i] != null && TShock.Players[i].IsRaptor)
|
||||
TShock.Players[i].SendRaptorPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -254,6 +260,12 @@ namespace TShockAPI
|
|||
permissions.Add(permission);
|
||||
negatedpermissions.Remove(permission); // Ensure we don't have conflicting definitions for a permissions
|
||||
}
|
||||
|
||||
for (int i = 0; i < TShock.Players.Length; i++)
|
||||
{
|
||||
if (TShock.Players[i] != null && TShock.Players[i].IsRaptor)
|
||||
TShock.Players[i].SendRaptorPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -281,6 +293,11 @@ namespace TShockAPI
|
|||
return;
|
||||
}
|
||||
permissions.Remove(permission);
|
||||
for (int i = 0; i < TShock.Players.Length; i++)
|
||||
{
|
||||
if (TShock.Players[i] != null && TShock.Players[i].IsRaptor && TShock.Players[i].Group == this)
|
||||
TShock.Players[i].SendRaptorPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -309,6 +326,10 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public class SuperAdminGroup : Group
|
||||
{
|
||||
public override List<string> TotalPermissions
|
||||
{
|
||||
get { return new List<string> { "*" }; }
|
||||
}
|
||||
public SuperAdminGroup()
|
||||
: base("superadmin")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ namespace TShockAPI.Hooks
|
|||
|
||||
public static void OnPlayerPostLogin(TSPlayer ply)
|
||||
{
|
||||
if(PlayerPostLogin == null)
|
||||
if (PlayerPostLogin == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
38
TShockAPI/RaptorPacketTypes.cs
Normal file
38
TShockAPI/RaptorPacketTypes.cs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace TShockAPI
|
||||
{
|
||||
/// <summary>
|
||||
/// Custom packet types for use with Raptor.
|
||||
/// </summary>
|
||||
public enum RaptorPacketTypes : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// The packet sent to the server to be acknowledged as a Raptor client.
|
||||
/// </summary>
|
||||
Acknowledge = 0,
|
||||
/// <summary>
|
||||
/// The packet sent to the client which dictates its permissions.
|
||||
/// </summary>
|
||||
Permissions,
|
||||
/// <summary>
|
||||
/// The packet sent which sets region info.
|
||||
/// </summary>
|
||||
Region,
|
||||
/// <summary>
|
||||
/// The packet sent to delete a region.
|
||||
/// </summary>
|
||||
RegionDelete,
|
||||
/// <summary>
|
||||
/// The packet sent which sets warp info.
|
||||
/// </summary>
|
||||
Warp,
|
||||
/// <summary>
|
||||
/// The packet sent to delete a warp.
|
||||
/// </summary>
|
||||
WarpDelete
|
||||
}
|
||||
}
|
||||
|
|
@ -20,8 +20,10 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Terraria;
|
||||
using TShockAPI.DB;
|
||||
using TShockAPI.Net;
|
||||
|
||||
namespace TShockAPI
|
||||
|
|
@ -38,6 +40,11 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public static readonly TSPlayer All = new TSPlayer("All");
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether the player is using Raptor.
|
||||
/// </summary>
|
||||
public bool IsRaptor { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// The amount of tiles that the player has killed in the last second.
|
||||
/// </summary>
|
||||
|
|
@ -887,6 +894,177 @@ namespace TShockAPI
|
|||
return TShock.SendBytes(Netplay.serverSock[Index], data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends Raptor permissions to the player.
|
||||
/// </summary>
|
||||
public void SendRaptorPermissions()
|
||||
{
|
||||
if (!IsRaptor)
|
||||
return;
|
||||
|
||||
lock (NetMessage.buffer[Index].writeBuffer)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
using (var ms = new MemoryStream(NetMessage.buffer[Index].writeBuffer, true))
|
||||
{
|
||||
using (var writer = new BinaryWriter(ms))
|
||||
{
|
||||
writer.BaseStream.Position = 4;
|
||||
|
||||
writer.Write((byte)PacketTypes.Placeholder);
|
||||
writer.Write((byte)RaptorPacketTypes.Permissions);
|
||||
|
||||
writer.Write(String.Join(",", Group.TotalPermissions.ToArray()));
|
||||
|
||||
length = (int)writer.BaseStream.Position;
|
||||
writer.BaseStream.Position = 0;
|
||||
writer.Write(length - 4);
|
||||
}
|
||||
}
|
||||
|
||||
TShock.PacketBuffer.SendBytes(Netplay.serverSock[Index], NetMessage.buffer[Index].writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sends a region to the player.
|
||||
/// <param name="region">The region.</param>
|
||||
/// </summary>
|
||||
public void SendRaptorRegion(Region region)
|
||||
{
|
||||
if (!IsRaptor)
|
||||
return;
|
||||
|
||||
lock (NetMessage.buffer[Index].writeBuffer)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
using (var ms = new MemoryStream(NetMessage.buffer[Index].writeBuffer, true))
|
||||
{
|
||||
using (var writer = new BinaryWriter(ms))
|
||||
{
|
||||
writer.BaseStream.Position = 4;
|
||||
|
||||
writer.Write((byte)PacketTypes.Placeholder);
|
||||
writer.Write((byte)RaptorPacketTypes.Region);
|
||||
|
||||
writer.Write(region.Area.X);
|
||||
writer.Write(region.Area.Y);
|
||||
writer.Write(region.Area.Width);
|
||||
writer.Write(region.Area.Height);
|
||||
writer.Write(region.Name);
|
||||
|
||||
length = (int)writer.BaseStream.Position;
|
||||
writer.BaseStream.Position = 0;
|
||||
writer.Write(length - 4);
|
||||
}
|
||||
}
|
||||
|
||||
TShock.PacketBuffer.SendBytes(Netplay.serverSock[Index], NetMessage.buffer[Index].writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sends a region deletion to the player.
|
||||
/// <param name="regionName">The region name.</param>
|
||||
/// </summary>
|
||||
public void SendRaptorRegionDeletion(string regionName)
|
||||
{
|
||||
if (!IsRaptor)
|
||||
return;
|
||||
|
||||
lock (NetMessage.buffer[Index].writeBuffer)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
using (var ms = new MemoryStream(NetMessage.buffer[Index].writeBuffer, true))
|
||||
{
|
||||
using (var writer = new BinaryWriter(ms))
|
||||
{
|
||||
writer.BaseStream.Position = 4;
|
||||
|
||||
writer.Write((byte)PacketTypes.Placeholder);
|
||||
writer.Write((byte)RaptorPacketTypes.RegionDelete);
|
||||
|
||||
writer.Write(regionName);
|
||||
|
||||
length = (int)writer.BaseStream.Position;
|
||||
writer.BaseStream.Position = 0;
|
||||
writer.Write(length - 4);
|
||||
}
|
||||
}
|
||||
|
||||
TShock.PacketBuffer.SendBytes(Netplay.serverSock[Index], NetMessage.buffer[Index].writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sends a warp to the player.
|
||||
/// <param name="warp">The warp.</param>
|
||||
/// </summary>
|
||||
public void SendRaptorWarp(Warp warp)
|
||||
{
|
||||
if (!IsRaptor)
|
||||
return;
|
||||
|
||||
lock (NetMessage.buffer[Index].writeBuffer)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
using (var ms = new MemoryStream(NetMessage.buffer[Index].writeBuffer, true))
|
||||
{
|
||||
using (var writer = new BinaryWriter(ms))
|
||||
{
|
||||
writer.BaseStream.Position = 4;
|
||||
|
||||
writer.Write((byte)PacketTypes.Placeholder);
|
||||
writer.Write((byte)RaptorPacketTypes.Warp);
|
||||
|
||||
writer.Write(warp.Position.X);
|
||||
writer.Write(warp.Position.Y);
|
||||
writer.Write(warp.Name);
|
||||
|
||||
length = (int)writer.BaseStream.Position;
|
||||
writer.BaseStream.Position = 0;
|
||||
writer.Write(length - 4);
|
||||
}
|
||||
}
|
||||
|
||||
TShock.PacketBuffer.SendBytes(Netplay.serverSock[Index], NetMessage.buffer[Index].writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sends a warp deletion to the player.
|
||||
/// <param name="warpName">The warp name.</param>
|
||||
/// </summary>
|
||||
public void SendRaptorWarpDeletion(string warpName)
|
||||
{
|
||||
if (!IsRaptor)
|
||||
return;
|
||||
|
||||
lock (NetMessage.buffer[Index].writeBuffer)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
using (var ms = new MemoryStream(NetMessage.buffer[Index].writeBuffer, true))
|
||||
{
|
||||
using (var writer = new BinaryWriter(ms))
|
||||
{
|
||||
writer.BaseStream.Position = 4;
|
||||
|
||||
writer.Write((byte)PacketTypes.Placeholder);
|
||||
writer.Write((byte)RaptorPacketTypes.WarpDelete);
|
||||
|
||||
writer.Write(warpName);
|
||||
|
||||
length = (int)writer.BaseStream.Position;
|
||||
writer.BaseStream.Position = 0;
|
||||
writer.Write(length - 4);
|
||||
}
|
||||
}
|
||||
|
||||
TShock.PacketBuffer.SendBytes(Netplay.serverSock[Index], NetMessage.buffer[Index].writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a command callback to a specified command string.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ using Terraria;
|
|||
using TerrariaApi.Server;
|
||||
using TShockAPI.DB;
|
||||
using TShockAPI.Net;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TShockAPI
|
||||
{
|
||||
|
|
@ -347,6 +349,24 @@ namespace TShockAPI
|
|||
|
||||
private void OnPlayerLogin(Hooks.PlayerPostLoginEventArgs args)
|
||||
{
|
||||
if (args.Player.IsRaptor)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
args.Player.SendRaptorPermissions();
|
||||
if (args.Player.Group.HasPermission(Permissions.manageregion))
|
||||
{
|
||||
for (int i = 0; i < Regions.Regions.Count; i++)
|
||||
args.Player.SendRaptorRegion(Regions.Regions[i]);
|
||||
}
|
||||
if (args.Player.Group.HasPermission(Permissions.managewarp))
|
||||
{
|
||||
for (int i = 0; i < Warps.Warps.Count; i++)
|
||||
args.Player.SendRaptorWarp(Warps.Warps[i]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
User u = Users.GetUserByName(args.Player.UserAccountName);
|
||||
List<String> KnownIps = new List<string>();
|
||||
if (!string.IsNullOrWhiteSpace(u.KnownIps))
|
||||
|
|
@ -592,13 +612,14 @@ namespace TShockAPI
|
|||
{
|
||||
AuthToken = 0;
|
||||
}
|
||||
|
||||
Regions.ReloadAllRegions();
|
||||
|
||||
Regions.Reload();
|
||||
Warps.ReloadWarps();
|
||||
|
||||
Lighting.lightMode = 2;
|
||||
|
||||
ComputeMaxStyles();
|
||||
FixChestStacks();
|
||||
|
||||
StatTracker.Initialize();
|
||||
}
|
||||
|
||||
|
|
@ -1110,13 +1131,7 @@ namespace TShockAPI
|
|||
Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte) type, type);
|
||||
|
||||
var player = Players[e.Msg.whoAmI];
|
||||
if (player == null)
|
||||
{
|
||||
e.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!player.ConnectionAlive)
|
||||
if (player == null || !player.ConnectionAlive)
|
||||
{
|
||||
e.Handled = true;
|
||||
return;
|
||||
|
|
@ -1137,15 +1152,8 @@ namespace TShockAPI
|
|||
|
||||
using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (GetDataHandlers.HandlerGetData(type, player, data))
|
||||
e.Handled = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex.ToString());
|
||||
}
|
||||
// Exceptions are already handled
|
||||
e.Handled = GetDataHandlers.HandlerGetData(type, player, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@
|
|||
<Compile Include="Hooks\GeneralHooks.cs" />
|
||||
<Compile Include="Hooks\PlayerHooks.cs" />
|
||||
<Compile Include="PaginationTools.cs" />
|
||||
<Compile Include="RaptorPacketTypes.cs" />
|
||||
<Compile Include="Rest\RestPermissions.cs" />
|
||||
<Compile Include="SaveManager.cs" />
|
||||
<Compile Include="DB\BanManager.cs" />
|
||||
|
|
@ -178,7 +179,7 @@
|
|||
</PropertyGroup>
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<UserProperties BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildAction="Both" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_StartDate="2011/6/17" BuildVersion_IncrementBeforeBuild="False" />
|
||||
<UserProperties BuildVersion_IncrementBeforeBuild="False" BuildVersion_StartDate="2011/6/17" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_BuildAction="Both" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
|
|
|||
|
|
@ -592,7 +592,7 @@ namespace TShockAPI
|
|||
FileTools.SetupConfig();
|
||||
TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs());
|
||||
TShock.Groups.LoadPermisions();
|
||||
TShock.Regions.ReloadAllRegions();
|
||||
TShock.Regions.Reload();
|
||||
TShock.Itembans.UpdateItemBans();
|
||||
Hooks.GeneralHooks.OnReloadEvent(player);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue