diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index e9853157..0e611543 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -490,12 +490,8 @@ namespace TShockAPI private static void Bloodmoon(CommandArgs args) { + TSPlayer.Server.SetBloodMoon(true); Tools.Broadcast(string.Format("{0} turned on blood moon.", args.Player.Name)); - Main.bloodMoon = true; - Main.time = 0; - Main.dayTime = false; - NetMessage.SendData(18, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); } private static void Invade(CommandArgs args) @@ -728,38 +724,23 @@ namespace TShockAPI switch (args.Parameters[0]) { case "day": - Main.time = 0; - Main.dayTime = true; - NetMessage.SendData(18, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); + TSPlayer.Server.SetTime(true, 0.0); Tools.Broadcast(string.Format("{0} set time to day.", args.Player.Name)); break; case "night": - Main.time = 0; - Main.dayTime = false; - NetMessage.SendData(18, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); + TSPlayer.Server.SetTime(false, 0.0); Tools.Broadcast(string.Format("{0} set time to night.", args.Player.Name)); break; case "dusk": - Main.dayTime = false; - Main.time = 0.0; - NetMessage.SendData(18, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); + TSPlayer.Server.SetTime(false, 0.0); Tools.Broadcast(string.Format("{0} set time to dusk.", args.Player.Name)); break; case "noon": - Main.dayTime = true; - Main.time = 27000.0; - NetMessage.SendData(18, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); + TSPlayer.Server.SetTime(true, 27000.0); Tools.Broadcast(string.Format("{0} set time to noon.", args.Player.Name)); break; case "midnight": - Main.dayTime = false; - Main.time = 16200.0; - NetMessage.SendData(18, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); + TSPlayer.Server.SetTime(false, 16200.0); Tools.Broadcast(string.Format("{0} set time to midnight.", args.Player.Name)); break; default: @@ -914,7 +895,7 @@ namespace TShockAPI { int.TryParse(args.Parameters[1], out damage); } - TShock.PlayerDamage(plr, damage); + plr.DamagePlayer(damage); Tools.Broadcast(string.Format("{0} slapped {1} for {2} damage.", args.Player.Name, plr.Name, damage)); } @@ -941,9 +922,9 @@ namespace TShockAPI else { var plr = player[0]; + plr.DamagePlayer(999999); args.Player.SendMessage(string.Format("You just killed {0}!", plr.Name)); plr.SendMessage(string.Format("{0} just killed you!", args.Player.Name)); - TShock.PlayerDamage(plr, 999999); } } @@ -954,8 +935,7 @@ namespace TShockAPI { if (!Main.npc[i].townNPC && Main.npc[i].active) { - Main.npc[i].StrikeNPC(99999, 90f, 1); - NetMessage.SendData(28, -1, -1, "", i, 99999, 90f, 1); + TSPlayer.Server.StrikeNPC(i, 99999, 90f, 1); killcount++; } } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 9f43c8d1..de8c0710 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -146,7 +146,6 @@ namespace TShockAPI Tools.ForceKick(args.Player, "Hair crash exploit."); return true; } - if (name.Length > 32) { Tools.ForceKick(args.Player, "Name exceeded 32 characters."); @@ -215,7 +214,7 @@ namespace TShockAPI if (!args.Player.Group.HasPermission("editspawn")) { args.Player.SendMessage("World protected from changes.", Color.Red); - TShock.SendTileSquare(args.Player, x, y); + args.Player.SendTileSquare(x, y); return true; } } @@ -227,7 +226,7 @@ namespace TShockAPI if (flag) { args.Player.SendMessage("Spawn protected from changes.", Color.Red); - TShock.SendTileSquare(args.Player, x, y); + args.Player.SendTileSquare(x, y); return true; } } @@ -248,12 +247,7 @@ namespace TShockAPI int id = args.Data.ReadByte(); bool pvp = args.Data.ReadBoolean(); - args.TPlayer.hostile = pvp; - if (id != args.Player.Index) - args.TPlayer.hostile = true; - if (ConfigurationManager.PermaPvp) - args.TPlayer.hostile = true; - NetMessage.SendData(30, -1, -1, "", args.Player.Index); + args.Player.SetPvP(id != args.Player.Index || ConfigurationManager.PermaPvp ? true : pvp); return true; } @@ -382,11 +376,7 @@ namespace TShockAPI if (ConfigurationManager.RangeChecks && ((Math.Abs(plyX - tileX) > 32) || (Math.Abs(plyY - tileY) > 32))) { Log.Debug(string.Format("Liquid(PlyXY:{0}_{1}, TileXY:{2}_{3}, Result:{4}_{5}, Amount:{6})", - plyX, plyY, - tileX, tileY, - Math.Abs(plyX - tileX), Math.Abs(plyY - tileY), - liquid - )); + plyX, plyY, tileX, tileY, Math.Abs(plyX - tileX), Math.Abs(plyY - tileY), liquid)); return Tools.HandleGriefer(args.Player, "Placing impossible to place liquid."); ; } diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 92de581e..d02ce43a 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -19,12 +19,13 @@ using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Terraria; +using TerrariaAPI; namespace TShockAPI { public class TSPlayer { - public static readonly TSPlayer Server = new ServerPlayer(); + public static readonly TSServerPlayer Server = new TSServerPlayer(); public static readonly TSPlayer All = new TSPlayer("All"); public uint TileThreshold { get; set; } public Dictionary TilesDestroyed { get; set; } @@ -104,6 +105,22 @@ namespace TShockAPI Group = new Group("null"); } + public virtual void Disconnect(string reason) + { + if (Index == -1) + return; + + NetMessage.SendData((int)PacketTypes.Disconnect, Index, -1, reason, 0x0, 0f, 0f, 0f); + } + + public virtual void SendTileSquare(int x, int y, int size = 10) + { + if (Index == -1) + return; + + NetMessage.SendData((int)PacketTypes.TileSendSquare, Index, -1, "", size, (float)(x - (size / 2)), (float)(y - (size / 2)), 0f); + } + public virtual void SendMessage(string msg) { SendMessage(msg, 0, 255, 0); @@ -116,30 +133,72 @@ namespace TShockAPI public virtual void SendMessage(string msg, byte red, byte green, byte blue) { - NetMessage.SendData(0x19, Index, -1, msg, 255, red, green, blue); + NetMessage.SendData((int)PacketTypes.ChatText, Index, -1, msg, 255, red, green, blue); + } + + public virtual void DamagePlayer(int damage) + { + if (Index == -1) + return; + + NetMessage.SendData((int)PacketTypes.PlayerDamage, -1, -1, "", Index, ((new Random()).Next(-1, 1)), damage, (float)0); + } + + public virtual void SetPvP(bool pvp) + { + if (Index == -1) + return; + + if (TPlayer.hostile != pvp) + { + TPlayer.hostile = pvp; + NetMessage.SendData((int)PacketTypes.TogglePVP, -1, -1, "", Index); + All.SendMessage(string.Format("{0} has {1} PvP!", Name, pvp ? "enabled" : "disabled"), Main.teamColor[Team]); + } } } - - public class ServerPlayer : TSPlayer + public class TSServerPlayer : TSPlayer { - public ServerPlayer() : base("Server") + public TSServerPlayer() : base("Server") { Group = new SuperAdminGroup(); } public override void SendMessage(string msg) { - Console.WriteLine(msg); - } - public override void SendMessage(string msg, byte red, byte green, byte blue) - { - SendMessage(msg); + SendMessage(msg, 0, 255, 0); } + public override void SendMessage(string msg, Color color) { - SendMessage(msg); + SendMessage(msg, color.R, color.G, color.B); + } + + public override void SendMessage(string msg, byte red, byte green, byte blue) + { + Console.WriteLine(msg); + } + + public void SetBloodMoon(bool bloodMoon) + { + Main.bloodMoon = bloodMoon; + SetTime(false, 0); + } + + public void SetTime(bool dayTime, double time) + { + Main.dayTime = dayTime; + Main.time = time; + NetMessage.SendData((int)PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); + NetMessage.syncPlayers(); + } + + public void StrikeNPC(int npcid, int damage, float knockBack, int hitDirection) + { + Main.npc[npcid].StrikeNPC(damage, knockBack, hitDirection); + NetMessage.SendData((int)PacketTypes.NPCStrike, -1, -1, "", npcid, damage, knockBack, hitDirection); } } } \ No newline at end of file diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 22837a1b..7c10110b 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -367,8 +367,7 @@ namespace TShockAPI } if (ConfigurationManager.PermaPvp) { - Main.player[who].hostile = true; - NetMessage.SendData(30, -1, -1, "", who); + player.SetPvP(true); } if (Players[who].Group.HasPermission("causeevents") && ConfigurationManager.InfiniteInvasion) { @@ -465,17 +464,6 @@ namespace TShockAPI } } - - public static void PlayerDamage(TSPlayer player, int damage) - { - NetMessage.SendData(26, -1, -1, "", player.Index, ((new Random()).Next(-1, 1)), damage, (float)0); - } - - public static void SendTileSquare(TSPlayer player, int x, int y, int size = 10) - { - NetMessage.SendData(20, player.Index, -1, "", size, (float)(x - (size / 2)), (float)(y - (size / 2)), 0f); - } - //TODO : Notify the player if there is more than one match. (or do we want a First() kinda thing?) public static int GetNPCID(string name, bool exact = false) { diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs index f5984c27..1883db11 100755 --- a/TShockAPI/Tools.cs +++ b/TShockAPI/Tools.cs @@ -215,7 +215,7 @@ namespace TShockAPI { if (!player.ConnectionAlive) return; - NetMessage.SendData(0x2, player.Index, -1, reason, 0x0, 0f, 0f, 0f); + player.Disconnect(reason); Log.Info(string.Format("{0} was force kicked for : {1}", player.IP, reason)); } @@ -231,7 +231,7 @@ namespace TShockAPI if (!player.Group.HasPermission("immunetokick")) { string playerName = player.Name; - NetMessage.SendData(0x2, player.Index, -1, string.Format("Kicked: {0}", reason), 0x0, 0f, 0f, 0f); + player.Disconnect(string.Format("Kicked: {0}", reason)); Log.Info(string.Format("Kicked {0} for : {1}", playerName, reason)); if (adminUserName.Length == 0) Broadcast(string.Format("{0} was kicked for {1}", playerName, reason.ToLower())); @@ -256,7 +256,7 @@ namespace TShockAPI string ip = player.IP; string playerName = player.Name; TShock.Bans.AddBan(ip, playerName, reason); - NetMessage.SendData(0x2, player.Index, -1, string.Format("Banned: {0}", reason), 0x0, 0f, 0f, 0f); + player.Disconnect(string.Format("Banned: {0}", reason)); Log.Info(string.Format("Banned {0} for : {1}", playerName, reason)); if (adminUserName.Length == 0) Broadcast(string.Format("{0} was banned for {1}", playerName, reason.ToLower()));