Merge branch 'general-devel'
Conflicts: TShockAPI/TShock.cs
This commit is contained in:
commit
4722046b48
9 changed files with 276 additions and 64 deletions
|
|
@ -160,6 +160,7 @@ namespace TShockAPI
|
||||||
add(Permissions.managegroup, AddGroup, "addgroup");
|
add(Permissions.managegroup, AddGroup, "addgroup");
|
||||||
add(Permissions.managegroup, DeleteGroup, "delgroup");
|
add(Permissions.managegroup, DeleteGroup, "delgroup");
|
||||||
add(Permissions.managegroup, ModifyGroup, "modgroup");
|
add(Permissions.managegroup, ModifyGroup, "modgroup");
|
||||||
|
add(Permissions.managegroup, ViewGroups, "group");
|
||||||
add(Permissions.manageitem, AddItem, "additem", "banitem");
|
add(Permissions.manageitem, AddItem, "additem", "banitem");
|
||||||
add(Permissions.manageitem, DeleteItem, "delitem", "unbanitem");
|
add(Permissions.manageitem, DeleteItem, "delitem", "unbanitem");
|
||||||
add(Permissions.manageitem, ListItems, "listitems", "listbanneditems");
|
add(Permissions.manageitem, ListItems, "listitems", "listbanneditems");
|
||||||
|
|
@ -209,6 +210,7 @@ namespace TShockAPI
|
||||||
add(Permissions.hardmode, StartHardMode, "hardmode");
|
add(Permissions.hardmode, StartHardMode, "hardmode");
|
||||||
add(Permissions.hardmode, DisableHardMode, "stophardmode", "disablehardmode");
|
add(Permissions.hardmode, DisableHardMode, "stophardmode", "disablehardmode");
|
||||||
add(Permissions.cfg, ServerInfo, "stats");
|
add(Permissions.cfg, ServerInfo, "stats");
|
||||||
|
add(Permissions.cfg, WorldInfo, "world");
|
||||||
add(Permissions.converthardmode, ConvertCorruption, "convertcorruption");
|
add(Permissions.converthardmode, ConvertCorruption, "convertcorruption");
|
||||||
add(Permissions.converthardmode, ConvertHallow, "converthallow");
|
add(Permissions.converthardmode, ConvertHallow, "converthallow");
|
||||||
}
|
}
|
||||||
|
|
@ -678,6 +680,12 @@ namespace TShockAPI
|
||||||
args.Player.SendMessage("Machine name: " + Environment.MachineName);
|
args.Player.SendMessage("Machine name: " + Environment.MachineName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void WorldInfo(CommandArgs args)
|
||||||
|
{
|
||||||
|
args.Player.SendMessage("World Name: " + Main.worldName);
|
||||||
|
args.Player.SendMessage("World ID: " + Main.worldID);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Player Management Commands
|
#region Player Management Commands
|
||||||
|
|
@ -693,12 +701,24 @@ namespace TShockAPI
|
||||||
var players = TShock.Utils.FindPlayer(args.Parameters[0]);
|
var players = TShock.Utils.FindPlayer(args.Parameters[0]);
|
||||||
if (players.Count > 1)
|
if (players.Count > 1)
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("More than one player matched your query.", Color.Red);
|
var plrMatches = "";
|
||||||
|
foreach (TSPlayer plr in players)
|
||||||
|
{
|
||||||
|
if (plrMatches.Length != 0)
|
||||||
|
{
|
||||||
|
plrMatches += ", " + plr.Name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plrMatches += plr.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName, Color.Green);
|
args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName + "Group: " + players[0].Group.Name, Color.Green);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|
@ -727,8 +747,20 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
else if (players.Count > 1)
|
else if (players.Count > 1)
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("More than one player matched!", Color.Red);
|
var plrMatches = "";
|
||||||
}
|
foreach (TSPlayer plr in players)
|
||||||
|
{
|
||||||
|
if (plrMatches.Length != 0)
|
||||||
|
{
|
||||||
|
plrMatches += ", " + plr.Name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plrMatches += plr.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string reason = args.Parameters.Count > 1
|
string reason = args.Parameters.Count > 1
|
||||||
|
|
@ -762,8 +794,20 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
else if (players.Count > 1)
|
else if (players.Count > 1)
|
||||||
{
|
{
|
||||||
args.Player.SendMessage("More than one player matched!", Color.Red);
|
var plrMatches = "";
|
||||||
}
|
foreach (TSPlayer plr in players)
|
||||||
|
{
|
||||||
|
if (plrMatches.Length != 0)
|
||||||
|
{
|
||||||
|
plrMatches += ", " + plr.Name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plrMatches += plr.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string reason = args.Parameters.Count > 1
|
string reason = args.Parameters.Count > 1
|
||||||
|
|
@ -1771,6 +1815,80 @@ namespace TShockAPI
|
||||||
args.Player.SendMessage("Incorrect format: /modGroup add|del <group name> <permission to add or remove>", Color.Red);
|
args.Player.SendMessage("Incorrect format: /modGroup add|del <group name> <permission to add or remove>", Color.Red);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ViewGroups(CommandArgs args)
|
||||||
|
{
|
||||||
|
if (args.Parameters.Count > 0)
|
||||||
|
{
|
||||||
|
String com = args.Parameters[0];
|
||||||
|
|
||||||
|
if( com == "list" )
|
||||||
|
{
|
||||||
|
string ret = "Groups: ";
|
||||||
|
foreach( Group g in TShock.Groups.groups )
|
||||||
|
{
|
||||||
|
if (ret.Length > 50)
|
||||||
|
{
|
||||||
|
args.Player.SendMessage(ret, Color.Green);
|
||||||
|
ret = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ret != "" )
|
||||||
|
{
|
||||||
|
ret += ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
ret += g.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret.Length > 0)
|
||||||
|
{
|
||||||
|
args.Player.SendMessage(ret, Color.Green);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if( com == "perm")
|
||||||
|
{
|
||||||
|
if (args.Parameters.Count > 1)
|
||||||
|
{
|
||||||
|
String groupname = args.Parameters[1];
|
||||||
|
|
||||||
|
if( TShock.Groups.GroupExists( groupname ) )
|
||||||
|
{
|
||||||
|
string ret = String.Format("Permissions for {0}: ", groupname);
|
||||||
|
foreach (string p in TShock.Utils.GetGroup( groupname ).permissions)
|
||||||
|
{
|
||||||
|
if (ret.Length > 50)
|
||||||
|
{
|
||||||
|
args.Player.SendMessage(ret, Color.Green);
|
||||||
|
ret = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != "")
|
||||||
|
{
|
||||||
|
ret += ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
ret += p;
|
||||||
|
}
|
||||||
|
if (ret.Length > 0)
|
||||||
|
{
|
||||||
|
args.Player.SendMessage(ret, Color.Green);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
args.Player.SendMessage("Group does not exist.", Color.Red);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.Player.SendMessage("Incorrect format: /group list", Color.Red);
|
||||||
|
args.Player.SendMessage(" /group perm <group name>", Color.Red);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion Group Management
|
#endregion Group Management
|
||||||
|
|
||||||
#region Item Management
|
#region Item Management
|
||||||
|
|
@ -2600,7 +2718,10 @@ namespace TShockAPI
|
||||||
|
|
||||||
private static void Playing(CommandArgs args)
|
private static void Playing(CommandArgs args)
|
||||||
{
|
{
|
||||||
args.Player.SendMessage(string.Format("Current players: {0}.", TShock.Utils.GetPlayers()), 255, 240, 20);
|
string response = args.Player.Group.HasPermission(Permissions.seeids)
|
||||||
|
? TShock.Utils.GetPlayersWithIds()
|
||||||
|
: TShock.Utils.GetPlayers();
|
||||||
|
args.Player.SendMessage(string.Format("Current players: {0}.", response), 255, 240, 20);
|
||||||
args.Player.SendMessage(string.Format("TShock: {0} ({1}): ({2}/{3})", TShock.VersionNum, TShock.VersionCodename,
|
args.Player.SendMessage(string.Format("TShock: {0} ({1}): ({2}/{3})", TShock.VersionNum, TShock.VersionCodename,
|
||||||
TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots));
|
TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,8 @@ namespace TShockAPI
|
||||||
|
|
||||||
[Description("Enable Server Side Inventory checks, EXPERIMENTAL")] public bool ServerSideInventory;
|
[Description("Enable Server Side Inventory checks, EXPERIMENTAL")] public bool ServerSideInventory;
|
||||||
|
|
||||||
|
[Description("Time, in milliseconds, to disallow discarding items after logging in when ServerSideInventory is ON")] public int LogonDiscardThreshold=250;
|
||||||
|
|
||||||
[Description("Disables reporting of playercount to the stat system.")] public bool DisablePlayerCountReporting;
|
[Description("Disables reporting of playercount to the stat system.")] public bool DisablePlayerCountReporting;
|
||||||
|
|
||||||
[Description("Disables clown bomb projectiles from spawning")] public bool DisableClownBombs;
|
[Description("Disables clown bomb projectiles from spawning")] public bool DisableClownBombs;
|
||||||
|
|
@ -175,6 +177,9 @@ namespace TShockAPI
|
||||||
[Description("Disable a player if they exceed this number of projectile new within 1 second.")] public int
|
[Description("Disable a player if they exceed this number of projectile new within 1 second.")] public int
|
||||||
ProjectileThreshold = 50;
|
ProjectileThreshold = 50;
|
||||||
|
|
||||||
|
[Description("Ignore shrapnel from crystal bullets for Projectile Threshold.")] public bool
|
||||||
|
ProjIgnoreShrapnel = true;
|
||||||
|
|
||||||
[Description("Require all players to register or login before being allowed to play.")] public bool RequireLogin;
|
[Description("Require all players to register or login before being allowed to play.")] public bool RequireLogin;
|
||||||
|
|
||||||
[Description(
|
[Description(
|
||||||
|
|
|
||||||
|
|
@ -1426,7 +1426,7 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}*/
|
}*/
|
||||||
if ((tile.type == 128 && newtile.Type == 128) || (tile.type == 105 && newtile.Type == 105))
|
if ((tile.type == 128 && newtile.Type == 128) || (tile.type == 105 && newtile.Type == 105) || (tile.type == 139 && newtile.Type == 139))
|
||||||
{
|
{
|
||||||
if (TShock.Config.EnableInsecureTileFixes)
|
if (TShock.Config.EnableInsecureTileFixes)
|
||||||
{
|
{
|
||||||
|
|
@ -1896,7 +1896,7 @@ namespace TShockAPI
|
||||||
// Server now checks owner + ident, if owner is different, server will create new projectile.
|
// Server now checks owner + ident, if owner is different, server will create new projectile.
|
||||||
/*if (args.Player.Index != owner)
|
/*if (args.Player.Index != owner)
|
||||||
{
|
{
|
||||||
args.Player.Disable("Owner and player ID does not match to update projectile");
|
args.Player.Disable(String.Format("Owner ({0}) and player ID ({1}) does not match to update projectile", owner, args.Player.Index));
|
||||||
args.Player.RemoveProjectile(ident, owner);
|
args.Player.RemoveProjectile(ident, owner);
|
||||||
return true;
|
return true;
|
||||||
}*/
|
}*/
|
||||||
|
|
@ -1916,8 +1916,15 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (!TShock.Config.IgnoreProjUpdate && TShock.CheckProjectilePermission(args.Player, index, type))
|
if (!TShock.Config.IgnoreProjUpdate && TShock.CheckProjectilePermission(args.Player, index, type))
|
||||||
{
|
{
|
||||||
args.Player.Disable("Does not have projectile permission to update projectile.");
|
if (type == 100)
|
||||||
args.Player.RemoveProjectile(ident, owner);
|
{ //fix for skele prime
|
||||||
|
Log.Debug("Skeletron Prime's death laser ignored for cheat detection..");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
args.Player.Disable("Does not have projectile permission to update projectile.");
|
||||||
|
args.Player.RemoveProjectile(ident, owner);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1936,7 +1943,14 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection))
|
if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection))
|
||||||
{
|
{
|
||||||
args.Player.ProjectileThreshold++;
|
if ((type ==90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel
|
||||||
|
{
|
||||||
|
Log.Debug("Ignoring shrapnel per config..");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
args.Player.ProjectileThreshold++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -1959,7 +1973,7 @@ namespace TShockAPI
|
||||||
// Players can no longer destroy projectiles that are not theirs as of 1.1.2
|
// Players can no longer destroy projectiles that are not theirs as of 1.1.2
|
||||||
/*if (args.Player.Index != Main.projectile[index].owner && type != 102 && type != 100 && !TShock.Config.IgnoreProjKill) // workaround for skeletron prime projectiles
|
/*if (args.Player.Index != Main.projectile[index].owner && type != 102 && type != 100 && !TShock.Config.IgnoreProjKill) // workaround for skeletron prime projectiles
|
||||||
{
|
{
|
||||||
args.Player.Disable("Owner and player ID does not match to kill projectile");
|
args.Player.Disable(String.Format("Owner ({0}) and player ID ({1}) does not match to kill projectile of type: {3}", Main.projectile[index].owner, args.Player.Index, type));
|
||||||
args.Player.RemoveProjectile(ident, owner);
|
args.Player.RemoveProjectile(ident, owner);
|
||||||
return true;
|
return true;
|
||||||
}*/
|
}*/
|
||||||
|
|
@ -2360,7 +2374,14 @@ namespace TShockAPI
|
||||||
args.Player.SendData(PacketTypes.ItemDrop, "", id);
|
args.Player.SendData(PacketTypes.ItemDrop, "", id);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if ((TShock.Config.ServerSideInventory) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.Config.LogonDiscardThreshold))
|
||||||
|
{
|
||||||
|
//Player is probably trying to sneak items onto the server in their hands!!!
|
||||||
|
Log.ConsoleInfo(string.Format("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.name));
|
||||||
|
args.Player.SendData(PacketTypes.ItemDrop, "", id);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
if (TShock.CheckIgnores(args.Player))
|
if (TShock.CheckIgnores(args.Player))
|
||||||
{
|
{
|
||||||
args.Player.SendData(PacketTypes.ItemDrop, "", id);
|
args.Player.SendData(PacketTypes.ItemDrop, "", id);
|
||||||
|
|
@ -2591,6 +2612,46 @@ namespace TShockAPI
|
||||||
return true;
|
return true;
|
||||||
if (plr != args.Player.Index)
|
if (plr != args.Player.Index)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
string boss;
|
||||||
|
switch (Type)
|
||||||
|
{
|
||||||
|
case -2:
|
||||||
|
boss = "the Snow Legion";
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
boss = "a Goblin Invasion";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
boss = "the Eye of Cthulhu";
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
boss = "the Eater of Worlds";
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
boss = "the King Slime";
|
||||||
|
break;
|
||||||
|
case 125:
|
||||||
|
boss = "Retinazer";
|
||||||
|
break;
|
||||||
|
case 126:
|
||||||
|
boss = "Spazmatism";
|
||||||
|
break;
|
||||||
|
case 134:
|
||||||
|
boss = "the Destroyer";
|
||||||
|
break;
|
||||||
|
case sbyte.MaxValue:
|
||||||
|
boss = "Skeleton Prime";
|
||||||
|
break;
|
||||||
|
case 128:
|
||||||
|
boss = "Skeleton Prime";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
boss = "error";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
TShock.Utils.SendLogs(string.Format("{0} summoned {1}", args.Player.Name, boss), Color.Red);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,10 @@ namespace TShockAPI
|
||||||
[Description("User can start invasions (Goblin/Snow Legion) using items")]
|
[Description("User can start invasions (Goblin/Snow Legion) using items")]
|
||||||
public static readonly string startinvasion;
|
public static readonly string startinvasion;
|
||||||
|
|
||||||
static Permissions()
|
[Description("User can see the id of players with /who")]
|
||||||
|
public static readonly string seeids;
|
||||||
|
|
||||||
|
static Permissions()
|
||||||
{
|
{
|
||||||
foreach (var field in typeof (Permissions).GetFields())
|
foreach (var field in typeof (Permissions).GetFields())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -48,5 +48,5 @@ using System.Runtime.InteropServices;
|
||||||
// Build Number
|
// Build Number
|
||||||
// MMdd of the build
|
// MMdd of the build
|
||||||
|
|
||||||
[assembly: AssemblyVersion("3.5.1.0122")]
|
[assembly: AssemblyVersion("3.6.0.0126")]
|
||||||
[assembly: AssemblyFileVersion("3.5.1.0122")]
|
[assembly: AssemblyFileVersion("3.6.0.0126")]
|
||||||
|
|
|
||||||
|
|
@ -76,11 +76,11 @@ namespace TShockAPI
|
||||||
public bool RequiresPassword;
|
public bool RequiresPassword;
|
||||||
public bool SilentKickInProgress;
|
public bool SilentKickInProgress;
|
||||||
public List<Point> IceTiles;
|
public List<Point> IceTiles;
|
||||||
public long RPm=1;
|
public long RPm=1;
|
||||||
public long WPm=1;
|
public long WPm=1;
|
||||||
public long SPm=1;
|
public long SPm=1;
|
||||||
public long BPm=1;
|
public long BPm=1;
|
||||||
|
public long LoginMS;
|
||||||
|
|
||||||
public bool RealPlayer
|
public bool RealPlayer
|
||||||
{
|
{
|
||||||
|
|
@ -268,8 +268,8 @@ namespace TShockAPI
|
||||||
|
|
||||||
SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false);
|
SendWorldInfo(Main.spawnTileX, Main.spawnTileY, false);
|
||||||
|
|
||||||
TPlayer.position.X = tilex * 16;
|
TPlayer.position.X = (float)(tilex * 16 + 8 - TPlayer.width /2);
|
||||||
TPlayer.position.Y = tiley * 16;
|
TPlayer.position.Y = (float)(tiley * 16 - TPlayer.height);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -308,22 +308,26 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool SendTileSquare(int x, int y, int size = 10)
|
public virtual bool SendTileSquare(int x, int y, int size = 10)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int num = (size - 1)/2;
|
int num = (size - 1)/2;
|
||||||
SendData(PacketTypes.TileSendSquare, "", size, (x - num), (y - num));
|
SendData(PacketTypes.TileSendSquare, "", size, (x - num), (y - num));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (IndexOutOfRangeException)
|
||||||
{
|
{
|
||||||
Log.Error(ex.ToString());
|
// This is expected if square exceeds array.
|
||||||
}
|
}
|
||||||
return false;
|
catch (Exception ex)
|
||||||
}
|
{
|
||||||
|
Log.Error(ex.ToString());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void GiveItem(int type, string name, int width, int height, int stack, int prefix = 0)
|
public virtual void GiveItem(int type, string name, int width, int height, int stack, int prefix = 0)
|
||||||
{
|
{
|
||||||
int itemid = Item.NewItem((int) X, (int) Y, width, height, type, stack, true, prefix);
|
int itemid = Item.NewItem((int) X, (int) Y, width, height, type, stack, true, prefix);
|
||||||
// This is for special pickaxe/hammers/swords etc
|
// This is for special pickaxe/hammers/swords etc
|
||||||
|
|
|
||||||
|
|
@ -819,6 +819,7 @@ namespace TShockAPI
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
player.LoginMS= DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
||||||
|
|
||||||
Utils.ShowFileToUser(player, "motd.txt");
|
Utils.ShowFileToUser(player, "motd.txt");
|
||||||
|
|
||||||
|
|
@ -1153,10 +1154,9 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){
|
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 2000){
|
||||||
player.SendMessage("Spawn protected from changes.", Color.Red);
|
player.SendMessage("Spawn protected from changes.", Color.Red);
|
||||||
player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
||||||
|
}
|
||||||
}
|
return true;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1167,14 +1167,14 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
if (!player.Group.HasPermission(Permissions.canbuild))
|
if (!player.Group.HasPermission(Permissions.canbuild))
|
||||||
{
|
{
|
||||||
|
|
||||||
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){
|
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.BPm) > 2000){
|
||||||
player.SendMessage("You do not have permission to build!", Color.Red);
|
player.SendMessage("You do not have permission to build!", Color.Red);
|
||||||
player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
player.BPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) &&
|
if (!player.Group.HasPermission(Permissions.editspawn) && !Regions.CanBuild(tileX, tileY, player) &&
|
||||||
Regions.InArea(tileX, tileY))
|
Regions.InArea(tileX, tileY))
|
||||||
{
|
{
|
||||||
|
|
@ -1182,24 +1182,19 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){
|
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.RPm) > 2000){
|
||||||
player.SendMessage("Region protected from changes.", Color.Red);
|
player.SendMessage("Region protected from changes.", Color.Red);
|
||||||
player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
player.RPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.DisableBuild)
|
if (Config.DisableBuild)
|
||||||
{
|
{
|
||||||
if (!player.Group.HasPermission(Permissions.editspawn))
|
if (!player.Group.HasPermission(Permissions.editspawn))
|
||||||
{
|
{
|
||||||
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){
|
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.WPm) > 2000){
|
||||||
player.SendMessage("World protected from changes.", Color.Red);
|
player.SendMessage("World protected from changes.", Color.Red);
|
||||||
player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
player.WPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1210,11 +1205,11 @@ namespace TShockAPI
|
||||||
var flag = CheckSpawn(tileX, tileY);
|
var flag = CheckSpawn(tileX, tileY);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){
|
if (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - player.SPm) > 1000){
|
||||||
player.SendMessage("Spawn protected from changes.", Color.Red);
|
player.SendMessage("Spawn protected from changes.", Color.Red);
|
||||||
player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
player.SPm=DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,29 @@ namespace TShockAPI
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used for some places where a list of players might be used.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>String of players and their id seperated by commas.</returns>
|
||||||
|
public string GetPlayersWithIds()
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
foreach (TSPlayer player in TShock.Players)
|
||||||
|
{
|
||||||
|
if (player != null && player.Active)
|
||||||
|
{
|
||||||
|
if (sb.Length != 0)
|
||||||
|
{
|
||||||
|
sb.Append(", ");
|
||||||
|
}
|
||||||
|
sb.Append(player.Name);
|
||||||
|
string id = "( " + Convert.ToString(TShock.Users.GetUserID(player.UserAccountName)) + " )";
|
||||||
|
sb.Append(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds a player and gets IP as string
|
/// Finds a player and gets IP as string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue