diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 2be3728a..61e9baad 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1641,16 +1641,49 @@ namespace TShockAPI { if (args.Parameters.Count < 1) { - args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /tp "); + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /tp "); + args.Player.SendErrorMessage(" /tp "); return; } - if (args.Parameters.Count < 2) + if(args.Parameters.Count == 2) + { + float x, y; + if (float.TryParse(args.Parameters[0], out x) && float.TryParse(args.Parameters[1], out y)) + { + + + if (x < 500) + { + x = 500; + } + if (y < 500) + { + y = 500; + } + if (x > Main.rightWorld - 500) + { + x = Main.rightWorld - 500; + } + if (y > Main.bottomWorld - 500) + { + y = Main.bottomWorld - 500; + } + args.Player.Teleport(x, y); + args.Player.SendSuccessMessage("Teleported!"); + } + } + else { string plStr = String.Join(" ", args.Parameters); var players = TShock.Utils.FindPlayer(plStr); if (players.Count == 0) - args.Player.SendErrorMessage("Invalid player!"); + { + args.Player.SendErrorMessage("Invalid user name."); + args.Player.SendErrorMessage("Proper syntax: /tp "); + args.Player.SendErrorMessage(" /tp "); + } + else if (players.Count > 1) TShock.Utils.SendMultipleMatchError(args.Player, players.Select(p => p.Name)); else if (!players[0].TPAllow && !args.Player.Group.HasPermission(Permissions.tpall)) @@ -1662,7 +1695,7 @@ namespace TShockAPI else { var plr = players[0]; - if (args.Player.Teleport(plr.TileX*16, plr.TileY*16 + 48)) + if (args.Player.Teleport(plr.TileX * 16, plr.TileY * 16 + 48)) { args.Player.SendSuccessMessage(string.Format("Teleported to {0}.", plr.Name)); if (!args.Player.Group.HasPermission(Permissions.tphide)) @@ -1670,13 +1703,8 @@ namespace TShockAPI } } } - else - { - float x = float.Parse(args.Parameters[0]); - float y = float.Parse(args.Parameters[1]); - args.Player.Teleport(x, y); - args.Player.SendSuccessMessage("Teleported!"); - } + + } private static void TPHere(CommandArgs args) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 2e3a043c..a86a37cb 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1130,6 +1130,53 @@ namespace TShockAPI return args.Handled; } + /// + /// For use with a NPCStrike event + /// + public class TeleportEventArgs : HandledEventArgs + { + /// + /// ??? + /// + public Int16 ID { get; set; } + /// + /// Flag is a bit field + /// if the first bit is set -> 0 = player, 1 = NPC + /// if the second bit is set, ignore this packet + /// if the third bit is set, style +1 + /// if the fourth bit is set, style +1 + /// + public byte Flag { get; set; } + /// + /// X Location + /// + public float X { get; set; } + /// + /// Y Location + /// + public float Y { get; set; } + } + /// + /// NPCStrike - Called when an NPC is attacked + /// + public static HandlerList Teleport; + + private static bool OnTeleport(Int16 id, byte f, float x, float y) + { + if (Teleport == null) + return false; + + var args = new TeleportEventArgs + { + ID = id, + Flag = f, + X = x, + Y = y + }; + Teleport.Invoke(null, args); + return args.Handled; + } + #endregion public static void InitGetDataHandler() { @@ -1174,7 +1221,8 @@ namespace TShockAPI {PacketTypes.PasswordSend, HandlePassword}, {PacketTypes.ContinueConnecting2, HandleConnecting}, {PacketTypes.ProjectileDestroy, HandleProjectileKill}, - {PacketTypes.SpawnBossorInvasion, HandleSpawnBoss} + {PacketTypes.SpawnBossorInvasion, HandleSpawnBoss}, + {PacketTypes.Teleport, HandleTeleport} }; } @@ -2980,5 +3028,76 @@ namespace TShockAPI TShock.Utils.SendLogs(string.Format("{0} summoned {1}", args.Player.Name, boss), Color.PaleVioletRed, args.Player); return false; } + + private static bool HandleTeleport(GetDataHandlerArgs args) + { + var flag = args.Data.ReadInt8(); + var id = args.Data.ReadInt16(); + var x = args.Data.ReadSingle(); + var y = args.Data.ReadSingle(); + + if (OnTeleport(id, flag, x, y)) + return true; + + var style = 0; + var isNPC = false; + if ((flag & 1) == 1) + { + isNPC = true; + } + + if ((flag & 2) != 2) + { + if ((flag & 4) == 4) + { + style++; + } + + if ((flag & 8) == 8) + { + style++; + } + + if (id > (isNPC ? 200 : 255)) + { + return true; + } + + if (x > Main.rightWorld - 500) + { + x = Main.rightWorld - 500; + } + if (x < 500) + { + x = 500; + } + if (y > Main.bottomWorld - 500) + { + y = Main.bottomWorld - 500; + } + if (y < 500) + { + y = 500; + } + + if (Main.player[id] == null || TShock.Players[id] == null) + { + return true; + } + + if (!args.Player.Group.HasPermission(Permissions.tp)) + { + args.Player.SendErrorMessage("You do not have permission to teleport."); + Main.player[id].Teleport(new Vector2(Main.player[id].position.X, Main.player[id].position.Y), style); + NetMessage.SendData(65, -1, -1, "", 0, (float)id, Main.player[id].position.X, Main.player[id].position.Y, style); + return true; + } + + Main.player[id].Teleport(new Vector2(x, y), style); + NetMessage.SendData(65, -1, -1, "", 0, (float)id, x, y, style); + } + + return true; + } } } diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index b8bfbaa8..f795ca39 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -68,7 +68,7 @@ - + False .exe ..\TerrariaServerBins\TerrariaServer.exe @@ -183,7 +183,7 @@ - +