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:
parent
fc735ba829
commit
8cf298ad85
10 changed files with 133 additions and 30 deletions
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue