Save player data on backups

Server Side Inventory security improvements, blocking trashcan and "banks" items
CovertCorruption is now more thorough.
PvP Modes, normal, always, disabled now configurable
Initial group prefix/suffix implementation
Range checks reworked, Killing ice blocks now ignored for ice rod.
Adding a NPC name to item banlist will block it from spawning
Added configs to disable snowballs and clown bombs from npcs.
This commit is contained in:
Zidonuke 2011-12-22 17:32:51 -05:00
parent fc735ba829
commit 8cf298ad85
10 changed files with 133 additions and 30 deletions

View file

@ -66,6 +66,15 @@ namespace TShockAPI
TShock.Utils.Broadcast("Server map saving, potential lag spike"); TShock.Utils.Broadcast("Server map saving, potential lag spike");
Console.WriteLine("Backing up world..."); Console.WriteLine("Backing up world...");
foreach (TSPlayer player in TShock.Players)
{
if (player.IsLoggedIn)
{
TShock.InventoryDB.InsertPlayerData(player);
}
}
Thread SaveWorld = new Thread(TShock.Utils.SaveWorld); Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
SaveWorld.Start(); SaveWorld.Start();

View file

@ -349,7 +349,8 @@ namespace TShockAPI
{ {
if (!TShock.CheckInventory(args.Player)) if (!TShock.CheckInventory(args.Player))
{ {
args.Player.SendMessage("Login Failed, Please fix the above errors then log back in.", Color.Cyan); args.Player.SendMessage("Login Failed, Please fix the above errors then /login again.", Color.Cyan);
args.Player.IgnoreActionsForClearingTrashCan = true;
return; return;
} }
} }
@ -361,7 +362,7 @@ namespace TShockAPI
args.Player.IgnoreActionsForInventory = false; args.Player.IgnoreActionsForInventory = false;
args.Player.PlayerData.CopyInventory(args.Player); args.Player.PlayerData.CopyInventory(args.Player);
TShock.InventoryDB.InsertPlayerData(args.Player, args.Player.UserID); TShock.InventoryDB.InsertPlayerData(args.Player);
args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen); args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen);
Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]); Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]);
@ -1252,12 +1253,20 @@ namespace TShockAPI
{ {
switch (Main.tile[x, y].type) switch (Main.tile[x, y].type)
{ {
case 22:
case 25: case 25:
Main.tile[x, y].type = 117; Main.tile[x, y].type = 117;
break; break;
case 23: case 23:
Main.tile[x, y].type = 109; Main.tile[x, y].type = 109;
break; break;
case 32:
Main.tile[x, y].type = 0;
Main.tile[x, y].active = false;
break;
case 24:
Main.tile[x, y].type = 110;
break;
case 112: case 112:
Main.tile[x, y].type = 116; Main.tile[x, y].type = 116;
break; break;

View file

@ -39,8 +39,8 @@ namespace TShockAPI
public bool EnableWhitelist; public bool EnableWhitelist;
[Description("Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map.")] [Description("Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map.")]
public bool InfiniteInvasion; public bool InfiniteInvasion;
[Description("Enable or disable perma pvp.")] [Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")]
public bool AlwaysPvP = false; public string PvPMode = "normal";
[Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")] [Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")]
public bool SpawnProtection = true; public bool SpawnProtection = true;
[Description("Radius from spawn tile for SpawnProtection.")] [Description("Radius from spawn tile for SpawnProtection.")]
@ -179,6 +179,12 @@ namespace TShockAPI
[Description("Disables reporting of playercount to the stat system.")] [Description("Disables reporting of playercount to the stat system.")]
public bool DisablePlayerCountReporting = false; public bool DisablePlayerCountReporting = false;
[Description("Disables clown bomb projectiles from spawning")] //Change this to stop the tile from spawning
public bool DisableClownBombs = false;
[Description("Disables snow ball projectiles from spawning")] //Change this to stop the tile from spawning
public bool DisableSnowBalls = false;
public static ConfigFile Read(string path) public static ConfigFile Read(string path)
{ {

View file

@ -21,7 +21,9 @@ namespace TShockAPI.DB
new SqlColumn("GroupName", MySqlDbType.VarChar, 32) { Primary = true }, new SqlColumn("GroupName", MySqlDbType.VarChar, 32) { Primary = true },
new SqlColumn("Parent", MySqlDbType.VarChar, 32), new SqlColumn("Parent", MySqlDbType.VarChar, 32),
new SqlColumn("Commands", MySqlDbType.Text), new SqlColumn("Commands", MySqlDbType.Text),
new SqlColumn("ChatColor", MySqlDbType.Text) new SqlColumn("ChatColor", MySqlDbType.Text),
new SqlColumn("Prefix", MySqlDbType.Text),
new SqlColumn("Suffix", MySqlDbType.Text)
); );
var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
creator.EnsureExists(table); creator.EnsureExists(table);
@ -199,6 +201,9 @@ namespace TShockAPI.DB
string groupname = reader.Get<String>("GroupName"); string groupname = reader.Get<String>("GroupName");
var group = new Group(groupname); var group = new Group(groupname);
group.Prefix = reader.Get<String>("Prefix");
group.Suffix= reader.Get<String>("Suffix");
//Inherit Given commands //Inherit Given commands
String[] commands = reader.Get<String>("Commands").Split(','); String[] commands = reader.Get<String>("Commands").Split(',');
foreach (var t in commands) foreach (var t in commands)

View file

@ -68,15 +68,18 @@ namespace TShockAPI.DB
return playerData; return playerData;
} }
public bool InsertPlayerData(TSPlayer player, int acctid) public bool InsertPlayerData(TSPlayer player)
{ {
PlayerData playerData = player.PlayerData; PlayerData playerData = player.PlayerData;
if (!GetPlayerData(player, acctid).exists) if (!player.IsLoggedIn)
return false;
if (!GetPlayerData(player, player.UserID).exists)
{ {
try try
{ {
database.Query("INSERT INTO Inventory (Account, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3);", acctid, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory)); database.Query("INSERT INTO Inventory (Account, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3);", player.UserID, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory));
return true; return true;
} }
catch (Exception ex) catch (Exception ex)
@ -88,7 +91,7 @@ namespace TShockAPI.DB
{ {
try try
{ {
database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @2 WHERE Account = @3;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), acctid); database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @2 WHERE Account = @3;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), player.UserID);
return true; return true;
} }
catch (Exception ex) catch (Exception ex)

View file

@ -308,6 +308,10 @@ namespace TShockAPI
var tile = Main.tile[realx, realy]; var tile = Main.tile[realx, realy];
var newtile = tiles[x, y]; var newtile = tiles[x, y];
if(TShock.CheckTilePermission(args.Player, x, y)) if(TShock.CheckTilePermission(args.Player, x, y))
{
continue;
}
if(TShock.CheckRangePermission(args.Player, x, y))
{ {
continue; continue;
} }
@ -474,6 +478,12 @@ namespace TShockAPI
{ {
return true; return true;
} }
if (tiletype == 29 && tiletype == 97 && TShock.Config.ServerSideInventory)
{
args.Player.SendMessage("You cannot place this tile, Server side inventory is enabled.", Color.Red);
args.Player.SendTileSquare(tileX, tileY);
return true;
}
if (tiletype == 48 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && TShock.Itembans.ItemIsBanned("Spikes")) if (tiletype == 48 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && TShock.Itembans.ItemIsBanned("Spikes"))
{ {
args.Player.SendTileSquare(tileX, tileY); args.Player.SendTileSquare(tileX, tileY);
@ -504,6 +514,17 @@ namespace TShockAPI
return true; return true;
} }
if (tiletype == 127 && type == 0) //Ice Block Kill, Bypass range checks and such
{
return false;
}
if (TShock.CheckRangePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY);
return true;
}
if (type == 0 && Main.tileSolid[Main.tile[tileX, tileY].type] && args.Player.Active) if (type == 0 && Main.tileSolid[Main.tile[tileX, tileY].type] && args.Player.Active)
{ {
args.Player.TileThreshold++; args.Player.TileThreshold++;
@ -543,7 +564,7 @@ namespace TShockAPI
args.TPlayer.hostile = pvp; args.TPlayer.hostile = pvp;
if (TShock.Config.AlwaysPvP) if (TShock.Config.PvPMode == "always")
{ {
if (pvp == true) if (pvp == true)
args.Player.IgnoreActionsForPvP = false; args.Player.IgnoreActionsForPvP = false;
@ -591,11 +612,15 @@ namespace TShockAPI
{ {
args.Player.SendMessage("You have been disabled for cheating! Please login with a new character!", Color.Red); args.Player.SendMessage("You have been disabled for cheating! Please login with a new character!", Color.Red);
} }
else if (TShock.Config.ServerSideInventory && !args.Player.IsLoggedIn) else if (args.Player.IgnoreActionsForInventory)
{ {
args.Player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red); args.Player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red);
} }
else if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) else if (args.Player.IgnoreActionsForClearingTrashCan)
{
args.Player.SendMessage("You need to rejoin to ensure your trash can is cleared!", Color.Red);
}
else if (args.Player.IgnoreActionsForPvP)
{ {
args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red);
} }
@ -772,11 +797,18 @@ namespace TShockAPI
args.Player.SendTileSquare(tileX, tileY); args.Player.SendTileSquare(tileX, tileY);
return true; return true;
} }
if (TShock.CheckTilePermission(args.Player, tileX, tileY)) if (TShock.CheckTilePermission(args.Player, tileX, tileY))
{ {
args.Player.SendTileSquare(tileX, tileY); args.Player.SendTileSquare(tileX, tileY);
return true; return true;
} }
if (TShock.CheckRangePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY);
return true;
}
return false; return false;
} }
@ -807,6 +839,12 @@ namespace TShockAPI
return true; return true;
} }
if (TShock.CheckRangePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY);
return true;
}
return false; return false;
} }
@ -851,7 +889,7 @@ namespace TShockAPI
return true; return true;
} }
if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - x) > 32) || (Math.Abs(args.Player.TileY - y) > 32))) if (TShock.CheckRangePermission(args.Player, x, y))
{ {
return true; return true;
} }
@ -891,6 +929,12 @@ namespace TShockAPI
return false; return false;
} }
if (TShock.CheckRangePermission(args.Player, Main.chest[id].x, Main.chest[id].y))
{
args.Player.SendData(PacketTypes.ChestItem, "", id, slot);
return true;
}
return false; return false;
} }
@ -905,6 +949,12 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.SignNew, "", id); args.Player.SendData(PacketTypes.SignNew, "", id);
return true; return true;
} }
if (TShock.CheckRangePermission(args.Player, x, y))
{
args.Player.SendData(PacketTypes.SignNew, "", id);
return true;
}
return false; return false;
} }
@ -936,6 +986,12 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless)); args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless));
return true; return true;
} }
if (TShock.CheckRangePermission(args.Player, x, y))
{
args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless));
return true;
}
return false; return false;
} }
@ -955,7 +1011,7 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.PlayerBuff, "", id); args.Player.SendData(PacketTypes.PlayerBuff, "", id);
return true; return true;
} }
if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - TShock.Players[id].TileX) > 64) || (Math.Abs(args.Player.TileY - TShock.Players[id].TileY) > 64))) if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 64))
{ {
args.Player.SendData(PacketTypes.PlayerBuff, "", id); args.Player.SendData(PacketTypes.PlayerBuff, "", id);
return true; return true;
@ -989,7 +1045,7 @@ namespace TShockAPI
return false; return false;
} }
if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - (pos.X / 16f)) > 64) || (Math.Abs(args.Player.TileY - (pos.Y / 16f)) > 64))) if (TShock.CheckRangePermission(args.Player, (int)(pos.X / 16f), (int)(pos.Y / 16f), 64))
{ {
args.Player.SendData(PacketTypes.ItemDrop, "", id); args.Player.SendData(PacketTypes.ItemDrop, "", id);
return true; return true;
@ -1055,7 +1111,7 @@ namespace TShockAPI
return true; return true;
} }
if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - TShock.Players[id].TileX) > 128) || (Math.Abs(args.Player.TileY - TShock.Players[id].TileY) > 128))) if (TShock.CheckRangePermission(args.Player, TShock.Players[id].TileX, TShock.Players[id].TileY, 128))
{ {
args.Player.SendData(PacketTypes.PlayerHp, "", id); args.Player.SendData(PacketTypes.PlayerHp, "", id);
args.Player.SendData(PacketTypes.PlayerUpdate, "", id); args.Player.SendData(PacketTypes.PlayerUpdate, "", id);

View file

@ -28,6 +28,8 @@ namespace TShockAPI
public string Name { get; set; } public string Name { get; set; }
public Group Parent { get; set; } public Group Parent { get; set; }
public int Order { get; set; } public int Order { get; set; }
public string Prefix { get; set; }
public string Suffix { get; set; }
public byte R = 255; public byte R = 255;
public byte G = 255; public byte G = 255;

View file

@ -13,19 +13,11 @@ namespace TShockAPI
{ {
Utils Utils = TShock.Utils; Utils Utils = TShock.Utils;
public DateTime lastcheck = DateTime.MinValue; public DateTime lastcheck = DateTime.MinValue;
private bool oneCheckin = false; readonly int checkinFrequency = 5;
readonly int checkinFrequency = 1;
public void checkin() public void checkin()
{ {
if (TShock.Config.DisablePlayerCountReporting) if ((DateTime.Now - lastcheck).TotalMinutes >= checkinFrequency)
{
if (!oneCheckin)
{
checkin();
oneCheckin = !oneCheckin;
}
} else if ((DateTime.Now - lastcheck).TotalMinutes >= checkinFrequency)
{ {
ThreadPool.QueueUserWorkItem(callHome); ThreadPool.QueueUserWorkItem(callHome);
lastcheck = DateTime.Now; lastcheck = DateTime.Now;

View file

@ -67,6 +67,7 @@ namespace TShockAPI
public bool IgnoreActionsForPvP = false; public bool IgnoreActionsForPvP = false;
public bool IgnoreActionsForInventory = false; public bool IgnoreActionsForInventory = false;
public bool IgnoreActionsForCheating = false; public bool IgnoreActionsForCheating = false;
public bool IgnoreActionsForClearingTrashCan = false;
public PlayerData PlayerData; public PlayerData PlayerData;
public bool RealPlayer public bool RealPlayer

View file

@ -518,7 +518,7 @@ namespace TShockAPI
if (tsplr.IsLoggedIn) if (tsplr.IsLoggedIn)
{ {
tsplr.PlayerData.CopyInventory(tsplr); tsplr.PlayerData.CopyInventory(tsplr);
InventoryDB.InsertPlayerData(tsplr, tsplr.UserID); InventoryDB.InsertPlayerData(tsplr);
} }
if (Config.RememberLeavePos) if (Config.RememberLeavePos)
@ -706,7 +706,7 @@ namespace TShockAPI
player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red); player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red);
} }
if (Config.AlwaysPvP && !player.TPlayer.hostile) if (TShock.Config.PvPMode == "always" && !player.TPlayer.hostile)
{ {
player.IgnoreActionsForPvP = true; player.IgnoreActionsForPvP = true;
player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red);
@ -741,6 +741,21 @@ namespace TShockAPI
if (e.Info == 43) if (e.Info == 43)
if (Config.DisableTombstones) if (Config.DisableTombstones)
e.Object.SetDefaults(0); e.Object.SetDefaults(0);
if (e.Info == 75)
if (Config.DisableClownBombs)
e.Object.SetDefaults(0);
if (e.Info == 109)
if (Config.DisableSnowBalls)
e.Object.SetDefaults(0);
}
void OnNpcSetDefaults(SetDefaultsEventArgs<NPC, int> e)
{
if (TShock.Itembans.ItemIsBanned(e.Object.name))
{
e.Object.SetDefaults(0);
}
} }
/// <summary> /// <summary>
@ -922,12 +937,17 @@ namespace TShockAPI
return false; return false;
} }
public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY) public static bool CheckRangePermission(TSPlayer player, int x, int y, int range = 32)
{ {
if (TShock.Config.RangeChecks && ((Math.Abs(player.TileX - tileX) > 32) || (Math.Abs(player.TileY - tileY) > 32))) if (TShock.Config.RangeChecks && ((Math.Abs(player.TileX - x) > 32) || (Math.Abs(player.TileY - y) > 32)))
{ {
return true; return true;
} }
return false;
}
public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY)
{
if (!player.Group.HasPermission(Permissions.canbuild)) if (!player.Group.HasPermission(Permissions.canbuild))
{ {
player.SendMessage("You do not have permission to build!", Color.Red); player.SendMessage("You do not have permission to build!", Color.Red);