diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 673dffd2..e8007ff4 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2032,8 +2032,9 @@ namespace TShockAPI int pageNumber; if (!PaginationTools.TryParsePageNumber(args.Parameters, 1, args.Player, out pageNumber)) return; - IEnumerable warpNames = from warp in TShock.Warps.ListAllPublicWarps(Main.worldID.ToString()) - select warp.WarpName; + IEnumerable 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 ", Color.Red); + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region delete "); 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 ", - Color.Red); - } + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region resize "); } else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize ", - Color.Red); - } + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /region resize "); 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": diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index e01494ca..e3fa0025 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -27,11 +27,14 @@ namespace TShockAPI.DB { public class RegionManager { + /// + /// The list of regions. + /// public List Regions = new List(); 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() + /// + /// Reloads all regions. + /// + public void Reload() { try { @@ -419,6 +423,33 @@ namespace TShockAPI.DB return false; } + /// + /// Sets the position of a region. + /// + /// The region name. + /// The X position. + /// The Y position. + /// The height. + /// The width. + /// Whether the operation succeeded. + 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; + } + /// /// Gets all the regions names from world /// diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index 9ece9591..9d735ae7 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -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; + /// + /// The list of warps. + /// + public List Warps = new List(); [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) + /// + /// Adds a warp. + /// + /// The X position. + /// The Y position. + /// The name. + /// Whether the opration succeeded. + 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) + /// + /// Reloads all warps. + /// + 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("X"), reader.Get("Y")), + reader.Get("WarpName"), + (reader.Get("Private") ?? "0") != "0")); + } + } + } + + /// + /// Removes a warp. + /// + /// The warp name. + /// Whether the operation succeeded. + 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) + /// + /// Finds the warp with the given name. + /// + /// The name. + /// The warp, if it exists, or else null. + public Warp Find(string warpName) + { + return Warps.FirstOrDefault(w => String.Equals(w.Name, warpName, StringComparison.OrdinalIgnoreCase)); + } + + /// + /// Sets the position of a warp. + /// + /// The warp name. + /// The X position. + /// The Y position. + /// Whether the operation suceeded. + 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("X"), reader.Get("Y")), reader.Get("WarpName"), - reader.Get("WorldID"), reader.Get("Private")); - } - catch - { - return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), - reader.Get("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; } /// - /// Gets all the warps names from world + /// Sets the hidden state of a warp. /// - /// World name to get warps from - /// List of warps with only their names - public List ListAllPublicWarps(string worldid) + /// The warp name. + /// The state. + /// Whether the operation suceeded. + public bool Hide(string warpName, bool state) { - var warps = new List(); 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("Private") == "0" || reader.Get("Private") == null) - warps.Add(new Warp {WarpName = reader.Get("WarpName")}); - } - catch - { - warps.Add(new Warp {WarpName = reader.Get("WarpName")}); - } - } + Warps.Find(w => String.Equals(w.Name, warpName, StringComparison.OrdinalIgnoreCase)).IsPrivate = state; + return true; } } catch (Exception ex) { Log.Error(ex.ToString()); } - return warps; - } - - /// - /// Gets all the warps names from world - /// - /// World name to get warps from - /// List of warps with only their names - 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; } } + /// + /// Represents a warp. + /// public class Warp { - public Vector2 WarpPos { get; set; } - public string WarpName { get; set; } - public string WorldWarpID { get; set; } - public string Private { get; set; } + /// + /// Gets or sets the name. + /// + public string Name { get; set; } + /// + /// Gets or sets the warp's privacy state. + /// + public bool IsPrivate { get; set; } + /// + /// Gets or sets the position. + /// + 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; } } } \ No newline at end of file diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index ae002603..2747ee58 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -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; + } + } } } diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 32d8272d..f90c56b9 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -118,7 +118,7 @@ namespace TShockAPI /// /// The permissions of this group and all that it inherits from. /// - public List TotalPermissions + public virtual List 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(); + } } /// @@ -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(); + } } /// @@ -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(); + } } /// @@ -309,6 +326,10 @@ namespace TShockAPI /// public class SuperAdminGroup : Group { + public override List TotalPermissions + { + get { return new List { "*" }; } + } public SuperAdminGroup() : base("superadmin") { diff --git a/TShockAPI/Hooks/PlayerHooks.cs b/TShockAPI/Hooks/PlayerHooks.cs index 047fca50..79db8a30 100644 --- a/TShockAPI/Hooks/PlayerHooks.cs +++ b/TShockAPI/Hooks/PlayerHooks.cs @@ -58,7 +58,7 @@ namespace TShockAPI.Hooks public static void OnPlayerPostLogin(TSPlayer ply) { - if(PlayerPostLogin == null) + if (PlayerPostLogin == null) { return; } diff --git a/TShockAPI/RaptorPacketTypes.cs b/TShockAPI/RaptorPacketTypes.cs new file mode 100644 index 00000000..81a6f125 --- /dev/null +++ b/TShockAPI/RaptorPacketTypes.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TShockAPI +{ + /// + /// Custom packet types for use with Raptor. + /// + public enum RaptorPacketTypes : byte + { + /// + /// The packet sent to the server to be acknowledged as a Raptor client. + /// + Acknowledge = 0, + /// + /// The packet sent to the client which dictates its permissions. + /// + Permissions, + /// + /// The packet sent which sets region info. + /// + Region, + /// + /// The packet sent to delete a region. + /// + RegionDelete, + /// + /// The packet sent which sets warp info. + /// + Warp, + /// + /// The packet sent to delete a warp. + /// + WarpDelete + } +} diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index d7c903db..4eac6a2d 100755 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -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 /// public static readonly TSPlayer All = new TSPlayer("All"); + /// + /// Gets whether the player is using Raptor. + /// + public bool IsRaptor { get; internal set; } + /// /// The amount of tiles that the player has killed in the last second. /// @@ -887,6 +894,177 @@ namespace TShockAPI return TShock.SendBytes(Netplay.serverSock[Index], data); } + /// + /// Sends Raptor permissions to the player. + /// + 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); + } + } + /// + /// Sends a region to the player. + /// The region. + /// + 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); + } + } + /// + /// Sends a region deletion to the player. + /// The region name. + /// + 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); + } + } + /// + /// Sends a warp to the player. + /// The warp. + /// + 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); + } + } + /// + /// Sends a warp deletion to the player. + /// The warp name. + /// + 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); + } + } + /// /// Adds a command callback to a specified command string. /// diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 10001583..105ca044 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -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 KnownIps = new List(); 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); } } diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 2c742b12..3ebc9d93 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -76,6 +76,7 @@ + @@ -178,7 +179,7 @@ - +