diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index b8c9f33a..87c57fc4 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -61,5 +61,7 @@ namespace TShockAPI public bool RememberLeavePos = false; public bool HardcoreOnly = false; + public bool KickOnHardcoreOnlyDeath = false; + public bool BanOnHardcoreOnlyDeath = false; } } \ No newline at end of file diff --git a/TShockAPI/ConfigurationManager.cs b/TShockAPI/ConfigurationManager.cs index b3f2fba8..c7935de2 100644 --- a/TShockAPI/ConfigurationManager.cs +++ b/TShockAPI/ConfigurationManager.cs @@ -82,6 +82,8 @@ namespace TShockAPI public static int originalSpawnY; public static bool hardcoreOnly = false; + public static bool KickOnHardcoreDeath = false; + public static bool BanOnHardcoreDeath = false; public static void ReadJsonConfiguration() { @@ -128,6 +130,8 @@ namespace TShockAPI Spawn_WorldID = cfg.Spawn_WorldID; RememberLeavePos = cfg.RememberLeavePos; hardcoreOnly = cfg.HardcoreOnly; + KickOnHardcoreDeath = cfg.KickOnHardcoreOnlyDeath; + BanOnHardcoreDeath = cfg.BanOnHardcoreOnlyDeath; } public static void WriteJsonConfiguration() @@ -167,6 +171,8 @@ namespace TShockAPI cfg.RememberLeavePos = RememberLeavePos; cfg.Spawn_WorldID = Spawn_WorldID; cfg.HardcoreOnly = hardcoreOnly; + cfg.BanOnHardcoreOnlyDeath = BanOnHardcoreDeath; + cfg.KickOnHardcoreOnlyDeath = KickOnHardcoreDeath; string json = JsonConvert.SerializeObject(cfg, Formatting.Indented); TextWriter tr = new StreamWriter(FileTools.ConfigPath); tr.Write(json); diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index c99ce762..c4870fd2 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -108,6 +108,7 @@ namespace TShockAPI {PacketTypes.TileKill, HandleTileKill}, {PacketTypes.PlayerKillMe, HandlePlayerKillMe}, {PacketTypes.LiquidSet, HandleLiquidSet}, + {PacketTypes.PlayerSpawn, HandleSpawn}, }; } @@ -448,5 +449,31 @@ namespace TShockAPI } return false; } + + private static bool HandleSpawn(GetDataHandlerArgs args) + { + byte player = args.Data.ReadInt8(); + int spawnx = args.Data.ReadInt32(); + int spawny = args.Data.ReadInt32(); + + if (args.Player.InitSpawn) + { + if (ConfigurationManager.hardcoreOnly && (ConfigurationManager.KickOnHardcoreDeath || ConfigurationManager.BanOnHardcoreDeath)) + if (args.TPlayer.selectedItem != 50) + { + if (ConfigurationManager.BanOnHardcoreDeath) + { + if (!Tools.Ban(args.Player, "Death results in a ban")) + Tools.ForceKick(args.Player, "Death results in a ban, but can't ban you"); + } + else + Tools.ForceKick(args.Player, "Death results in a kick"); + return true; + } + } + else + args.Player.InitSpawn = true; + return false; + } } } diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index a43a084c..4cdcf169 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -37,6 +37,7 @@ namespace TShockAPI public DateTime LastPvpChange { get; protected set; } public Rectangle TempArea = new Rectangle(); public DateTime LastExplosive { get; set; } + public bool InitSpawn = false; public bool RealPlayer { @@ -135,6 +136,7 @@ namespace TShockAPI public bool Teleport(int tileX, int tileY) { + this.InitSpawn = false; int spawnTileX = Main.spawnTileX; int spawnTileY = Main.spawnTileY; Main.spawnTileX = tileX; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 33fe34f6..183a8cf7 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -265,6 +265,7 @@ namespace TShockAPI } Players[ply] = player; + Players[ply].InitSpawn = false; Netplay.spamCheck = ConfigurationManager.SpamChecks; }