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("banip", "ban", BanIP));
ChatCommands.Add(new Command("unban", "unban", UnBan)); ChatCommands.Add(new Command("unban", "unban", UnBan));
ChatCommands.Add(new Command("unbanip", "unban", UnBanIP)); 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", "maintenance", Off));
ChatCommands.Add(new Command("off-nosave", "maintenance", OffNoSave)); ChatCommands.Add(new Command("off-nosave", "maintenance", OffNoSave));
ChatCommands.Add(new Command("checkupdates", "maintenance", CheckUpdates)); ChatCommands.Add(new Command("checkupdates", "maintenance", CheckUpdates));
@ -120,16 +121,21 @@ namespace TShockAPI
ChatCommands.Add(new Command("spawn", "tp", Spawn)); ChatCommands.Add(new Command("spawn", "tp", Spawn));
ChatCommands.Add(new Command("tp", "tp", TP)); ChatCommands.Add(new Command("tp", "tp", TP));
ChatCommands.Add(new Command("tphere", "tp", TPHere)); 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("reload", "cfg", Reload));
ChatCommands.Add(new Command("debug-config", "cfg", DebugConfiguration)); ChatCommands.Add(new Command("debug-config", "cfg", DebugConfiguration));
ChatCommands.Add(new Command("password", "cfg", Password)); ChatCommands.Add(new Command("password", "cfg", Password));
ChatCommands.Add(new Command("save", "cfg", Save)); ChatCommands.Add(new Command("save", "cfg", Save));
ChatCommands.Add(new Command("maxspawns", "cfg", MaxSpawns)); ChatCommands.Add(new Command("maxspawns", "cfg", MaxSpawns));
ChatCommands.Add(new Command("spawnrate", "cfg", SpawnRate)); 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("slap", "pvpfun", Slap));
ChatCommands.Add(new Command("antibuild", "editspawn", ToggleAntiBuild)); ChatCommands.Add(new Command("antibuild", "editspawn", ToggleAntiBuild));
ChatCommands.Add(new Command("protectspawn", "editspawn", ProtectSpawn)); ChatCommands.Add(new Command("protectspawn", "editspawn", ProtectSpawn));
ChatCommands.Add(new Command("region", "editspawn", Region));
ChatCommands.Add(new Command("help", "", Help)); ChatCommands.Add(new Command("help", "", Help));
ChatCommands.Add(new Command("playing", "", Playing)); ChatCommands.Add(new Command("playing", "", Playing));
ChatCommands.Add(new Command("online", "", Playing)); ChatCommands.Add(new Command("online", "", Playing));
@ -138,15 +144,10 @@ namespace TShockAPI
ChatCommands.Add(new Command("me", "", ThirdPerson)); ChatCommands.Add(new Command("me", "", ThirdPerson));
ChatCommands.Add(new Command("p", "", PartyChat)); ChatCommands.Add(new Command("p", "", PartyChat));
ChatCommands.Add(new Command("rules", "", Rules)); 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") if (ConfigurationManager.DistributationAgent != "terraria-online")
{ {
ChatCommands.Add(new Command("kill", "kill", Kill)); 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("i", "cheat", Item));
ChatCommands.Add(new Command("item", "cheat", Item)); ChatCommands.Add(new Command("item", "cheat", Item));
ChatCommands.Add(new Command("give", "cheat", Give)); 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 #endregion Player Management Commands
#region Server Maintenence Commands #region Server Maintenence Commands
@ -660,7 +672,7 @@ namespace TShockAPI
{ {
if (!args.Player.RealPlayer) if (!args.Player.RealPlayer)
{ {
args.Player.SendMessage("You cant use teleport commands!"); args.Player.SendMessage("You cannot use teleport commands!");
return; return;
} }
@ -672,21 +684,21 @@ namespace TShockAPI
{ {
if (!args.Player.RealPlayer) if (!args.Player.RealPlayer)
{ {
args.Player.SendMessage("You cant use teleport commands!"); args.Player.SendMessage("You cannot use teleport commands!");
return; return;
} }
if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY)) if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY))
args.Player.SendMessage("Teleported to the map's spawnpoint."); args.Player.SendMessage("Teleported to the map's spawnpoint.");
else 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) private static void TP(CommandArgs args)
{ {
if (!args.Player.RealPlayer) if (!args.Player.RealPlayer)
{ {
args.Player.SendMessage("You cant use teleport commands!"); args.Player.SendMessage("You cannot use teleport commands!");
return; return;
} }
@ -708,7 +720,7 @@ namespace TShockAPI
if (args.Player.Teleport(plr.TileX, plr.TileY)) if (args.Player.Teleport(plr.TileX, plr.TileY))
args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name)); args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name));
else 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) if (!args.Player.RealPlayer)
{ {
args.Player.SendMessage("You cant use teleport commands!"); args.Player.SendMessage("You cannot use teleport commands!");
return; return;
} }
@ -745,7 +757,7 @@ namespace TShockAPI
args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name)); args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name));
} }
else 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) private static void SetWarp(CommandArgs args)
{ {
if (args.Parameters.Count > 0) 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(); WarpsManager.WriteSettings();
} }
else else
{ {
args.Player.SendMessage("Warp " + args.Parameters[0] + " already exists", Color.Red); args.Player.SendMessage("Warp " + warpName + " already exists", Color.Red);
} }
}
else else
args.Player.SendMessage("Invalid syntax! Proper syntax: /setwarp [name]", Color.Red); args.Player.SendMessage("Invalid syntax! Proper syntax: /setwarp [name]", Color.Red);
} }
@ -770,43 +789,85 @@ namespace TShockAPI
{ {
if (args.Parameters.Count > 0) if (args.Parameters.Count > 0)
{ {
if (WarpsManager.DeleteWarp(args.Parameters[0])) string warpName = String.Join(" ", args.Parameters);
args.Player.SendMessage("Deleted warp " + args.Parameters[0], Color.Yellow); if (WarpsManager.DeleteWarp(warpName))
args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow);
else else
args.Player.SendMessage("Could not find specified warp", Color.Red); 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) private static void UseWarp(CommandArgs args)
{ {
if (args.Parameters.Count > 0) 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("Current Warps:", Color.Green);
args.Player.SendMessage("Warped to " + args.Parameters[0], Color.Yellow); 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 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 else
{ args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or warp list", Color.Red);
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);
}
}
} }
#endregion Teleport Commands #endregion Teleport Commands
#region Server Config 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) private static void DebugConfiguration(CommandArgs args)
{ {
args.Player.SendMessage("TShock Config:"); 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)); 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) private static void Time(CommandArgs args)
{ {
if (args.Parameters.Count != 1) 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 #region World Protection Commands
@ -938,122 +1040,170 @@ namespace TShockAPI
private static void Region(CommandArgs args) private static void Region(CommandArgs args)
{ {
string cmd = "help";
if (args.Parameters.Count > 0) if (args.Parameters.Count > 0)
{ {
switch (args.Parameters[0].ToLower()) cmd = args.Parameters[0].ToLower();
{ }
case "set": 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; if (args.Player.TileX > args.Player.TempArea.X && args.Player.TileY > args.Player.TempArea.Y)
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) 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.TempArea.Width = args.Player.TileX - args.Player.TempArea.X; args.Player.SendMessage("Set Temp Point 2", Color.Yellow);
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);
}
} }
else 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 else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red); 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)) args.Player.TempArea = Rectangle.Empty;
{ args.Player.SendMessage("Set region " + regionName, Color.Yellow);
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);
}
} }
else else
args.Player.SendMessage("Points not set up yet", Color.Red); {
args.Player.SendMessage("Region " + regionName + " already exists", Color.Red);
}
} }
else else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red); args.Player.SendMessage("Points not set up yet", Color.Red);
break;
} }
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(regionName, true))
{ args.Player.SendMessage("Protected region " + regionName, Color.Yellow);
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);
}
else 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 else if (args.Parameters[2].ToLower() == "false")
args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red);
break;
}
case "delete":
{
if (args.Parameters.Count > 1)
{ {
if (RegionManager.DeleteRegion(args.Parameters[1])) if (RegionManager.SetRegionState(regionName, false))
args.Player.SendMessage("Deleted region " + args.Parameters[1], Color.Yellow); args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow);
else else
args.Player.SendMessage("Could not find specified region", Color.Red); args.Player.SendMessage("Could not find specified region", Color.Red);
} }
else else
args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red); args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red);
break;
} }
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; string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1));
args.Player.SendMessage("Cleared temp area", Color.Yellow); if (RegionManager.DeleteRegion(regionName))
break; 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); string playerName = args.Parameters[1];
args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", Color.Yellow); string regionName = "";
args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow); string playerIP = null;
break;
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 #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) private static void Help(CommandArgs args)
{ {
args.Player.SendMessage("TShock Commands:"); args.Player.SendMessage("TShock Commands:");
@ -1177,43 +1316,6 @@ namespace TShockAPI
#region Cheat Commands #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) private static void Kill(CommandArgs args)
{ {
if (args.Parameters.Count < 1) if (args.Parameters.Count < 1)
@ -1328,6 +1430,7 @@ namespace TShockAPI
} }
var items = Tools.GetItemByIdOrName(args.Parameters[0]); var items = Tools.GetItemByIdOrName(args.Parameters[0]);
if (items.Count == 0) if (items.Count == 0)
{ {
args.Player.SendMessage("Invalid item type!", Color.Red); args.Player.SendMessage("Invalid item type!", Color.Red);
@ -1424,4 +1527,4 @@ namespace TShockAPI
#endregion Cheat Comamnds #endregion Cheat Comamnds
} }
} }

