Merge branch 'master' of github.com:TShock/TShock
This commit is contained in:
commit
acb3458ef6
18 changed files with 832 additions and 245 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
76
TShockAPI/ItemManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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")]
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
136
TShockAPI/RememberPosManager.cs
Normal file
136
TShockAPI/RememberPosManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
18
TShockAPI/Resources.Designer.cs
generated
18
TShockAPI/Resources.Designer.cs
generated
|
|
@ -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'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]";.
|
||||
///#reservedslot - reserved slot for player
|
||||
///#canwater - allow players to use water
|
||||
///#canlav [rest of string was truncated]";.
|
||||
/// </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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
2
TShockAPI/config/itembans.txt
Normal file
2
TShockAPI/config/itembans.txt
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue