Merge branch 'master' of github.com:TShock/TShock

This commit is contained in:
high 2011-06-23 16:55:54 -04:00
commit acb3458ef6
18 changed files with 832 additions and 245 deletions

View file

@ -102,6 +102,7 @@ namespace TShockAPI
ChatCommands.Add(new Command("banip", "ban", BanIP));
ChatCommands.Add(new Command("unban", "unban", UnBan));
ChatCommands.Add(new Command("unbanip", "unban", UnBanIP));
ChatCommands.Add(new Command("whitelist", "whitelist", Whitelist));
ChatCommands.Add(new Command("off", "maintenance", Off));
ChatCommands.Add(new Command("off-nosave", "maintenance", OffNoSave));
ChatCommands.Add(new Command("checkupdates", "maintenance", CheckUpdates));
@ -120,16 +121,21 @@ namespace TShockAPI
ChatCommands.Add(new Command("spawn", "tp", Spawn));
ChatCommands.Add(new Command("tp", "tp", TP));
ChatCommands.Add(new Command("tphere", "tp", TPHere));
ChatCommands.Add(new Command("warp", "warp", UseWarp));
ChatCommands.Add(new Command("setwarp", "managewarp", SetWarp));
ChatCommands.Add(new Command("delwarp", "managewarp", DeleteWarp));
ChatCommands.Add(new Command("reload", "cfg", Reload));
ChatCommands.Add(new Command("debug-config", "cfg", DebugConfiguration));
ChatCommands.Add(new Command("password", "cfg", Password));
ChatCommands.Add(new Command("save", "cfg", Save));
ChatCommands.Add(new Command("maxspawns", "cfg", MaxSpawns));
ChatCommands.Add(new Command("spawnrate", "cfg", SpawnRate));
ChatCommands.Add(new Command("time", "cfg", Time));
ChatCommands.Add(new Command("setspawn", "cfg", SetSpawn));
ChatCommands.Add(new Command("time", "time", Time));
ChatCommands.Add(new Command("slap", "pvpfun", Slap));
ChatCommands.Add(new Command("antibuild", "editspawn", ToggleAntiBuild));
ChatCommands.Add(new Command("protectspawn", "editspawn", ProtectSpawn));
ChatCommands.Add(new Command("region", "editspawn", Region));
ChatCommands.Add(new Command("help", "", Help));
ChatCommands.Add(new Command("playing", "", Playing));
ChatCommands.Add(new Command("online", "", Playing));
@ -138,15 +144,10 @@ namespace TShockAPI
ChatCommands.Add(new Command("me", "", ThirdPerson));
ChatCommands.Add(new Command("p", "", PartyChat));
ChatCommands.Add(new Command("rules", "", Rules));
ChatCommands.Add(new Command("whitelist", "maintenance", Whitelist));
ChatCommands.Add(new Command("region", "editspawn", Region));
ChatCommands.Add(new Command("warp", "", UseWarp));
ChatCommands.Add(new Command("setwarp", "cfg", SetWarp));
ChatCommands.Add(new Command("delwarp", "cfg", DeleteWarp));
if (ConfigurationManager.DistributationAgent != "terraria-online")
{
ChatCommands.Add(new Command("kill", "kill", Kill));
ChatCommands.Add(new Command("butcher", "cheat", Butcher));
ChatCommands.Add(new Command("butcher", "butcher", Butcher));
ChatCommands.Add(new Command("i", "cheat", Item));
ChatCommands.Add(new Command("item", "cheat", Item));
ChatCommands.Add(new Command("give", "cheat", Give));
@ -417,6 +418,17 @@ namespace TShockAPI
}
}
public static void Whitelist(CommandArgs args)
{
if (args.Parameters.Count == 1)
{
TextWriter tw = new StreamWriter(FileTools.WhitelistPath, true);
tw.WriteLine(args.Parameters[0]);
tw.Close();
args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist.");
}
}
#endregion Player Management Commands
#region Server Maintenence Commands
@ -660,7 +672,7 @@ namespace TShockAPI
{
if (!args.Player.RealPlayer)
{
args.Player.SendMessage("You cant use teleport commands!");
args.Player.SendMessage("You cannot use teleport commands!");
return;
}
@ -672,21 +684,21 @@ namespace TShockAPI
{
if (!args.Player.RealPlayer)
{
args.Player.SendMessage("You cant use teleport commands!");
args.Player.SendMessage("You cannot use teleport commands!");
return;
}
if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY))
args.Player.SendMessage("Teleported to the map's spawnpoint.");
else
args.Player.SendMessage("Teleport unavailable custom spawnpoint set (to unset die after bed is destroyed).", Color.Red);
args.Player.SendMessage("Teleport unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red);
}
private static void TP(CommandArgs args)
{
if (!args.Player.RealPlayer)
{
args.Player.SendMessage("You cant use teleport commands!");
args.Player.SendMessage("You cannot use teleport commands!");
return;
}
@ -708,7 +720,7 @@ namespace TShockAPI
if (args.Player.Teleport(plr.TileX, plr.TileY))
args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name));
else
args.Player.SendMessage("Teleport unavailable custom spawnpoint set (to unset die after bed is destroyed).", Color.Red);
args.Player.SendMessage("Teleport unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red);
}
}
@ -716,7 +728,7 @@ namespace TShockAPI
{
if (!args.Player.RealPlayer)
{
args.Player.SendMessage("You cant use teleport commands!");
args.Player.SendMessage("You cannot use teleport commands!");
return;
}
@ -745,7 +757,7 @@ namespace TShockAPI
args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name));
}
else
args.Player.SendMessage("Teleport unavailable target player has custom spawnpoint set.", Color.Red);
args.Player.SendMessage("Teleport unavailable - Target player has spawn point set to Bed.", Color.Red);
}
}
@ -753,15 +765,22 @@ namespace TShockAPI
private static void SetWarp(CommandArgs args)
{
if (args.Parameters.Count > 0)
if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, args.Parameters[0]))
{
string warpName = String.Join(" ", args.Parameters);
if (warpName.Equals("list"))
{
args.Player.SendMessage("Set warp " + args.Parameters[0], Color.Yellow);
args.Player.SendMessage("Name reserved, use a different name", Color.Red);
}
else if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName))
{
args.Player.SendMessage("Set warp " + warpName, Color.Yellow);
WarpsManager.WriteSettings();
}
else
{
args.Player.SendMessage("Warp " + args.Parameters[0] + " already exists", Color.Red);
args.Player.SendMessage("Warp " + warpName + " already exists", Color.Red);
}
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /setwarp [name]", Color.Red);
}
@ -770,43 +789,85 @@ namespace TShockAPI
{
if (args.Parameters.Count > 0)
{
if (WarpsManager.DeleteWarp(args.Parameters[0]))
args.Player.SendMessage("Deleted warp " + args.Parameters[0], Color.Yellow);
string warpName = String.Join(" ", args.Parameters);
if (WarpsManager.DeleteWarp(warpName))
args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow);
else
args.Player.SendMessage("Could not find specified warp", Color.Red);
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /delwarp [name]", Color.Red);
}
private static void UseWarp(CommandArgs args)
{
if (args.Parameters.Count > 0)
{
if (WarpsManager.FindWarp(args.Parameters[0]) != Vector2.Zero)
if (args.Parameters[0].Equals("list"))
{
args.Player.Teleport((int)WarpsManager.FindWarp(args.Parameters[0]).X, (int)WarpsManager.FindWarp(args.Parameters[0]).Y);
args.Player.SendMessage("Warped to " + args.Parameters[0], Color.Yellow);
args.Player.SendMessage("Current Warps:", Color.Green);
int page = 1;
if (args.Parameters.Count > 1)
int.TryParse(args.Parameters[1], out page);
var sb = new StringBuilder();
if (WarpsManager.Warps.Count > (15 * (page - 1)))
{
for (int j = (15 * (page - 1)); j < (15 * page); j++)
{
if (sb.Length != 0)
sb.Append(", ");
sb.Append("/").Append(WarpsManager.Warps[j].WarpName);
if (j == WarpsManager.Warps.Count - 1)
{
args.Player.SendMessage(sb.ToString(), Color.Yellow);
break;
}
if ((j + 1) % 5 == 0)
{
args.Player.SendMessage(sb.ToString(), Color.Yellow);
sb.Clear();
}
}
}
if (WarpsManager.Warps.Count > (15 * page))
{
args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow);
}
}
else
{
args.Player.SendMessage("Specified warp not found", Color.Yellow);
string warpName = String.Join(" ", args.Parameters);
var warp = WarpsManager.FindWarp(warpName);
if (warp != Vector2.Zero)
{
if (args.Player.Teleport((int)warp.X, (int)warp.Y))
args.Player.SendMessage("Warped to " + warpName, Color.Yellow);
else
args.Player.SendMessage("Warp unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red);
}
else
{
args.Player.SendMessage("Specified warp not found", Color.Red);
}
}
}
else
{
args.Player.SendMessage("Current Warps:", Color.Green);
//Someone needs to make it list
for (int i = 0; i < (WarpsManager.Warps.Count); i++)
{
args.Player.SendMessage(WarpsManager.Warps[i].WarpName, Color.Yellow);
}
}
args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or warp list", Color.Red);
}
#endregion Teleport Commands
#region Server Config Commands
private static void SetSpawn(CommandArgs args)
{
Main.spawnTileX = args.Player.TileX;
Main.spawnTileY = args.Player.TileY;
ConfigurationManager.WriteJsonConfiguration();
args.Player.SendMessage("Set server spawn point to your position");
}
private static void DebugConfiguration(CommandArgs args)
{
args.Player.SendMessage("TShock Config:");
@ -884,6 +945,10 @@ namespace TShockAPI
Tools.Broadcast(string.Format("{0} changed the spawn rate to: {1}", args.Player.Name, amount));
}
#endregion Server Config Commands
#region Time/PvpFun Commands
private static void Time(CommandArgs args)
{
if (args.Parameters.Count != 1)
@ -920,7 +985,44 @@ namespace TShockAPI
}
}
#endregion Server Config Commands
private static void Slap(CommandArgs args)
{
if (args.Parameters.Count < 1 || args.Parameters.Count > 2)
{
args.Player.SendMessage("Invalid syntax! Proper syntax: /slap <player> [dmg]", Color.Red);
return;
}
if (args.Parameters[0].Length == 0)
{
args.Player.SendMessage("Missing player name", Color.Red);
return;
}
string plStr = args.Parameters[0];
var players = Tools.FindPlayer(plStr);
if (players.Count == 0)
{
args.Player.SendMessage("Invalid player!", Color.Red);
}
else if (players.Count > 1)
{
args.Player.SendMessage("More than one player matched!", Color.Red);
}
else
{
var plr = players[0];
int damage = 5;
if (args.Parameters.Count == 2)
{
int.TryParse(args.Parameters[1], out damage);
}
plr.DamagePlayer(damage);
Tools.Broadcast(string.Format("{0} slapped {1} for {2} damage.",
args.Player.Name, plr.Name, damage));
}
}
#endregion Time/PvpFun Commands
#region World Protection Commands
@ -938,122 +1040,170 @@ namespace TShockAPI
private static void Region(CommandArgs args)
{
string cmd = "help";
if (args.Parameters.Count > 0)
{
switch (args.Parameters[0].ToLower())
{
case "set":
cmd = args.Parameters[0].ToLower();
}
switch (cmd)
{
case "set":
{
if (args.Parameters.Count == 2)
{
if (args.Parameters.Count > 1)
if (args.Parameters[1] == "1")
{
if (args.Parameters[1] == "1")
args.Player.TempArea.X = args.Player.TileX;
args.Player.TempArea.Y = args.Player.TileY;
args.Player.SendMessage("Set Temp Point 1", Color.Yellow);
}
else if (args.Parameters[1] == "2")
{
if (args.Player.TempArea.X != 0)
{
args.Player.TempArea.X = args.Player.TileX;
args.Player.TempArea.Y = args.Player.TileY;
args.Player.SendMessage("Set Temp Point 1", Color.Yellow);
}
else if (args.Parameters[1] == "2")
{
if (args.Player.TempArea.X != 0)
if (args.Player.TileX > args.Player.TempArea.X && args.Player.TileY > args.Player.TempArea.Y)
{
if (args.Player.TileX > args.Player.TempArea.X && args.Player.TileY > args.Player.TempArea.Y)
{
args.Player.TempArea.Width = args.Player.TileX - args.Player.TempArea.X;
args.Player.TempArea.Height = (args.Player.TileY + 3) - args.Player.TempArea.Y;
args.Player.SendMessage("Set Temp Point 2", Color.Yellow);
}
else
{
args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow);
args.Player.SendMessage("Use /region clear to start again", Color.Yellow);
}
args.Player.TempArea.Width = args.Player.TileX - args.Player.TempArea.X;
args.Player.TempArea.Height = (args.Player.TileY + 3) - args.Player.TempArea.Y;
args.Player.SendMessage("Set Temp Point 2", Color.Yellow);
}
else
{
args.Player.SendMessage("You have not set Point 1 yet", Color.Red);
args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow);
args.Player.SendMessage("Use /region clear to start again", Color.Yellow);
}
}
else
{
args.Player.SendMessage("You have not set Point 1 yet", Color.Red);
}
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red);
break;
}
case "define":
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red);
break;
}
case "define":
{
if (args.Parameters.Count > 1)
{
if (args.Parameters.Count > 1)
if (!args.Player.TempArea.IsEmpty)
{
if (!args.Player.TempArea.IsEmpty)
string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1));
if (RegionManager.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y,
args.Player.TempArea.Width, args.Player.TempArea.Height,
regionName, Main.worldName))
{
if (RegionManager.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, args.Player.TempArea.Width, args.Player.TempArea.Height, args.Parameters[1], true))
{
RegionManager.WriteSettings();
args.Player.TempArea = Rectangle.Empty;
args.Player.SendMessage("Set region " + args.Parameters[1], Color.Yellow);
}
else
{
args.Player.SendMessage("Region " + args.Parameters[1] + " already exists", Color.Red);
}
args.Player.TempArea = Rectangle.Empty;
args.Player.SendMessage("Set region " + regionName, Color.Yellow);
}
else
args.Player.SendMessage("Points not set up yet", Color.Red);
{
args.Player.SendMessage("Region " + regionName + " already exists", Color.Red);
}
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red);
break;
args.Player.SendMessage("Points not set up yet", Color.Red);
}
case "protect":
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red);
break;
}
case "protect":
{
if (args.Parameters.Count == 3)
{
if (args.Parameters.Count > 2)
string regionName = args.Parameters[1];
if (args.Parameters[2].ToLower() == "true")
{
if (args.Parameters[2].ToLower() == "true")
{
if(RegionManager.SetRegionState(args.Parameters[1],true))
args.Player.SendMessage("Protected region " + args.Parameters[1], Color.Yellow);
else
args.Player.SendMessage("Could not find specified region", Color.Red);
}
else if (args.Parameters[2].ToLower() == "false")
{
if (RegionManager.SetRegionState(args.Parameters[1], false))
args.Player.SendMessage("Unprotected region " + args.Parameters[1], Color.Yellow);
else
args.Player.SendMessage("Could not find specified region", Color.Red);
}
if (RegionManager.SetRegionState(regionName, true))
args.Player.SendMessage("Protected region " + regionName, Color.Yellow);
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red);
args.Player.SendMessage("Could not find specified region", Color.Red);
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red);
break;
}
case "delete":
{
if (args.Parameters.Count > 1)
else if (args.Parameters[2].ToLower() == "false")
{
if (RegionManager.DeleteRegion(args.Parameters[1]))
args.Player.SendMessage("Deleted region " + args.Parameters[1], Color.Yellow);
if (RegionManager.SetRegionState(regionName, false))
args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow);
else
args.Player.SendMessage("Could not find specified region", Color.Red);
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red);
break;
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red);
}
case "clear":
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red);
break;
}
case "delete":
{
if (args.Parameters.Count > 1)
{
args.Player.TempArea = Rectangle.Empty;
args.Player.SendMessage("Cleared temp area", Color.Yellow);
break;
string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1));
if (RegionManager.DeleteRegion(regionName))
args.Player.SendMessage("Deleted region " + regionName, Color.Yellow);
else
args.Player.SendMessage("Could not find specified region", Color.Red);
}
case "help":
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red);
break;
}
case "clear":
{
args.Player.TempArea = Rectangle.Empty;
args.Player.SendMessage("Cleared temp area", Color.Yellow);
break;
}
case "allow":
{
if (args.Parameters.Count > 2)
{
args.Player.SendMessage("Avialable region commands:", Color.Green);
args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", Color.Yellow);
args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow);
break;
string playerName = args.Parameters[1];
string regionName = "";
string playerIP = null;
for (int i = 2; i < args.Parameters.Count; i++)
{
if (regionName == "")
{
regionName = args.Parameters[2];
}
else
{
regionName = regionName + " " + args.Parameters[i];
}
}
if ((playerIP = Tools.GetPlayerIP(playerName)) != null)
{
if (RegionManager.AddNewUser(regionName, playerIP))
{
args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow);
RegionManager.WriteSettings();
}
else
args.Player.SendMessage("Region " + regionName + " not found", Color.Red);
}
else
{
args.Player.SendMessage("Player " + playerName + " not found", Color.Red);
}
}
}
else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red);
break;
}
case "help":
default:
{
args.Player.SendMessage("Avialable region commands:", Color.Green);
args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", Color.Yellow);
args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow);
args.Player.SendMessage("/region allow [name] [regionname]", Color.Yellow);
break;
}
}
}
@ -1062,17 +1212,6 @@ namespace TShockAPI
#region General Commands
public static void Whitelist(CommandArgs args)
{
if (args.Parameters.Count == 1)
{
TextWriter tw = new StreamWriter(FileTools.WhitelistPath, true);
tw.WriteLine(args.Parameters[0]);
tw.Close();
args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist.");
}
}
private static void Help(CommandArgs args)
{
args.Player.SendMessage("TShock Commands:");
@ -1177,43 +1316,6 @@ namespace TShockAPI
#region Cheat Commands
private static void Slap(CommandArgs args)
{
if (args.Parameters.Count < 1 || args.Parameters.Count > 2)
{
args.Player.SendMessage("Invalid syntax! Proper syntax: /slap <player> [dmg]", Color.Red);
return;
}
if (args.Parameters[0].Length == 0)
{
args.Player.SendMessage("Missing player name", Color.Red);
return;
}
string plStr = args.Parameters[0];
var players = Tools.FindPlayer(plStr);
if (players.Count == 0)
{
args.Player.SendMessage("Invalid player!", Color.Red);
}
else if (players.Count > 1)
{
args.Player.SendMessage("More than one player matched!", Color.Red);
}
else
{
var plr = players[0];
int damage = 5;
if (args.Parameters.Count == 2)
{
int.TryParse(args.Parameters[1], out damage);
}
plr.DamagePlayer(damage);
Tools.Broadcast(string.Format("{0} slapped {1} for {2} damage.",
args.Player.Name, plr.Name, damage));
}
}
private static void Kill(CommandArgs args)
{
if (args.Parameters.Count < 1)
@ -1328,6 +1430,7 @@ namespace TShockAPI
}
var items = Tools.GetItemByIdOrName(args.Parameters[0]);
if (items.Count == 0)
{
args.Player.SendMessage("Invalid item type!", Color.Red);
@ -1424,4 +1527,4 @@ namespace TShockAPI
#endregion Cheat Comamnds
}
}
}

View file

@ -30,10 +30,11 @@ namespace TShockAPI
public bool BanCheaters = true;
public bool KickGriefers = true;
public bool BanGriefers = true;
public bool BanKillTileAbusers;
public bool KickKillTileAbusers;
public bool BanKillTileAbusers = true;
public bool KickKillTileAbusers = true;
public bool BanExplosives = true;
public bool KickExplosives = true;
public bool DisableExplosives = true;
public bool SpawnProtection = true;
public int SpawnProtectionRadius = 5;
public string DistributationAgent = "facepunch";
@ -41,6 +42,7 @@ namespace TShockAPI
public bool RangeChecks = true;
public bool SpamChecks = false;
public bool DisableBuild = false;
public int TileThreshold = 20;
public float[] AdminChatRGB = {255, 0, 0};
public string AdminChatPrefix = "(Admin) ";
@ -51,5 +53,10 @@ namespace TShockAPI
public int BackupKeepFor = 60;
public bool ListServer = false;
public int spawnTileX;
public int spawnTileY;
public bool RememberLeavePos = false;
}
}

View file

@ -44,6 +44,7 @@ namespace TShockAPI
public static bool KickTnt = true;
public static bool BanBoom = true;
public static bool KickBoom = true;
public static bool DisableBoom = true;
public static bool SpawnProtect = true;
public static bool RangeChecks = true;
public static int SpawnProtectRadius = 5;
@ -54,6 +55,8 @@ namespace TShockAPI
public static bool DisableBuild = false;
public static float[] AdminChatRGB = {255, 0, 0};
public static string AdminChatPrefix = "(Admin) ";
public static bool RememberLeavePos = false;
public static int TileThreshold = 20;
/// <summary>
/// Don't allow pvp changing for x seconds.
@ -95,6 +98,7 @@ namespace TShockAPI
KickTnt = cfg.KickKillTileAbusers;
BanBoom = cfg.BanExplosives;
KickBoom = cfg.KickExplosives;
DisableBoom = cfg.DisableExplosives;
SpawnProtect = cfg.SpawnProtection;
SpawnProtectRadius = cfg.SpawnProtectionRadius;
DistributationAgent = cfg.DistributationAgent;
@ -102,6 +106,7 @@ namespace TShockAPI
RangeChecks = cfg.RangeChecks;
SpamChecks = cfg.SpamChecks;
DisableBuild = cfg.DisableBuild;
TileThreshold = cfg.TileThreshold;
NPC.maxSpawns = DefaultMaxSpawns;
NPC.defaultSpawnRate = DefaultSpawnRate;
AdminChatRGB = cfg.AdminChatRGB;
@ -110,6 +115,9 @@ namespace TShockAPI
BackupInterval = cfg.BackupInterval;
BackupKeepFor = cfg.BackupKeepFor;
ListServer = cfg.ListServer;
Main.spawnTileX = cfg.spawnTileX;
Main.spawnTileY = cfg.spawnTileY;
RememberLeavePos = cfg.RememberLeavePos;
}
public static void WriteJsonConfiguration()
@ -126,22 +134,28 @@ namespace TShockAPI
cfg.BanCheaters = BanCheater;
cfg.KickGriefers = KickGriefer;
cfg.BanGriefers = BanGriefer;
cfg.BanKillTileAbusers = BanGriefer;
cfg.KickKillTileAbusers = KickGriefer;
cfg.BanKillTileAbusers = BanTnt;
cfg.KickKillTileAbusers = KickTnt;
cfg.BanExplosives = BanBoom;
cfg.KickExplosives = KickBoom;
cfg.DisableExplosives = DisableBoom;
cfg.SpawnProtection = SpawnProtect;
cfg.SpawnProtectionRadius = SpawnProtectRadius;
cfg.MaxSlots = MaxSlots;
cfg.RangeChecks = RangeChecks;
cfg.SpamChecks = SpamChecks;
cfg.DisableBuild = DisableBuild;
cfg.TileThreshold = TileThreshold;
cfg.AdminChatRGB = AdminChatRGB;
cfg.AdminChatPrefix = AdminChatPrefix;
cfg.PvpThrottle = PvpThrottle;
cfg.BackupInterval = BackupInterval;
cfg.BackupKeepFor = BackupKeepFor;
cfg.ListServer = ListServer;
cfg.spawnTileX = Main.spawnTileX;
cfg.spawnTileY = Main.spawnTileY;
cfg.RememberLeavePos = RememberLeavePos;
string json = JsonConvert.SerializeObject(cfg, Formatting.Indented);
TextWriter tr = new StreamWriter(FileTools.ConfigPath);
tr.Write(json);

View file

@ -29,6 +29,8 @@ namespace TShockAPI
public static readonly string WhitelistPath = Path.Combine(TShock.SavePath, "whitelist.txt");
public static readonly string GroupsPath = Path.Combine(TShock.SavePath, "groups.txt");
public static readonly string UsersPath = Path.Combine(TShock.SavePath, "users.txt");
public static readonly string ItemBansPath = Path.Combine(TShock.SavePath, "itembans.txt");
public static readonly string RememberedPosPath = Path.Combine(TShock.SavePath, "oldpos.xml");
public static readonly string ConfigPath = Path.Combine(TShock.SavePath, "config.json");
public static void CreateFile(string file)
@ -60,6 +62,7 @@ namespace TShockAPI
CreateIfNot(WhitelistPath);
CreateIfNot(GroupsPath, Resources.groups);
CreateIfNot(UsersPath, Resources.users);
CreateIfNot(ItemBansPath, Resources.itembans);
try
{
@ -100,7 +103,23 @@ namespace TShockAPI
TextReader tr = new StreamReader(WhitelistPath);
string whitelist = tr.ReadToEnd();
ip = Tools.GetRealIP(ip);
return whitelist.Contains(ip);
bool contains = whitelist.Contains(ip);
if (!contains)
{
var char2 = Environment.NewLine.ToCharArray();
var array = whitelist.Split(Environment.NewLine.ToCharArray());
foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray()))
{
if (string.IsNullOrWhiteSpace(line))
continue;
contains = Tools.GetIPv4Address(line).Equals(ip);
if (contains)
return true;
}
return false;
}
else
return true;
}
}
}

View file

@ -216,7 +216,7 @@ namespace TShockAPI
return true;
}
}
if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y))
if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y, Tools.GetPlayerIP(args.Player.Name)))
{
args.Player.SendMessage("Region protected from changes.", Color.Red);
args.Player.SendTileSquare(x, y);
@ -251,6 +251,13 @@ namespace TShockAPI
if (!args.Player.TilesDestroyed.ContainsKey(coords))
args.Player.TilesDestroyed.Add(coords, Main.tile[x, y]);
}
if (args.Player.LastExplosive != null)
if ((DateTime.UtcNow - args.Player.LastExplosive).TotalMilliseconds < 1000)
{
args.Player.SendMessage("Please wait another " + (1000 - (DateTime.UtcNow - args.Player.LastExplosive).TotalMilliseconds).ToString() + " milliseconds before placing/destroying tiles", Color.Red);
args.Player.SendTileSquare(x, y);
return true;
}
return false;
}
@ -318,7 +325,16 @@ namespace TShockAPI
if (type == 29 || type == 28 || type == 37)
{
Log.Debug(string.Format("Explosive(PlyXY:{0}_{1}, Type:{2})", args.Player.TileX, args.Player.TileY, type));
return Tools.HandleExplosivesUser(args.Player, "Throwing an explosive device.");
if (ConfigurationManager.DisableBoom && (!args.Player.Group.HasPermission("useexplosives") || !args.Player.Group.HasPermission("ignoregriefdetection")))
{
Main.projectile[ident].type = 0;
NetMessage.SendData((int)PacketTypes.ProjectileNew, args.Player.Index, -1, "", ident);
args.Player.SendMessage("Explosives are disabled!", Color.Red);
args.Player.LastExplosive = DateTime.UtcNow;
//return true;
}
else
return Tools.HandleExplosivesUser(args.Player, "Throwing an explosive device.");
}
return false;
}

