Added some tile hacking checks and moved explosive projectiles server-side.
This commit is contained in:
parent
edb7e6e5a2
commit
8ba1aa58ac
1 changed files with 118 additions and 66 deletions
|
|
@ -17,13 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Streams;
|
using System.IO.Streams;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using TShockAPI.DB;
|
using TShockAPI.DB;
|
||||||
using Terraria;
|
using Terraria;
|
||||||
using TShockAPI.Net;
|
using TShockAPI.Net;
|
||||||
|
|
||||||
|
|
@ -1220,13 +1220,13 @@ namespace TShockAPI
|
||||||
if (args.Player.IsLoggedIn)
|
if (args.Player.IsLoggedIn)
|
||||||
{
|
{
|
||||||
args.Player.PlayerData.StoreSlot(slot, type, prefix, stack);
|
args.Player.PlayerData.StoreSlot(slot, type, prefix, stack);
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
TShock.Config.ServerSideInventory && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck &&
|
TShock.Config.ServerSideInventory && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck &&
|
||||||
args.Player.HasSentInventory && !args.Player.Group.HasPermission(Permissions.bypassinventorychecks)
|
args.Player.HasSentInventory && !args.Player.Group.HasPermission(Permissions.bypassinventorychecks)
|
||||||
) {
|
) {
|
||||||
// The player might have moved an item to their trash can before they performed a single login attempt yet.
|
// The player might have moved an item to their trash can before they performed a single login attempt yet.
|
||||||
args.Player.IgnoreActionsForClearingTrashCan = true;
|
args.Player.IgnoreActionsForClearingTrashCan = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -1694,31 +1694,31 @@ namespace TShockAPI
|
||||||
bool includeUnprotected = false;
|
bool includeUnprotected = false;
|
||||||
bool includeZIndexes = false;
|
bool includeZIndexes = false;
|
||||||
bool persistentMode = false;
|
bool persistentMode = false;
|
||||||
foreach (string parameter in args.Player.AwaitingNameParameters)
|
foreach (string parameter in args.Player.AwaitingNameParameters)
|
||||||
{
|
{
|
||||||
if (parameter.Equals("-u", StringComparison.InvariantCultureIgnoreCase))
|
if (parameter.Equals("-u", StringComparison.InvariantCultureIgnoreCase))
|
||||||
includeUnprotected = true;
|
includeUnprotected = true;
|
||||||
if (parameter.Equals("-z", StringComparison.InvariantCultureIgnoreCase))
|
if (parameter.Equals("-z", StringComparison.InvariantCultureIgnoreCase))
|
||||||
includeZIndexes = true;
|
includeZIndexes = true;
|
||||||
if (parameter.Equals("-p", StringComparison.InvariantCultureIgnoreCase))
|
if (parameter.Equals("-p", StringComparison.InvariantCultureIgnoreCase))
|
||||||
persistentMode = true;
|
persistentMode = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<string> outputRegions = new List<string>();
|
List<string> outputRegions = new List<string>();
|
||||||
foreach (Region region in TShock.Regions.Regions.OrderBy(r => r.Z).Reverse())
|
foreach (Region region in TShock.Regions.Regions.OrderBy(r => r.Z).Reverse())
|
||||||
{
|
{
|
||||||
if (!includeUnprotected && !region.DisableBuild)
|
if (!includeUnprotected && !region.DisableBuild)
|
||||||
continue;
|
continue;
|
||||||
if (tileX < region.Area.Left || tileX > region.Area.Right)
|
if (tileX < region.Area.Left || tileX > region.Area.Right)
|
||||||
continue;
|
continue;
|
||||||
if (tileY < region.Area.Top || tileY > region.Area.Bottom)
|
if (tileY < region.Area.Top || tileY > region.Area.Bottom)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
string format = "{1}";
|
string format = "{1}";
|
||||||
if (includeZIndexes)
|
if (includeZIndexes)
|
||||||
format = "{1} (z:{0})";
|
format = "{1} (z:{0})";
|
||||||
|
|
||||||
outputRegions.Add(string.Format(format, region.Z, region.Name));
|
outputRegions.Add(string.Format(format, region.Z, region.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outputRegions.Count == 0)
|
if (outputRegions.Count == 0)
|
||||||
|
|
@ -1739,10 +1739,10 @@ namespace TShockAPI
|
||||||
args.Player.SendMessage(line, Color.White);
|
args.Player.SendMessage(line, Color.White);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!persistentMode)
|
if (!persistentMode)
|
||||||
{
|
{
|
||||||
args.Player.AwaitingName = false;
|
args.Player.AwaitingName = false;
|
||||||
args.Player.AwaitingNameParameters = null;
|
args.Player.AwaitingNameParameters = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
args.Player.SendTileSquare(tileX, tileY);
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
|
@ -1759,22 +1759,54 @@ namespace TShockAPI
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == 1 || type == 3)
|
byte[] rightClickKill = new byte[] { 4, 13, 33, 49, 50, 128};
|
||||||
|
Item selectedItem = args.TPlayer.inventory[args.TPlayer.selectedItem];
|
||||||
|
if (type == 0 && Main.tile[tileX, tileY].type != 127 && !Main.tileCut[Main.tile[tileX, tileY].type] && !rightClickKill.Contains(Main.tile[tileX, tileY].type))
|
||||||
{
|
{
|
||||||
if (tiletype >= ((type == 1) ? Main.maxTileSets : Main.maxWallTypes))
|
// If the tile is an axe tile and they aren't selecting an axe, they're hacking.
|
||||||
|
if (Main.tileAxe[Main.tile[tileX, tileY].type] && selectedItem.axe == 0)
|
||||||
{
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// If the tile is a hammer tile and they aren't selecting an hammer, they're hacking.
|
||||||
|
else if (Main.tileHammer[Main.tile[tileX, tileY].type] && selectedItem.hammer == 0)
|
||||||
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// If the tile is a pickaxe tile and they aren't selecting an pickaxe, they're hacking.
|
||||||
|
else if ((!Main.tileAxe[Main.tile[tileX, tileY].type] && !Main.tileHammer[Main.tile[tileX, tileY].type]) && selectedItem.pick == 0)
|
||||||
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type == 2)
|
||||||
|
{
|
||||||
|
// If they aren't selecting an hammer, they're hacking.
|
||||||
|
if (selectedItem.hammer == 0)
|
||||||
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type == 1 || type == 3)
|
||||||
|
{
|
||||||
|
// If they aren't selecting the item which creates the tile or wall, they're hacking.
|
||||||
|
if (tiletype != 127 && tiletype != (type == 1 ? selectedItem.createTile : selectedItem.createWall))
|
||||||
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (TShock.Itembans.ItemIsBanned(selectedItem.name, args.Player) || tiletype >= (type == 1 ? Main.maxTileSets : Main.maxWallTypes))
|
||||||
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (type == 1 && (tiletype == 29 || tiletype == 97) && TShock.Config.ServerSideInventory && TShock.Config.DisablePiggybanksOnSSI)
|
if (type == 1 && (tiletype == 29 || tiletype == 97) && TShock.Config.ServerSideInventory && TShock.Config.DisablePiggybanksOnSSI)
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("You cannot place this tile, server side inventory is enabled.", Color.Red);
|
args.Player.SendMessage("You cannot place this tile because 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("Spike", args.Player))
|
|
||||||
{
|
|
||||||
args.Player.Disable("Used banned spikes without permission.");
|
|
||||||
args.Player.SendTileSquare(tileX, tileY);
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1782,7 +1814,7 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
if (TShock.Utils.MaxChests())
|
if (TShock.Utils.MaxChests())
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("Reached the world's max chest limit, unable to place more.", Color.Red);
|
args.Player.SendMessage("The world's chest limit has been reached - unable to place more.", Color.Red);
|
||||||
args.Player.SendTileSquare(tileX, tileY);
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1793,10 +1825,21 @@ namespace TShockAPI
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tiletype == 141 && !args.Player.Group.HasPermission(Permissions.usebanneditem) &&
|
}
|
||||||
TShock.Itembans.ItemIsBanned("Explosives", args.Player))
|
else if (type == 5)
|
||||||
|
{
|
||||||
|
// If they aren't selecting the wrench, they're hacking.
|
||||||
|
if (args.TPlayer.inventory[args.TPlayer.selectedItem].type != 509)
|
||||||
|
{
|
||||||
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type == 6)
|
||||||
|
{
|
||||||
|
// If they aren't selecting the wire cutter, they're hacking.
|
||||||
|
if (args.TPlayer.inventory[args.TPlayer.selectedItem].type != 510)
|
||||||
{
|
{
|
||||||
args.Player.Disable("Used banned explosives tile without permission.");
|
|
||||||
args.Player.SendTileSquare(tileX, tileY);
|
args.Player.SendTileSquare(tileX, tileY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -2112,17 +2155,18 @@ namespace TShockAPI
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TShock.Config.IgnoreProjUpdate && TShock.CheckProjectilePermission(args.Player, index, type))
|
bool hasPermission = !TShock.CheckProjectilePermission(args.Player, index, type);
|
||||||
|
if (!TShock.Config.IgnoreProjUpdate && !hasPermission)
|
||||||
{
|
{
|
||||||
if (type == 100)
|
if (type == 100)
|
||||||
{ //fix for skele prime
|
{ //fix for skele prime
|
||||||
Log.Debug("Skeletron Prime's death laser ignored for cheat detection..");
|
Log.Debug("Skeletron Prime's death laser ignored for cheat detection..");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
args.Player.Disable("Does not have projectile permission to update projectile.");
|
args.Player.Disable("Does not have projectile permission to update projectile.");
|
||||||
args.Player.RemoveProjectile(ident, owner);
|
args.Player.RemoveProjectile(ident, owner);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2141,14 +2185,22 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection))
|
if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection))
|
||||||
{
|
{
|
||||||
if ((type ==90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel
|
if ((type == 90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel
|
||||||
{
|
{
|
||||||
Log.Debug("Ignoring shrapnel per config..");
|
Log.Debug("Ignoring shrapnel per config..");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
args.Player.ProjectileThreshold++;
|
args.Player.ProjectileThreshold++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// force all explosives server-side.
|
||||||
|
if (hasPermission && (type == 28 || type == 29 || type == 37))
|
||||||
|
{
|
||||||
|
args.Player.RemoveProjectile(ident, owner);
|
||||||
|
Projectile.NewProjectile(pos.X, pos.Y, vel.X, vel.Y, type, dmg, knockback);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue