diff --git a/CHANGELOG.md b/CHANGELOG.md index e081c0b6..db04f777 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin * Fix message requiring login not using the command specifier set in the config file. (@hakusaro) * Move `TShock.CheckRangePermission()` to `TSPlayer.IsInRange` which **returns the opposite** of what the previous method did (see updated docs). (@hakusaro) * Move `TShock.CheckSpawn` to `Utils.IsInSpawn`. (@hakusaro) +* Replace `TShock.CheckTilePermission` with `TSPlayer.HasBuildPermission`, `TSPlayer.HasPaintPermission`, and `TSPlayer.HasModifiedIceSuccessfully` respectively. (@hakusaro) ## TShock 4.3.25 * Fixed a critical exploit in the Terraria protocol that could cause massive unpreventable world corruption as well as a number of other problems. Thanks to @bartico6 for reporting. Fixed by the efforts of @QuiCM, @hakusaro, and tips in the right directioon from @bartico6. diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 77d602a7..d17c5266 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -533,11 +533,8 @@ namespace TShockAPI short y = args.Y; byte homeless = args.Homeless; - // Calls to TShock.CheckTilePermission need to be broken up into different subsystems - // In particular, this handles both regions and other things. Ouch. if (!args.Player.HasBuildPermission(x, y)) { - args.Player.SendErrorMessage("You do not have access to modify this area."); args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless)); args.Handled = true; diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index a5aa17f2..dad3ca4e 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -346,7 +346,7 @@ namespace TShockAPI /// The x coordinate they want to build at. /// The y coordinate they want to paint at. /// True if the player can build at the given point from build, spawn, and region protection. - public bool HasBuildPermission(int x, int y) + public bool HasBuildPermission(int x, int y, bool shouldWarnPlayer = true) { BuildPermissionFailPoint failure = BuildPermissionFailPoint.GeneralBuild; // The goal is to short circuit on easy stuff as much as possible. @@ -356,10 +356,12 @@ namespace TShockAPI // (General build protection takes precedence over spawn protection) if (!TShock.Config.DisableBuild || HasPermission(Permissions.antibuild)) { + failure = BuildPermissionFailPoint.SpawnProtect; // If they have spawn protect bypass, or it isn't spawn, or it isn't in spawn; continue // (If they have spawn protect bypass, we don't care if it's spawn or not) if (!TShock.Config.SpawnProtection || HasPermission(Permissions.editspawn) || !Utils.IsInSpawn(x, y)) { + failure = BuildPermissionFailPoint.Regions; // If they have build permission in this region, then they're allowed to continue if (TShock.Regions.CanBuild(x, y, this)) { @@ -367,12 +369,28 @@ namespace TShockAPI } } } - - // TODO: Implement warning system. - // If they lack build permission, they end up here. // If they have build permission but lack the ability to edit spawn and it's spawn, they end up here. // If they have build, it isn't spawn, or they can edit spawn, but they fail the region check, they end up here. + + // If they shouldn't be warned, exit early. + if (!shouldWarnPlayer) + return false; + + // If they should be warned, warn them. + switch (failure) + { + case BuildPermissionFailPoint.GeneralBuild: + SendErrorMessage("You lack permission to build on this server."); + break; + case BuildPermissionFailPoint.SpawnProtect: + SendErrorMessage("You lack permission to build in the spawn point."); + break; + case BuildPermissionFailPoint.Regions: + SendErrorMessage("You lack permission to build in this region."); + break; + } + return false; }