View file

@ -30,10 +30,11 @@ namespace TShockAPI
public bool BanCheaters = true; public bool BanCheaters = true;
public bool KickGriefers = true; public bool KickGriefers = true;
public bool BanGriefers = true; public bool BanGriefers = true;
public bool BanKillTileAbusers; public bool BanKillTileAbusers = true;
public bool KickKillTileAbusers; public bool KickKillTileAbusers = true;
public bool BanExplosives = true; public bool BanExplosives = true;
public bool KickExplosives = true; public bool KickExplosives = true;
public bool DisableExplosives = true;
public bool SpawnProtection = true; public bool SpawnProtection = true;
public int SpawnProtectionRadius = 5; public int SpawnProtectionRadius = 5;
public string DistributationAgent = "facepunch"; public string DistributationAgent = "facepunch";
@ -41,6 +42,7 @@ namespace TShockAPI
public bool RangeChecks = true; public bool RangeChecks = true;
public bool SpamChecks = false; public bool SpamChecks = false;
public bool DisableBuild = false; public bool DisableBuild = false;
public int TileThreshold = 20;
public float[] AdminChatRGB = {255, 0, 0}; public float[] AdminChatRGB = {255, 0, 0};
public string AdminChatPrefix = "(Admin) "; public string AdminChatPrefix = "(Admin) ";
@ -51,5 +53,10 @@ namespace TShockAPI
public int BackupKeepFor = 60; public int BackupKeepFor = 60;
public bool ListServer = false; 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 KickTnt = true;
public static bool BanBoom = true; public static bool BanBoom = true;
public static bool KickBoom = true; public static bool KickBoom = true;
public static bool DisableBoom = true;
public static bool SpawnProtect = true; public static bool SpawnProtect = true;
public static bool RangeChecks = true; public static bool RangeChecks = true;
public static int SpawnProtectRadius = 5; public static int SpawnProtectRadius = 5;
@ -54,6 +55,8 @@ namespace TShockAPI
public static bool DisableBuild = false; public static bool DisableBuild = false;
public static float[] AdminChatRGB = {255, 0, 0}; public static float[] AdminChatRGB = {255, 0, 0};
public static string AdminChatPrefix = "(Admin) "; public static string AdminChatPrefix = "(Admin) ";
public static bool RememberLeavePos = false;
public static int TileThreshold = 20;
/// <summary> /// <summary>
/// Don't allow pvp changing for x seconds. /// Don't allow pvp changing for x seconds.
@ -95,6 +98,7 @@ namespace TShockAPI
KickTnt = cfg.KickKillTileAbusers; KickTnt = cfg.KickKillTileAbusers;
BanBoom = cfg.BanExplosives; BanBoom = cfg.BanExplosives;
KickBoom = cfg.KickExplosives; KickBoom = cfg.KickExplosives;
DisableBoom = cfg.DisableExplosives;
SpawnProtect = cfg.SpawnProtection; SpawnProtect = cfg.SpawnProtection;
SpawnProtectRadius = cfg.SpawnProtectionRadius; SpawnProtectRadius = cfg.SpawnProtectionRadius;
DistributationAgent = cfg.DistributationAgent; DistributationAgent = cfg.DistributationAgent;
@ -102,6 +106,7 @@ namespace TShockAPI
RangeChecks = cfg.RangeChecks; RangeChecks = cfg.RangeChecks;
SpamChecks = cfg.SpamChecks; SpamChecks = cfg.SpamChecks;
DisableBuild = cfg.DisableBuild; DisableBuild = cfg.DisableBuild;
TileThreshold = cfg.TileThreshold;
NPC.maxSpawns = DefaultMaxSpawns; NPC.maxSpawns = DefaultMaxSpawns;
NPC.defaultSpawnRate = DefaultSpawnRate; NPC.defaultSpawnRate = DefaultSpawnRate;
AdminChatRGB = cfg.AdminChatRGB; AdminChatRGB = cfg.AdminChatRGB;
@ -110,6 +115,9 @@ namespace TShockAPI
BackupInterval = cfg.BackupInterval; BackupInterval = cfg.BackupInterval;
BackupKeepFor = cfg.BackupKeepFor; BackupKeepFor = cfg.BackupKeepFor;
ListServer = cfg.ListServer; ListServer = cfg.ListServer;
Main.spawnTileX = cfg.spawnTileX;
Main.spawnTileY = cfg.spawnTileY;
RememberLeavePos = cfg.RememberLeavePos;
} }
public static void WriteJsonConfiguration() public static void WriteJsonConfiguration()
@ -126,22 +134,28 @@ namespace TShockAPI
cfg.BanCheaters = BanCheater; cfg.BanCheaters = BanCheater;
cfg.KickGriefers = KickGriefer; cfg.KickGriefers = KickGriefer;
cfg.BanGriefers = BanGriefer; cfg.BanGriefers = BanGriefer;
cfg.BanKillTileAbusers = BanGriefer; cfg.BanKillTileAbusers = BanTnt;
cfg.KickKillTileAbusers = KickGriefer; cfg.KickKillTileAbusers = KickTnt;
cfg.BanExplosives = BanBoom; cfg.BanExplosives = BanBoom;
cfg.KickExplosives = KickBoom; cfg.KickExplosives = KickBoom;
cfg.DisableExplosives = DisableBoom;
cfg.SpawnProtection = SpawnProtect; cfg.SpawnProtection = SpawnProtect;
cfg.SpawnProtectionRadius = SpawnProtectRadius; cfg.SpawnProtectionRadius = SpawnProtectRadius;
cfg.MaxSlots = MaxSlots; cfg.MaxSlots = MaxSlots;
cfg.RangeChecks = RangeChecks; cfg.RangeChecks = RangeChecks;
cfg.SpamChecks = SpamChecks; cfg.SpamChecks = SpamChecks;
cfg.DisableBuild = DisableBuild; cfg.DisableBuild = DisableBuild;
cfg.TileThreshold = TileThreshold;
cfg.AdminChatRGB = AdminChatRGB; cfg.AdminChatRGB = AdminChatRGB;
cfg.AdminChatPrefix = AdminChatPrefix; cfg.AdminChatPrefix = AdminChatPrefix;
cfg.PvpThrottle = PvpThrottle; cfg.PvpThrottle = PvpThrottle;
cfg.BackupInterval = BackupInterval; cfg.BackupInterval = BackupInterval;
cfg.BackupKeepFor = BackupKeepFor; cfg.BackupKeepFor = BackupKeepFor;
cfg.ListServer = ListServer; cfg.ListServer = ListServer;
cfg.spawnTileX = Main.spawnTileX;
cfg.spawnTileY = Main.spawnTileY;
cfg.RememberLeavePos = RememberLeavePos;
string json = JsonConvert.SerializeObject(cfg, Formatting.Indented); string json = JsonConvert.SerializeObject(cfg, Formatting.Indented);
TextWriter tr = new StreamWriter(FileTools.ConfigPath); TextWriter tr = new StreamWriter(FileTools.ConfigPath);
tr.Write(json); 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 WhitelistPath = Path.Combine(TShock.SavePath, "whitelist.txt");
public static readonly string GroupsPath = Path.Combine(TShock.SavePath, "groups.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 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 readonly string ConfigPath = Path.Combine(TShock.SavePath, "config.json");
public static void CreateFile(string file) public static void CreateFile(string file)
@ -60,6 +62,7 @@ namespace TShockAPI
CreateIfNot(WhitelistPath); CreateIfNot(WhitelistPath);
CreateIfNot(GroupsPath, Resources.groups); CreateIfNot(GroupsPath, Resources.groups);
CreateIfNot(UsersPath, Resources.users); CreateIfNot(UsersPath, Resources.users);
CreateIfNot(ItemBansPath, Resources.itembans);
try try
{ {
@ -100,7 +103,23 @@ namespace TShockAPI
TextReader tr = new StreamReader(WhitelistPath); TextReader tr = new StreamReader(WhitelistPath);
string whitelist = tr.ReadToEnd(); string whitelist = tr.ReadToEnd();
ip = Tools.GetRealIP(ip); 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; 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.SendMessage("Region protected from changes.", Color.Red);
args.Player.SendTileSquare(x, y); args.Player.SendTileSquare(x, y);
@ -251,6 +251,13 @@ namespace TShockAPI
if (!args.Player.TilesDestroyed.ContainsKey(coords)) if (!args.Player.TilesDestroyed.ContainsKey(coords))
args.Player.TilesDestroyed.Add(coords, Main.tile[x, y]); 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; return false;
} }
@ -318,7 +325,16 @@ namespace TShockAPI
if (type == 29 || type == 28 || type == 37) if (type == 29 || type == 28 || type == 37)
{ {
Log.Debug(string.Format("Explosive(PlyXY:{0}_{1}, Type:{2})", args.Player.TileX, args.Player.TileY, type)); 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; 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: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.2.0.0620")] [assembly: AssemblyVersion("2.2.0.0623")]
[assembly: AssemblyFileVersion("2.2.0.0620")] [assembly: AssemblyFileVersion("2.2.0.0623")]

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Xml; using System.Xml;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Terraria;
namespace TShockAPI namespace TShockAPI
{ {
@ -11,24 +12,38 @@ namespace TShockAPI
{ {
public static List<Region> Regions = new List<Region>(); 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) foreach (Region nametest in Regions)
{ {
if (name.ToLower() == nametest.RegionName.ToLower()) if (regionname.ToLower() == nametest.RegionName.ToLower())
{ {
return false; 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; 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) public static bool DeleteRegion(string name)
{ {
foreach (Region nametest in Regions) foreach (Region nametest in Regions)
{ {
if (name.ToLower() == nametest.RegionName.ToLower()) if (name.ToLower() == nametest.RegionName.ToLower() && nametest.WorldRegionName == Main.worldName)
{ {
Regions.Remove(nametest); Regions.Remove(nametest);
WriteSettings(); WriteSettings();
@ -52,18 +67,45 @@ namespace TShockAPI
return false; 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) 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 true;
} }
} }
return false; 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() public static void WriteSettings()
{ {
try try
@ -86,6 +128,12 @@ namespace TShockAPI
settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString()); settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString());
settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString()); settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString());
settingsw.WriteElementString("Protected", region.DisableBuild.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(); settingsw.WriteEndElement();
} }
@ -96,7 +144,7 @@ namespace TShockAPI
} }
catch catch
{ {
Log.Info("Could not write Regions"); Log.Warn("Could not write Regions");
} }
} }
@ -123,15 +171,21 @@ namespace TShockAPI
{ {
if (settingr.Read()) if (settingr.Read())
{ {
string name; string name = null;
int x = 0; int x = 0;
int y = 0; int y = 0;
int width = 0; int width = 0;
int height = 0; int height = 0;
bool state = true; bool state = true;
string worldname = null;
int playercount = 0;
settingr.Read(); 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();
settingr.Read(); settingr.Read();
@ -139,7 +193,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out x); Int32.TryParse(settingr.Value, out x);
else else
Console.WriteLine("Could not parse x"); Log.Warn("x for region " + name + " is empty");
settingr.Read(); settingr.Read();
settingr.Read(); settingr.Read();
@ -147,7 +201,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out y); Int32.TryParse(settingr.Value, out y);
else else
Console.WriteLine("Could not parse y"); Log.Warn("y for region " + name + " is empty");
settingr.Read(); settingr.Read();
settingr.Read(); settingr.Read();
@ -155,7 +209,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out width); Int32.TryParse(settingr.Value, out width);
else else
Console.WriteLine("Could not parse width"); Log.Warn("Width for region " + name + " is empty");
settingr.Read(); settingr.Read();
settingr.Read(); settingr.Read();
@ -163,7 +217,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out height); Int32.TryParse(settingr.Value, out height);
else else
Console.WriteLine("Could not parse height"); Log.Warn("Height for region " + name + " is empty");
settingr.Read(); settingr.Read();
settingr.Read(); settingr.Read();
@ -171,9 +225,44 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
bool.TryParse(settingr.Value, out state); bool.TryParse(settingr.Value, out state);
else 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; break;
} }
@ -185,7 +274,7 @@ namespace TShockAPI
} }
catch catch
{ {
Log.Info("Could not read Regions"); Log.Warn("Could not read Regions");
WriteSettings(); WriteSettings();
} }
} }
@ -196,12 +285,15 @@ namespace TShockAPI
public Rectangle RegionArea { get; set; } public Rectangle RegionArea { get; set; }
public string RegionName { get; set; } public string RegionName { get; set; }
public bool DisableBuild { 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; RegionArea = region;
RegionName = name; RegionName = name;
DisableBuild = disablebuild; DisableBuild = disablebuild;
WorldRegionName = worldname;
} }
public Region() public Region()
@ -209,6 +301,7 @@ namespace TShockAPI
RegionArea = Rectangle.Empty; RegionArea = Rectangle.Empty;
RegionName = string.Empty; RegionName = string.Empty;
DisableBuild = true; 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> // <auto-generated>
// This code was generated by a tool. // 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 // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
@ -71,9 +71,9 @@ namespace TShockAPI {
///#ALWAYS DECLARE A GROUP&apos;S PARENT BEFORE YOU DECLARE THE GROUP ///#ALWAYS DECLARE A GROUP&apos;S PARENT BEFORE YOU DECLARE THE GROUP
/// ///
///#currently avaliable permissions: ///#currently avaliable permissions:
///#kick ban ignorecheatdetection ///#reservedslot - reserved slot for player
///#maintenance cfg causeevents spawnboss tp ///#canwater - allow players to use water
///#spawnmob che [rest of string was truncated]&quot;;. ///#canlav [rest of string was truncated]&quot;;.
/// </summary> /// </summary>
internal static string groups { internal static string groups {
get { 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> /// <summary>
/// Looks up a localized string similar to #format /// Looks up a localized string similar to #format
///#ip group ///#ip group

View file

@ -1,21 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?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> <root>
<!-- <!--
Microsoft ResX Schema 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"> <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> <value>config\groups.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data> </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"> <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> <value>config\users.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data> </data>

View file

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

View file

@ -102,8 +102,10 @@ namespace TShockAPI
Log.Info("Commands initialized"); Log.Info("Commands initialized");
RegionManager.ReadAllSettings(); RegionManager.ReadAllSettings();
WarpsManager.ReadAllSettings(); WarpsManager.ReadAllSettings();
ItemManager.LoadBans();
Backups.KeepFor = ConfigurationManager.BackupKeepFor; Backups.KeepFor = ConfigurationManager.BackupKeepFor;
Backups.Interval = ConfigurationManager.BackupInterval; Backups.Interval = ConfigurationManager.BackupInterval;
@ -193,7 +195,7 @@ namespace TShockAPI
{ {
if (player != null && player.Active) if (player != null && player.Active)
{ {
if (player.TileThreshold >= 20) if (player.TileThreshold >= ConfigurationManager.TileThreshold)
{ {
if (Tools.HandleTntUser(player, "Kill tile abuse detected.")) if (Tools.HandleTntUser(player, "Kill tile abuse detected."))
{ {
@ -211,6 +213,18 @@ namespace TShockAPI
player.TileThreshold = 0; player.TileThreshold = 0;
player.TilesDestroyed.Clear(); 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) if (tsplr != null && tsplr.ReceivedInfo)
Log.Info(string.Format("{0} left.", tsplr.Name)); 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; 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()); 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) // 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"); Log.Debug("Rejecting " + type + " from " + player.Name + " as this player is about to be kicked");
e.Handled = true; e.Handled = true;
@ -402,6 +422,16 @@ namespace TShockAPI
{ {
StartInvasion(); 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; e.Handled = true;
} }

View file

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

View file

@ -19,6 +19,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Net;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Terraria; using Terraria;
@ -60,6 +61,25 @@ namespace TShockAPI
return sb.ToString(); 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> /// <summary>
/// It's a clamp function /// It's a clamp function
/// </summary> /// </summary>
@ -536,13 +556,35 @@ namespace TShockAPI
{ {
continue; 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(); sr.Close();
return GetGroup("default"); 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 System.Text;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using System.Xml; using System.Xml;
using Terraria;
namespace TShockAPI namespace TShockAPI
{ {
@ -11,7 +12,7 @@ namespace TShockAPI
{ {
public static List<Warp> Warps = new List<Warp>(); 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) foreach (Warp nametest in Warps)
{ {
@ -20,7 +21,7 @@ namespace TShockAPI
return false; return false;
} }
} }
Warps.Add(new Warp(new Vector2(x, y), name)); Warps.Add(new Warp(new Vector2(x, y), name, worldname));
return true; return true;
} }
@ -28,7 +29,7 @@ namespace TShockAPI
{ {
foreach (Warp nametest in Warps) foreach (Warp nametest in Warps)
{ {
if (name.ToLower() == nametest.WarpName.ToLower()) if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName)
{ {
Warps.Remove(nametest); Warps.Remove(nametest);
WriteSettings(); WriteSettings();
@ -42,7 +43,7 @@ namespace TShockAPI
{ {
foreach (Warp nametest in Warps) foreach (Warp nametest in Warps)
{ {
if (name.ToLower() == nametest.WarpName.ToLower()) if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName)
{ {
return nametest.WarpPos; return nametest.WarpPos;
} }
@ -69,6 +70,7 @@ namespace TShockAPI
settingsw.WriteElementString("WarpName", warp.WarpName); settingsw.WriteElementString("WarpName", warp.WarpName);
settingsw.WriteElementString("X", warp.WarpPos.X.ToString()); settingsw.WriteElementString("X", warp.WarpPos.X.ToString());
settingsw.WriteElementString("Y", warp.WarpPos.Y.ToString()); settingsw.WriteElementString("Y", warp.WarpPos.Y.ToString());
settingsw.WriteElementString("WorldName", warp.WorldWarpName);
settingsw.WriteEndElement(); settingsw.WriteEndElement();
} }
@ -106,12 +108,16 @@ namespace TShockAPI
{ {
if (settingr.Read()) if (settingr.Read())
{ {
string name; string name = string.Empty;
int x = 0; int x = 0;
int y = 0; int y = 0;
string worldname = string.Empty;
settingr.Read(); 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();
settingr.Read(); settingr.Read();
@ -119,7 +125,7 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out x); Int32.TryParse(settingr.Value, out x);
else else
Console.WriteLine("Could not parse x"); Log.Warn("x for warp " + name + " is empty");
settingr.Read(); settingr.Read();
settingr.Read(); settingr.Read();
@ -127,9 +133,17 @@ namespace TShockAPI
if (settingr.Value != "" || settingr.Value != null) if (settingr.Value != "" || settingr.Value != null)
Int32.TryParse(settingr.Value, out y); Int32.TryParse(settingr.Value, out y);
else 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; break;
} }
@ -151,17 +165,20 @@ namespace TShockAPI
{ {
public Vector2 WarpPos { get; set; } public Vector2 WarpPos { get; set; }
public string WarpName { 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; WarpPos = warppos;
WarpName = name; WarpName = name;
WorldWarpName = worldname;
} }
public Warp() public Warp()
{ {
WarpPos = Vector2.Zero; WarpPos = Vector2.Zero;
WarpName = null; WarpName = null;
WorldWarpName = string.Empty;
} }
} }
} }

View file

@ -8,14 +8,36 @@
#ALWAYS DECLARE A GROUP'S PARENT BEFORE YOU DECLARE THE GROUP #ALWAYS DECLARE A GROUP'S PARENT BEFORE YOU DECLARE THE GROUP
#currently avaliable permissions: #currently avaliable permissions:
#kick ban ignorecheatdetection #reservedslot - reserved slot for player
#maintenance cfg causeevents spawnboss tp #canwater - allow players to use water
#spawnmob cheat kill pvpfun #canlava - allow playes to use lava
#immunetoban immunetokick editspawn #warp - allow players to use warps
#ignoregriefdetection reservedslot #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 vip default reservedslot
newadmin default kick editspawn reservedslot newadmin default kick editspawn reservedslot
admin newadmin ban unban causeevents spawnboss spawnmob tp immunetokick kill logs admin newadmin ban unban whitelist causeevents spawnboss spawnmob managewarp time tp pvpfun kill logs immunetokick
trustedadmin admin maintenance cfg cheat pvpfun ignorecheatdetection immunetoban ignoregriefdetection 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