public CreateProtection ( TShockAPI.TSPlayer player, System.Drawing.Point tileLocation, bool checkIfBlockTypeProtectableByConfig = true, bool checkTShockBuildAndRegionAccess = true, bool checkLimits = true ) : ProtectionEntry | ||
player | TShockAPI.TSPlayer | |
tileLocation | System.Drawing.Point | |
checkIfBlockTypeProtectableByConfig | bool | |
checkTShockBuildAndRegionAccess | bool | |
checkLimits | bool | |
return | ProtectionEntry |
public void InfiniteChests_ChestDataImport( ProtectionManager protectionManager, out int importedChests, out int overwrittenChests, out int protectFailures ) { string sqliteDatabaseFilePath = Path.Combine(TShock.SavePath, "chests.sqlite"); if (!File.Exists(sqliteDatabaseFilePath)) throw new FileNotFoundException("Sqlite database file not found.", sqliteDatabaseFilePath); IDbConnection dbConnection = null; try { switch (TShock.Config.StorageType.ToLower()) { case "mysql": string[] host = TShock.Config.MySqlHost.Split(':'); dbConnection = new MySqlConnection(string.Format( "Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", host[0], host.Length == 1 ? "3306" : host[1], TShock.Config.MySqlDbName, TShock.Config.MySqlUsername, TShock.Config.MySqlPassword )); break; case "sqlite": dbConnection = new SqliteConnection( string.Format("uri=file://{0},Version=3", sqliteDatabaseFilePath) ); break; default: throw new NotImplementedException("Unsupported database."); } importedChests = 0; overwrittenChests = 0; protectFailures = 0; using (QueryResult reader = dbConnection.QueryReader( "SELECT X, Y, Account, Flags, Items FROM Chests WHERE WorldID = @0", Main.worldID) ) { while (reader.Read()) { int rawX = reader.Get<int>("X"); int rawY = reader.Get<int>("Y"); string rawAccount = reader.Get<string>("Account"); InfiniteChestsChestFlags rawFlags = (InfiniteChestsChestFlags)reader.Get<int>("Flags"); string rawItems = reader.Get<string>("Items"); if (!TerrariaUtils.Tiles.IsValidCoord(rawX, rawY)) continue; DPoint chestLocation = new DPoint(rawX, rawY); if (!TerrariaUtils.Tiles[chestLocation].active() || TerrariaUtils.Tiles[chestLocation].type != (int)BlockType.Chest) { this.PluginTrace.WriteLineWarning(string.Format( "The chest data on the location {0} could not be imported because no corresponding chest does exist in the world.", chestLocation )); continue; } // TSPlayer.All means that the chest must not be protected at all. TSPlayer owner = TSPlayer.All; if (!string.IsNullOrEmpty(rawAccount)) { User tUser = TShock.Users.GetUserByName(rawAccount); if (tUser != null) { owner = new TSPlayer(0); owner.User.ID = tUser.ID; owner.User.Name = tUser.Name; owner.Group = TShock.Groups.GetGroupByName(tUser.Group); } else { // The original owner of the chest does not exist anymore, so we just protect it for the server player. owner = TSPlayer.Server; } } int chestIndex = Chest.FindChest(rawX, rawY); if (chestIndex == -1) { chestIndex = Chest.CreateChest(rawX, rawY); } else { this.PluginTrace.WriteLineWarning(string.Format("The items of the chest {0} were overwritten.", chestLocation)); overwrittenChests++; } Chest tChest = Main.chest[chestIndex]; int[] itemArgs = new int[60]; string[] itemData = rawItems.Split(','); for (int i = 0; i < 120; i++) itemArgs[i] = int.Parse(itemData[i]); for (int i = 0; i < 40; i++) { tChest.item[i] = new Item(); tChest.item[i].netDefaults(itemArgs[i * 3]); tChest.item[i].prefix = (byte)itemArgs[i * 3 + 2]; tChest.item[i].stack = itemArgs[i * 3 + 1]; } importedChests++; if (owner != TSPlayer.All) { try { ProtectionEntry protection = protectionManager.CreateProtection(owner, chestLocation, true, false, false); protection.IsSharedWithEveryone = (rawFlags & InfiniteChestsChestFlags.PUBLIC) != 0; if ((rawFlags & InfiniteChestsChestFlags.REFILL) != 0) protectionManager.SetUpRefillChest(owner, chestLocation, TimeSpan.Zero); } catch (Exception ex) { this.PluginTrace.WriteLineWarning( "Failed to create protection or define refill chest at {0}:\n{1}", chestLocation, ex ); protectFailures++; } } } } } finally { if (dbConnection != null) dbConnection.Close(); } }
public void InfiniteSigns_SignDataImport( ProtectionManager protectionManager, out int importedSigns, out int protectFailures ) { string sqliteDatabaseFilePath = Path.Combine(TShock.SavePath, "signs.sqlite"); if (!File.Exists(sqliteDatabaseFilePath)) throw new FileNotFoundException("Sqlite database file not found.", sqliteDatabaseFilePath); IDbConnection dbConnection = null; try { switch (TShock.Config.StorageType.ToLower()) { case "mysql": string[] host = TShock.Config.MySqlHost.Split(':'); dbConnection = new MySqlConnection(string.Format( "Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", host[0], host.Length == 1 ? "3306" : host[1], TShock.Config.MySqlDbName, TShock.Config.MySqlUsername, TShock.Config.MySqlPassword )); break; case "sqlite": dbConnection = new SqliteConnection( string.Format("uri=file://{0},Version=3", sqliteDatabaseFilePath) ); break; default: throw new NotImplementedException("Unsupported database."); } importedSigns = 0; protectFailures = 0; using (QueryResult reader = dbConnection.QueryReader( "SELECT X, Y, Account, Text FROM Signs WHERE WorldID = @0", Main.worldID) ) { while (reader.Read()) { int rawX = reader.Get<int>("X"); int rawY = reader.Get<int>("Y"); string rawAccount = reader.Get<string>("Account"); string rawText = reader.Get<string>("Text"); if (!TerrariaUtils.Tiles.IsValidCoord(rawX, rawY)) continue; // TSPlayer.All means that the sign must not be protected at all. TSPlayer owner = TSPlayer.All; if (!string.IsNullOrEmpty(rawAccount)) { User tUser = TShock.Users.GetUserByName(rawAccount); if (tUser != null) { owner = new TSPlayer(0); owner.User.ID = tUser.ID; owner.User.Name = tUser.Name; owner.Group = TShock.Groups.GetGroupByName(tUser.Group); } else { // The original owner of the sign does not exist anymore, so we just protect it for the server player. owner = TSPlayer.Server; } } DPoint signLocation = new DPoint(rawX, rawY); int signIndex = -1; for (int i = 0; i < Main.sign.Length; i++) { Sign sign = Main.sign[i]; if (sign == null || sign.x != signLocation.X || sign.y != signLocation.Y) continue; signIndex = i; break; } if (signIndex == -1) { Tile signTile = TerrariaUtils.Tiles[signLocation]; if (!signTile.active() || (signTile.type != (int)BlockType.Sign && signTile.type != (int)BlockType.Tombstone)) { this.PluginTrace.WriteLineWarning(string.Format( "The sign data on the location {0} could not be imported because no corresponding sign does exist in the world.", signLocation )); continue; } for (int i = 0; i < Main.sign.Length; i++) { Sign sign = Main.sign[i]; if (sign == null) continue; Main.sign[i] = new Sign() { x = rawX, y = rawY, text = rawText }; signIndex = i; break; } } else { Sign.TextSign(signIndex, rawText); importedSigns++; } if (owner != TSPlayer.All) { try { protectionManager.CreateProtection(owner, signLocation, true, false, false); } catch (Exception ex) { this.PluginTrace.WriteLineWarning("Failed to create protection at {0}:\n{1}", signLocation, ex); protectFailures++; } } } } } finally { if (dbConnection != null) dbConnection.Close(); } }
public void InfiniteSigns_SignDataImport( ProtectionManager protectionManager, out int importedSigns, out int protectFailures ) { string sqliteDatabaseFilePath = Path.Combine(TShock.SavePath, "signs.sqlite"); if (!File.Exists(sqliteDatabaseFilePath)) { throw new FileNotFoundException("Sqlite database file not found.", sqliteDatabaseFilePath); } IDbConnection dbConnection = null; try { switch (TShock.Config.StorageType.ToLower()) { case "mysql": string[] host = TShock.Config.MySqlHost.Split(':'); dbConnection = new MySqlConnection(string.Format( "Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", host[0], host.Length == 1 ? "3306" : host[1], TShock.Config.MySqlDbName, TShock.Config.MySqlUsername, TShock.Config.MySqlPassword )); break; case "sqlite": dbConnection = new SqliteConnection( string.Format("uri=file://{0},Version=3", sqliteDatabaseFilePath) ); break; default: throw new NotImplementedException("Unsupported database."); } importedSigns = 0; protectFailures = 0; using (QueryResult reader = dbConnection.QueryReader( "SELECT X, Y, Account, Text FROM Signs WHERE WorldID = @0", Main.worldID) ) { while (reader.Read()) { int rawX = reader.Get <int>("X"); int rawY = reader.Get <int>("Y"); string rawAccount = reader.Get <string>("Account"); string rawText = reader.Get <string>("Text"); if (!TerrariaUtils.Tiles.IsValidCoord(rawX, rawY)) { continue; } // TSPlayer.All means that the sign must not be protected at all. TSPlayer owner = TSPlayer.All; if (!string.IsNullOrEmpty(rawAccount)) { UserAccount tUser = TShock.UserAccounts.GetUserAccountByName(rawAccount); if (tUser != null) { owner = new TSPlayer(0); owner.Account.ID = tUser.ID; owner.Account.Name = tUser.Name; owner.Group = TShock.Groups.GetGroupByName(tUser.Group); } else { // The original owner of the sign does not exist anymore, so we just protect it for the server player. owner = TSPlayer.Server; } } DPoint signLocation = new DPoint(rawX, rawY); int signIndex = -1; for (int i = 0; i < Main.sign.Length; i++) { Sign sign = Main.sign[i]; if (sign == null || sign.x != signLocation.X || sign.y != signLocation.Y) { continue; } signIndex = i; break; } if (signIndex == -1) { ITile signTile = TerrariaUtils.Tiles[signLocation]; if (!signTile.active() || (signTile.type != TileID.Signs && signTile.type != TileID.Tombstones)) { this.PluginTrace.WriteLineWarning( $"The sign data on the location {signLocation} could not be imported because no corresponding sign does exist in the world."); continue; } for (int i = 0; i < Main.sign.Length; i++) { Sign sign = Main.sign[i]; if (sign == null) { continue; } Main.sign[i] = new Sign() { x = rawX, y = rawY, text = rawText }; signIndex = i; break; } } else { Sign.TextSign(signIndex, rawText); importedSigns++; } if (owner != TSPlayer.All) { try { protectionManager.CreateProtection(owner, signLocation, true, false, false); } catch (Exception ex) { this.PluginTrace.WriteLineWarning("Failed to create protection at {0}:\n{1}", signLocation, ex); protectFailures++; } } } } } finally { if (dbConnection != null) { dbConnection.Close(); } } }
public void InfiniteChests_ChestDataImport( ChestManager chestManager, ProtectionManager protectionManager, out int importedChests, out int protectFailures ) { //Contract.Assert(this.ChestManager != null); importedChests = 0; protectFailures = 0; IDbConnection dbConnection = null; try { switch (TShock.Config.StorageType.ToLower()) { case "mysql": string[] host = TShock.Config.MySqlHost.Split(':'); dbConnection = new MySqlConnection(string.Format( "Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", host[0], host.Length == 1 ? "3306" : host[1], TShock.Config.MySqlDbName, TShock.Config.MySqlUsername, TShock.Config.MySqlPassword )); break; case "sqlite": string sqliteDatabaseFilePath = Path.Combine(TShock.SavePath, "chests.sqlite"); if (!File.Exists(sqliteDatabaseFilePath)) { throw new FileNotFoundException("Sqlite database file not found.", sqliteDatabaseFilePath); } dbConnection = new SqliteConnection($"uri=file://{sqliteDatabaseFilePath},Version=3"); break; default: throw new NotImplementedException("Unsupported database."); } using (QueryResult reader = dbConnection.QueryReader( "SELECT X, Y, Account, Flags, Items, RefillTime FROM Chests WHERE WorldID = @0", Main.worldID) ) { while (reader.Read()) { int rawX = reader.Get <int>("X"); int rawY = reader.Get <int>("Y"); string rawAccount = reader.Get <string>("Account"); InfiniteChestsChestFlags rawFlags = (InfiniteChestsChestFlags)reader.Get <int>("Flags"); string rawItems = reader.Get <string>("Items"); int refillTime = reader.Get <int>("RefillTime"); if (!TerrariaUtils.Tiles.IsValidCoord(rawX, rawY)) { continue; } DPoint chestLocation = new DPoint(rawX, rawY); ITile chestTile = TerrariaUtils.Tiles[chestLocation]; if (!chestTile.active() || (chestTile.type != TileID.Containers && chestTile.type != TileID.Containers2 && chestTile.type != TileID.Dressers)) { this.PluginTrace.WriteLineWarning($"Chest data at {chestLocation} could not be imported because no corresponding chest tiles exist in the world."); continue; } // TSPlayer.All = chest will not be protected TSPlayer owner = TSPlayer.All; if (!string.IsNullOrEmpty(rawAccount)) { UserAccount tUser = TShock.UserAccounts.GetUserAccountByName(rawAccount); if (tUser != null) { owner = new TSPlayer(0); owner.Account.ID = tUser.ID; owner.Account.Name = tUser.Name; owner.Group = TShock.Groups.GetGroupByName(tUser.Group); } else { // The original owner of the chest does not exist anymore, so we just protect it for the server player. owner = TSPlayer.Server; } } IChest importedChest; try { importedChest = this.ChestManager.ChestFromLocation(chestLocation); if (importedChest == null) { importedChest = this.ChestManager.CreateChestData(chestLocation); } } catch (LimitEnforcementException) { this.PluginTrace.WriteLineWarning($"Chest limit of {Main.chest.Length + this.Config.MaxProtectorChests - 1} has been reached!"); break; } string[] itemData = rawItems.Split(','); int[] itemArgs = new int[itemData.Length]; for (int i = 0; i < itemData.Length; i++) { itemArgs[i] = int.Parse(itemData[i]); } for (int i = 0; i < 40; i++) { int type = itemArgs[i * 3]; int stack = itemArgs[i * 3 + 1]; int prefix = (byte)itemArgs[i * 3 + 2]; importedChest.Items[i] = new ItemData(prefix, type, stack); } importedChests++; if (owner != TSPlayer.All) { try { ProtectionEntry protection = protectionManager.CreateProtection(owner, chestLocation, false, false, false); protection.IsSharedWithEveryone = (rawFlags & InfiniteChestsChestFlags.PUBLIC) != 0; if ((rawFlags & InfiniteChestsChestFlags.REFILL) != 0) { chestManager.SetUpRefillChest(owner, chestLocation, TimeSpan.FromSeconds(refillTime)); } } catch (Exception ex) { this.PluginTrace.WriteLineWarning($"Failed to create protection or define refill chest at {chestLocation}:\n{ex}"); protectFailures++; } } } } } finally { dbConnection?.Close(); } }
public void InfiniteChests_ChestDataImport( ChestManager chestManager, ProtectionManager protectionManager, out int importedChests, out int overwrittenChests, out int protectFailures ) { string sqliteDatabaseFilePath = Path.Combine(TShock.SavePath, "chests.sqlite"); if (!File.Exists(sqliteDatabaseFilePath)) { throw new FileNotFoundException("Sqlite database file not found.", sqliteDatabaseFilePath); } IDbConnection dbConnection = null; try { switch (TShock.Config.StorageType.ToLower()) { case "mysql": string[] host = TShock.Config.MySqlHost.Split(':'); dbConnection = new MySqlConnection(string.Format( "Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", host[0], host.Length == 1 ? "3306" : host[1], TShock.Config.MySqlDbName, TShock.Config.MySqlUsername, TShock.Config.MySqlPassword )); break; case "sqlite": dbConnection = new SqliteConnection( string.Format("uri=file://{0},Version=3", sqliteDatabaseFilePath) ); break; default: throw new NotImplementedException("Unsupported database."); } importedChests = 0; overwrittenChests = 0; protectFailures = 0; using (QueryResult reader = dbConnection.QueryReader( "SELECT X, Y, Account, Flags, Items FROM Chests WHERE WorldID = @0", Main.worldID) ) { while (reader.Read()) { int rawX = reader.Get <int>("X"); int rawY = reader.Get <int>("Y"); string rawAccount = reader.Get <string>("Account"); InfiniteChestsChestFlags rawFlags = (InfiniteChestsChestFlags)reader.Get <int>("Flags"); string rawItems = reader.Get <string>("Items"); if (!TerrariaUtils.Tiles.IsValidCoord(rawX, rawY)) { continue; } DPoint chestLocation = new DPoint(rawX, rawY); if (!TerrariaUtils.Tiles[chestLocation].active() || TerrariaUtils.Tiles[chestLocation].type != (int)BlockType.Chest) { this.PluginTrace.WriteLineWarning(string.Format( "The chest data on the location {0} could not be imported because no corresponding chest does exist in the world.", chestLocation )); continue; } // TSPlayer.All means that the chest must not be protected at all. TSPlayer owner = TSPlayer.All; if (!string.IsNullOrEmpty(rawAccount)) { User tUser = TShock.Users.GetUserByName(rawAccount); if (tUser != null) { owner = new TSPlayer(0); owner.User.ID = tUser.ID; owner.User.Name = tUser.Name; owner.Group = TShock.Groups.GetGroupByName(tUser.Group); } else { // The original owner of the chest does not exist anymore, so we just protect it for the server player. owner = TSPlayer.Server; } } int chestIndex = Chest.FindChest(rawX, rawY); if (chestIndex == -1) { chestIndex = Chest.CreateChest(rawX, rawY); } else { this.PluginTrace.WriteLineWarning(string.Format("The items of the chest {0} were overwritten.", chestLocation)); overwrittenChests++; } Chest tChest = Main.chest[chestIndex]; int[] itemArgs = new int[60]; string[] itemData = rawItems.Split(','); for (int i = 0; i < 120; i++) { itemArgs[i] = int.Parse(itemData[i]); } for (int i = 0; i < 40; i++) { tChest.item[i] = new Item(); tChest.item[i].netDefaults(itemArgs[i * 3]); tChest.item[i].prefix = (byte)itemArgs[i * 3 + 2]; tChest.item[i].stack = itemArgs[i * 3 + 1]; } importedChests++; if (owner != TSPlayer.All) { try { ProtectionEntry protection = protectionManager.CreateProtection(owner, chestLocation, true, false, false); protection.IsSharedWithEveryone = (rawFlags & InfiniteChestsChestFlags.PUBLIC) != 0; if ((rawFlags & InfiniteChestsChestFlags.REFILL) != 0) { chestManager.SetUpRefillChest(owner, chestLocation, TimeSpan.Zero); } } catch (Exception ex) { this.PluginTrace.WriteLineWarning( "Failed to create protection or define refill chest at {0}:\n{1}", chestLocation, ex ); protectFailures++; } } } } } finally { if (dbConnection != null) { dbConnection.Close(); } } }