diff --git a/TShockAPI/BackupManager.cs b/TShockAPI/BackupManager.cs index f624c746..510b4260 100644 --- a/TShockAPI/BackupManager.cs +++ b/TShockAPI/BackupManager.cs @@ -68,7 +68,7 @@ namespace TShockAPI if (worldpath != null && !Directory.Exists(worldpath)) Directory.CreateDirectory(worldpath); - if (TShock.Config.ShowBackupAutosaveMessages) + if (TShock.Config.Settings.ShowBackupAutosaveMessages) { TSPlayer.All.SendInfoMessage("Server map saving, potential lag spike."); @@ -105,4 +105,4 @@ namespace TShockAPI } } } -} \ No newline at end of file +} diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 5aca3613..99d4a9ff 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -164,7 +164,7 @@ namespace TShockAPI if (args.Player.IsBeingDisabled()) { // If the player has moved outside the disabled zone... - if (distance > TShock.Config.MaxRangeForDisabled) + if (distance > TShock.Config.Settings.MaxRangeForDisabled) { // We need to tell them they were disabled and why, then revert the change. if (args.Player.IsDisabledForStackDetection) @@ -177,11 +177,11 @@ namespace TShockAPI } else if (args.Player.IsDisabledForSSC) { - args.Player.SendErrorMessage("Disabled. You need to {0}login to load your saved data.", TShock.Config.CommandSpecifier); + args.Player.SendErrorMessage("Disabled. You need to {0}login to load your saved data.", TShock.Config.Settings.CommandSpecifier); } - else if (TShock.Config.RequireLogin && !args.Player.IsLoggedIn) + else if (TShock.Config.Settings.RequireLogin && !args.Player.IsLoggedIn) { - args.Player.SendErrorMessage("Account needed! Please {0}register or {0}login to play!", TShock.Config.CommandSpecifier); + args.Player.SendErrorMessage("Account needed! Please {0}register or {0}login to play!", TShock.Config.Settings.CommandSpecifier); } else if (args.Player.IsDisabledPendingTrashRemoval) { @@ -257,7 +257,7 @@ namespace TShockAPI return; } - if (args.Player.Dead && TShock.Config.PreventDeadModification) + if (args.Player.Dead && TShock.Config.Settings.PreventDeadModification) { TShock.Log.ConsoleDebug("Bouncer / OnTileEdit rejected from (pdm) {0} {1} {2}", args.Player.Name, action, editData); args.Player.SendTileSquare(tileX, tileY, 4); @@ -345,7 +345,7 @@ namespace TShockAPI } else if (action == EditAction.PlaceTile || action == EditAction.ReplaceTile || action == EditAction.PlaceWall || action == EditAction.ReplaceWall) { - if ((action == EditAction.PlaceTile && TShock.Config.PreventInvalidPlaceStyle) && + if ((action == EditAction.PlaceTile && TShock.Config.Settings.PreventInvalidPlaceStyle) && (MaxPlaceStyles.ContainsKey(editData) && style > MaxPlaceStyles[editData]) && (ExtraneousPlaceStyles.ContainsKey(editData) && style > ExtraneousPlaceStyles[editData])) { @@ -436,7 +436,7 @@ namespace TShockAPI return; } } - if (TShock.Config.AllowCutTilesAndBreakables && Main.tileCut[tile.type]) + if (TShock.Config.Settings.AllowCutTilesAndBreakables && Main.tileCut[tile.type]) { if (action == EditAction.KillWall || action == EditAction.ReplaceWall) { @@ -496,11 +496,11 @@ namespace TShockAPI return; } - if (args.Player.TileKillThreshold >= TShock.Config.TileKillThreshold) + if (args.Player.TileKillThreshold >= TShock.Config.Settings.TileKillThreshold) { - if (TShock.Config.KickOnTileKillThresholdBroken) + if (TShock.Config.Settings.KickOnTileKillThresholdBroken) { - args.Player.Kick(string.Format("Tile kill threshold exceeded {0}.", TShock.Config.TileKillThreshold)); + args.Player.Kick(string.Format("Tile kill threshold exceeded {0}.", TShock.Config.Settings.TileKillThreshold)); } else { @@ -514,11 +514,11 @@ namespace TShockAPI return; } - if (args.Player.TilePlaceThreshold >= TShock.Config.TilePlaceThreshold) + if (args.Player.TilePlaceThreshold >= TShock.Config.Settings.TilePlaceThreshold) { - if (TShock.Config.KickOnTilePlaceThresholdBroken) + if (TShock.Config.Settings.KickOnTilePlaceThresholdBroken) { - args.Player.Kick(string.Format("Tile place threshold exceeded {0}.", TShock.Config.TilePlaceThreshold)); + args.Player.Kick(string.Format("Tile place threshold exceeded {0}.", TShock.Config.Settings.TilePlaceThreshold)); } else { @@ -719,7 +719,7 @@ namespace TShockAPI } // TODO: Remove item ban part of this check - if ((Main.ServerSideCharacter) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.ServerSideCharacterConfig.LogonDiscardThreshold)) + if ((Main.ServerSideCharacter) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.ServerSideCharacterConfig.Settings.LogonDiscardThreshold)) { //Player is probably trying to sneak items onto the server in their hands!!! TShock.Log.ConsoleInfo("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.Name); @@ -771,10 +771,10 @@ namespace TShockAPI return; } - if (damage > TShock.Config.MaxProjDamage && !args.Player.HasPermission(Permissions.ignoredamagecap)) + if (damage > TShock.Config.Settings.MaxProjDamage && !args.Player.HasPermission(Permissions.ignoredamagecap)) { - args.Player.Disable(String.Format("Projectile damage is higher than {0}.", TShock.Config.MaxProjDamage), DisableFlags.WriteToLogAndConsole); - TShock.Log.ConsoleDebug("Bouncer / OnNewProjectile rejected from projectile damage limit from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.MaxProjDamage); + args.Player.Disable(String.Format("Projectile damage is higher than {0}.", TShock.Config.Settings.MaxProjDamage), DisableFlags.WriteToLogAndConsole); + TShock.Log.ConsoleDebug("Bouncer / OnNewProjectile rejected from projectile damage limit from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.Settings.MaxProjDamage); args.Player.RemoveProjectile(ident, owner); args.Handled = true; return; @@ -836,7 +836,7 @@ namespace TShockAPI return; } - if (!TShock.Config.IgnoreProjUpdate && !args.Player.HasPermission(Permissions.ignoreprojectiledetection)) + if (!TShock.Config.Settings.IgnoreProjUpdate && !args.Player.HasPermission(Permissions.ignoreprojectiledetection)) { if (type == ProjectileID.BlowupSmokeMoonlord || type == ProjectileID.PhantasmalEye @@ -863,11 +863,11 @@ namespace TShockAPI // return; } - if (args.Player.ProjectileThreshold >= TShock.Config.ProjectileThreshold) + if (args.Player.ProjectileThreshold >= TShock.Config.Settings.ProjectileThreshold) { - if (TShock.Config.KickOnProjectileThresholdBroken) + if (TShock.Config.Settings.KickOnProjectileThresholdBroken) { - args.Player.Kick(string.Format("Projectile update threshold exceeded {0}.", TShock.Config.ProjectileThreshold)); + args.Player.Kick(string.Format("Projectile update threshold exceeded {0}.", TShock.Config.Settings.ProjectileThreshold)); } else { @@ -875,7 +875,7 @@ namespace TShockAPI args.Player.RemoveProjectile(ident, owner); } - TShock.Log.ConsoleDebug("Bouncer / OnNewProjectile rejected from projectile update threshold from {0} {1}/{2}", args.Player.Name, args.Player.ProjectileThreshold, TShock.Config.ProjectileThreshold); + TShock.Log.ConsoleDebug("Bouncer / OnNewProjectile rejected from projectile update threshold from {0} {1}/{2}", args.Player.Name, args.Player.ProjectileThreshold, TShock.Config.Settings.ProjectileThreshold); TShock.Log.ConsoleDebug("If this player wasn't hacking, please report the projectile update threshold they were disabled for to TShock so we can improve this!"); args.Handled = true; return; @@ -891,7 +891,7 @@ namespace TShockAPI if (!args.Player.HasPermission(Permissions.ignoreprojectiledetection)) { - if (type == ProjectileID.CrystalShard && TShock.Config.ProjIgnoreShrapnel) // Ignore crystal shards + if (type == ProjectileID.CrystalShard && TShock.Config.Settings.ProjIgnoreShrapnel) // Ignore crystal shards { TShock.Log.Debug("Ignoring shrapnel per config.."); } @@ -930,19 +930,19 @@ namespace TShockAPI return; } - if (damage >= TShock.Config.MaxDamage && !args.Player.HasPermission(Permissions.ignoredamagecap)) + if (damage >= TShock.Config.Settings.MaxDamage && !args.Player.HasPermission(Permissions.ignoredamagecap)) { - if (TShock.Config.KickOnDamageThresholdBroken) + if (TShock.Config.Settings.KickOnDamageThresholdBroken) { - args.Player.Kick(string.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage)); + args.Player.Kick(string.Format("NPC damage exceeded {0}.", TShock.Config.Settings.MaxDamage)); } else { - args.Player.Disable(String.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage), DisableFlags.WriteToLogAndConsole); + args.Player.Disable(String.Format("NPC damage exceeded {0}.", TShock.Config.Settings.MaxDamage), DisableFlags.WriteToLogAndConsole); args.Player.SendData(PacketTypes.NpcUpdate, "", id); } - TShock.Log.ConsoleDebug("Bouncer / OnNPCStrike rejected from damage threshold from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.MaxDamage); + TShock.Log.ConsoleDebug("Bouncer / OnNPCStrike rejected from damage threshold from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.Settings.MaxDamage); TShock.Log.ConsoleDebug("If this player wasn't hacking, please report the damage threshold they were disabled for to TShock so we can improve this!"); args.Handled = true; return; @@ -956,7 +956,7 @@ namespace TShockAPI return; } - if (TShock.Config.RangeChecks && + if (TShock.Config.Settings.RangeChecks && !args.Player.IsInRange((int)(Main.npc[id].position.X / 16f), (int)(Main.npc[id].position.Y / 16f), 128)) { TShock.Log.ConsoleDebug("Bouncer / OnNPCStrike rejected from range checks from {0}", args.Player.Name); @@ -1029,7 +1029,7 @@ namespace TShockAPI return; } - if (!args.Player.HasBuildPermission(Main.chest[id].x, Main.chest[id].y) && TShock.Config.RegionProtectChests) + if (!args.Player.HasBuildPermission(Main.chest[id].x, Main.chest[id].y) && TShock.Config.Settings.RegionProtectChests) { TShock.Log.ConsoleDebug("Bouncer / OnChestItemChange rejected from region protection? from {0}", args.Player.Name); args.Handled = true; @@ -1063,7 +1063,7 @@ namespace TShockAPI return; } - if (!args.Player.HasBuildPermission(args.X, args.Y) && TShock.Config.RegionProtectChests) + if (!args.Player.HasBuildPermission(args.X, args.Y) && TShock.Config.Settings.RegionProtectChests) { TShock.Log.ConsoleDebug("Bouncer / OnChestOpen rejected from region check from {0}", args.Player.Name); args.Handled = true; @@ -1083,7 +1083,7 @@ namespace TShockAPI int tileY = args.TileY; int flag = args.Flag; - if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.PreventDeadModification)) + if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.Settings.PreventDeadModification)) { TShock.Log.ConsoleDebug("Bouncer / OnPlaceChest rejected from invalid check from {0}", args.Player.Name); args.Handled = true; @@ -1209,7 +1209,7 @@ namespace TShockAPI byte amount = args.Amount; LiquidType type = args.Type; - if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.PreventDeadModification)) + if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.Settings.PreventDeadModification)) { TShock.Log.ConsoleDebug("Bouncer / OnLiquidSet rejected invalid check from {0}", args.Player.Name); args.Handled = true; @@ -1224,11 +1224,11 @@ namespace TShockAPI return; } - if (args.Player.TileLiquidThreshold >= TShock.Config.TileLiquidThreshold) + if (args.Player.TileLiquidThreshold >= TShock.Config.Settings.TileLiquidThreshold) { - if (TShock.Config.KickOnTileLiquidThresholdBroken) + if (TShock.Config.Settings.KickOnTileLiquidThresholdBroken) { - args.Player.Kick(string.Format("Reached TileLiquid threshold {0}.", TShock.Config.TileLiquidThreshold)); + args.Player.Kick(string.Format("Reached TileLiquid threshold {0}.", TShock.Config.Settings.TileLiquidThreshold)); } else { @@ -1236,7 +1236,7 @@ namespace TShockAPI args.Player.SendTileSquare(tileX, tileY, 1); } - TShock.Log.ConsoleDebug("Bouncer / OnLiquidSet rejected from liquid threshold from {0} {1}/{2}", args.Player.Name, args.Player.TileLiquidThreshold, TShock.Config.TileLiquidThreshold); + TShock.Log.ConsoleDebug("Bouncer / OnLiquidSet rejected from liquid threshold from {0} {1}/{2}", args.Player.Name, args.Player.TileLiquidThreshold, TShock.Config.Settings.TileLiquidThreshold); TShock.Log.ConsoleDebug("If this player wasn't hacking, please report the tile liquid threshold they were disabled for to TShock so we can improve this!"); args.Handled = true; return; @@ -1261,8 +1261,8 @@ namespace TShockAPI } var recentBombs = args.Player.RecentlyCreatedProjectiles.Where(p => projectileTypesThatPerformThisOperation.Contains(Main.projectile[p.Index].type)); - wasThereABombNearby = recentBombs.Any(r => Math.Abs(args.TileX - (Main.projectile[r.Index].position.X / 16.0f)) < TShock.Config.BombExplosionRadius - && Math.Abs(args.TileY - (Main.projectile[r.Index].position.Y / 16.0f)) < TShock.Config.BombExplosionRadius); + wasThereABombNearby = recentBombs.Any(r => Math.Abs(args.TileX - (Main.projectile[r.Index].position.X / 16.0f)) < TShock.Config.Settings.BombExplosionRadius + && Math.Abs(args.TileY - (Main.projectile[r.Index].position.Y / 16.0f)) < TShock.Config.Settings.BombExplosionRadius); } // Liquid anti-cheat @@ -1561,7 +1561,7 @@ namespace TShockAPI // Why 0.2? // @bartico6: Because heal other player only happens when you are using the spectre armor with the hood, // and the healing you can do with that is 20% of your damage. - if (amount >= TShock.Config.MaxDamage * 0.2) + if (amount >= TShock.Config.Settings.MaxDamage * 0.2) { TShock.Log.ConsoleDebug("Bouncer / OnHealOtherPlayer 0.2 check from {0}", args.Player.Name); args.Player.Disable("HealOtherPlayer cheat attempt!", DisableFlags.WriteToLogAndConsole); @@ -1569,17 +1569,17 @@ namespace TShockAPI return; } - if (args.Player.HealOtherThreshold >= TShock.Config.HealOtherThreshold) + if (args.Player.HealOtherThreshold >= TShock.Config.Settings.HealOtherThreshold) { - if (TShock.Config.KickOnHealOtherThresholdBroken) + if (TShock.Config.Settings.KickOnHealOtherThresholdBroken) { - args.Player.Kick(string.Format("HealOtherPlayer threshold exceeded {0}.", TShock.Config.HealOtherThreshold)); + args.Player.Kick(string.Format("HealOtherPlayer threshold exceeded {0}.", TShock.Config.Settings.HealOtherThreshold)); } else { args.Player.Disable("Reached HealOtherPlayer threshold.", DisableFlags.WriteToLogAndConsole); } - TShock.Log.ConsoleDebug("Bouncer / OnHealOtherPlayer rejected heal other threshold from {0} {1}/{2}", args.Player.Name, args.Player.HealOtherThreshold, TShock.Config.HealOtherThreshold); + TShock.Log.ConsoleDebug("Bouncer / OnHealOtherPlayer rejected heal other threshold from {0} {1}/{2}", args.Player.Name, args.Player.HealOtherThreshold, TShock.Config.Settings.HealOtherThreshold); TShock.Log.ConsoleDebug("If this player wasn't hacking, please report the HealOtherPlayer threshold they were disabled for to TShock so we can improve this!"); args.Handled = true; return; @@ -1658,7 +1658,7 @@ namespace TShockAPI return; } - if (args.Player.Dead && TShock.Config.PreventDeadModification) + if (args.Player.Dead && TShock.Config.Settings.PreventDeadModification) { TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected dead people don't do things from {0}", args.Player.Name); args.Player.SendTileSquare(x, y, 4); @@ -1725,9 +1725,9 @@ namespace TShockAPI return; } - if (args.Player.TilePlaceThreshold >= TShock.Config.TilePlaceThreshold) + if (args.Player.TilePlaceThreshold >= TShock.Config.Settings.TilePlaceThreshold) { - TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected tile place threshold from {0} {1}/{2}", args.Player.Name, args.Player.TilePlaceThreshold, TShock.Config.TilePlaceThreshold); + TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected tile place threshold from {0} {1}/{2}", args.Player.Name, args.Player.TilePlaceThreshold, TShock.Config.Settings.TilePlaceThreshold); args.Player.Disable("Reached TilePlace threshold.", DisableFlags.WriteToLogAndConsole); args.Player.SendTileSquare(x, y, 4); args.Handled = true; @@ -1844,7 +1844,7 @@ namespace TShockAPI return; } - if (!TShock.Utils.TilePlacementValid(args.X, args.Y) || (args.Player.Dead && TShock.Config.PreventDeadModification)) + if (!TShock.Utils.TilePlacementValid(args.X, args.Y) || (args.Player.Dead && TShock.Config.Settings.PreventDeadModification)) { TShock.Log.ConsoleDebug("Bouncer / OnGemLockToggle invalid placement/deadmod from {0}", args.Player.Name); args.Handled = true; @@ -1892,7 +1892,7 @@ namespace TShockAPI x = p.X; y = p.Y; - if (!TShock.Utils.TilePlacementValid(x, y) || (args.Player.Dead && TShock.Config.PreventDeadModification)) + if (!TShock.Utils.TilePlacementValid(x, y) || (args.Player.Dead && TShock.Config.Settings.PreventDeadModification)) { TShock.Log.ConsoleDebug("Bouncer / OnMassWireOperation rejected valid placement from {0}", args.Player.Name); args.Handled = true; @@ -1933,19 +1933,19 @@ namespace TShockAPI return; } - if (damage > TShock.Config.MaxDamage && !args.Player.HasPermission(Permissions.ignoredamagecap) && id != args.Player.Index) + if (damage > TShock.Config.Settings.MaxDamage && !args.Player.HasPermission(Permissions.ignoredamagecap) && id != args.Player.Index) { - if (TShock.Config.KickOnDamageThresholdBroken) + if (TShock.Config.Settings.KickOnDamageThresholdBroken) { - TShock.Log.ConsoleDebug("Bouncer / OnPlayerDamage rejected damage threshold from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.MaxDamage); - args.Player.Kick(string.Format("Player damage exceeded {0}.", TShock.Config.MaxDamage)); + TShock.Log.ConsoleDebug("Bouncer / OnPlayerDamage rejected damage threshold from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.Settings.MaxDamage); + args.Player.Kick(string.Format("Player damage exceeded {0}.", TShock.Config.Settings.MaxDamage)); args.Handled = true; return; } else { - TShock.Log.ConsoleDebug("Bouncer / OnPlayerDamage rejected damage threshold2 from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.MaxDamage); - args.Player.Disable(String.Format("Player damage exceeded {0}.", TShock.Config.MaxDamage), DisableFlags.WriteToLogAndConsole); + TShock.Log.ConsoleDebug("Bouncer / OnPlayerDamage rejected damage threshold2 from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.Settings.MaxDamage); + args.Player.Disable(String.Format("Player damage exceeded {0}.", TShock.Config.Settings.MaxDamage), DisableFlags.WriteToLogAndConsole); } args.Player.SendData(PacketTypes.PlayerHp, "", id); args.Player.SendData(PacketTypes.PlayerUpdate, "", id); diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 878c69d1..82aa71dd 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -199,7 +199,7 @@ namespace TShockAPI /// public static string Specifier { - get { return string.IsNullOrWhiteSpace(TShock.Config.CommandSpecifier) ? "/" : TShock.Config.CommandSpecifier; } + get { return string.IsNullOrWhiteSpace(TShock.Config.Settings.CommandSpecifier) ? "/" : TShock.Config.Settings.CommandSpecifier; } } /// @@ -207,7 +207,7 @@ namespace TShockAPI /// public static string SilentSpecifier { - get { return string.IsNullOrWhiteSpace(TShock.Config.CommandSilentSpecifier) ? "." : TShock.Config.CommandSilentSpecifier; } + get { return string.IsNullOrWhiteSpace(TShock.Config.Settings.CommandSilentSpecifier) ? "." : TShock.Config.Settings.CommandSilentSpecifier; } } private delegate void AddChatCommand(string permission, CommandDelegate command, params string[] names); @@ -756,10 +756,10 @@ namespace TShockAPI private static void AttemptLogin(CommandArgs args) { - if (args.Player.LoginAttempts > TShock.Config.MaximumLoginAttempts && (TShock.Config.MaximumLoginAttempts != -1)) + if (args.Player.LoginAttempts > TShock.Config.Settings.MaximumLoginAttempts && (TShock.Config.Settings.MaximumLoginAttempts != -1)) { TShock.Log.Warn(String.Format("{0} ({1}) had {2} or more invalid login attempts and was kicked automatically.", - args.Player.IP, args.Player.Name, TShock.Config.MaximumLoginAttempts)); + args.Player.IP, args.Player.Name, TShock.Config.Settings.MaximumLoginAttempts)); args.Player.Kick("Too many invalid login attempts."); return; } @@ -773,7 +773,7 @@ namespace TShockAPI UserAccount account = TShock.UserAccounts.GetUserAccountByName(args.Player.Name); string password = ""; bool usingUUID = false; - if (args.Parameters.Count == 0 && !TShock.Config.DisableUUIDLogin) + if (args.Parameters.Count == 0 && !TShock.Config.Settings.DisableUUIDLogin) { if (PlayerHooks.OnPlayerPreLogin(args.Player, args.Player.Name, "")) return; @@ -785,7 +785,7 @@ namespace TShockAPI return; password = args.Parameters[0]; } - else if (args.Parameters.Count == 2 && TShock.Config.AllowLoginAnyUsername) + else if (args.Parameters.Count == 2 && TShock.Config.Settings.AllowLoginAnyUsername) { if (String.IsNullOrEmpty(args.Parameters[0])) { @@ -814,7 +814,7 @@ namespace TShockAPI args.Player.SendErrorMessage("A user account by that name does not exist."); } else if (account.VerifyPassword(password) || - (usingUUID && account.UUID == args.Player.UUID && !TShock.Config.DisableUUIDLogin && + (usingUUID && account.UUID == args.Player.UUID && !TShock.Config.Settings.DisableUUIDLogin && !String.IsNullOrWhiteSpace(args.Player.UUID))) { args.Player.PlayerData = TShock.CharacterDB.GetPlayerData(args.Player, account.ID); @@ -847,7 +847,7 @@ namespace TShockAPI args.Player.SendSuccessMessage("Authenticated as " + account.Name + " successfully."); TShock.Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + account.Name + "."); - if ((args.Player.LoginHarassed) && (TShock.Config.RememberLeavePos)) + if ((args.Player.LoginHarassed) && (TShock.Config.Settings.RememberLeavePos)) { if (TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP) != Vector2.Zero) { @@ -863,7 +863,7 @@ namespace TShockAPI } else { - if (usingUUID && !TShock.Config.DisableUUIDLogin) + if (usingUUID && !TShock.Config.Settings.DisableUUIDLogin) { args.Player.SendErrorMessage("UUID does not match this character!"); } @@ -916,7 +916,7 @@ namespace TShockAPI } catch (ArgumentOutOfRangeException) { - args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.MinimumPasswordLength + " characters."); + args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.Settings.MinimumPasswordLength + " characters."); } } else @@ -954,11 +954,11 @@ namespace TShockAPI } catch (ArgumentOutOfRangeException) { - args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.MinimumPasswordLength + " characters."); + args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.Settings.MinimumPasswordLength + " characters."); return; } } - else if (args.Parameters.Count == 2 && TShock.Config.AllowRegisterAnyUsername) + else if (args.Parameters.Count == 2 && TShock.Config.Settings.AllowRegisterAnyUsername) { account.Name = args.Parameters[0]; echoPassword = args.Parameters[1]; @@ -968,7 +968,7 @@ namespace TShockAPI } catch (ArgumentOutOfRangeException) { - args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.MinimumPasswordLength + " characters."); + args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.Settings.MinimumPasswordLength + " characters."); return; } } @@ -978,7 +978,7 @@ namespace TShockAPI return; } - account.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB. --Why? + account.Group = TShock.Config.Settings.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB. --Why? account.UUID = args.Player.UUID; if (TShock.UserAccounts.GetUserAccountByName(account.Name) == null && account.Name != TSServerPlayer.AccountName) // Cheap way of checking for existance of a user @@ -1025,7 +1025,7 @@ namespace TShockAPI } catch (ArgumentOutOfRangeException) { - args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.MinimumPasswordLength + " characters."); + args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.Settings.MinimumPasswordLength + " characters."); return; } account.Group = args.Parameters[3]; @@ -1096,7 +1096,7 @@ namespace TShockAPI } catch (ArgumentOutOfRangeException) { - args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.MinimumPasswordLength + " characters."); + args.Player.SendErrorMessage("Password must be greater than or equal to " + TShock.Config.Settings.MinimumPasswordLength + " characters."); } } // Group changing requires a username or IP address, and a new group to set @@ -1156,7 +1156,7 @@ namespace TShockAPI private static void WorldInfo(CommandArgs args) { args.Player.SendInfoMessage("Information of the currently running world"); - args.Player.SendInfoMessage("Name: " + (TShock.Config.UseServerName ? TShock.Config.ServerName : Main.worldName)); + args.Player.SendInfoMessage("Name: " + (TShock.Config.Settings.UseServerName ? TShock.Config.Settings.ServerName : Main.worldName)); args.Player.SendInfoMessage("Size: {0}x{1}", Main.maxTilesX, Main.maxTilesY); args.Player.SendInfoMessage("ID: " + Main.worldID); args.Player.SendInfoMessage("Seed: " + WorldGen.currentWorldSeed); @@ -1772,22 +1772,22 @@ namespace TShockAPI private static void ForceHalloween(CommandArgs args) { - TShock.Config.ForceHalloween = !TShock.Config.ForceHalloween; + TShock.Config.Settings.ForceHalloween = !TShock.Config.Settings.ForceHalloween; Main.checkHalloween(); if (args.Silent) - args.Player.SendInfoMessage("{0}abled halloween mode!", (TShock.Config.ForceHalloween ? "en" : "dis")); + args.Player.SendInfoMessage("{0}abled halloween mode!", (TShock.Config.Settings.ForceHalloween ? "en" : "dis")); else - TSPlayer.All.SendInfoMessage("{0} {1}abled halloween mode!", args.Player.Name, (TShock.Config.ForceHalloween ? "en" : "dis")); + TSPlayer.All.SendInfoMessage("{0} {1}abled halloween mode!", args.Player.Name, (TShock.Config.Settings.ForceHalloween ? "en" : "dis")); } private static void ForceXmas(CommandArgs args) { - TShock.Config.ForceXmas = !TShock.Config.ForceXmas; + TShock.Config.Settings.ForceXmas = !TShock.Config.Settings.ForceXmas; Main.checkXMas(); if (args.Silent) - args.Player.SendInfoMessage("{0}abled Christmas mode!", (TShock.Config.ForceXmas ? "en" : "dis")); + args.Player.SendInfoMessage("{0}abled Christmas mode!", (TShock.Config.Settings.ForceXmas ? "en" : "dis")); else - TSPlayer.All.SendInfoMessage("{0} {1}abled Christmas mode!", args.Player.Name, (TShock.Config.ForceXmas ? "en" : "dis")); + TSPlayer.All.SendInfoMessage("{0} {1}abled Christmas mode!", args.Player.Name, (TShock.Config.Settings.ForceXmas ? "en" : "dis")); } private static void TempGroup(CommandArgs args) @@ -1898,8 +1898,8 @@ namespace TShockAPI TShock.Utils.Broadcast( "(Server Broadcast) " + message, - Convert.ToByte(TShock.Config.BroadcastRGB[0]), Convert.ToByte(TShock.Config.BroadcastRGB[1]), - Convert.ToByte(TShock.Config.BroadcastRGB[2])); + Convert.ToByte(TShock.Config.Settings.BroadcastRGB[0]), Convert.ToByte(TShock.Config.Settings.BroadcastRGB[1]), + Convert.ToByte(TShock.Config.Settings.BroadcastRGB[2])); } private static void Off(CommandArgs args) @@ -2395,7 +2395,7 @@ namespace TShockAPI TSPlayer.All.SendData(PacketTypes.WorldInfo); args.Player.SendSuccessMessage("Hardmode is now off."); } - else if (!TShock.Config.DisableHardmode) + else if (!TShock.Config.Settings.DisableHardmode) { WorldGen.StartHardmode(); args.Player.SendSuccessMessage("Hardmode is now on."); @@ -4192,7 +4192,7 @@ namespace TShockAPI return; } string passwd = args.Parameters[0]; - TShock.Config.ServerPassword = passwd; + TShock.Config.Settings.ServerPassword = passwd; args.Player.SendSuccessMessage(string.Format("Server password has been changed to: {0}.", passwd)); } @@ -4220,13 +4220,13 @@ namespace TShockAPI { if (args.Parameters.Count == 0) { - args.Player.SendInfoMessage("Current maximum spawns: {0}", TShock.Config.DefaultMaximumSpawns); + args.Player.SendInfoMessage("Current maximum spawns: {0}", TShock.Config.Settings.DefaultMaximumSpawns); return; } if (String.Equals(args.Parameters[0], "default", StringComparison.CurrentCultureIgnoreCase)) { - TShock.Config.DefaultMaximumSpawns = NPC.defaultMaxSpawns = 5; + TShock.Config.Settings.DefaultMaximumSpawns = NPC.defaultMaxSpawns = 5; if (args.Silent) { args.Player.SendInfoMessage("Changed the maximum spawns to 5."); @@ -4245,7 +4245,7 @@ namespace TShockAPI return; } - TShock.Config.DefaultMaximumSpawns = NPC.defaultMaxSpawns = maxSpawns; + TShock.Config.Settings.DefaultMaximumSpawns = NPC.defaultMaxSpawns = maxSpawns; if (args.Silent) { args.Player.SendInfoMessage("Changed the maximum spawns to {0}.", maxSpawns); @@ -4260,13 +4260,13 @@ namespace TShockAPI { if (args.Parameters.Count == 0) { - args.Player.SendInfoMessage("Current spawn rate: {0}", TShock.Config.DefaultSpawnRate); + args.Player.SendInfoMessage("Current spawn rate: {0}", TShock.Config.Settings.DefaultSpawnRate); return; } if (String.Equals(args.Parameters[0], "default", StringComparison.CurrentCultureIgnoreCase)) { - TShock.Config.DefaultSpawnRate = NPC.defaultSpawnRate = 600; + TShock.Config.Settings.DefaultSpawnRate = NPC.defaultSpawnRate = 600; if (args.Silent) { args.Player.SendInfoMessage("Changed the spawn rate to 600."); @@ -4284,7 +4284,7 @@ namespace TShockAPI args.Player.SendWarningMessage("Invalid spawn rate!"); return; } - TShock.Config.DefaultSpawnRate = NPC.defaultSpawnRate = spawnRate; + TShock.Config.Settings.DefaultSpawnRate = NPC.defaultSpawnRate = spawnRate; if (args.Silent) { args.Player.SendInfoMessage("Changed the spawn rate to {0}.", spawnRate); @@ -5008,14 +5008,14 @@ namespace TShockAPI private static void ToggleAntiBuild(CommandArgs args) { - TShock.Config.DisableBuild = !TShock.Config.DisableBuild; - TSPlayer.All.SendSuccessMessage(string.Format("Anti-build is now {0}.", (TShock.Config.DisableBuild ? "on" : "off"))); + TShock.Config.Settings.DisableBuild = !TShock.Config.Settings.DisableBuild; + TSPlayer.All.SendSuccessMessage(string.Format("Anti-build is now {0}.", (TShock.Config.Settings.DisableBuild ? "on" : "off"))); } private static void ProtectSpawn(CommandArgs args) { - TShock.Config.SpawnProtection = !TShock.Config.SpawnProtection; - TSPlayer.All.SendSuccessMessage(string.Format("Spawn is now {0}.", (TShock.Config.SpawnProtection ? "protected" : "open"))); + TShock.Config.Settings.SpawnProtection = !TShock.Config.Settings.SpawnProtection; + TSPlayer.All.SendSuccessMessage(string.Format("Spawn is now {0}.", (TShock.Config.Settings.SpawnProtection ? "protected" : "open"))); } #endregion World Protection Commands @@ -5121,7 +5121,7 @@ namespace TShockAPI return; } - args.Player.SendSuccessMessage("Online Players ({0}/{1})", TShock.Utils.GetActivePlayerCount(), TShock.Config.MaxSlots); + args.Player.SendSuccessMessage("Online Players ({0}/{1})", TShock.Utils.GetActivePlayerCount(), TShock.Config.Settings.MaxSlots); var players = new List(); diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 1a969669..63937614 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -28,6 +28,7 @@ using Rests; namespace TShockAPI { /// The config file class, which contains the configuration for a server that is serialized into JSON and deserialized on load. + [Obsolete("Use TShockAPI.Configuration.TShockConfig", true)] public class ConfigFile { diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 7e195507..0edea2d0 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -107,7 +107,7 @@ namespace TShockAPI.DB int res; if (database.GetSqlType() == SqlType.Mysql) { - res = database.QueryScalar("SELECT COUNT(name) FROM information_schema.tables WHERE table_schema = @0 and table_name = 'Bans'", TShock.Config.MySqlDbName); + res = database.QueryScalar("SELECT COUNT(name) FROM information_schema.tables WHERE table_schema = @0 and table_name = 'Bans'", TShock.Config.Settings.MySqlDbName); } else { diff --git a/TShockAPI/DB/CharacterManager.cs b/TShockAPI/DB/CharacterManager.cs index d057c39a..d6e923c5 100644 --- a/TShockAPI/DB/CharacterManager.cs +++ b/TShockAPI/DB/CharacterManager.cs @@ -126,7 +126,7 @@ namespace TShockAPI.DB { var inventory = new StringBuilder(); - var items = new List(TShock.ServerSideCharacterConfig.StartingInventory); + var items = new List(TShock.ServerSideCharacterConfig.Settings.StartingInventory); if (items.Count < NetItem.MaxInventory) items.AddRange(new NetItem[NetItem.MaxInventory - items.Count]); @@ -135,10 +135,10 @@ namespace TShockAPI.DB { database.Query("INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, spawnX, spawnY, questsCompleted) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8);", account.ID, - TShock.ServerSideCharacterConfig.StartingHealth, - TShock.ServerSideCharacterConfig.StartingHealth, - TShock.ServerSideCharacterConfig.StartingMana, - TShock.ServerSideCharacterConfig.StartingMana, + TShock.ServerSideCharacterConfig.Settings.StartingHealth, + TShock.ServerSideCharacterConfig.Settings.StartingHealth, + TShock.ServerSideCharacterConfig.Settings.StartingMana, + TShock.ServerSideCharacterConfig.Settings.StartingMana, initialItems, -1, -1, diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index eae7df43..e8610421 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -196,7 +196,7 @@ namespace TShockAPI.DB // Load Permissions from the DB LoadPermisions(); - Group.DefaultGroup = GetGroupByName(TShock.Config.DefaultGuestGroupName); + Group.DefaultGroup = GetGroupByName(TShock.Config.Settings.DefaultGuestGroupName); } private void AddDefaultGroup(string name, string parent, string permissions) @@ -271,7 +271,7 @@ namespace TShockAPI.DB group.Parent = parent; } - string query = (TShock.Config.StorageType.ToLower() == "sqlite") + string query = (TShock.Config.Settings.StorageType.ToLower() == "sqlite") ? "INSERT OR IGNORE INTO GroupList (GroupName, Parent, Commands, ChatColor) VALUES (@0, @1, @2, @3);" : "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3"; if (database.Query(query, name, parentname, permissions, chatcolor) == 1) @@ -389,15 +389,15 @@ namespace TShockAPI.DB } // Read the config file to prevent the possible loss of any unsaved changes - TShock.Config = ConfigFile.Read(FileTools.ConfigPath, out bool writeConfig); - if (TShock.Config.DefaultGuestGroupName == oldGroup.Name) + TShock.Config.Read(FileTools.ConfigPath, out bool writeConfig); + if (TShock.Config.Settings.DefaultGuestGroupName == oldGroup.Name) { - TShock.Config.DefaultGuestGroupName = newGroup.Name; + TShock.Config.Settings.DefaultGuestGroupName = newGroup.Name; Group.DefaultGroup = newGroup; } - if (TShock.Config.DefaultRegistrationGroupName == oldGroup.Name) + if (TShock.Config.Settings.DefaultRegistrationGroupName == oldGroup.Name) { - TShock.Config.DefaultRegistrationGroupName = newGroup.Name; + TShock.Config.Settings.DefaultRegistrationGroupName = newGroup.Name; } if (writeConfig) { diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 0ea5c4f1..2d09ba5a 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -496,7 +496,7 @@ namespace TShockAPI.DB return; } - if (currentWorkFactor < TShock.Config.BCryptWorkFactor) + if (currentWorkFactor < TShock.Config.Settings.BCryptWorkFactor) { try { @@ -513,13 +513,13 @@ namespace TShockAPI.DB /// The plain text password to hash public void CreateBCryptHash(string password) { - if (password.Trim().Length < Math.Max(4, TShock.Config.MinimumPasswordLength)) + if (password.Trim().Length < Math.Max(4, TShock.Config.Settings.MinimumPasswordLength)) { - throw new ArgumentOutOfRangeException("password", "Password must be > " + TShock.Config.MinimumPasswordLength + " characters."); + throw new ArgumentOutOfRangeException("password", "Password must be > " + TShock.Config.Settings.MinimumPasswordLength + " characters."); } try { - Password = BCrypt.Net.BCrypt.HashPassword(password.Trim(), TShock.Config.BCryptWorkFactor); + Password = BCrypt.Net.BCrypt.HashPassword(password.Trim(), TShock.Config.Settings.BCryptWorkFactor); } catch (ArgumentOutOfRangeException) { @@ -533,9 +533,9 @@ namespace TShockAPI.DB /// The work factor to use in generating the password hash public void CreateBCryptHash(string password, int workFactor) { - if (password.Trim().Length < Math.Max(4, TShock.Config.MinimumPasswordLength)) + if (password.Trim().Length < Math.Max(4, TShock.Config.Settings.MinimumPasswordLength)) { - throw new ArgumentOutOfRangeException("password", "Password must be > " + TShock.Config.MinimumPasswordLength + " characters."); + throw new ArgumentOutOfRangeException("password", "Password must be > " + TShock.Config.Settings.MinimumPasswordLength + " characters."); } Password = BCrypt.Net.BCrypt.HashPassword(password.Trim(), workFactor); } @@ -563,8 +563,8 @@ namespace TShockAPI.DB if (bytes == null) throw new NullReferenceException("bytes"); Func func; - if (!HashTypes.TryGetValue(TShock.Config.HashAlgorithm.ToLower(), out func)) - throw new NotSupportedException("Hashing algorithm {0} is not supported".SFormat(TShock.Config.HashAlgorithm.ToLower())); + if (!HashTypes.TryGetValue(TShock.Config.Settings.HashAlgorithm.ToLower(), out func)) + throw new NotSupportedException("Hashing algorithm {0} is not supported".SFormat(TShock.Config.Settings.HashAlgorithm.ToLower())); using (var hash = func()) { diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index 7b421213..a408f242 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -23,7 +23,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; -using TShockAPI.ServerSideCharacters; namespace TShockAPI { @@ -110,7 +109,7 @@ namespace TShockAPI bool writeConfig = true; // Default to true if the file doesn't exist if (File.Exists(ConfigPath)) { - TShock.Config = ConfigFile.Read(ConfigPath, out writeConfig); + TShock.Config.Read(ConfigPath, out writeConfig); } if (writeConfig) { @@ -121,21 +120,21 @@ namespace TShockAPI bool writeSSCConfig = true; // Default to true if the file doesn't exist if (File.Exists(ServerSideCharacterConfigPath)) { - TShock.ServerSideCharacterConfig = - ServerSideConfig.Read(ServerSideCharacterConfigPath, out writeSSCConfig); + TShock.ServerSideCharacterConfig.Read(ServerSideCharacterConfigPath, out writeSSCConfig); } if (writeSSCConfig) { // Add all the missing config properties in the json file - TShock.ServerSideCharacterConfig = new ServerSideConfig + TShock.ServerSideCharacterConfig = new Configuration.ServerSideConfig { - StartingInventory = + Settings = { StartingInventory = new List { new NetItem(-15, 1, 0), new NetItem(-13, 1, 0), new NetItem(-16, 1, 0) } + } }; TShock.ServerSideCharacterConfig.Write(ServerSideCharacterConfigPath); } @@ -148,7 +147,7 @@ namespace TShockAPI /// true/false public static bool OnWhitelist(string ip) { - if (!TShock.Config.EnableWhitelist) + if (!TShock.Config.Settings.EnableWhitelist) { return true; } @@ -173,20 +172,45 @@ namespace TShockAPI return true; } } + + /// + /// Looks for a 'Settings' token in the json object. If one is not found, returns a new json object with all tokens of the previous object added + /// as children to a root 'Settings' token + /// + /// + /// + internal static JObject AttemptConfigUpgrade(string json) + { + JObject cfg = JObject.Parse(json); + + if (cfg.SelectToken("Settings") == null) + { + JObject newCfg = new JObject + { + { "Settings", cfg } + }; + cfg = newCfg; + } + + return cfg; + } + + internal static TSettings LoadConfigAndCheckForMissingFields(string json, out bool anyMissingFields) + { + return LoadConfigAndCheckForMissingFields(JObject.Parse(json), out anyMissingFields); + } /// - /// Parse some json text and also return whether any fields are missing from the json + /// Parses a JObject into a TSettings object, also emitting a bool indicating if any of the TSetting's fields were missing from the JObject /// - /// The type of the config file object - /// The json text to parse + /// The type of the config file object + /// The json object to parse /// Whether any fields are missing from the config /// The config object - internal static T LoadConfigAndCheckForMissingFields(string json, out bool anyMissingFields) + internal static TSettings LoadConfigAndCheckForMissingFields(JObject jObject, out bool anyMissingFields) { - JObject jObject = JObject.Parse(json); - anyMissingFields = false; - var configFields = new HashSet(typeof(T).GetFields() + var configFields = new HashSet(typeof(Configuration.ConfigFile).GetFields() .Where(field => !field.IsStatic) .Select(field => field.Name)); var jsonFields = new HashSet(jObject @@ -196,7 +220,7 @@ namespace TShockAPI .Select(field => field.Name)); anyMissingFields = !configFields.SetEquals(jsonFields); - return jObject.ToObject(); + return jObject.SelectToken("Settings").ToObject(); } } } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index c4e22d95..55ddaa05 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -2305,13 +2305,13 @@ namespace TShockAPI NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, args.Player.Index, NetworkText.FromLiteral(args.Player.Name), args.Player.Index); return true; } - if (TShock.Config.MediumcoreOnly && difficulty < 1) + if (TShock.Config.Settings.MediumcoreOnly && difficulty < 1) { TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected mediumcore required"); args.Player.Kick("You need to join with a mediumcore player or higher.", true, true); return true; } - if (TShock.Config.HardcoreOnly && difficulty < 2) + if (TShock.Config.Settings.HardcoreOnly && difficulty < 2) { TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected hardcore required"); args.Player.Kick("You need to join with a hardcore player.", true, true); @@ -2359,7 +2359,7 @@ namespace TShockAPI { args.Player.PlayerData.StoreSlot(slot, type, prefix, stack); } - else if (Main.ServerSideCharacter && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck && + else if (Main.ServerSideCharacter && TShock.Config.Settings.DisableLoginBeforeJoin && !bypassTrashCanCheck && args.Player.HasSentInventory && !args.Player.HasPermission(Permissions.bypassssc)) { // The player might have moved an item to their trash can before they performed a single login attempt yet. @@ -2383,7 +2383,7 @@ namespace TShockAPI args.Player.PlayerData = new PlayerData(args.Player); args.Player.PlayerData.CopyCharacter(args.Player); - if (account != null && !TShock.Config.DisableUUIDLogin) + if (account != null && !TShock.Config.Settings.DisableUUIDLogin) { if (account.UUID == args.Player.UUID) { @@ -2424,13 +2424,13 @@ namespace TShockAPI return true; } } - else if (account != null && !TShock.Config.DisableLoginBeforeJoin) + else if (account != null && !TShock.Config.Settings.DisableLoginBeforeJoin) { args.Player.RequiresPassword = true; NetMessage.SendData((int)PacketTypes.PasswordRequired, args.Player.Index); return true; } - else if (!string.IsNullOrEmpty(TShock.Config.ServerPassword)) + else if (!string.IsNullOrEmpty(TShock.Config.Settings.ServerPassword)) { args.Player.RequiresPassword = true; NetMessage.SendData((int)PacketTypes.PasswordRequired, args.Player.Index); @@ -2448,11 +2448,11 @@ namespace TShockAPI if (OnGetSection(args.Player, args.Data, args.Data.ReadInt32(), args.Data.ReadInt32())) return true; - if (TShock.Utils.GetActivePlayerCount() + 1 > TShock.Config.MaxSlots && + if (TShock.Utils.GetActivePlayerCount() + 1 > TShock.Config.Settings.MaxSlots && !args.Player.HasPermission(Permissions.reservedslot)) { TShock.Log.ConsoleDebug("GetDataHandlers / HandleGetSection rejected reserve slot"); - args.Player.Kick(TShock.Config.ServerFullReason, true, true); + args.Player.Kick(TShock.Config.Settings.ServerFullReason, true, true); return true; } @@ -2557,7 +2557,7 @@ namespace TShockAPI if (OnPlayerHP(args.Player, args.Data, plr, cur, max) || cur <= 0 || max <= 0 || args.Player.IgnoreSSCPackets) return true; - if (max > TShock.Config.MaxHP && !args.Player.HasPermission(Permissions.ignorehp)) + if (max > TShock.Config.Settings.MaxHP && !args.Player.HasPermission(Permissions.ignorehp)) { TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerHp rejected over max hp {0}", args.Player.Name); args.Player.Disable("Maximum HP beyond limit", DisableFlags.WriteToLogAndConsole); @@ -2771,7 +2771,7 @@ namespace TShockAPI return true; } - if (TShock.ProjectileBans.ProjectileIsBanned(type, args.Player) && !TShock.Config.IgnoreProjKill) + if (TShock.ProjectileBans.ProjectileIsBanned(type, args.Player) && !TShock.Config.Settings.IgnoreProjKill) { // According to 2012 deathmax, this is a workaround to fix skeletron prime issues // https://github.com/Pryaxis/TShock/commit/a5aa9231239926f361b7246651e32144bbf28dda @@ -2808,7 +2808,7 @@ namespace TShockAPI return true; } - string pvpMode = TShock.Config.PvPMode.ToLowerInvariant(); + string pvpMode = TShock.Config.Settings.PvPMode.ToLowerInvariant(); if (pvpMode == "disabled" || pvpMode == "always" || (DateTime.UtcNow - args.Player.LastPvPTeamChange).TotalSeconds < 5) { TShock.Log.ConsoleDebug("GetDataHandlers / HandleTogglePvp rejected fastswitch {0}", args.Player.Name); @@ -2869,7 +2869,7 @@ namespace TShockAPI args.Player.ActiveChest = id; - if (!args.Player.HasBuildPermission(x, y) && TShock.Config.RegionProtectChests) + if (!args.Player.HasBuildPermission(x, y) && TShock.Config.Settings.RegionProtectChests) { TShock.Log.ConsoleDebug("GetDataHandlers / HandleChestActive rejected build permission and region check {0}", args.Player.Name); args.Player.SendData(PacketTypes.ChestOpen, "", -1); @@ -2923,7 +2923,7 @@ namespace TShockAPI return true; var account = TShock.UserAccounts.GetUserAccountByName(args.Player.Name); - if (account != null && !TShock.Config.DisableLoginBeforeJoin) + if (account != null && !TShock.Config.Settings.DisableLoginBeforeJoin) { if (account.VerifyPassword(password)) { @@ -2970,9 +2970,9 @@ namespace TShockAPI return true; } - if (!string.IsNullOrEmpty(TShock.Config.ServerPassword)) + if (!string.IsNullOrEmpty(TShock.Config.Settings.ServerPassword)) { - if (TShock.Config.ServerPassword == password) + if (TShock.Config.Settings.ServerPassword == password) { args.Player.RequiresPassword = false; if (args.Player.State == 1) @@ -3005,9 +3005,9 @@ namespace TShockAPI if (OnPlayerMana(args.Player, args.Data, plr, cur, max) || cur < 0 || max < 0 || args.Player.IgnoreSSCPackets) return true; - if (max > TShock.Config.MaxMP && !args.Player.HasPermission(Permissions.ignoremp)) + if (max > TShock.Config.Settings.MaxMP && !args.Player.HasPermission(Permissions.ignoremp)) { - TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerMana rejected max mana {0} {1}/{2}", args.Player.Name, max, TShock.Config.MaxMP); + TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerMana rejected max mana {0} {1}/{2}", args.Player.Name, max, TShock.Config.Settings.MaxMP); args.Player.Disable("Maximum MP beyond limit", DisableFlags.WriteToLogAndConsole); return true; } @@ -3092,7 +3092,7 @@ namespace TShockAPI { var buff = args.Data.ReadUInt16(); - if (buff == 10 && TShock.Config.DisableInvisPvP && args.TPlayer.hostile) + if (buff == 10 && TShock.Config.Settings.DisableInvisPvP && args.TPlayer.hostile) buff = 0; if (Netplay.Clients[args.TPlayer.whoAmI].State < 2 && (buff == 156 || buff == 47 || buff == 149)) @@ -3125,7 +3125,7 @@ namespace TShockAPI if (OnNPCSpecial(args.Player, args.Data, id, type)) return true; - if (type == 1 && TShock.Config.DisableDungeonGuardian) + if (type == 1 && TShock.Config.Settings.DisableDungeonGuardian) { TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpecial rejected type 1 for {0}", args.Player.Name); args.Player.SendMessage("The Dungeon Guardian returned you to your spawn point.", Color.Purple); @@ -3275,7 +3275,7 @@ namespace TShockAPI thing = String.Format("summoned the {0}", npc.FullName); break; } - if (TShock.Config.AnonymousBossInvasions) + if (TShock.Config.Settings.AnonymousBossInvasions) TShock.Utils.SendLogs(string.Format("{0} {1}!", args.Player.Name, thing), Color.PaleVioletRed, args.Player); else TShock.Utils.Broadcast(String.Format("{0} {1}!", args.Player.Name, thing), 175, 75, 255); @@ -3712,7 +3712,7 @@ namespace TShockAPI return true; } - if (TShock.Config.AnonymousBossInvasions) + if (TShock.Config.Settings.AnonymousBossInvasions) TShock.Utils.SendLogs(string.Format("{0} started the Old One's Army event!", args.Player.Name), Color.PaleVioletRed, args.Player); else TShock.Utils.Broadcast(string.Format("{0} started the Old One's Army event!", args.Player.Name), 175, 75, 255); @@ -3754,14 +3754,14 @@ namespace TShockAPI return true; args.Player.Dead = true; - args.Player.RespawnTimer = TShock.Config.RespawnSeconds; + args.Player.RespawnTimer = TShock.Config.Settings.RespawnSeconds; foreach (NPC npc in Main.npc) { if (npc.active && (npc.boss || npc.type == 13 || npc.type == 14 || npc.type == 15) && Math.Abs(args.TPlayer.Center.X - npc.Center.X) + Math.Abs(args.TPlayer.Center.Y - npc.Center.Y) < 4000f) { - args.Player.RespawnTimer = TShock.Config.RespawnBossSeconds; + args.Player.RespawnTimer = TShock.Config.Settings.RespawnBossSeconds; break; } } @@ -3770,10 +3770,10 @@ namespace TShockAPI if (args.TPlayer.difficulty == 1 || args.TPlayer.difficulty == 2) // Player is not softcore { bool mediumcore = args.TPlayer.difficulty == 1; - bool shouldBan = mediumcore ? TShock.Config.BanOnMediumcoreDeath : TShock.Config.BanOnHardcoreDeath; - bool shouldKick = mediumcore ? TShock.Config.KickOnMediumcoreDeath : TShock.Config.KickOnHardcoreDeath; - string banReason = mediumcore ? TShock.Config.MediumcoreBanReason : TShock.Config.HardcoreBanReason; - string kickReason = mediumcore ? TShock.Config.MediumcoreKickReason : TShock.Config.HardcoreKickReason; + bool shouldBan = mediumcore ? TShock.Config.Settings.BanOnMediumcoreDeath : TShock.Config.Settings.BanOnHardcoreDeath; + bool shouldKick = mediumcore ? TShock.Config.Settings.KickOnMediumcoreDeath : TShock.Config.Settings.KickOnHardcoreDeath; + string banReason = mediumcore ? TShock.Config.Settings.MediumcoreBanReason : TShock.Config.Settings.HardcoreBanReason; + string kickReason = mediumcore ? TShock.Config.Settings.MediumcoreKickReason : TShock.Config.Settings.HardcoreKickReason; if (shouldBan) { diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 2d39b90a..fa2d1975 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -340,11 +340,11 @@ namespace TShockAPI public SuperAdminGroup() : base("superadmin") { - R = (byte)TShock.Config.SuperAdminChatRGB[0]; - G = (byte)TShock.Config.SuperAdminChatRGB[1]; - B = (byte)TShock.Config.SuperAdminChatRGB[2]; - Prefix = TShock.Config.SuperAdminChatPrefix; - Suffix = TShock.Config.SuperAdminChatSuffix; + R = (byte)TShock.Config.Settings.SuperAdminChatRGB[0]; + G = (byte)TShock.Config.Settings.SuperAdminChatRGB[1]; + B = (byte)TShock.Config.Settings.SuperAdminChatRGB[2]; + Prefix = TShock.Config.Settings.SuperAdminChatPrefix; + Suffix = TShock.Config.Settings.SuperAdminChatSuffix; } /// diff --git a/TShockAPI/Handlers/SendTileRectHandler.cs b/TShockAPI/Handlers/SendTileRectHandler.cs index 73dd698f..2e52baf7 100644 --- a/TShockAPI/Handlers/SendTileRectHandler.cs +++ b/TShockAPI/Handlers/SendTileRectHandler.cs @@ -430,10 +430,10 @@ namespace TShockAPI.Handlers } var rectSize = args.Width * args.Length; - if (rectSize > TShock.Config.TileRectangleSizeThreshold) + if (rectSize > TShock.Config.Settings.TileRectangleSizeThreshold) { TShock.Log.ConsoleDebug("Bouncer / SendTileRect rejected from non-vanilla tilemod from {0}", args.Player.Name); - if (TShock.Config.KickOnTileRectangleSizeThresholdBroken) + if (TShock.Config.Settings.KickOnTileRectangleSizeThresholdBroken) { args.Player.Kick("Unexpected tile threshold reached"); } @@ -509,7 +509,7 @@ namespace TShockAPI.Handlers /// New tiles to be visualised public static void VisualiseTileSetDiff(int tileX, int tileY, int width, int height, NetTile[,] newTiles) { - if (TShock.Config.DebugLogs) + if (TShock.Config.Settings.DebugLogs) { char pad = '0'; for (int y = 0; y < height; y++) diff --git a/TShockAPI/ItemBans.cs b/TShockAPI/ItemBans.cs index 343e20b4..3556d38c 100644 --- a/TShockAPI/ItemBans.cs +++ b/TShockAPI/ItemBans.cs @@ -76,7 +76,7 @@ namespace TShockAPI /// The standard event arguments. internal void OnSecondlyUpdate(EventArgs args) { - DisableFlags disableFlags = TShock.Config.DisableSecondUpdateLogs ? DisableFlags.WriteToConsole : DisableFlags.WriteToLogAndConsole; + DisableFlags disableFlags = TShock.Config.Settings.DisableSecondUpdateLogs ? DisableFlags.WriteToConsole : DisableFlags.WriteToLogAndConsole; foreach (TSPlayer player in TShock.Players) { @@ -153,7 +153,7 @@ namespace TShockAPI internal void OnPlayerUpdate(object sender, PlayerUpdateEventArgs args) { - DisableFlags disableFlags = TShock.Config.DisableSecondUpdateLogs ? DisableFlags.WriteToConsole : DisableFlags.WriteToLogAndConsole; + DisableFlags disableFlags = TShock.Config.Settings.DisableSecondUpdateLogs ? DisableFlags.WriteToConsole : DisableFlags.WriteToLogAndConsole; bool useItem = args.Control.IsUsingItem; TSPlayer player = args.Player; string itemName = player.TPlayer.inventory[args.SelectedItem].Name; diff --git a/TShockAPI/PlayerData.cs b/TShockAPI/PlayerData.cs index 76be1421..46f5471d 100644 --- a/TShockAPI/PlayerData.cs +++ b/TShockAPI/PlayerData.cs @@ -29,10 +29,10 @@ namespace TShockAPI public class PlayerData { public NetItem[] inventory = new NetItem[NetItem.MaxInventory]; - public int health = TShock.ServerSideCharacterConfig.StartingHealth; - public int maxHealth = TShock.ServerSideCharacterConfig.StartingHealth; - public int mana = TShock.ServerSideCharacterConfig.StartingMana; - public int maxMana = TShock.ServerSideCharacterConfig.StartingMana; + public int health = TShock.ServerSideCharacterConfig.Settings.StartingHealth; + public int maxHealth = TShock.ServerSideCharacterConfig.Settings.StartingHealth; + public int mana = TShock.ServerSideCharacterConfig.Settings.StartingMana; + public int maxMana = TShock.ServerSideCharacterConfig.Settings.StartingMana; public bool exists; public int spawnX = -1; public int spawnY = -1; @@ -58,9 +58,9 @@ namespace TShockAPI this.inventory[i] = new NetItem(); } - for (int i = 0; i < TShock.ServerSideCharacterConfig.StartingInventory.Count; i++) + for (int i = 0; i < TShock.ServerSideCharacterConfig.Settings.StartingInventory.Count; i++) { - var item = TShock.ServerSideCharacterConfig.StartingInventory[i]; + var item = TShock.ServerSideCharacterConfig.Settings.StartingInventory[i]; StoreSlot(i, item.NetId, item.PrefixId, item.Stack); } } diff --git a/TShockAPI/RegionHandler.cs b/TShockAPI/RegionHandler.cs index 41b8efbb..671e9933 100644 --- a/TShockAPI/RegionHandler.cs +++ b/TShockAPI/RegionHandler.cs @@ -55,7 +55,7 @@ namespace TShockAPI private void OnGemLockToggle(object sender, GetDataHandlers.GemLockToggleEventArgs e) { - if (TShock.Config.RegionProtectGemLocks) + if (TShock.Config.Settings.RegionProtectGemLocks) { if (!_regionManager.CanBuild(e.X, e.Y, e.Player)) { diff --git a/TShockAPI/Rest/Rest.cs b/TShockAPI/Rest/Rest.cs index 2cc8ef19..86345e77 100644 --- a/TShockAPI/Rest/Rest.cs +++ b/TShockAPI/Rest/Rest.cs @@ -153,7 +153,7 @@ namespace Rests tokenBucketTimer = new Timer((e) => { DegradeBucket(); - }, null, TimeSpan.Zero, TimeSpan.FromMinutes(Math.Max(TShock.Config.RESTRequestBucketDecreaseIntervalMinutes, 1))); + }, null, TimeSpan.Zero, TimeSpan.FromMinutes(Math.Max(TShock.Config.Settings.RESTRequestBucketDecreaseIntervalMinutes, 1))); } catch (Exception ex) @@ -356,7 +356,7 @@ namespace Rests protected virtual object ExecuteCommand(RestCommand cmd, RestVerbs verbs, IParameterCollection parms, IRequest request, IHttpContext context) { object result = cmd.Execute(verbs, parms, request, context); - if (cmd.DoLog && TShock.Config.LogRest) + if (cmd.DoLog && TShock.Config.Settings.LogRest) { TShock.Log.ConsoleInfo("Anonymous requested REST endpoint: " + BuildRequestUri(cmd, verbs, parms, false)); } @@ -430,4 +430,4 @@ namespace Rests #endregion } -} \ No newline at end of file +} diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index b90749e2..c93f8907 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -183,7 +183,7 @@ namespace TShockAPI public void RegisterRestfulCommands() { // Server Commands - if (TShock.Config.EnableTokenEndpointAuthentication) + if (TShock.Config.Settings.EnableTokenEndpointAuthentication) { Rest.Register(new SecureRestCommand("/v2/server/status", ServerStatusV2)); Rest.Register(new SecureRestCommand("/v3/server/motd", ServerMotd)); @@ -398,15 +398,15 @@ namespace TShockAPI { var ret = new RestObject() { - {"name", TShock.Config.ServerName}, + {"name", TShock.Config.Settings.ServerName}, {"serverversion", Main.versionNumber}, {"tshockversion", TShock.VersionNum}, - {"port", TShock.Config.ServerPort}, + {"port", TShock.Config.Settings.ServerPort}, {"playercount", Main.player.Where(p => null != p && p.active).Count()}, - {"maxplayers", TShock.Config.MaxSlots}, - {"world", (TShock.Config.UseServerName ? TShock.Config.ServerName : Main.worldName)}, + {"maxplayers", TShock.Config.Settings.MaxSlots}, + {"world", (TShock.Config.Settings.UseServerName ? TShock.Config.Settings.ServerName : Main.worldName)}, {"uptime", (DateTime.Now - System.Diagnostics.Process.GetCurrentProcess().StartTime).ToString(@"d'.'hh':'mm':'ss")}, - {"serverpassword", !string.IsNullOrEmpty(TShock.Config.ServerPassword)} + {"serverpassword", !string.IsNullOrEmpty(TShock.Config.Settings.ServerPassword)} }; if (GetBool(args.Parameters["players"], false)) @@ -424,18 +424,18 @@ namespace TShockAPI if (GetBool(args.Parameters["rules"], false)) { var rules = new Dictionary(); - rules.Add("AutoSave", TShock.Config.AutoSave); - rules.Add("DisableBuild", TShock.Config.DisableBuild); - rules.Add("DisableClownBombs", TShock.Config.DisableClownBombs); - rules.Add("DisableDungeonGuardian", TShock.Config.DisableDungeonGuardian); - rules.Add("DisableInvisPvP", TShock.Config.DisableInvisPvP); - rules.Add("DisableSnowBalls", TShock.Config.DisableSnowBalls); - rules.Add("DisableTombstones", TShock.Config.DisableTombstones); - rules.Add("EnableWhitelist", TShock.Config.EnableWhitelist); - rules.Add("HardcoreOnly", TShock.Config.HardcoreOnly); - rules.Add("PvPMode", TShock.Config.PvPMode); - rules.Add("SpawnProtection", TShock.Config.SpawnProtection); - rules.Add("SpawnProtectionRadius", TShock.Config.SpawnProtectionRadius); + rules.Add("AutoSave", TShock.Config.Settings.AutoSave); + rules.Add("DisableBuild", TShock.Config.Settings.DisableBuild); + rules.Add("DisableClownBombs", TShock.Config.Settings.DisableClownBombs); + rules.Add("DisableDungeonGuardian", TShock.Config.Settings.DisableDungeonGuardian); + rules.Add("DisableInvisPvP", TShock.Config.Settings.DisableInvisPvP); + rules.Add("DisableSnowBalls", TShock.Config.Settings.DisableSnowBalls); + rules.Add("DisableTombstones", TShock.Config.Settings.DisableTombstones); + rules.Add("EnableWhitelist", TShock.Config.Settings.EnableWhitelist); + rules.Add("HardcoreOnly", TShock.Config.Settings.HardcoreOnly); + rules.Add("PvPMode", TShock.Config.Settings.PvPMode); + rules.Add("SpawnProtection", TShock.Config.Settings.SpawnProtection); + rules.Add("SpawnProtectionRadius", TShock.Config.Settings.SpawnProtectionRadius); rules.Add("ServerSideInventory", Main.ServerSideCharacter); ret.Add("rules", rules); @@ -496,7 +496,7 @@ namespace TShockAPI var group = args.Parameters["group"]; if (string.IsNullOrWhiteSpace(group)) - group = TShock.Config.DefaultRegistrationGroupName; + group = TShock.Config.Settings.DefaultRegistrationGroupName; var password = args.Parameters["password"]; if (string.IsNullOrWhiteSpace(password)) @@ -775,7 +775,7 @@ namespace TShockAPI bool autoSave; if (!bool.TryParse(args.Verbs["state"], out autoSave)) return RestInvalidParam("state"); - TShock.Config.AutoSave = autoSave; + TShock.Config.Settings.AutoSave = autoSave; var resp = RestResponse("AutoSave has been set to " + autoSave); resp.Add("upgrade", "/v3/world/autosave"); @@ -791,11 +791,11 @@ namespace TShockAPI bool autoSave; if (!bool.TryParse(args.Parameters["state"], out autoSave)) { - return RestResponse($"Autosave is currently {(TShock.Config.AutoSave ? "enabled" : "disabled")}"); + return RestResponse($"Autosave is currently {(TShock.Config.Settings.AutoSave ? "enabled" : "disabled")}"); } - TShock.Config.AutoSave = autoSave; + TShock.Config.Settings.AutoSave = autoSave; - return RestResponse($"AutoSave has been {(TShock.Config.AutoSave ? "enabled" : "disabled")}"); + return RestResponse($"AutoSave has been {(TShock.Config.Settings.AutoSave ? "enabled" : "disabled")}"); } [Description("Save the world.")] @@ -840,7 +840,7 @@ namespace TShockAPI { return new RestObject() { - {"name", (TShock.Config.UseServerName ? TShock.Config.ServerName : Main.worldName)}, + {"name", (TShock.Config.Settings.UseServerName ? TShock.Config.Settings.ServerName : Main.worldName)}, {"size", Main.maxTilesX + "*" + Main.maxTilesY}, {"time", Main.time}, {"daytime", Main.dayTime}, diff --git a/TShockAPI/Rest/SecureRest.cs b/TShockAPI/Rest/SecureRest.cs index df5f7001..a88aa764 100644 --- a/TShockAPI/Rest/SecureRest.cs +++ b/TShockAPI/Rest/SecureRest.cs @@ -59,7 +59,7 @@ namespace Rests AppTokens.Add(t.Key, t.Value); } - foreach (KeyValuePair t in TShock.Config.ApplicationRestTokens) + foreach (KeyValuePair t in TShock.Config.Settings.ApplicationRestTokens) { AppTokens.Add(t.Key, t.Value); } @@ -115,7 +115,7 @@ namespace Rests int tokens = 0; if (tokenBucket.TryGetValue(context.RemoteEndPoint.Address.ToString(), out tokens)) { - if (tokens >= TShock.Config.RESTMaximumRequestsPerInterval) + if (tokens >= TShock.Config.Settings.RESTMaximumRequestsPerInterval) { TShock.Log.ConsoleError("A REST login from {0} was blocked as it currently has {1} tokens", context.RemoteEndPoint.Address.ToString(), tokens); tokenBucket[context.RemoteEndPoint.Address.ToString()] += 1; // Tokens over limit, increment by one and reject request @@ -208,7 +208,7 @@ namespace Rests } object result = secureCmd.Execute(verbs, parms, tokenData, request, context); - if (cmd.DoLog && TShock.Config.LogRest) + if (cmd.DoLog && TShock.Config.Settings.LogRest) TShock.Utils.SendLogs(string.Format( "\"{0}\" requested REST endpoint: {1}", tokenData.Username, this.BuildRequestUri(cmd, verbs, parms, false)), Color.PaleVioletRed); diff --git a/TShockAPI/SaveManager.cs b/TShockAPI/SaveManager.cs index c0af6d42..335fe965 100644 --- a/TShockAPI/SaveManager.cs +++ b/TShockAPI/SaveManager.cs @@ -49,7 +49,7 @@ namespace TShockAPI /// public void OnSaveWorld(WorldSaveEventArgs args) { - if (TShock.Config.AnnounceSave) + if (TShock.Config.Settings.AnnounceSave) { // Protect against internal errors causing save failures // These can be caused by an unexpected error such as a bad or out of date plugin @@ -131,7 +131,7 @@ namespace TShockAPI else WorldFile.SaveWorld(task.resetTime); - if (TShock.Config.AnnounceSave) + if (TShock.Config.Settings.AnnounceSave) TShock.Utils.Broadcast("World saved.", Color.Yellow); TShock.Log.Info(string.Format("World saved at ({0})", Main.worldPathName)); diff --git a/TShockAPI/ServerSideCharacters/ServerSideConfig.cs b/TShockAPI/ServerSideCharacters/ServerSideConfig.cs deleted file mode 100644 index 701dce11..00000000 --- a/TShockAPI/ServerSideCharacters/ServerSideConfig.cs +++ /dev/null @@ -1,109 +0,0 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011-2019 Pryaxis & TShock Contributors - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Text; -using Newtonsoft.Json; - -namespace TShockAPI.ServerSideCharacters -{ - public class ServerSideConfig - { - [Description("Enable server side characters, This stops the client from saving character data! EXPERIMENTAL!!!!!")] - public bool Enabled = false; - - [Description("How often SSC should save, in minutes.")] - public int ServerSideCharacterSave = 5; - - [Description("Time, in milliseconds, to disallow discarding items after logging in when ServerSideInventory is ON.")] - public int LogonDiscardThreshold = 250; - - [Description("The starting default health for new SSC.")] - public int StartingHealth = 100; - - [Description("The starting default mana for new SSC.")] - public int StartingMana = 20; - - [Description("The starting default inventory for new SSC.")] - public List StartingInventory = new List(); - - /// - /// Reads a server-side configuration file from a given path - /// - /// The path to the config file - /// - /// Whether the config object has any new fields in it, meaning that the config file has to be - /// overwritten. - /// - /// ConfigFile object - public static ServerSideConfig Read(string path, out bool anyMissingFields) - { - using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) - using (var reader = new StreamReader(fileStream)) - { - string txt = reader.ReadToEnd(); - var config = FileTools.LoadConfigAndCheckForMissingFields(txt, out anyMissingFields); - return config; - } - } - - public void Write(string path) - { - using (var writer = new StreamWriter(path)) - { - writer.Write(JsonConvert.SerializeObject(this, Formatting.Indented)); - } - } - - /// - /// Dumps all configuration options to a text file in Markdown format - /// - public static void DumpDescriptions() - { - var sb = new StringBuilder(); - var defaults = new ServerSideConfig(); - - foreach (var field in defaults.GetType().GetFields().OrderBy(f => f.Name)) - { - if (field.IsStatic) - continue; - - var name = field.Name; - var type = field.FieldType.Name; - - var descattr = - field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute; - var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : "None"; - - var def = field.GetValue(defaults); - - sb.AppendLine("{0} ".SFormat(name)); - sb.AppendLine("Type: {0} ".SFormat(type)); - sb.AppendLine("Description: {0} ".SFormat(desc)); - sb.AppendLine("Default: \"{0}\" ".SFormat(def)); - sb.AppendLine(); - } - - File.WriteAllText("ServerSideConfigDescriptions.txt", sb.ToString()); - } - } -} diff --git a/TShockAPI/SqlLog.cs b/TShockAPI/SqlLog.cs index 599a9de8..31ade10b 100644 --- a/TShockAPI/SqlLog.cs +++ b/TShockAPI/SqlLog.cs @@ -48,7 +48,7 @@ namespace TShockAPI { private readonly IDbConnection _database; private readonly TextLog _backupLog; - private readonly List _failures = new List(TShock.Config.RevertToTextLogsOnSqlFailures); + private readonly List _failures = new List(TShock.Config.Settings.RevertToTextLogsOnSqlFailures); private bool _useTextLog; public string FileName { get; set; } @@ -211,7 +211,7 @@ namespace TShockAPI /// The message to be written. public void ConsoleDebug(string message) { - if (TShock.Config.DebugLogs) + if (TShock.Config.Settings.DebugLogs) { Console.WriteLine("Debug: " + message); Write(message, TraceLevel.Verbose); @@ -234,7 +234,7 @@ namespace TShockAPI /// The message to be written. public void Debug(string message) { - if (TShock.Config.DebugLogs) + if (TShock.Config.Settings.DebugLogs) Write(message, TraceLevel.Verbose); } @@ -245,7 +245,7 @@ namespace TShockAPI /// The format arguments. public void Debug(string format, params object[] args) { - if (TShock.Config.DebugLogs) + if (TShock.Config.Settings.DebugLogs) Debug(string.Format(format, args)); } @@ -314,7 +314,7 @@ namespace TShockAPI }); } - if (_failures.Count >= TShock.Config.RevertToTextLogsOnSqlFailures) + if (_failures.Count >= TShock.Config.Settings.RevertToTextLogsOnSqlFailures) { _useTextLog = true; _backupLog.ConsoleError("SQL Logging disabled due to errors. Reverting to text logging."); @@ -333,4 +333,4 @@ namespace TShockAPI _backupLog.Dispose(); } } -} \ No newline at end of file +} diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index c807229a..20977c8e 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -350,7 +350,7 @@ namespace TShockAPI || IsDisabledForStackDetection || IsDisabledForBannedWearable || IsDisabledPendingTrashRemoval - || !IsLoggedIn && TShock.Config.RequireLogin; + || !IsLoggedIn && TShock.Config.Settings.RequireLogin; } /// Checks to see if a player has hacked item stacks in their inventory, and messages them as it checks. @@ -608,7 +608,7 @@ namespace TShockAPI { int rgX = Math.Abs(TileX - x); int rgY = Math.Abs(TileY - y); - if (TShock.Config.RangeChecks && ((rgX > range) || (rgY > range))) + if (TShock.Config.Settings.RangeChecks && ((rgX > range) || (rgY > range))) { TShock.Log.ConsoleDebug("Rangecheck failed for {0} ({1}, {2}) (rg: {3}/{5}, {4}/{5})", Name, x, y, rgX, rgY, range); return false; @@ -636,12 +636,12 @@ namespace TShockAPI // If the player has bypass on build protection or building is enabled; continue // (General build protection takes precedence over spawn protection) - if (!TShock.Config.DisableBuild || HasPermission(Permissions.antibuild)) + if (!TShock.Config.Settings.DisableBuild || HasPermission(Permissions.antibuild)) { failure = BuildPermissionFailPoint.SpawnProtect; // If they have spawn protect bypass, or it isn't spawn, or it isn't in spawn; continue // (If they have spawn protect bypass, we don't care if it's spawn or not) - if (!TShock.Config.SpawnProtection || HasPermission(Permissions.editspawn) || !Utils.IsInSpawn(x, y)) + if (!TShock.Config.Settings.SpawnProtection || HasPermission(Permissions.editspawn) || !Utils.IsInSpawn(x, y)) { failure = BuildPermissionFailPoint.Regions; // If they have build permission in this region, then they're allowed to continue @@ -730,7 +730,7 @@ namespace TShockAPI { // The goal is to short circuit ASAP. // A subsequent call to HasBuildPermission can figure this out if not explicitly ice. - if (!TShock.Config.AllowIce) + if (!TShock.Config.Settings.AllowIce) { return false; } @@ -1103,7 +1103,7 @@ namespace TShockAPI } PlayerData = new PlayerData(this); - Group = TShock.Groups.GetGroupByName(TShock.Config.DefaultGuestGroupName); + Group = TShock.Groups.GetGroupByName(TShock.Config.Settings.DefaultGuestGroupName); tempGroup = null; if (tempGroupTimer != null) { @@ -1312,8 +1312,8 @@ namespace TShockAPI /// True or false, depending if the item passed the check or not. public bool GiveItemCheck(int type, string name, int stack, int prefix = 0) { - if ((TShock.ItemBans.DataModel.ItemIsBanned(name) && TShock.Config.PreventBannedItemSpawn) && - (TShock.ItemBans.DataModel.ItemIsBanned(name, this) || !TShock.Config.AllowAllowedGroupsToSpawnBannedItems)) + if ((TShock.ItemBans.DataModel.ItemIsBanned(name) && TShock.Config.Settings.PreventBannedItemSpawn) && + (TShock.ItemBans.DataModel.ItemIsBanned(name, this) || !TShock.Config.Settings.AllowAllowedGroupsToSpawnBannedItems)) return false; GiveItem(type, stack, prefix); @@ -1502,7 +1502,7 @@ namespace TShockAPI } } - foo = foo.Replace("%map%", (TShock.Config.UseServerName ? TShock.Config.ServerName : Main.worldName)); + foo = foo.Replace("%map%", (TShock.Config.Settings.UseServerName ? TShock.Config.Settings.ServerName : Main.worldName)); foo = foo.Replace("%players%", String.Join(",", players)); SendMessage(foo, lineColor); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 117a93b9..2794264f 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -38,12 +38,12 @@ using Terraria.Localization; using TerrariaApi.Server; using TShockAPI.DB; using TShockAPI.Hooks; -using TShockAPI.ServerSideCharacters; using Terraria.Utilities; using Microsoft.Xna.Framework; using TShockAPI.Sockets; using TShockAPI.CLI; using TShockAPI.Localization; +using TShockAPI.Configuration; namespace TShockAPI { @@ -101,7 +101,7 @@ namespace TShockAPI /// Contains the information about what research has been performed in Journey mode. public static ResearchDatastore ResearchDatastore; /// Config - Static reference to the config system, for accessing values set in users' config files. - public static ConfigFile Config { get; set; } + public static TShockConfig Config { get; set; } /// ServerSideCharacterConfig - Static reference to the server side character config, for accessing values set by users to modify SSC. public static ServerSideConfig ServerSideCharacterConfig; /// DB - Static reference to the database. @@ -180,11 +180,11 @@ namespace TShockAPI public TShock(Main game) : base(game) { - Config = new ConfigFile(); + Config = new TShockConfig(); ServerSideCharacterConfig = new ServerSideConfig(); - ServerSideCharacterConfig.StartingInventory.Add(new NetItem(-15, 1, 0)); - ServerSideCharacterConfig.StartingInventory.Add(new NetItem(-13, 1, 0)); - ServerSideCharacterConfig.StartingInventory.Add(new NetItem(-16, 1, 0)); + ServerSideCharacterConfig.Settings.StartingInventory.Add(new NetItem(-15, 1, 0)); + ServerSideCharacterConfig.Settings.StartingInventory.Add(new NetItem(-13, 1, 0)); + ServerSideCharacterConfig.Settings.StartingInventory.Add(new NetItem(-16, 1, 0)); Order = 0; instance = this; } @@ -221,10 +221,10 @@ namespace TShockAPI if (!Directory.Exists(SavePath)) Directory.CreateDirectory(SavePath); - ConfigFile.ConfigRead += OnConfigRead; + TShockConfig.OnConfigRead += OnConfigRead; FileTools.SetupConfig(); - Main.ServerSideCharacter = ServerSideCharacterConfig.Enabled; + Main.ServerSideCharacter = ServerSideCharacterConfig.Settings.Enabled; //TSAPI previously would do this automatically, but the vanilla server wont if (Netplay.ServerIP == null) @@ -233,7 +233,7 @@ namespace TShockAPI DateTime now = DateTime.Now; // Log path was not already set by the command line parameter? if (LogPath == LogPathDefault) - LogPath = Config.LogPath; + LogPath = Config.Settings.LogPath; try { logFilename = Path.Combine(LogPath, now.ToString(LogFormat) + ".log"); @@ -262,25 +262,25 @@ namespace TShockAPI // Further exceptions are written to TShock's log from now on. try { - if (Config.StorageType.ToLower() == "sqlite") + if (Config.Settings.StorageType.ToLower() == "sqlite") { - string sql = Path.Combine(SavePath, Config.SqliteDBPath); + string sql = Path.Combine(SavePath, Config.Settings.SqliteDBPath); Directory.CreateDirectory(Path.GetDirectoryName(sql)); DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); } - else if (Config.StorageType.ToLower() == "mysql") + else if (Config.Settings.StorageType.ToLower() == "mysql") { try { - var hostport = Config.MySqlHost.Split(':'); + var hostport = Config.Settings.MySqlHost.Split(':'); DB = new MySqlConnection(); DB.ConnectionString = String.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", hostport[0], hostport.Length > 1 ? hostport[1] : "3306", - Config.MySqlDbName, - Config.MySqlUsername, - Config.MySqlPassword + Config.Settings.MySqlDbName, + Config.Settings.MySqlUsername, + Config.Settings.MySqlPassword ); } catch (MySqlException ex) @@ -294,7 +294,7 @@ namespace TShockAPI throw new Exception("Invalid storage type"); } - if (Config.UseSqlLogs) + if (Config.Settings.UseSqlLogs) Log = new SqlLog(DB, logFilename, LogClear); else Log = new TextLog(logFilename, LogClear); @@ -312,8 +312,8 @@ namespace TShockAPI HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); Backups = new BackupManager(Path.Combine(SavePath, "backups")); - Backups.KeepFor = Config.BackupKeepFor; - Backups.Interval = Config.BackupInterval; + Backups.KeepFor = Config.Settings.BackupKeepFor; + Backups.Interval = Config.Settings.BackupInterval; Bans = new BanManager(DB); Warps = new WarpManager(DB); Regions = new RegionManager(DB); @@ -324,7 +324,7 @@ namespace TShockAPI RememberedPos = new RememberedPosManager(DB); CharacterDB = new CharacterManager(DB); ResearchDatastore = new ResearchDatastore(DB); - RestApi = new SecureRest(Netplay.ServerIP, Config.RestApiPort); + RestApi = new SecureRest(Netplay.ServerIP, Config.Settings.RestApiPort); RestManager = new RestManager(RestApi); RestManager.RegisterRestfulCommands(); Bouncer = new Bouncer(); @@ -332,7 +332,7 @@ namespace TShockAPI ItemBans = new ItemBans(this, DB); var geoippath = "GeoIP.dat"; - if (Config.EnableGeoIP && File.Exists(geoippath)) + if (Config.Settings.EnableGeoIP && File.Exists(geoippath)) Geo = new GeoIPCountry(geoippath); Log.ConsoleInfo("TShock {0} ({1}) now running.", Version, VersionCodename); @@ -368,14 +368,13 @@ namespace TShockAPI EnglishLanguage.Initialize(); - if (Config.RestApiEnabled) + if (Config.Settings.RestApiEnabled) RestApi.Start(); - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + Log.ConsoleInfo("AutoSave " + (Config.Settings.AutoSave ? "Enabled" : "Disabled")); Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); - if (Initialized != null) - Initialized(); + Initialized?.Invoke(); Log.ConsoleInfo("Welcome to TShock for Terraria!"); Log.ConsoleInfo("TShock comes with no warranty & is free software."); @@ -559,7 +558,7 @@ namespace TShockAPI if (args.Chest != null) { - if (Config.RegionProtectChests && !Regions.CanBuild((int)args.WorldPosition.X, (int)args.WorldPosition.Y, tsplr)) + if (Config.Settings.RegionProtectChests && !Regions.CanBuild((int)args.WorldPosition.X, (int)args.WorldPosition.Y, tsplr)) { args.Handled = true; return; @@ -580,7 +579,7 @@ namespace TShockAPI if (args.Handled) return; - if (Config.ForceXmas) + if (Config.Settings.ForceXmas) { args.Xmas = true; args.Handled = true; @@ -594,7 +593,7 @@ namespace TShockAPI if (args.Handled) return; - if (Config.ForceHalloween) + if (Config.Settings.ForceHalloween) { args.Halloween = true; args.Handled = true; @@ -630,7 +629,7 @@ namespace TShockAPI if (e.IsTerminating) { - if (Main.worldPathName != null && Config.SaveWorldOnCrash) + if (Main.worldPathName != null && Config.Settings.SaveWorldOnCrash) { Main.ActiveWorldFileData._path += ".crash"; SaveManager.Instance.SaveWorld(); @@ -768,7 +767,7 @@ namespace TShockAPI if (int.TryParse(p, out port)) { Netplay.ListenPort = port; - Config.ServerPort = port; + Config.Settings.ServerPort = port; OverridePort = true; Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); } @@ -783,7 +782,7 @@ namespace TShockAPI bool enabled; if (bool.TryParse(e, out enabled)) { - Config.RestApiEnabled = enabled; + Config.Settings.RestApiEnabled = enabled; Console.WriteLine("Startup parameter overrode REST enable."); } }) @@ -792,7 +791,7 @@ namespace TShockAPI int restPort; if (int.TryParse(p, out restPort)) { - Config.RestApiPort = restPort; + Config.Settings.RestApiPort = restPort; Console.WriteLine("Startup parameter overrode REST port."); } }) @@ -801,7 +800,7 @@ namespace TShockAPI int slots; if (int.TryParse(p, out slots)) { - Config.MaxSlots = slots; + Config.Settings.MaxSlots = slots; Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); } }); @@ -826,7 +825,7 @@ namespace TShockAPI //CLI defined password overrides a config password _cliPassword = Netplay.ServerPassword; Netplay.ServerPassword = ""; - Config.ServerPassword = _cliPassword; + Config.Settings.ServerPassword = _cliPassword; } // Disable the auth system if "setup.lock" is present or a user account already exists @@ -873,9 +872,9 @@ namespace TShockAPI Utils.ComputeMaxStyles(); Utils.FixChestStacks(); - if (Config.UseServerName) + if (Config.Settings.UseServerName) { - Main.worldName = Config.ServerName; + Main.worldName = Config.Settings.ServerName; } UpdateManager = new UpdateManager(); @@ -900,7 +899,7 @@ namespace TShockAPI LastCheck = DateTime.UtcNow; } - if (Main.ServerSideCharacter && (DateTime.UtcNow - LastSave).TotalMinutes >= ServerSideCharacterConfig.ServerSideCharacterSave) + if (Main.ServerSideCharacter && (DateTime.UtcNow - LastSave).TotalMinutes >= ServerSideCharacterConfig.Settings.ServerSideCharacterSave) { foreach (TSPlayer player in Players) { @@ -918,11 +917,11 @@ namespace TShockAPI /// OnSecondUpdate - Called effectively every second for all time based checks. private void OnSecondUpdate() { - DisableFlags flags = Config.DisableSecondUpdateLogs ? DisableFlags.WriteToConsole : DisableFlags.WriteToLogAndConsole; + DisableFlags flags = Config.Settings.DisableSecondUpdateLogs ? DisableFlags.WriteToConsole : DisableFlags.WriteToLogAndConsole; - if (Config.ForceTime != "normal") + if (Config.Settings.ForceTime != "normal") { - switch (Config.ForceTime) + switch (Config.Settings.ForceTime) { case "day": TSPlayer.Server.SetTime(true, 27000.0); @@ -939,7 +938,7 @@ namespace TShockAPI { if (player.TilesDestroyed != null) { - if (player.TileKillThreshold >= Config.TileKillThreshold) + if (player.TileKillThreshold >= Config.Settings.TileKillThreshold) { player.Disable("Reached TileKill threshold.", flags); TSPlayer.Server.RevertTiles(player.TilesDestroyed); @@ -956,7 +955,7 @@ namespace TShockAPI if (player.TilesCreated != null) { - if (player.TilePlaceThreshold >= Config.TilePlaceThreshold) + if (player.TilePlaceThreshold >= Config.Settings.TilePlaceThreshold) { player.Disable("Reached TilePlace threshold", flags); lock (player.TilesCreated) @@ -1000,7 +999,7 @@ namespace TShockAPI } } - if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) + if (player.TileLiquidThreshold >= Config.Settings.TileLiquidThreshold) { player.Disable("Reached TileLiquid threshold", flags); } @@ -1009,7 +1008,7 @@ namespace TShockAPI player.TileLiquidThreshold = 0; } - if (player.ProjectileThreshold >= Config.ProjectileThreshold) + if (player.ProjectileThreshold >= Config.Settings.ProjectileThreshold) { player.Disable("Reached projectile threshold", flags); } @@ -1018,7 +1017,7 @@ namespace TShockAPI player.ProjectileThreshold = 0; } - if (player.PaintThreshold >= Config.TilePaintThreshold) + if (player.PaintThreshold >= Config.Settings.TilePaintThreshold) { player.Disable("Reached paint threshold", flags); } @@ -1027,7 +1026,7 @@ namespace TShockAPI player.PaintThreshold = 0; } - if (player.HealOtherThreshold >= TShock.Config.HealOtherThreshold) + if (player.HealOtherThreshold >= TShock.Config.Settings.HealOtherThreshold) { player.Disable("Reached HealOtherPlayer threshold", flags); } @@ -1093,19 +1092,19 @@ namespace TShockAPI /// True if allowed, otherwise false private bool OnCreep(int tileType) { - if (!Config.AllowCrimsonCreep && (tileType == TileID.Dirt || tileType == TileID.CrimsonGrass + if (!Config.Settings.AllowCrimsonCreep && (tileType == TileID.Dirt || tileType == TileID.CrimsonGrass || TileID.Sets.Crimson[tileType])) { return false; } - if (!Config.AllowCorruptionCreep && (tileType == TileID.Dirt || tileType == TileID.CorruptThorns + if (!Config.Settings.AllowCorruptionCreep && (tileType == TileID.Dirt || tileType == TileID.CorruptThorns || TileID.Sets.Corrupt[tileType])) { return false; } - if (!Config.AllowHallowCreep && (TileID.Sets.Hallow[tileType])) + if (!Config.Settings.AllowHallowCreep && (TileID.Sets.Hallow[tileType])) { return false; } @@ -1117,7 +1116,7 @@ namespace TShockAPI /// args - The StatueSpawnEventArgs object. private void OnStatueSpawn(StatueSpawnEventArgs args) { - if (args.Within200 < Config.StatueSpawn200 && args.Within600 < Config.StatueSpawn600 && args.WorldWide < Config.StatueSpawnWorld) + if (args.Within200 < Config.Settings.StatueSpawn200 && args.Within600 < Config.Settings.StatueSpawn600 && args.WorldWide < Config.Settings.StatueSpawnWorld) { args.Handled = true; } @@ -1140,16 +1139,16 @@ namespace TShockAPI var player = new TSPlayer(args.Who); - if (Utils.GetActivePlayerCount() + 1 > Config.MaxSlots + Config.ReservedSlots) + if (Utils.GetActivePlayerCount() + 1 > Config.Settings.MaxSlots + Config.Settings.ReservedSlots) { - player.Kick(Config.ServerFullNoReservedReason, true, true, null, false); + player.Kick(Config.Settings.ServerFullNoReservedReason, true, true, null, false); args.Handled = true; return; } if (!FileTools.OnWhitelist(player.IP)) { - player.Kick(Config.WhitelistKickReason, true, true, null, false); + player.Kick(Config.Settings.WhitelistKickReason, true, true, null, false); args.Handled = true; return; } @@ -1160,7 +1159,7 @@ namespace TShockAPI player.Country = code == null ? "N/A" : GeoIPCountry.GetCountryNameByCode(code); if (code == "A1") { - if (Config.KickProxyUsers) + if (Config.Settings.KickProxyUsers) { player.Kick("Connecting via a proxy is not allowed.", true, true, null, false); args.Handled = true; @@ -1182,7 +1181,7 @@ namespace TShockAPI return; } - if (Config.KickEmptyUUID && String.IsNullOrWhiteSpace(player.UUID)) + if (Config.Settings.KickEmptyUUID && String.IsNullOrWhiteSpace(player.UUID)) { player.Kick("Your client sent a blank UUID. Configure it to send one or use a different client.", true, true, null, false); args.Handled = true; @@ -1222,7 +1221,7 @@ namespace TShockAPI CharacterDB.InsertPlayerData(tsplr); } - if (Config.RememberLeavePos && !tsplr.LoginHarassed) + if (Config.Settings.RememberLeavePos && !tsplr.LoginHarassed) { RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int)(tsplr.X / 16), (int)(tsplr.Y / 16)); } @@ -1242,7 +1241,7 @@ namespace TShockAPI // The last player will leave after this hook is executed. if (Utils.GetActivePlayerCount() == 1) { - if (Config.SaveWorldOnLastPlayerExit) + if (Config.Settings.SaveWorldOnLastPlayerExit) SaveManager.Instance.SaveWorld(); Utils.SetConsoleTitle(true); } @@ -1290,7 +1289,7 @@ namespace TShockAPI } } - if ((text.StartsWith(Config.CommandSpecifier) || text.StartsWith(Config.CommandSilentSpecifier)) + if ((text.StartsWith(Config.Settings.CommandSpecifier) || text.StartsWith(Config.Settings.CommandSilentSpecifier)) && !string.IsNullOrWhiteSpace(text.Substring(1))) { try @@ -1320,9 +1319,9 @@ namespace TShockAPI tsplr.SendErrorMessage("You are muted!"); args.Handled = true; } - else if (!TShock.Config.EnableChatAboveHeads) + else if (!TShock.Config.Settings.EnableChatAboveHeads) { - text = String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, + text = String.Format(Config.Settings.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix, args.Text); Hooks.PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text); Utils.Broadcast(text, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B); @@ -1332,7 +1331,7 @@ namespace TShockAPI { Player ply = Main.player[args.Who]; string name = ply.name; - ply.name = String.Format(Config.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix); + ply.name = String.Format(Config.Settings.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix); //Update the player's name to format text nicely. This needs to be done because Terraria automatically formats messages against our will NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, NetworkText.FromLiteral(ply.name), args.Who, 0, 0, 0, 0); @@ -1352,7 +1351,7 @@ namespace TShockAPI NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, NetworkText.FromLiteral(name), args.Who, 0, 0, 0, 0); string msg = String.Format("<{0}> {1}", - String.Format(Config.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix), + String.Format(Config.Settings.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix), text ); @@ -1388,8 +1387,8 @@ namespace TShockAPI if (args.Command == "autosave") { - Main.autoSave = Config.AutoSave = !Config.AutoSave; - Log.ConsoleInfo("AutoSave " + (Config.AutoSave ? "Enabled" : "Disabled")); + Main.autoSave = Config.Settings.AutoSave = !Config.Settings.AutoSave; + Log.ConsoleInfo("AutoSave " + (Config.Settings.AutoSave ? "Enabled" : "Disabled")); } else if (args.Command.StartsWith(Commands.Specifier) || args.Command.StartsWith(Commands.SilentSpecifier)) { @@ -1456,28 +1455,28 @@ namespace TShockAPI player.LoginMS = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; - if (Config.EnableGeoIP && TShock.Geo != null) + if (Config.Settings.EnableGeoIP && TShock.Geo != null) { Log.Info("{0} ({1}) from '{2}' group from '{3}' joined. ({4}/{5})", player.Name, player.IP, player.Group.Name, player.Country, TShock.Utils.GetActivePlayerCount(), - TShock.Config.MaxSlots); + TShock.Config.Settings.MaxSlots); if (!player.SilentJoinInProgress) Utils.Broadcast(string.Format("{0} ({1}) has joined.", player.Name, player.Country), Color.Yellow); } else { Log.Info("{0} ({1}) from '{2}' group joined. ({3}/{4})", player.Name, player.IP, - player.Group.Name, TShock.Utils.GetActivePlayerCount(), TShock.Config.MaxSlots); + player.Group.Name, TShock.Utils.GetActivePlayerCount(), TShock.Config.Settings.MaxSlots); if (!player.SilentJoinInProgress) Utils.Broadcast(player.Name + " has joined.", Color.Yellow); } - if (Config.DisplayIPToAdmins) + if (Config.Settings.DisplayIPToAdmins) Utils.SendLogs(string.Format("{0} has joined. IP: {1}", player.Name, player.IP), Color.Blue); player.SendFileTextAsMessage(FileTools.MotdPath); - string pvpMode = Config.PvPMode.ToLowerInvariant(); + string pvpMode = Config.Settings.PvPMode.ToLowerInvariant(); if (pvpMode == "always") { player.TPlayer.hostile = true; @@ -1493,7 +1492,7 @@ namespace TShockAPI player.SendErrorMessage(String.Format("Server side characters is enabled! Please {0}register or {0}login to play!", Commands.Specifier)); player.LoginHarassed = true; } - else if (Config.RequireLogin) + else if (Config.Settings.RequireLogin) { player.SendErrorMessage("Please {0}register or {0}login to play!", Commands.Specifier); player.LoginHarassed = true; @@ -1502,7 +1501,7 @@ namespace TShockAPI player.LastNetPosition = new Vector2(Main.spawnTileX * 16f, Main.spawnTileY * 16f); - if (Config.RememberLeavePos && (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero) && !player.LoginHarassed) + if (Config.Settings.RememberLeavePos && (RememberedPos.GetLeavePos(player.Name, player.IP) != Vector2.Zero) && !player.LoginHarassed) { player.RPPending = 3; player.SendInfoMessage("You will be teleported to your last known location..."); @@ -1515,7 +1514,7 @@ namespace TShockAPI /// e - The NpcStrikeEventArgs object. private void NpcHooks_OnStrikeNpc(NpcStrikeEventArgs e) { - if (Config.InfiniteInvasion) + if (Config.Settings.InfiniteInvasion) { if (Main.invasionSize < 10) { @@ -1530,13 +1529,13 @@ namespace TShockAPI { //tombstone fix. if (e.Info == 43 || (e.Info >= 201 && e.Info <= 205) || (e.Info >= 527 && e.Info <= 531)) - if (Config.DisableTombstones) + if (Config.Settings.DisableTombstones) e.Object.SetDefaults(0); if (e.Info == 75) - if (Config.DisableClownBombs) + if (Config.Settings.DisableClownBombs) e.Object.SetDefaults(0); if (e.Info == 109) - if (Config.DisableSnowBalls) + if (Config.Settings.DisableSnowBalls) e.Object.SetDefaults(0); } @@ -1587,37 +1586,37 @@ namespace TShockAPI /// e - The HandledEventArgs object. private void OnStartHardMode(HandledEventArgs e) { - if (Config.DisableHardmode) + if (Config.Settings.DisableHardmode) e.Handled = true; } /// OnConfigRead - Fired when the config file has been read. /// file - The config file object. - public void OnConfigRead(ConfigFile file) + public void OnConfigRead(ConfigFile file) { - NPC.defaultMaxSpawns = file.DefaultMaximumSpawns; - NPC.defaultSpawnRate = file.DefaultSpawnRate; + NPC.defaultMaxSpawns = file.Settings.DefaultMaximumSpawns; + NPC.defaultSpawnRate = file.Settings.DefaultSpawnRate; - Main.autoSave = file.AutoSave; + Main.autoSave = file.Settings.AutoSave; if (Backups != null) { - Backups.KeepFor = file.BackupKeepFor; - Backups.Interval = file.BackupInterval; + Backups.KeepFor = file.Settings.BackupKeepFor; + Backups.Interval = file.Settings.BackupInterval; } if (!OverridePort) { - Netplay.ListenPort = file.ServerPort; + Netplay.ListenPort = file.Settings.ServerPort; } - if (file.MaxSlots > Main.maxPlayers - file.ReservedSlots) - file.MaxSlots = Main.maxPlayers - file.ReservedSlots; - Main.maxNetPlayers = file.MaxSlots + file.ReservedSlots; + if (file.Settings.MaxSlots > Main.maxPlayers - file.Settings.ReservedSlots) + file.Settings.MaxSlots = Main.maxPlayers - file.Settings.ReservedSlots; + Main.maxNetPlayers = file.Settings.MaxSlots + file.Settings.ReservedSlots; Netplay.ServerPassword = ""; if (!string.IsNullOrEmpty(_cliPassword)) { //This prevents a config reload from removing/updating a CLI-defined password - file.ServerPassword = _cliPassword; + file.Settings.ServerPassword = _cliPassword; } Netplay.SpamCheck = false; diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 7cfa834a..cde1f86e 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -83,6 +83,9 @@ + + + @@ -165,7 +168,7 @@ - + @@ -226,7 +229,7 @@ - +