76
TShockAPI/ItemManager.cs Normal file
View file

@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Terraria;
namespace TShockAPI
{
class ItemManager
{
public static List<ItemBan> BannedItems = new List<ItemBan>();
public static void LoadBans()
{
try
{
if (!File.Exists(FileTools.ItemBansPath))
return;
BannedItems.Clear();
foreach (var line in File.ReadAllLines(FileTools.ItemBansPath))
{
int ID = -1;
if (Int32.TryParse(line, out ID))
{
if (ID <= Main.item.Length)
{
var item = Tools.GetItemById(ID);
BannedItems.Add(new ItemBan(ID, item.name));
Log.Info("Item: " + item.name + " is banned");
}
else
{
Log.Warn("Invalid ID " + ID);
}
}
}
}
catch (Exception e)
{
Log.Error(e.ToString());
}
}
public static bool ItemIsBanned(string ID)
{
foreach (ItemBan item in BannedItems)
{
if (ID == item.Name)
return true;
}
return false;
}
}
public class ItemBan
{
public int ID { get; set; }
public string Name { get; set; }
public ItemBan(int id, string name)
{
ID = id;
Name = name;
}
public ItemBan()
{
ID = -1;
Name = string.Empty;
}
}
}

View file

@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.2.0.0620")]
[assembly: AssemblyFileVersion("2.2.0.0620")]
[assembly: AssemblyVersion("2.2.0.0623")]
[assembly: AssemblyFileVersion("2.2.0.0623")]

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using System.Xml;
using Microsoft.Xna.Framework;
using Terraria;
namespace TShockAPI
{
@ -11,24 +12,38 @@ namespace TShockAPI
{
public static List<Region> Regions = new List<Region>();
public static bool AddRegion(int tx, int ty, int width, int height, string name, bool state)
public static bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldname)
{
foreach (Region nametest in Regions)
{
if (name.ToLower() == nametest.RegionName.ToLower())
if (regionname.ToLower() == nametest.RegionName.ToLower())
{
return false;
}
}
Regions.Add(new Region(new Rectangle(tx, ty, width, height), name, true));
Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, true, worldname));
WriteSettings();
return true;
}
public static bool AddNewUser(string regionName, string IP)
{
foreach (Region nametest in Regions)
{
if (regionName.ToLower() == nametest.RegionName.ToLower())
{
nametest.RegionAllowedIPs.Add(IP.ToLower());
return true;
}
}
return false;
}
public static bool DeleteRegion(string name)
{
foreach (Region nametest in Regions)
{
if (name.ToLower() == nametest.RegionName.ToLower())
if (name.ToLower() == nametest.RegionName.ToLower() && nametest.WorldRegionName == Main.worldName)
{
Regions.Remove(nametest);
WriteSettings();
@ -52,18 +67,45 @@ namespace TShockAPI
return false;
}
public static bool InProtectedArea(int X, int Y)
public static bool InProtectedArea(int X, int Y, string IP)
{
foreach(Region region in Regions)
{
if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && region.DisableBuild)
if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && region.DisableBuild && Main.worldName == region.WorldRegionName && (!AllowedUser(region.RegionName, IP.ToLower()) || region.RegionAllowedIPs.Count == 0))
{
Console.WriteLine(region.RegionName);
return true;
}
}
return false;
}
public static int GetRegionIndex(string regionName)
{
for(int i = 0; i< Regions.Count;i++)
{
if(Regions[i].RegionName == regionName)
return i;
}
return -1;
}
public static bool AllowedUser(string regionName, string playerIP)
{
int ID = -1;
if ((ID = GetRegionIndex(regionName)) != -1)
{
for (int i = 0; i < Regions[ID].RegionAllowedIPs.Count; i++)
{
if (Regions[ID].RegionAllowedIPs[i].ToLower() == playerIP.ToLower())
{
return true;
}
}
}
return false;
}
public static void WriteSettings()
{
try
@ -86,6 +128,12 @@ namespace TShockAPI
settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString());
settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString());
settingsw.WriteElementString("Protected", region.DisableBuild.ToString());
settingsw.WriteElementString("WorldName", region.WorldRegionName);
settingsw.WriteElementString("AllowedUserCount", region.RegionAllowedIPs.Count.ToString());
for (int i = 0; i < region.RegionAllowedIPs.Count; i++)
{
settingsw.WriteElementString("IP", region.RegionAllowedIPs[i]);
}
settingsw.WriteEndElement();
}
@ -96,7 +144,7 @@ namespace TShockAPI
}
catch
{
Log.Info("Could not write Regions");
Log.Warn("Could not write Regions");
}
}
@ -123,15 +171,21 @@ namespace TShockAPI
{
if (settingr.Read())
{
string name;
string name = null;
int x = 0;
int y = 0;
int width = 0;
int height = 0;
bool state = true;
string worldname = null;
int playercount = 0;
settingr.Read();
name = settingr.Value;
if (settingr.Value != "" || settingr.Value != null)
name = settingr.Value;
else
Log.Warn("Region name is empty");
settingr.Read();
settingr.Read();
@ -139,7 +193,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out x);
else
Console.WriteLine("Could not parse x");
Log.Warn("x for region " + name + " is empty");
settingr.Read();
settingr.Read();
@ -147,7 +201,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out y);
else
Console.WriteLine("Could not parse y");
Log.Warn("y for region " + name + " is empty");
settingr.Read();
settingr.Read();
@ -155,7 +209,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out width);
else
Console.WriteLine("Could not parse width");
Log.Warn("Width for region " + name + " is empty");
settingr.Read();
settingr.Read();
@ -163,7 +217,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out height);
else
Console.WriteLine("Could not parse height");
Log.Warn("Height for region " + name + " is empty");
settingr.Read();
settingr.Read();
@ -171,9 +225,44 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
bool.TryParse(settingr.Value, out state);
else
Console.WriteLine("Could not parse state");
Log.Warn("State for region " + name + " is empty");
AddRegion(x, y, width, height, name, state);
settingr.Read();
settingr.Read();
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
worldname = settingr.Value;
else
Log.Warn("Worldname for region " + name + " is empty");
Console.WriteLine(settingr.Value);
settingr.Read();
settingr.Read();
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out playercount);
else
Log.Warn("Playercount for region " + name + " is empty");
AddRegion(x, y, width, height, name, worldname);
if (playercount > 0)
{
for (int i = 0; i < playercount; i++)
{
settingr.Read();
settingr.Read();
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
{
int ID = RegionManager.GetRegionIndex(name);
Regions[ID].RegionAllowedIPs.Add(settingr.Value);
}
else
Log.Warn("PlayerIP " + i + " for region " + name + " is empty");
}
}
}
break;
}
@ -185,7 +274,7 @@ namespace TShockAPI
}
catch
{
Log.Info("Could not read Regions");
Log.Warn("Could not read Regions");
WriteSettings();
}
}
@ -196,12 +285,15 @@ namespace TShockAPI
public Rectangle RegionArea { get; set; }
public string RegionName { get; set; }
public bool DisableBuild { get; set; }
public string WorldRegionName { get; set; }
public List<string> RegionAllowedIPs = new List<string>();
public Region(Rectangle region, string name, bool disablebuild)
public Region(Rectangle region, string name, bool disablebuild, string worldname)
{
RegionArea = region;
RegionName = name;
DisableBuild = disablebuild;
WorldRegionName = worldname;
}
public Region()
@ -209,6 +301,7 @@ namespace TShockAPI
RegionArea = Rectangle.Empty;
RegionName = string.Empty;
DisableBuild = true;
WorldRegionName = string.Empty;
}
}
}

View file

@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Terraria;
using Microsoft.Xna.Framework;
using System.Xml;
namespace TShockAPI
{
class RemeberedPosManager
{
public static List<RemeberedPos> RemeberedPosistions = new List<RemeberedPos>();
public static void LoadPos()
{
try
{
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.IgnoreWhitespace = true;
using (XmlReader settingr = XmlReader.Create(FileTools.RememberedPosPath, xmlReaderSettings))
{
while (settingr.Read())
{
if (settingr.IsStartElement())
{
switch (settingr.Name)
{
case "Positions":
{
break;
}
case "Player":
{
if (settingr.Read())
{
string IP = null;
float X = 0;
float Y = 0;
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
IP = settingr.Value;
else
Log.Warn("IP is empty");
settingr.Read();
settingr.Read();
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
float.TryParse(settingr.Value, out X);
else
Log.Warn("X for IP " + IP + " is empty");
settingr.Read();
settingr.Read();
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
float.TryParse(settingr.Value, out Y);
else
Log.Warn("Y for IP " + IP + " is empty");
if (X != 0 && Y != 0)
RemeberedPosistions.Add(new RemeberedPos(IP, new Vector2(X, Y)));
}
break;
}
}
}
}
}
Log.Info("Read Remembered Positions");
}
catch
{
Log.Warn("Could not read Remembered Positions");
WriteSettings();
}
}
public static void WriteSettings()
{
try
{
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.NewLineChars = Environment.NewLine;
using (XmlWriter settingsw = XmlWriter.Create(FileTools.RememberedPosPath, xmlWriterSettings))
{
settingsw.WriteStartDocument();
settingsw.WriteStartElement("Positions");
foreach (RemeberedPos player in RemeberedPosistions)
{
settingsw.WriteStartElement("Player");
settingsw.WriteElementString("IP", player.IP);
settingsw.WriteElementString("X", player.Pos.X.ToString());
settingsw.WriteElementString("Y", player.Pos.Y.ToString());
settingsw.WriteEndElement();
}
settingsw.WriteEndElement();
settingsw.WriteEndDocument();
}
Log.Info("Wrote Remembered Positions");
}
catch
{
Log.Warn("Could not write Remembered Positions");
}
}
}
public class RemeberedPos
{
public string IP { get; set; }
public Vector2 Pos { get; set; }
public RemeberedPos(string ip, Vector2 pos)
{
IP = ip;
Pos = pos;
}
public RemeberedPos()
{
IP = string.Empty;
Pos = Vector2.Zero;
}
}
}

View file

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.225
// Runtime Version:4.0.30319.1
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -71,9 +71,9 @@ namespace TShockAPI {
///#ALWAYS DECLARE A GROUP&apos;S PARENT BEFORE YOU DECLARE THE GROUP
///
///#currently avaliable permissions:
///#kick ban ignorecheatdetection
///#maintenance cfg causeevents spawnboss tp
///#spawnmob che [rest of string was truncated]&quot;;.
///#reservedslot - reserved slot for player
///#canwater - allow players to use water
///#canlav [rest of string was truncated]&quot;;.
/// </summary>
internal static string groups {
get {
@ -81,6 +81,16 @@ namespace TShockAPI {
}
}
/// <summary>
/// Looks up a localized string similar to #see https://github.com/TShock/TShock/wiki/Item-List for a list of groups
///#List each banned item below this with spaces.
/// </summary>
internal static string itembans {
get {
return ResourceManager.GetString("itembans", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to #format
///#ip group

View file

@ -1,21 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
TShock, a server mod for Terraria
Copyright (C) 2011 The TShock Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<root>
<!--
Microsoft ResX Schema
@ -138,6 +121,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<data name="groups" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>config\groups.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="itembans" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>config\itembans.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="users" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>config\users.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>

View file

@ -36,6 +36,8 @@ namespace TShockAPI
public int Index { get; protected set; }
public DateTime LastPvpChange { get; protected set; }
public Rectangle TempArea = new Rectangle();
public DateTime LastExplosive { get; set; }
public bool RealPlayer
{
get { return Index >= 0 && Index < Main.maxNetPlayers; }
@ -133,21 +135,27 @@ namespace TShockAPI
public bool Teleport(int tileX, int tileY)
{
if (TPlayer.SpawnX >= 0 && TPlayer.SpawnY >= 0)
return false;
int oldSpawnX = Main.spawnTileX;
int oldSpawnY = Main.spawnTileY;
int spawnTileX = Main.spawnTileX;
int spawnTileY = Main.spawnTileY;
Main.spawnTileX = tileX;
Main.spawnTileY = tileY;
//Send only that player the new spawn point data
NetMessage.SendData((int)PacketTypes.WorldInfo, Index, -1, "", 0, 0f, 0f, 0f);
//Force them to respawn
Spawn();
//Reset to old spawnpoint and send spawn data back to player
Main.spawnTileX = (int)oldSpawnX;
Main.spawnTileY = (int)oldSpawnY;
NetMessage.SendData((int)PacketTypes.WorldInfo, Index, -1, "", 0, 0f, 0f, 0f);
NetMessage.SendData((int)PacketTypes.WorldInfo, Index, -1, "", 0, 0.0f, 0.0f, 0.0f);
if (TPlayer.SpawnX >= 0 && TPlayer.SpawnY >= 0)
{
Main.tile[TPlayer.SpawnX, TPlayer.SpawnY].active = false;
NetMessage.SendTileSquare(Index, TPlayer.SpawnX, TPlayer.SpawnY, 1);
Spawn();
Main.tile[TPlayer.SpawnX, TPlayer.SpawnY].active = true;
NetMessage.SendTileSquare(Index, TPlayer.SpawnX, TPlayer.SpawnY, 1);
SendMessage("Warning! Your bed spawn point has been destroyed because of warp", Color.Red);
}
else
{
Spawn();
}
Main.spawnTileX = spawnTileX;
Main.spawnTileY = spawnTileY;
NetMessage.SendData((int)PacketTypes.WorldInfo, Index, -1, "", 0, 0.0f, 0.0f, 0.0f);
return true;
}

View file

@ -102,8 +102,10 @@ namespace TShockAPI
Log.Info("Commands initialized");
RegionManager.ReadAllSettings();
WarpsManager.ReadAllSettings();
ItemManager.LoadBans();
Backups.KeepFor = ConfigurationManager.BackupKeepFor;
Backups.Interval = ConfigurationManager.BackupInterval;
@ -193,7 +195,7 @@ namespace TShockAPI
{
if (player != null && player.Active)
{
if (player.TileThreshold >= 20)
if (player.TileThreshold >= ConfigurationManager.TileThreshold)
{
if (Tools.HandleTntUser(player, "Kill tile abuse detected."))
{
@ -211,6 +213,18 @@ namespace TShockAPI
player.TileThreshold = 0;
player.TilesDestroyed.Clear();
}
if (!player.Group.HasPermission("usebanneditem"))
{
for (int i = 0; i < Main.player[player.Index].inventory.Length; i++)
{
if (ItemManager.ItemIsBanned(Main.player[player.Index].inventory[i].name))
{
player.Disconnect("Using banned item: " + Main.player[player.Index].inventory[i].name + ", remove it and rejoin");
break;
}
}
}
}
}
}
@ -256,6 +270,12 @@ namespace TShockAPI
if (tsplr != null && tsplr.ReceivedInfo)
Log.Info(string.Format("{0} left.", tsplr.Name));
if (ConfigurationManager.RememberLeavePos)
{
RemeberedPosManager.RemeberedPosistions.Add(new RemeberedPos(Players[ply].IP, new Vector2(Players[ply].X / 16, (Players[ply].Y / 16) + 3)));
RemeberedPosManager.WriteSettings();
}
Players[ply] = null;
}
@ -359,7 +379,7 @@ namespace TShockAPI
Debug.WriteLine("{0:X} ({2}): {3} ({1:XX})", player.Index, (byte)type, player.TPlayer.dead ? "dead " : "alive", type.ToString());
// Stop accepting updates from player as this player is going to be kicked/banned during OnUpdate (different thread so can produce race conditions)
if ((ConfigurationManager.BanTnt || ConfigurationManager.KickTnt) && player.TileThreshold >= 20 && !player.Group.HasPermission("ignoregriefdetection"))
if ((ConfigurationManager.BanTnt || ConfigurationManager.KickTnt) && player.TileThreshold >= ConfigurationManager.TileThreshold && !player.Group.HasPermission("ignoregriefdetection"))
{
Log.Debug("Rejecting " + type + " from " + player.Name + " as this player is about to be kicked");
e.Handled = true;
@ -402,6 +422,16 @@ namespace TShockAPI
{
StartInvasion();
}
if (ConfigurationManager.RememberLeavePos)
{
foreach (RemeberedPos playerIP in RemeberedPosManager.RemeberedPosistions)
{
if (playerIP.IP == Players[who].IP)
{
Players[who].Teleport((int)playerIP.Pos.X, (int)playerIP.Pos.Y);
}
}
}
e.Handled = true;
}

View file

@ -74,6 +74,7 @@
<ItemGroup>
<Compile Include="BackupManager.cs" />
<Compile Include="BanManager.cs" />
<Compile Include="ItemManager.cs" />
<Compile Include="Commands.cs" />
<Compile Include="ConfigFile.cs" />
<Compile Include="ConfigurationManager.cs" />
@ -82,6 +83,7 @@
<Compile Include="Group.cs" />
<Compile Include="Log.cs" />
<Compile Include="RegionManager.cs" />
<Compile Include="RememberPosManager.cs" />
<Compile Include="Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
@ -129,13 +131,17 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Content Include="config\itembans.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>"$(SolutionDir)\myass.bat"</PostBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<ProjectExtensions>
<VisualStudio>

View file

@ -19,6 +19,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Net;
using Microsoft.Xna.Framework;
using Terraria;
@ -60,6 +61,25 @@ namespace TShockAPI
return sb.ToString();
}
/// <summary>
/// Finds a player and gets IP as string
/// </summary>
/// <param name="msg">Player name</param>
public static string GetPlayerIP(string playername)
{
foreach (TSPlayer player in TShock.Players)
{
if (player != null && player.Active)
{
if (playername.ToLower() == player.Name.ToLower())
{
return player.IP;
}
}
}
return null;
}
/// <summary>
/// It's a clamp function
/// </summary>
@ -536,13 +556,35 @@ namespace TShockAPI
{
continue;
}
if (args[0].Equals(ip))
try
{
return GetGroup(args[1]);
var hi = GetIPv4Address(args[0]);
if (GetIPv4Address(args[0]).Equals(ip))
return GetGroup(args[1]);
}
catch (Exception ex)
{ Log.Error(ex.ToString()); }
}
sr.Close();
return GetGroup("default");
}
/// <summary>
/// Returns an IPv4 address from a DNS query
/// </summary>
/// <param name="hostname">string ip</param>
public static string GetIPv4Address(string hostname)
{
string IP4Address = String.Empty;
foreach (IPAddress IPA in Dns.GetHostAddresses(hostname))
{
if (IPA.AddressFamily.ToString() == "InterNetwork")
{
IP4Address = IPA.ToString();
break;
}
}
return IP4Address;
}
}
}

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using System.Xml;
using Terraria;
namespace TShockAPI
{
@ -11,7 +12,7 @@ namespace TShockAPI
{
public static List<Warp> Warps = new List<Warp>();
public static bool AddWarp(int x, int y, string name)
public static bool AddWarp(int x, int y, string name, string worldname)
{
foreach (Warp nametest in Warps)
{
@ -20,7 +21,7 @@ namespace TShockAPI
return false;
}
}
Warps.Add(new Warp(new Vector2(x, y), name));
Warps.Add(new Warp(new Vector2(x, y), name, worldname));
return true;
}
@ -28,7 +29,7 @@ namespace TShockAPI
{
foreach (Warp nametest in Warps)
{
if (name.ToLower() == nametest.WarpName.ToLower())
if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName)
{
Warps.Remove(nametest);
WriteSettings();
@ -42,7 +43,7 @@ namespace TShockAPI
{
foreach (Warp nametest in Warps)
{
if (name.ToLower() == nametest.WarpName.ToLower())
if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName)
{
return nametest.WarpPos;
}
@ -69,6 +70,7 @@ namespace TShockAPI
settingsw.WriteElementString("WarpName", warp.WarpName);
settingsw.WriteElementString("X", warp.WarpPos.X.ToString());
settingsw.WriteElementString("Y", warp.WarpPos.Y.ToString());
settingsw.WriteElementString("WorldName", warp.WorldWarpName);
settingsw.WriteEndElement();
}
@ -106,12 +108,16 @@ namespace TShockAPI
{
if (settingr.Read())
{
string name;
string name = string.Empty;
int x = 0;
int y = 0;
string worldname = string.Empty;
settingr.Read();
name = settingr.Value;
if (settingr.Value != "" || settingr.Value != null)
name = settingr.Value;
else
Log.Warn("Warp name is empty, This warp will not work");
settingr.Read();
settingr.Read();
@ -119,7 +125,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out x);
else
Console.WriteLine("Could not parse x");
Log.Warn("x for warp " + name + " is empty");
settingr.Read();
settingr.Read();
@ -127,9 +133,17 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out y);
else
Console.WriteLine("Could not parse y");
Log.Warn("y for warp " + name + " is empty");
AddWarp(x, y, name);
settingr.Read();
settingr.Read();
settingr.Read();
if (settingr.Value != "" || settingr.Value != null)
worldname = settingr.Value;
else
Log.Warn("Worldname for warp " + name + " is empty");
AddWarp(x, y, name, worldname);
}
break;
}
@ -151,17 +165,20 @@ namespace TShockAPI
{
public Vector2 WarpPos { get; set; }
public string WarpName { get; set; }
public string WorldWarpName { get; set; }
public Warp(Vector2 warppos, string name)
public Warp(Vector2 warppos, string name, string worldname)
{
WarpPos = warppos;
WarpName = name;
WorldWarpName = worldname;
}
public Warp()
{
WarpPos = Vector2.Zero;
WarpName = null;
WorldWarpName = string.Empty;
}
}
}

