diff --git a/TShockAPI/BackupManager.cs b/TShockAPI/BackupManager.cs index 857570ef..e56bbffa 100644 --- a/TShockAPI/BackupManager.cs +++ b/TShockAPI/BackupManager.cs @@ -66,6 +66,15 @@ namespace TShockAPI TShock.Utils.Broadcast("Server map saving, potential lag spike"); Console.WriteLine("Backing up world..."); + + foreach (TSPlayer player in TShock.Players) + { + if (player.IsLoggedIn) + { + TShock.InventoryDB.InsertPlayerData(player); + } + } + Thread SaveWorld = new Thread(TShock.Utils.SaveWorld); SaveWorld.Start(); diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index fb3f2eba..a7eea1a7 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -349,7 +349,8 @@ namespace TShockAPI { if (!TShock.CheckInventory(args.Player)) { - args.Player.SendMessage("Login Failed, Please fix the above errors then log back in.", Color.Cyan); + args.Player.SendMessage("Login Failed, Please fix the above errors then /login again.", Color.Cyan); + args.Player.IgnoreActionsForClearingTrashCan = true; return; } } @@ -361,7 +362,7 @@ namespace TShockAPI args.Player.IgnoreActionsForInventory = false; args.Player.PlayerData.CopyInventory(args.Player); - TShock.InventoryDB.InsertPlayerData(args.Player, args.Player.UserID); + TShock.InventoryDB.InsertPlayerData(args.Player); args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen); Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]); @@ -1252,12 +1253,20 @@ namespace TShockAPI { switch (Main.tile[x, y].type) { + case 22: case 25: Main.tile[x, y].type = 117; break; case 23: Main.tile[x, y].type = 109; break; + case 32: + Main.tile[x, y].type = 0; + Main.tile[x, y].active = false; + break; + case 24: + Main.tile[x, y].type = 110; + break; case 112: Main.tile[x, y].type = 116; break; diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 8e7012cb..7deccc50 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -39,8 +39,8 @@ namespace TShockAPI public bool EnableWhitelist; [Description("Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map.")] public bool InfiniteInvasion; - [Description("Enable or disable perma pvp.")] - public bool AlwaysPvP = false; + [Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")] + public string PvPMode = "normal"; [Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")] public bool SpawnProtection = true; [Description("Radius from spawn tile for SpawnProtection.")] @@ -179,6 +179,12 @@ namespace TShockAPI [Description("Disables reporting of playercount to the stat system.")] public bool DisablePlayerCountReporting = false; + + [Description("Disables clown bomb projectiles from spawning")] //Change this to stop the tile from spawning + public bool DisableClownBombs = false; + + [Description("Disables snow ball projectiles from spawning")] //Change this to stop the tile from spawning + public bool DisableSnowBalls = false; public static ConfigFile Read(string path) { diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 30238f5a..11898003 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -21,7 +21,9 @@ namespace TShockAPI.DB new SqlColumn("GroupName", MySqlDbType.VarChar, 32) { Primary = true }, new SqlColumn("Parent", MySqlDbType.VarChar, 32), new SqlColumn("Commands", MySqlDbType.Text), - new SqlColumn("ChatColor", MySqlDbType.Text) + new SqlColumn("ChatColor", MySqlDbType.Text), + new SqlColumn("Prefix", MySqlDbType.Text), + new SqlColumn("Suffix", MySqlDbType.Text) ); var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); creator.EnsureExists(table); @@ -199,6 +201,9 @@ namespace TShockAPI.DB string groupname = reader.Get("GroupName"); var group = new Group(groupname); + group.Prefix = reader.Get("Prefix"); + group.Suffix= reader.Get("Suffix"); + //Inherit Given commands String[] commands = reader.Get("Commands").Split(','); foreach (var t in commands) diff --git a/TShockAPI/DB/InventoryManager.cs b/TShockAPI/DB/InventoryManager.cs index 0ea940f2..dd8ce24a 100644 --- a/TShockAPI/DB/InventoryManager.cs +++ b/TShockAPI/DB/InventoryManager.cs @@ -68,15 +68,18 @@ namespace TShockAPI.DB return playerData; } - public bool InsertPlayerData(TSPlayer player, int acctid) + public bool InsertPlayerData(TSPlayer player) { PlayerData playerData = player.PlayerData; - if (!GetPlayerData(player, acctid).exists) + if (!player.IsLoggedIn) + return false; + + if (!GetPlayerData(player, player.UserID).exists) { try { - database.Query("INSERT INTO Inventory (Account, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3);", acctid, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory)); + database.Query("INSERT INTO Inventory (Account, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3);", player.UserID, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory)); return true; } catch (Exception ex) @@ -88,7 +91,7 @@ namespace TShockAPI.DB { try { - database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @2 WHERE Account = @3;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), acctid); + database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @2 WHERE Account = @3;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), player.UserID); return true; } catch (Exception ex) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 9674bcf9..f63a69de 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -308,6 +308,10 @@ namespace TShockAPI var tile = Main.tile[realx, realy]; var newtile = tiles[x, y]; if(TShock.CheckTilePermission(args.Player, x, y)) + { + continue; + } + if(TShock.CheckRangePermission(args.Player, x, y)) { continue; } @@ -474,6 +478,12 @@ namespace TShockAPI { return true; } + if (tiletype == 29 && tiletype == 97 && TShock.Config.ServerSideInventory) + { + args.Player.SendMessage("You cannot place this tile, Server side inventory is enabled.", Color.Red); + args.Player.SendTileSquare(tileX, tileY); + return true; + } if (tiletype == 48 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && TShock.Itembans.ItemIsBanned("Spikes")) { args.Player.SendTileSquare(tileX, tileY); @@ -504,6 +514,17 @@ namespace TShockAPI return true; } + if (tiletype == 127 && type == 0) //Ice Block Kill, Bypass range checks and such + { + return false; + } + + if (TShock.CheckRangePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (type == 0 && Main.tileSolid[Main.tile[tileX, tileY].type] && args.Player.Active) { args.Player.TileThreshold++; @@ -543,7 +564,7 @@ namespace TShockAPI args.TPlayer.hostile = pvp; - if (TShock.Config.AlwaysPvP) + if (TShock.Config.PvPMode == "always") { if (pvp == true) args.Player.IgnoreActionsForPvP = false; @@ -591,11 +612,15 @@ namespace TShockAPI { args.Player.SendMessage("You have been disabled for cheating! Please login with a new character!", Color.Red); } - else if (TShock.Config.ServerSideInventory && !args.Player.IsLoggedIn) + else if (args.Player.IgnoreActionsForInventory) { args.Player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red); } - else if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + else if (args.Player.IgnoreActionsForClearingTrashCan) + { + args.Player.SendMessage("You need to rejoin to ensure your trash can is cleared!", Color.Red); + } + else if (args.Player.IgnoreActionsForPvP) { args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); } @@ -772,11 +797,18 @@ namespace TShockAPI args.Player.SendTileSquare(tileX, tileY); return true; } + if (TShock.CheckTilePermission(args.Player, tileX, tileY)) { args.Player.SendTileSquare(tileX, tileY); return true; } + + if (TShock.CheckRangePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } return false; } @@ -807,6 +839,12 @@ namespace TShockAPI return true; } + if (TShock.CheckRangePermission(args.Player, tileX, tileY)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + return false; } @@ -851,7 +889,7 @@ namespace TShockAPI return true; } - if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - x) > 32) || (Math.Abs(args.Player.TileY - y) > 32))) + if (TShock.CheckRangePermission(args.Player, x, y)) { return true; } @@ -891,6 +929,12 @@ namespace TShockAPI return false; } + if (TShock.CheckRangePermission(args.Player, Main.chest[id].x, Main.chest[id].y)) + { + args.Player.SendData(PacketTypes.ChestItem, "", id, slot); + return true; + } + return false; } @@ -905,6 +949,12 @@ namespace TShockAPI args.Player.SendData(PacketTypes.SignNew, "", id); return true; } + + if (TShock.CheckRangePermission(args.Player, x, y)) + { + args.Player.SendData(PacketTypes.SignNew, "", id); + return true; + } return false; } @@ -936,6 +986,12 @@ namespace TShockAPI args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless)); return true; } + + if (TShock.CheckRangePermission(args.Player, x, y)) + { + args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless)); + return true; + } return false; } @@ -955,7 +1011,7 @@ namespace TShockAPI args.Player.SendData(PacketTypes.PlayerBuff, "", id); return true; } - if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - TShock.Players[id].TileX) > 64) || (Math.Abs(args.Player.TileY - TShock.Players[id].TileY) > 64))) + if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 64)) { args.Player.SendData(PacketTypes.PlayerBuff, "", id); return true; @@ -989,7 +1045,7 @@ namespace TShockAPI return false; } - if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - (pos.X / 16f)) > 64) || (Math.Abs(args.Player.TileY - (pos.Y / 16f)) > 64))) + if (TShock.CheckRangePermission(args.Player, (int)(pos.X / 16f), (int)(pos.Y / 16f), 64)) { args.Player.SendData(PacketTypes.ItemDrop, "", id); return true; @@ -1055,7 +1111,7 @@ namespace TShockAPI return true; } - if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - TShock.Players[id].TileX) > 128) || (Math.Abs(args.Player.TileY - TShock.Players[id].TileY) > 128))) + if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 128)) { args.Player.SendData(PacketTypes.PlayerHp, "", id); args.Player.SendData(PacketTypes.PlayerUpdate, "", id); diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index c089ff16..60be04f8 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -28,6 +28,8 @@ namespace TShockAPI public string Name { get; set; } public Group Parent { get; set; } public int Order { get; set; } + public string Prefix { get; set; } + public string Suffix { get; set; } public byte R = 255; public byte G = 255; diff --git a/TShockAPI/StatTracker.cs b/TShockAPI/StatTracker.cs index 3fc4e421..83f84434 100644 --- a/TShockAPI/StatTracker.cs +++ b/TShockAPI/StatTracker.cs @@ -13,19 +13,11 @@ namespace TShockAPI { Utils Utils = TShock.Utils; public DateTime lastcheck = DateTime.MinValue; - private bool oneCheckin = false; - readonly int checkinFrequency = 1; + readonly int checkinFrequency = 5; public void checkin() { - if (TShock.Config.DisablePlayerCountReporting) - { - if (!oneCheckin) - { - checkin(); - oneCheckin = !oneCheckin; - } - } else if ((DateTime.Now - lastcheck).TotalMinutes >= checkinFrequency) + if ((DateTime.Now - lastcheck).TotalMinutes >= checkinFrequency) { ThreadPool.QueueUserWorkItem(callHome); lastcheck = DateTime.Now; diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index f706badf..e7f8f681 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -67,6 +67,7 @@ namespace TShockAPI public bool IgnoreActionsForPvP = false; public bool IgnoreActionsForInventory = false; public bool IgnoreActionsForCheating = false; + public bool IgnoreActionsForClearingTrashCan = false; public PlayerData PlayerData; public bool RealPlayer diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index daef661f..e56bd53a 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -518,7 +518,7 @@ namespace TShockAPI if (tsplr.IsLoggedIn) { tsplr.PlayerData.CopyInventory(tsplr); - InventoryDB.InsertPlayerData(tsplr, tsplr.UserID); + InventoryDB.InsertPlayerData(tsplr); } if (Config.RememberLeavePos) @@ -706,7 +706,7 @@ namespace TShockAPI player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red); } - if (Config.AlwaysPvP && !player.TPlayer.hostile) + if (TShock.Config.PvPMode == "always" && !player.TPlayer.hostile) { player.IgnoreActionsForPvP = true; player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); @@ -741,6 +741,21 @@ namespace TShockAPI if (e.Info == 43) if (Config.DisableTombstones) e.Object.SetDefaults(0); + if (e.Info == 75) + if (Config.DisableClownBombs) + e.Object.SetDefaults(0); + if (e.Info == 109) + if (Config.DisableSnowBalls) + e.Object.SetDefaults(0); + + } + + void OnNpcSetDefaults(SetDefaultsEventArgs e) + { + if (TShock.Itembans.ItemIsBanned(e.Object.name)) + { + e.Object.SetDefaults(0); + } } /// @@ -922,12 +937,17 @@ namespace TShockAPI return false; } - public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) + public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32) { - if (TShock.Config.RangeChecks && ((Math.Abs(player.TileX - tileX) > 32) || (Math.Abs(player.TileY - tileY) > 32))) + if (TShock.Config.RangeChecks && ((Math.Abs(player.TileX - x) > 32) || (Math.Abs(player.TileY - y) > 32))) { return true; } + return false; + } + + public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) + { if (!player.Group.HasPermission(Permissions.canbuild)) { player.SendMessage("You do not have permission to build!", Color.Red);