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");
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);
SaveWorld.Start();

View file

@ -349,7 +349,8 @@ namespace TShockAPI
{
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;
}
}
@ -361,7 +362,7 @@ namespace TShockAPI
args.Player.IgnoreActionsForInventory = false;
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);
Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]);
@ -1252,12 +1253,20 @@ namespace TShockAPI
{
switch (Main.tile[x, y].type)
{
case 22:
case 25:
Main.tile[x, y].type = 117;
break;
case 23:
Main.tile[x, y].type = 109;
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:
Main.tile[x, y].type = 116;
break;

View file

@ -39,8 +39,8 @@ namespace TShockAPI
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.")]
public bool InfiniteInvasion;
[Description("Enable or disable perma pvp.")]
public bool AlwaysPvP = false;
[Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")]
public string PvPMode = "normal";
[Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")]
public bool SpawnProtection = true;
[Description("Radius from spawn tile for SpawnProtection.")]
@ -179,6 +179,12 @@ namespace TShockAPI
[Description("Disables reporting of playercount to the stat system.")]
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)
{

View file

@ -21,7 +21,9 @@ namespace TShockAPI.DB
new SqlColumn("GroupName", MySqlDbType.VarChar, 32) { Primary = true },
new SqlColumn("Parent", MySqlDbType.VarChar, 32),
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());
creator.EnsureExists(table);
@ -199,6 +201,9 @@ namespace TShockAPI.DB
string groupname = reader.Get<String>("GroupName");
var group = new Group(groupname);
group.Prefix = reader.Get<String>("Prefix");
group.Suffix= reader.Get<String>("Suffix");
//Inherit Given commands
String[] commands = reader.Get<String>("Commands").Split(',');
foreach (var t in commands)

View file

@ -68,15 +68,18 @@ namespace TShockAPI.DB
return playerData;
}
public bool InsertPlayerData(TSPlayer player, int acctid)
public bool InsertPlayerData(TSPlayer player)
{
PlayerData playerData = player.PlayerData;
if (!GetPlayerData(player, acctid).exists)
if (!player.IsLoggedIn)
return false;
if (!GetPlayerData(player, player.UserID).exists)
{
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;
}
catch (Exception ex)
@ -88,7 +91,7 @@ namespace TShockAPI.DB
{
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;
}
catch (Exception ex)

View file

@ -308,6 +308,10 @@ namespace TShockAPI
var tile = Main.tile[realx, realy];
var newtile = tiles[x, y];
if(TShock.CheckTilePermission(args.Player, x, y))
{
continue;
}
if(TShock.CheckRangePermission(args.Player, x, y))
{
continue;
}
@ -474,6 +478,12 @@ namespace TShockAPI
{
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"))
{
args.Player.SendTileSquare(tileX, tileY);
@ -504,6 +514,17 @@ namespace TShockAPI
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)
{
args.Player.TileThreshold++;
@ -543,7 +564,7 @@ namespace TShockAPI
args.TPlayer.hostile = pvp;
if (TShock.Config.AlwaysPvP)
if (TShock.Config.PvPMode == "always")
{
if (pvp == true)
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);
}
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);
}
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);
}
@ -772,11 +797,18 @@ namespace TShockAPI
args.Player.SendTileSquare(tileX, tileY);
return true;
}
if (TShock.CheckTilePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY);
return true;
}
if (TShock.CheckRangePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY);
return true;
}
return false;
}
@ -807,6 +839,12 @@ namespace TShockAPI
return true;
}
if (TShock.CheckRangePermission(args.Player, tileX, tileY))
{
args.Player.SendTileSquare(tileX, tileY);
return true;
}
return false;
}
@ -851,7 +889,7 @@ namespace TShockAPI
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;
}
@ -891,6 +929,12 @@ namespace TShockAPI
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;
}
@ -905,6 +949,12 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.SignNew, "", id);
return true;
}
if (TShock.CheckRangePermission(args.Player, x, y))
{
args.Player.SendData(PacketTypes.SignNew, "", id);
return true;
}
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));
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;
}
@ -955,7 +1011,7 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.PlayerBuff, "", id);
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);
return true;
@ -989,7 +1045,7 @@ namespace TShockAPI
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);
return true;
@ -1055,7 +1111,7 @@ namespace TShockAPI
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.PlayerUpdate, "", id);

View file

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

View file

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

View file

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

View file

@ -518,7 +518,7 @@ namespace TShockAPI
if (tsplr.IsLoggedIn)
{
tsplr.PlayerData.CopyInventory(tsplr);
InventoryDB.InsertPlayerData(tsplr, tsplr.UserID);
InventoryDB.InsertPlayerData(tsplr);
}
if (Config.RememberLeavePos)
@ -706,7 +706,7 @@ namespace TShockAPI
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.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 (Config.DisableTombstones)
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>
@ -922,12 +937,17 @@ namespace TShockAPI
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 false;
}
public static bool CheckTilePermission(TSPlayer player, int tileX, int tileY)
{
if (!player.Group.HasPermission(Permissions.canbuild))
{
player.SendMessage("You do not have permission to build!", Color.Red);