View file

@ -8,14 +8,36 @@
#ALWAYS DECLARE A GROUP'S PARENT BEFORE YOU DECLARE THE GROUP
#currently avaliable permissions:
#kick ban ignorecheatdetection
#maintenance cfg causeevents spawnboss tp
#spawnmob cheat kill pvpfun
#immunetoban immunetokick editspawn
#ignoregriefdetection reservedslot
#reservedslot - reserved slot for player
#canwater - allow players to use water
#canlava - allow playes to use lava
#warp - allow players to use warps
#kick - kick users
#ban - ban players by name or ip
#unban - unban players by name or ip
#whitelist - add ip to whitelist
#maintenance - check for updates/turn off server
#causeevents - allow player to drop star/meteor and start invasion/bloodmoon
#spawnboss - allow player to spawn bosses
#spawnmob - allow player to spawn any npcs
#tp - allow player to teleport
#managewarp - allow player to add/delete warp locations
#editspawn - allow player to enable/disable build protection
#cfg - allow player to view/change tshock configuration
#time - allow player to change time
#pvpfun - enable pvpfun commands
#logs - notify player when any command is executed
#kill - allow player to kill others
#butcher - allow player to kill all alive monsters
#cheat - allow player to spawn items and heal self
#immunetokick - player can't be kick
#immunetoban - player can't be banned
#ignorecheatdetection - allow player to cheat (health/mana cheats)
#ignoregriefdetection - allow player to grief (use explosives, water, lava even if they dont have premission to)
#usebanneditem - allows player to use banned items
default null canwater canlava
default null canwater canlava warp
vip default reservedslot
newadmin default kick editspawn reservedslot
admin newadmin ban unban causeevents spawnboss spawnmob tp immunetokick kill logs
trustedadmin admin maintenance cfg cheat pvpfun ignorecheatdetection immunetoban ignoregriefdetection
admin newadmin ban unban whitelist causeevents spawnboss spawnmob managewarp time tp pvpfun kill logs immunetokick
trustedadmin admin maintenance cfg butcher cheat immunetoban ignorecheatdetection ignoregriefdetection usebanneditem

View file

@ -0,0 +1,2 @@
#see https://github.com/TShock/TShock/wiki/Item-List for a list of item ids
#List each banned item ID below this, with each on a new line