diff --git a/src/Ezperm/Configuration.cs b/src/Ezperm/Configuration.cs index 528bef791..7237bbf0c 100644 --- a/src/Ezperm/Configuration.cs +++ b/src/Ezperm/Configuration.cs @@ -1,65 +1,65 @@ -using Newtonsoft.Json; +using LazyAPI.Attributes; +using LazyAPI.ConfigFiles; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.IO; using TShockAPI; namespace Ezperm; -internal class GroupInfo +[Config] +internal class Configuration : JsonConfigBase { - [JsonProperty("组名字")] - public string Name { get; set; } = ""; - [JsonProperty("添加的权限")] - public List AddPermissions { get; set; } = new(); - [JsonProperty("删除的权限")] - public List DelPermissions { get; set; } = new(); -} + protected override string Filename => "ezperm"; + internal class GroupInfo + { + [LocalizedPropertyName(CultureType.Chinese, "组名字")] + [LocalizedPropertyName(CultureType.English, "Name")] + public string Name { get; set; } = ""; -internal class Configuration -{ - public static readonly string FilePath = Path.Combine(TShock.SavePath, "ezperm.json"); + [LocalizedPropertyName(CultureType.Chinese, "父组")] + [LocalizedPropertyName(CultureType.English, "Parent")] + public string Parent { get; set; } = ""; - public List Groups { get; set; } = new(); + [LocalizedPropertyName(CultureType.Chinese, "添加的权限")] + [LocalizedPropertyName(CultureType.English, "AddPermissions")] + public List AddPermissions { get; set; } = new List(); - public void Write(string path) - { - using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write)) - { - var str = JsonConvert.SerializeObject(this, Formatting.Indented); - using (var sw = new StreamWriter(fs)) - { - sw.Write(str); - } - } + [LocalizedPropertyName(CultureType.Chinese, "删除的权限")] + [LocalizedPropertyName(CultureType.English, "DelPermissions")] + public List DelPermissions { get; set; } = new List(); } - public static Configuration Read(string path) + [LocalizedPropertyName(CultureType.Chinese, "组列表", Order = -3)] + [LocalizedPropertyName(CultureType.English, "Groups", Order = -3)] + public List Groups { get; set; } = new List(); + + protected override void SetDefault() { - if (!File.Exists(path)) + this.Groups = new List { - // If the file doesn't exist, create a default configuration - var defaultConfig = new Configuration + new GroupInfo { - Groups = new List + Name = "default", + Parent = "guest", + AddPermissions = new List { - new GroupInfo - { - Name = "default", - AddPermissions = new List { "tshock.world.movenpc","tshock.world.time.usesundial", "tshock.tp.pylon", "tshock.tp.demonconch", "tshock.tp.magicconch", "tshock.tp.tppotion", "tshock.tp.rod","tshock.tp.wormhole","tshock.npc.startdd2", "tshock.npc.spawnpets", "tshock.npc.summonboss","tshock.npc.startinvasion","tshock.npc.hurttown" }, - DelPermissions = new List { "tshock.admin" } - } - } - }; - - defaultConfig.Write(path); - return defaultConfig; - } - - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) - { - using (var sr = new StreamReader(fs)) - { - var cf = JsonConvert.DeserializeObject(sr.ReadToEnd())!; - return cf; + "tshock.world.movenpc", + "tshock.world.time.usesundial", + "tshock.tp.pylon", + "tshock.tp.demonconch", + "tshock.tp.magicconch", + "tshock.tp.tppotion", + "tshock.tp.rod", + "tshock.tp.wormhole", + "tshock.npc.startdd2", + "tshock.npc.spawnpets", + "tshock.npc.summonboss", + "tshock.npc.startinvasion", + "tshock.npc.hurttown" + }, + DelPermissions = new List { "tshock.admin" } } - } + }; } } \ No newline at end of file diff --git a/src/Ezperm/Ezperm.cs b/src/Ezperm/Ezperm.cs index 32005818a..ec65b5a27 100644 --- a/src/Ezperm/Ezperm.cs +++ b/src/Ezperm/Ezperm.cs @@ -1,4 +1,5 @@ -using Terraria; +using LazyAPI; +using Terraria; using TerrariaApi.Server; using TShockAPI; using TShockAPI.DB; @@ -7,55 +8,43 @@ namespace Ezperm; [ApiVersion(2, 1)] -public class Ezperm : TerrariaPlugin +public class Ezperm : LazyPlugin { public override string Name => System.Reflection.Assembly.GetExecutingAssembly().GetName().Name!; public override string Author => "大豆子,肝帝熙恩优化1449"; public override string Description => GetString("一个指令帮助小白给初始服务器添加缺失的权限,还可以批量添删权限"); - public override Version Version => new Version(1, 2, 8); - internal static Configuration Config = null!; + public override Version Version => new Version(1, 2, 9); public Ezperm(Main game) : base(game) { - } - private static void LoadConfig() - { - - Config = Configuration.Read(Configuration.FilePath); - Config.Write(Configuration.FilePath); - - } - private static void ReloadConfig(ReloadEventArgs args) - { - LoadConfig(); - args.Player?.SendSuccessMessage(GetString("[Ezperm] 重新加载配置完毕。")); } public override void Initialize() { - GeneralHooks.ReloadEvent += ReloadConfig; Commands.ChatCommands.Add(new Command("inperms.admin", this.Cmd, "inperms", "批量改权限")); - LoadConfig(); } protected override void Dispose(bool disposing) { if (disposing) { Commands.ChatCommands.RemoveAll(x => x.CommandDelegate == this.Cmd); - GeneralHooks.ReloadEvent -= ReloadConfig; } base.Dispose(disposing); } private void Cmd(CommandArgs args) { - foreach (var groupInfo in Config.Groups) + foreach (var groupInfo in Configuration.Instance.Groups) { var groupName = groupInfo.Name; + + // 检查组是否存在,如果不存在则创建 if (TShock.Groups.GetGroupByName(groupName) == null) { try { - TShock.Groups.AddGroup(groupName, null, "", Group.defaultChatColor); + // 如果父组为空字符串,则不设置父组 + var parentGroup = string.IsNullOrWhiteSpace(groupInfo.Parent) ? null : groupInfo.Parent; + TShock.Groups.AddGroup(groupName, parentGroup, "", Group.defaultChatColor); args.Player.SendSuccessMessage(GetString($"组 {groupName} 不存在,已创建该组。") + "\r\n"); } catch (GroupManagerException ex) @@ -63,6 +52,32 @@ private void Cmd(CommandArgs args) args.Player.SendErrorMessage(ex.ToString()); } } + else + { + // 如果组已存在,更新父组 + if (!string.IsNullOrWhiteSpace(groupInfo.Parent)) + { + try + { + var group = TShock.Groups.GetGroupByName(groupName); + var newParentGroup = groupInfo.Parent; + + // 如果父组为 "null",则将父组设置为空 + if (groupInfo.Parent.Equals("null", StringComparison.OrdinalIgnoreCase)) + { + newParentGroup = null; + } + + TShock.Groups.UpdateGroup(groupName, newParentGroup, group.Permissions, group.ChatColor, group.Suffix, group.Prefix); + args.Player.SendSuccessMessage(GetString($"成功将组 {groupName} 的父组设置为 {newParentGroup ?? "空"}。") + "\r\n"); + } + catch (GroupManagerException ex) + { + args.Player.SendErrorMessage(ex.ToString()); + } + } + } + // 添加权限 if (groupInfo.AddPermissions.Count > 0) { diff --git a/src/Ezperm/Ezperm.csproj b/src/Ezperm/Ezperm.csproj index 606c2b11f..542a88bf0 100644 --- a/src/Ezperm/Ezperm.csproj +++ b/src/Ezperm/Ezperm.csproj @@ -2,4 +2,8 @@ + + + + diff --git a/src/Ezperm/README.en-US.md b/src/Ezperm/README.en-US.md index 6afb9059e..867967738 100644 --- a/src/Ezperm/README.en-US.md +++ b/src/Ezperm/README.en-US.md @@ -17,23 +17,24 @@ { "Groups": [ { - "组名字": "default", - "添加的权限": [ + "Name": "default", + "Parent": "guest", + "AddPermissions": [ "tshock.world.movenpc", + "tshock.world.time.usesundial", "tshock.tp.pylon", "tshock.tp.demonconch", "tshock.tp.magicconch", "tshock.tp.tppotion", "tshock.tp.rod", - "tshock.npc.startdd2", "tshock.tp.wormhole", + "tshock.npc.startdd2", + "tshock.npc.spawnpets", "tshock.npc.summonboss", "tshock.npc.startinvasion", - "tshock.npc.spawnpets", - "tshock.world.time.usesundial", "tshock.npc.hurttown" ], - "删除的权限": [ + "DelPermissions": [ "tshock.admin" ] } diff --git a/src/Ezperm/README.md b/src/Ezperm/README.md index 91241e518..2d46b2eb7 100644 --- a/src/Ezperm/README.md +++ b/src/Ezperm/README.md @@ -15,22 +15,24 @@ > 配置文件位置:tshock/ezperm.json ```json5 { - "Groups": [ + "组列表": [ { "组名字": "default", + "父组": "guest", "添加的权限": [ "tshock.world.movenpc", + "tshock.world.time.usesundial", "tshock.tp.pylon", "tshock.tp.demonconch", "tshock.tp.magicconch", "tshock.tp.tppotion", "tshock.tp.rod", - "tshock.npc.startdd2", "tshock.tp.wormhole", + "tshock.npc.startdd2", + "tshock.npc.spawnpets", "tshock.npc.summonboss", "tshock.npc.startinvasion", - "tshock.npc.spawnpets", - "tshock.world.time.usesundial" + "tshock.npc.hurttown" ], "删除的权限": [ "tshock.admin" @@ -43,6 +45,8 @@ ## 更新日志 ``` +v1.2.9 +使用lazyapi,添加父组预设 v1.2.8 添加 GetString v1.2.7 diff --git a/src/TShockConfigMultiLang/Config.cs b/src/TShockConfigMultiLang/Config.cs index 667d2e65c..5fc74c62f 100644 --- a/src/TShockConfigMultiLang/Config.cs +++ b/src/TShockConfigMultiLang/Config.cs @@ -782,4 +782,4 @@ public class Config : JsonConfigBase public Dictionary ApplicationRestTokens = TShock.Config.Settings.ApplicationRestTokens; #endregion -} +} \ No newline at end of file diff --git a/src/TShockConfigMultiLang/README.md b/src/TShockConfigMultiLang/README.md index 5b99f033a..aa86377e9 100644 --- a/src/TShockConfigMultiLang/README.md +++ b/src/TShockConfigMultiLang/README.md @@ -26,33 +26,33 @@ "是否启用报Debug日志": false, "禁用登录后进入": false, "允许箱子中物品堆叠超出限制": false, - "世界图格提供器": "default", // heaptile/constileation + "世界图格提供器": "default", "启用自动保存": true, "自动保存世界广播提示": true, "是否显示备份自动保存消息": true, - "自动备份间隔": 10, // 分钟 - "备份保留时间": 140, // 分钟 + "自动备份间隔": 10, + "备份保留时间": 240, "崩溃时保存世界": true, "最后玩家退出时保存世界": true, "事件入侵乘数": 1, "默认刷怪生成上限": 5, "默认刷怪率": 600, "事件无限入侵": false, - "PVP模式": "normal", // normal/always/disabled/pvpwithnoteam + "PVP模式": "normal", "启用出生点保护": true, - "出生点保护范围": 10, // 格 + "出生点保护范围": 10, "启用放置物块范围检查": true, "启用强制硬核角色": false, "启用强制中核角色": false, "启用强制软核角色": false, - "禁止建筑": false, // antibuild - "禁止困难模式": false, // 不会通过肉山或 /starthardmode 命令激活 - "禁止生成地牢守卫": false, // 禁止地牢守卫生成,取而代之的是将玩家发送回生成点 + "禁止建筑": false, + "禁止困难模式": false, + "禁止生成地牢守卫": false, "禁止血月小丑炸弹": false, "禁止雪人雪块弹幕": false, "禁止玩家死亡生成墓碑": true, - "禁止机械骷髅王炸弹": true, - "强制世界时间": "normal", // normal/day/night + "禁止机械骷髅王炸弹": false, + "强制世界时间": "normal", "禁止PVP隐身药水": false, "未登录时禁止移动范围": 10, "保护区域箱子": false, @@ -101,7 +101,7 @@ "用户必须登录": false, "允许玩家登录账号与角色名不符": true, "允许玩家注册账号与角色名不符": false, - "密码最少长度": 4, // 最少为4 + "密码最少长度": 4, "使用的BCrypt工作因子": 7, "禁止UUID自动登录": false, "踢出不发送UUID到服务器的玩家": false, @@ -167,7 +167,8 @@ ## 更新日志 ``` -暂无 +v1.0.3 +用指令会先加载现在的配置,再同步 ``` ## 反馈 diff --git a/src/TShockConfigMultiLang/TShockConfigMultiLang.cs b/src/TShockConfigMultiLang/TShockConfigMultiLang.cs index af97fe743..972f9d535 100644 --- a/src/TShockConfigMultiLang/TShockConfigMultiLang.cs +++ b/src/TShockConfigMultiLang/TShockConfigMultiLang.cs @@ -7,9 +7,10 @@ namespace TShockConfigMultiLang; [ApiVersion(2, 1)] public class TShockConfigMultiLang : LazyPlugin { - public override string Name => System.Reflection.Assembly.GetExecutingAssembly().GetName().Name!; public override string Author => "肝帝熙恩,羽学"; + public override string Name => System.Reflection.Assembly.GetExecutingAssembly().GetName().Name!; + public override string Author => "肝帝熙恩,羽学"; public override string Description => GetString("创建一个本地化语言的config"); - public override Version Version => new Version(1, 0, 2); + public override Version Version => new Version(1, 0, 3); public TShockConfigMultiLang(Main game) : base(game) { @@ -18,27 +19,15 @@ public TShockConfigMultiLang(Main game) : base(game) public override void Initialize() { - Commands.ChatCommands.Add(new Command(Permissions.cfgreload, this.configToNewconfig, "configToNewconfig", "ctc", "本土同步原版")); - Commands.ChatCommands.Add(new Command(Permissions.cfgreload, this.configFromnNewconfig, "configFromnNewconfig", "cfc", "原版同步本土")); - } - - private void configFromnNewconfig(CommandArgs args) - { - this.CFC(); - this.OnReload(args.Player); - } - - private void configToNewconfig(CommandArgs args) - { - this.CTC(); - this.OnReload(args.Player); + Commands.ChatCommands.Add(new Command(Permissions.cfgreload, this.CTC, "configToNewconfig", "ctc", "原版同步给本土")); + Commands.ChatCommands.Add(new Command(Permissions.cfgreload, this.CFC, "configFromnNewconfig", "cfc", "本土同步给原版")); } protected override void Dispose(bool disposing) { if (disposing) { - TShockAPI.Commands.ChatCommands.RemoveAll(x => x.CommandDelegate == this.configToNewconfig || x.CommandDelegate == this.configFromnNewconfig); + Commands.ChatCommands.RemoveAll(x => x.CommandDelegate == this.CTC || x.CommandDelegate == this.CFC); } base.Dispose(disposing); } @@ -46,794 +35,809 @@ private void OnReload(TSPlayer player) { TShock.Utils.Reload(); TShockAPI.Hooks.GeneralHooks.OnReloadEvent(player); - - player.SendSuccessMessage( - GetString("同步已完成,已自动重载所有配置")); + player.SendSuccessMessage(GetString("[TShockConfigMultiLang] 同步已完成,已自动重载所有配置")); } - private void CFC() + private void CFC(CommandArgs args) { - // 应用服务器设置 - #region Apply ServerSettings - TShock.Config.Settings.ServerPassword = Config.Instance.ServerPassword; - TShock.Config.Settings.ServerPort = Config.Instance.ServerPort; - TShock.Config.Settings.MaxSlots = Config.Instance.MaxSlots; - TShock.Config.Settings.ReservedSlots = Config.Instance.ReservedSlots; - TShock.Config.Settings.ServerName = Config.Instance.ServerName; - TShock.Config.Settings.UseServerName = Config.Instance.UseServerName; - TShock.Config.Settings.LogPath = Config.Instance.LogPath; - TShock.Config.Settings.DebugLogs = Config.Instance.DebugLogs; - TShock.Config.Settings.DisableLoginBeforeJoin = Config.Instance.DisableLoginBeforeJoin; - TShock.Config.Settings.IgnoreChestStacksOnLoad = Config.Instance.IgnoreChestStacksOnLoad; - TShock.Config.Settings.WorldTileProvider = Config.Instance.WorldTileProvider; - #endregion + try + { + this.OnReload(args.Player); + // 应用服务器设置 + #region Apply ServerSettings + TShock.Config.Settings.ServerPassword = Config.Instance.ServerPassword; + TShock.Config.Settings.ServerPort = Config.Instance.ServerPort; + TShock.Config.Settings.MaxSlots = Config.Instance.MaxSlots; + TShock.Config.Settings.ReservedSlots = Config.Instance.ReservedSlots; + TShock.Config.Settings.ServerName = Config.Instance.ServerName; + TShock.Config.Settings.UseServerName = Config.Instance.UseServerName; + TShock.Config.Settings.LogPath = Config.Instance.LogPath; + TShock.Config.Settings.DebugLogs = Config.Instance.DebugLogs; + TShock.Config.Settings.DisableLoginBeforeJoin = Config.Instance.DisableLoginBeforeJoin; + TShock.Config.Settings.IgnoreChestStacksOnLoad = Config.Instance.IgnoreChestStacksOnLoad; + TShock.Config.Settings.WorldTileProvider = Config.Instance.WorldTileProvider; + #endregion - // 应用备份和保存设置 - #region Apply Backup and Save Settings - TShock.Config.Settings.AutoSave = Config.Instance.AutoSave; - TShock.Config.Settings.AnnounceSave = Config.Instance.AnnounceSave; - TShock.Config.Settings.ShowBackupAutosaveMessages = Config.Instance.ShowBackupAutosaveMessages; - TShock.Config.Settings.BackupInterval = Config.Instance.BackupInterval; - TShock.Config.Settings.BackupKeepFor = Config.Instance.BackupKeepFor; - TShock.Config.Settings.SaveWorldOnCrash = Config.Instance.SaveWorldOnCrash; - TShock.Config.Settings.SaveWorldOnLastPlayerExit = Config.Instance.SaveWorldOnLastPlayerExit; - #endregion + // 应用备份和保存设置 + #region Apply Backup and Save Settings + TShock.Config.Settings.AutoSave = Config.Instance.AutoSave; + TShock.Config.Settings.AnnounceSave = Config.Instance.AnnounceSave; + TShock.Config.Settings.ShowBackupAutosaveMessages = Config.Instance.ShowBackupAutosaveMessages; + TShock.Config.Settings.BackupInterval = Config.Instance.BackupInterval; + TShock.Config.Settings.BackupKeepFor = Config.Instance.BackupKeepFor; + TShock.Config.Settings.SaveWorldOnCrash = Config.Instance.SaveWorldOnCrash; + TShock.Config.Settings.SaveWorldOnLastPlayerExit = Config.Instance.SaveWorldOnLastPlayerExit; + #endregion - #region Apply World Settings + #region Apply World Settings - // 入侵事件的大小乘数 - TShock.Config.Settings.InvasionMultiplier = Config.Instance.InvasionMultiplier; + // 入侵事件的大小乘数 + TShock.Config.Settings.InvasionMultiplier = Config.Instance.InvasionMultiplier; - // 默认刷怪生成上限 - TShock.Config.Settings.DefaultMaximumSpawns = Config.Instance.DefaultMaximumSpawns; + // 默认刷怪生成上限 + TShock.Config.Settings.DefaultMaximumSpawns = Config.Instance.DefaultMaximumSpawns; - // 刷怪间隔(数值越低,敌人生成越频繁) - TShock.Config.Settings.DefaultSpawnRate = Config.Instance.DefaultSpawnRate; + // 刷怪间隔(数值越低,敌人生成越频繁) + TShock.Config.Settings.DefaultSpawnRate = Config.Instance.DefaultSpawnRate; - // 是否启用无限制入侵事件(仍需手动触发) - TShock.Config.Settings.InfiniteInvasion = Config.Instance.InfiniteInvasion; + // 是否启用无限制入侵事件(仍需手动触发) + TShock.Config.Settings.InfiniteInvasion = Config.Instance.InfiniteInvasion; - // 设置 PvP 模式 - TShock.Config.Settings.PvPMode = Config.Instance.PvPMode; + // 设置 PvP 模式 + TShock.Config.Settings.PvPMode = Config.Instance.PvPMode; - // 启用出生点保护 - TShock.Config.Settings.SpawnProtection = Config.Instance.SpawnProtection; + // 启用出生点保护 + TShock.Config.Settings.SpawnProtection = Config.Instance.SpawnProtection; - // 出生点保护范围(单位:格) - TShock.Config.Settings.SpawnProtectionRadius = Config.Instance.SpawnProtectionRadius; + // 出生点保护范围(单位:格) + TShock.Config.Settings.SpawnProtectionRadius = Config.Instance.SpawnProtectionRadius; - // 启用放置物块范围检查 - TShock.Config.Settings.RangeChecks = Config.Instance.RangeChecks; + // 启用放置物块范围检查 + TShock.Config.Settings.RangeChecks = Config.Instance.RangeChecks; - // 禁止非硬核玩家连接 - TShock.Config.Settings.HardcoreOnly = Config.Instance.HardcoreOnly; + // 禁止非硬核玩家连接 + TShock.Config.Settings.HardcoreOnly = Config.Instance.HardcoreOnly; - // 禁止软核玩家连接 - TShock.Config.Settings.MediumcoreOnly = Config.Instance.MediumcoreOnly; + // 禁止软核玩家连接 + TShock.Config.Settings.MediumcoreOnly = Config.Instance.MediumcoreOnly; - // 禁止非软核玩家连接 - TShock.Config.Settings.SoftcoreOnly = Config.Instance.SoftcoreOnly; + // 禁止非软核玩家连接 + TShock.Config.Settings.SoftcoreOnly = Config.Instance.SoftcoreOnly; - // 禁用方块放置或移除 - TShock.Config.Settings.DisableBuild = Config.Instance.DisableBuild; + // 禁用方块放置或移除 + TShock.Config.Settings.DisableBuild = Config.Instance.DisableBuild; - // 禁止困难模式 - TShock.Config.Settings.DisableHardmode = Config.Instance.DisableHardmode; + // 禁止困难模式 + TShock.Config.Settings.DisableHardmode = Config.Instance.DisableHardmode; - // 禁止生成地牢守卫 - TShock.Config.Settings.DisableDungeonGuardian = Config.Instance.DisableDungeonGuardian; + // 禁止生成地牢守卫 + TShock.Config.Settings.DisableDungeonGuardian = Config.Instance.DisableDungeonGuardian; - // 禁用小丑炸弹生成 - TShock.Config.Settings.DisableClownBombs = Config.Instance.DisableClownBombs; + // 禁用小丑炸弹生成 + TShock.Config.Settings.DisableClownBombs = Config.Instance.DisableClownBombs; - // 禁用雪球炸弹生成 - TShock.Config.Settings.DisableSnowBalls = Config.Instance.DisableSnowBalls; + // 禁用雪球炸弹生成 + TShock.Config.Settings.DisableSnowBalls = Config.Instance.DisableSnowBalls; - // 禁用死亡时掉落墓碑 - TShock.Config.Settings.DisableTombstones = Config.Instance.DisableTombstones; + // 禁用死亡时掉落墓碑 + TShock.Config.Settings.DisableTombstones = Config.Instance.DisableTombstones; - // 禁用 Skeletron Prime 炸弹生成 - TShock.Config.Settings.DisablePrimeBombs = Config.Instance.DisablePrimeBombs; + // 禁用 Skeletron Prime 炸弹生成 + TShock.Config.Settings.DisablePrimeBombs = Config.Instance.DisablePrimeBombs; - // 强制世界时间为白天或黑夜 - TShock.Config.Settings.ForceTime = Config.Instance.ForceTime; + // 强制世界时间为白天或黑夜 + TShock.Config.Settings.ForceTime = Config.Instance.ForceTime; - // 当PvP启用时,禁用隐身药水的效果 - TShock.Config.Settings.DisableInvisPvP = Config.Instance.DisableInvisPvP; + // 当PvP启用时,禁用隐身药水的效果 + TShock.Config.Settings.DisableInvisPvP = Config.Instance.DisableInvisPvP; - // 禁止移动范围(未登录时) - TShock.Config.Settings.MaxRangeForDisabled = Config.Instance.MaxRangeForDisabled; + // 禁止移动范围(未登录时) + TShock.Config.Settings.MaxRangeForDisabled = Config.Instance.MaxRangeForDisabled; - // 保护区域箱子 - TShock.Config.Settings.RegionProtectChests = Config.Instance.RegionProtectChests; + // 保护区域箱子 + TShock.Config.Settings.RegionProtectChests = Config.Instance.RegionProtectChests; - // 保护区域箱子是否上锁 - TShock.Config.Settings.RegionProtectGemLocks = Config.Instance.RegionProtectGemLocks; + // 保护区域箱子是否上锁 + TShock.Config.Settings.RegionProtectGemLocks = Config.Instance.RegionProtectGemLocks; - // 忽略检查玩家是否可以更新弹幕 - TShock.Config.Settings.IgnoreProjUpdate = Config.Instance.IgnoreProjUpdate; + // 忽略检查玩家是否可以更新弹幕 + TShock.Config.Settings.IgnoreProjUpdate = Config.Instance.IgnoreProjUpdate; - // 忽略检查玩家是否可以销毁弹幕 - TShock.Config.Settings.IgnoreProjKill = Config.Instance.IgnoreProjKill; + // 忽略检查玩家是否可以销毁弹幕 + TShock.Config.Settings.IgnoreProjKill = Config.Instance.IgnoreProjKill; - // 允许玩家破坏易碎方块 - TShock.Config.Settings.AllowCutTilesAndBreakables = Config.Instance.AllowCutTilesAndBreakables; + // 允许玩家破坏易碎方块 + TShock.Config.Settings.AllowCutTilesAndBreakables = Config.Instance.AllowCutTilesAndBreakables; - // 允许在通常不能建造的地方放置冰块 - TShock.Config.Settings.AllowIce = Config.Instance.AllowIce; + // 允许在通常不能建造的地方放置冰块 + TShock.Config.Settings.AllowIce = Config.Instance.AllowIce; - // 允许猩红在困难模式下蔓延 - TShock.Config.Settings.AllowCrimsonCreep = Config.Instance.AllowCrimsonCreep; + // 允许猩红在困难模式下蔓延 + TShock.Config.Settings.AllowCrimsonCreep = Config.Instance.AllowCrimsonCreep; - // 允许腐化在困难模式下蔓延 - TShock.Config.Settings.AllowCorruptionCreep = Config.Instance.AllowCorruptionCreep; + // 允许腐化在困难模式下蔓延 + TShock.Config.Settings.AllowCorruptionCreep = Config.Instance.AllowCorruptionCreep; - // 允许神圣在困难模式下蔓延 - TShock.Config.Settings.AllowHallowCreep = Config.Instance.AllowHallowCreep; + // 允许神圣在困难模式下蔓延 + TShock.Config.Settings.AllowHallowCreep = Config.Instance.AllowHallowCreep; - // 统计200格之间的雕像生成NPC数量 - TShock.Config.Settings.StatueSpawn200 = Config.Instance.StatueSpawn200; + // 统计200格之间的雕像生成NPC数量 + TShock.Config.Settings.StatueSpawn200 = Config.Instance.StatueSpawn200; - // 统计600格之间的雕像生成NPC数量 - TShock.Config.Settings.StatueSpawn600 = Config.Instance.StatueSpawn600; + // 统计600格之间的雕像生成NPC数量 + TShock.Config.Settings.StatueSpawn600 = Config.Instance.StatueSpawn600; - // 统计整个世界雕像生成NPC数量 - TShock.Config.Settings.StatueSpawnWorld = Config.Instance.StatueSpawnWorld; + // 统计整个世界雕像生成NPC数量 + TShock.Config.Settings.StatueSpawnWorld = Config.Instance.StatueSpawnWorld; - // 阻止禁用物品生成或指令获取 - TShock.Config.Settings.PreventBannedItemSpawn = Config.Instance.PreventBannedItemSpawn; + // 阻止禁用物品生成或指令获取 + TShock.Config.Settings.PreventBannedItemSpawn = Config.Instance.PreventBannedItemSpawn; - // 阻止玩家死后与世界互动 - TShock.Config.Settings.PreventDeadModification = Config.Instance.PreventDeadModification; + // 阻止玩家死后与世界互动 + TShock.Config.Settings.PreventDeadModification = Config.Instance.PreventDeadModification; - // 阻止玩家放置无效风格的方块 - TShock.Config.Settings.PreventInvalidPlaceStyle = Config.Instance.PreventInvalidPlaceStyle; + // 阻止玩家放置无效风格的方块 + TShock.Config.Settings.PreventInvalidPlaceStyle = Config.Instance.PreventInvalidPlaceStyle; - // 强制圣诞节事件全年发生 - TShock.Config.Settings.ForceXmas = Config.Instance.ForceXmas; + // 强制圣诞节事件全年发生 + TShock.Config.Settings.ForceXmas = Config.Instance.ForceXmas; - // 强制万圣节事件全年发生 - TShock.Config.Settings.ForceHalloween = Config.Instance.ForceHalloween; + // 强制万圣节事件全年发生 + TShock.Config.Settings.ForceHalloween = Config.Instance.ForceHalloween; - // 允许管理员获取禁用物品 - TShock.Config.Settings.AllowAllowedGroupsToSpawnBannedItems = Config.Instance.AllowAllowedGroupsToSpawnBannedItems; + // 允许管理员获取禁用物品 + TShock.Config.Settings.AllowAllowedGroupsToSpawnBannedItems = Config.Instance.AllowAllowedGroupsToSpawnBannedItems; - // 玩家复活时间(秒) - TShock.Config.Settings.RespawnSeconds = Config.Instance.RespawnSeconds; + // 玩家复活时间(秒) + TShock.Config.Settings.RespawnSeconds = Config.Instance.RespawnSeconds; - // 玩家BOSS战复活时间(秒) - TShock.Config.Settings.RespawnBossSeconds = Config.Instance.RespawnBossSeconds; + // 玩家BOSS战复活时间(秒) + TShock.Config.Settings.RespawnBossSeconds = Config.Instance.RespawnBossSeconds; - // 是否提示BOSS生成或事件入侵 - TShock.Config.Settings.AnonymousBossInvasions = Config.Instance.AnonymousBossInvasions; + // 是否提示BOSS生成或事件入侵 + TShock.Config.Settings.AnonymousBossInvasions = Config.Instance.AnonymousBossInvasions; - // 检测玩家血量上限(超过会被网住) - TShock.Config.Settings.MaxHP = Config.Instance.MaxHP; + // 检测玩家血量上限(超过会被网住) + TShock.Config.Settings.MaxHP = Config.Instance.MaxHP; - // 检测玩家蓝量上限(惩罚同上) - TShock.Config.Settings.MaxMP = Config.Instance.MaxMP; + // 检测玩家蓝量上限(惩罚同上) + TShock.Config.Settings.MaxMP = Config.Instance.MaxMP; - // 爆炸影响范围(单位:方块) - TShock.Config.Settings.BombExplosionRadius = Config.Instance.BombExplosionRadius; + // 爆炸影响范围(单位:方块) + TShock.Config.Settings.BombExplosionRadius = Config.Instance.BombExplosionRadius; - // 是否直接给予玩家物品到其背包中(需要SSC支持) - TShock.Config.Settings.GiveItemsDirectly = Config.Instance.GiveItemsDirectly; + // 是否直接给予玩家物品到其背包中(需要SSC支持) + TShock.Config.Settings.GiveItemsDirectly = Config.Instance.GiveItemsDirectly; - #endregion + #endregion - #region Apply Login and Ban Settings + #region Apply Login and Ban Settings - // 默认将新注册的用户放入的组名。 - TShock.Config.Settings.DefaultRegistrationGroupName = Config.Instance.DefaultRegistrationGroupName; + // 默认将新注册的用户放入的组名。 + TShock.Config.Settings.DefaultRegistrationGroupName = Config.Instance.DefaultRegistrationGroupName; - // 默认将未注册玩家放入的组名。 - TShock.Config.Settings.DefaultGuestGroupName = Config.Instance.DefaultGuestGroupName; + // 默认将未注册玩家放入的组名。 + TShock.Config.Settings.DefaultGuestGroupName = Config.Instance.DefaultGuestGroupName; - // 记住玩家离开的位置,基于玩家的 IP。此设置不会在服务器重启后保存。 - TShock.Config.Settings.RememberLeavePos = Config.Instance.RememberLeavePos; + // 记住玩家离开的位置,基于玩家的 IP。此设置不会在服务器重启后保存。 + TShock.Config.Settings.RememberLeavePos = Config.Instance.RememberLeavePos; - // 最大登录失败尝试次数,超过此次数后踢出玩家。 - TShock.Config.Settings.MaximumLoginAttempts = Config.Instance.MaximumLoginAttempts; + // 最大登录失败尝试次数,超过此次数后踢出玩家。 + TShock.Config.Settings.MaximumLoginAttempts = Config.Instance.MaximumLoginAttempts; - // 是否在中核玩家死亡时将其踢出。 - TShock.Config.Settings.KickOnMediumcoreDeath = Config.Instance.KickOnMediumcoreDeath; + // 是否在中核玩家死亡时将其踢出。 + TShock.Config.Settings.KickOnMediumcoreDeath = Config.Instance.KickOnMediumcoreDeath; - // 如果中核玩家死亡,将给出的踢出原因。 - TShock.Config.Settings.MediumcoreKickReason = Config.Instance.MediumcoreKickReason; + // 如果中核玩家死亡,将给出的踢出原因。 + TShock.Config.Settings.MediumcoreKickReason = Config.Instance.MediumcoreKickReason; - // 是否在中核玩家死亡时将其封禁。 - TShock.Config.Settings.BanOnMediumcoreDeath = Config.Instance.BanOnMediumcoreDeath; + // 是否在中核玩家死亡时将其封禁。 + TShock.Config.Settings.BanOnMediumcoreDeath = Config.Instance.BanOnMediumcoreDeath; - // 如果中核玩家死亡,将给出的封禁原因。 - TShock.Config.Settings.MediumcoreBanReason = Config.Instance.MediumcoreBanReason; + // 如果中核玩家死亡,将给出的封禁原因。 + TShock.Config.Settings.MediumcoreBanReason = Config.Instance.MediumcoreBanReason; - // 默认情况下,禁用 IP 封禁(如果没有传递参数到封禁命令)。 - TShock.Config.Settings.DisableDefaultIPBan = Config.Instance.DisableDefaultIPBan; + // 默认情况下,禁用 IP 封禁(如果没有传递参数到封禁命令)。 + TShock.Config.Settings.DisableDefaultIPBan = Config.Instance.DisableDefaultIPBan; - // 根据 whitelist.txt 文件中的 IP 地址启用或禁用白名单。 - TShock.Config.Settings.EnableWhitelist = Config.Instance.EnableWhitelist; + // 根据 whitelist.txt 文件中的 IP 地址启用或禁用白名单。 + TShock.Config.Settings.EnableWhitelist = Config.Instance.EnableWhitelist; - // 玩家尝试加入时,如果不在白名单中,将给出的踢出原因。 - TShock.Config.Settings.WhitelistKickReason = Config.Instance.WhitelistKickReason; + // 玩家尝试加入时,如果不在白名单中,将给出的踢出原因。 + TShock.Config.Settings.WhitelistKickReason = Config.Instance.WhitelistKickReason; - // 当服务器已满,玩家尝试加入时的踢出原因。 - TShock.Config.Settings.ServerFullReason = Config.Instance.ServerFullReason; + // 当服务器已满,玩家尝试加入时的踢出原因。 + TShock.Config.Settings.ServerFullReason = Config.Instance.ServerFullReason; - // 当服务器已满且没有保留插槽时,玩家尝试加入时的踢出原因。 - TShock.Config.Settings.ServerFullNoReservedReason = Config.Instance.ServerFullNoReservedReason; + // 当服务器已满且没有保留插槽时,玩家尝试加入时的踢出原因。 + TShock.Config.Settings.ServerFullNoReservedReason = Config.Instance.ServerFullNoReservedReason; - // 是否在硬核玩家死亡时将其踢出。 - TShock.Config.Settings.KickOnHardcoreDeath = Config.Instance.KickOnHardcoreDeath; + // 是否在硬核玩家死亡时将其踢出。 + TShock.Config.Settings.KickOnHardcoreDeath = Config.Instance.KickOnHardcoreDeath; - // 硬核玩家死亡时的踢出原因。 - TShock.Config.Settings.HardcoreKickReason = Config.Instance.HardcoreKickReason; + // 硬核玩家死亡时的踢出原因。 + TShock.Config.Settings.HardcoreKickReason = Config.Instance.HardcoreKickReason; - // 是否在硬核玩家死亡时将其封禁。 - TShock.Config.Settings.BanOnHardcoreDeath = Config.Instance.BanOnHardcoreDeath; + // 是否在硬核玩家死亡时将其封禁。 + TShock.Config.Settings.BanOnHardcoreDeath = Config.Instance.BanOnHardcoreDeath; - // 硬核玩家死亡时的封禁原因。 - TShock.Config.Settings.HardcoreBanReason = Config.Instance.HardcoreBanReason; + // 硬核玩家死亡时的封禁原因。 + TShock.Config.Settings.HardcoreBanReason = Config.Instance.HardcoreBanReason; - // 如果启用了 GeoIP,将踢出被识别为使用代理的用户。 - TShock.Config.Settings.KickProxyUsers = Config.Instance.KickProxyUsers; + // 如果启用了 GeoIP,将踢出被识别为使用代理的用户。 + TShock.Config.Settings.KickProxyUsers = Config.Instance.KickProxyUsers; - // 是否要求所有玩家在游戏前注册或登录。 - TShock.Config.Settings.RequireLogin = Config.Instance.RequireLogin; + // 是否要求所有玩家在游戏前注册或登录。 + TShock.Config.Settings.RequireLogin = Config.Instance.RequireLogin; - // 允许用户登录任何账号,即使用户名与角色名不匹配。 - TShock.Config.Settings.AllowLoginAnyUsername = Config.Instance.AllowLoginAnyUsername; + // 允许用户登录任何账号,即使用户名与角色名不匹配。 + TShock.Config.Settings.AllowLoginAnyUsername = Config.Instance.AllowLoginAnyUsername; - // 允许用户注册与角色名不匹配的用户名。 - TShock.Config.Settings.AllowRegisterAnyUsername = Config.Instance.AllowRegisterAnyUsername; + // 允许用户注册与角色名不匹配的用户名。 + TShock.Config.Settings.AllowRegisterAnyUsername = Config.Instance.AllowRegisterAnyUsername; - // 新用户账户的最小密码长度。不能低于 4。 - TShock.Config.Settings.MinimumPasswordLength = Config.Instance.MinimumPasswordLength; + // 新用户账户的最小密码长度。不能低于 4。 + TShock.Config.Settings.MinimumPasswordLength = Config.Instance.MinimumPasswordLength; - // 确定 BCrypt 工作因子。增加此因子后,所有密码将在验证时升级为新工作因子。计算轮数是 2^n。增加时请谨慎。范围:5-31。 - TShock.Config.Settings.BCryptWorkFactor = Config.Instance.BCryptWorkFactor; + // 确定 BCrypt 工作因子。增加此因子后,所有密码将在验证时升级为新工作因子。计算轮数是 2^n。增加时请谨慎。范围:5-31。 + TShock.Config.Settings.BCryptWorkFactor = Config.Instance.BCryptWorkFactor; - // 禁止用户使用客户端 UUID 登录。 - TShock.Config.Settings.DisableUUIDLogin = Config.Instance.DisableUUIDLogin; + // 禁止用户使用客户端 UUID 登录。 + TShock.Config.Settings.DisableUUIDLogin = Config.Instance.DisableUUIDLogin; - // 踢出未发送 UUID 的客户端。 - TShock.Config.Settings.KickEmptyUUID = Config.Instance.KickEmptyUUID; + // 踢出未发送 UUID 的客户端。 + TShock.Config.Settings.KickEmptyUUID = Config.Instance.KickEmptyUUID; - // 如果在 1 秒钟内绘制的瓷砖数量超过此数值,将禁用玩家。 - TShock.Config.Settings.TilePaintThreshold = Config.Instance.TilePaintThreshold; + // 如果在 1 秒钟内绘制的瓷砖数量超过此数值,将禁用玩家。 + TShock.Config.Settings.TilePaintThreshold = Config.Instance.TilePaintThreshold; - // 是否在超出 TilePaint 阈值时踢出玩家。 - TShock.Config.Settings.KickOnTilePaintThresholdBroken = Config.Instance.KickOnTilePaintThresholdBroken; + // 是否在超出 TilePaint 阈值时踢出玩家。 + TShock.Config.Settings.KickOnTilePaintThresholdBroken = Config.Instance.KickOnTilePaintThresholdBroken; - // 玩家或 NPC 可造成的最大伤害。 - TShock.Config.Settings.MaxDamage = Config.Instance.MaxDamage; + // 玩家或 NPC 可造成的最大伤害。 + TShock.Config.Settings.MaxDamage = Config.Instance.MaxDamage; - // 投射物可造成的最大伤害。 - TShock.Config.Settings.MaxProjDamage = Config.Instance.MaxProjDamage; + // 投射物可造成的最大伤害。 + TShock.Config.Settings.MaxProjDamage = Config.Instance.MaxProjDamage; - // 是否在超出 MaxDamage 阈值时踢出玩家。 - TShock.Config.Settings.KickOnDamageThresholdBroken = Config.Instance.KickOnDamageThresholdBroken; + // 是否在超出 MaxDamage 阈值时踢出玩家。 + TShock.Config.Settings.KickOnDamageThresholdBroken = Config.Instance.KickOnDamageThresholdBroken; - // 如果在 1 秒内杀死的瓷砖数量超过此值,将禁用玩家并撤销其操作。 - TShock.Config.Settings.TileKillThreshold = Config.Instance.TileKillThreshold; + // 如果在 1 秒内杀死的瓷砖数量超过此值,将禁用玩家并撤销其操作。 + TShock.Config.Settings.TileKillThreshold = Config.Instance.TileKillThreshold; - // 是否在超出 TileKill 阈值时踢出玩家。 - TShock.Config.Settings.KickOnTileKillThresholdBroken = Config.Instance.KickOnTileKillThresholdBroken; + // 是否在超出 TileKill 阈值时踢出玩家。 + TShock.Config.Settings.KickOnTileKillThresholdBroken = Config.Instance.KickOnTileKillThresholdBroken; - // 如果在 1 秒内放置的瓷砖数量超过此值,将禁用玩家并撤销其操作。 - TShock.Config.Settings.TilePlaceThreshold = Config.Instance.TilePlaceThreshold; + // 如果在 1 秒内放置的瓷砖数量超过此值,将禁用玩家并撤销其操作。 + TShock.Config.Settings.TilePlaceThreshold = Config.Instance.TilePlaceThreshold; - // 是否在超出 TilePlace 阈值时踢出玩家。 - TShock.Config.Settings.KickOnTilePlaceThresholdBroken = Config.Instance.KickOnTilePlaceThresholdBroken; + // 是否在超出 TilePlace 阈值时踢出玩家。 + TShock.Config.Settings.KickOnTilePlaceThresholdBroken = Config.Instance.KickOnTilePlaceThresholdBroken; - // 如果在 1 秒内超出此液体设置数值,将禁用玩家。 - TShock.Config.Settings.TileLiquidThreshold = Config.Instance.TileLiquidThreshold; + // 如果在 1 秒内超出此液体设置数值,将禁用玩家。 + TShock.Config.Settings.TileLiquidThreshold = Config.Instance.TileLiquidThreshold; - // 是否在超出 TileLiquid 阈值时踢出玩家。 - TShock.Config.Settings.KickOnTileLiquidThresholdBroken = Config.Instance.KickOnTileLiquidThresholdBroken; + // 是否在超出 TileLiquid 阈值时踢出玩家。 + TShock.Config.Settings.KickOnTileLiquidThresholdBroken = Config.Instance.KickOnTileLiquidThresholdBroken; - // 是否忽略水晶子弹的碎片在投射物阈值统计中。 - TShock.Config.Settings.ProjIgnoreShrapnel = Config.Instance.ProjIgnoreShrapnel; + // 是否忽略水晶子弹的碎片在投射物阈值统计中。 + TShock.Config.Settings.ProjIgnoreShrapnel = Config.Instance.ProjIgnoreShrapnel; - // 如果在 1 秒内超出此投射物创建数,将禁用玩家。 - TShock.Config.Settings.ProjectileThreshold = Config.Instance.ProjectileThreshold; + // 如果在 1 秒内超出此投射物创建数,将禁用玩家。 + TShock.Config.Settings.ProjectileThreshold = Config.Instance.ProjectileThreshold; - // 是否在超出 Projectile 阈值时踢出玩家。 - TShock.Config.Settings.KickOnProjectileThresholdBroken = Config.Instance.KickOnProjectileThresholdBroken; + // 是否在超出 Projectile 阈值时踢出玩家。 + TShock.Config.Settings.KickOnProjectileThresholdBroken = Config.Instance.KickOnProjectileThresholdBroken; - // 如果在 1 秒内发送的 HealOtherPlayer 包超过此数值,将禁用玩家。 - TShock.Config.Settings.HealOtherThreshold = Config.Instance.HealOtherThreshold; + // 如果在 1 秒内发送的 HealOtherPlayer 包超过此数值,将禁用玩家。 + TShock.Config.Settings.HealOtherThreshold = Config.Instance.HealOtherThreshold; - // 是否在超出 HealOther 阈值时踢出玩家。 - TShock.Config.Settings.KickOnHealOtherThresholdBroken = Config.Instance.KickOnHealOtherThresholdBroken; + // 是否在超出 HealOther 阈值时踢出玩家。 + TShock.Config.Settings.KickOnHealOtherThresholdBroken = Config.Instance.KickOnHealOtherThresholdBroken; - // 区域与出生点提示无权建筑。 - TShock.Config.Settings.SuppressPermissionFailureNotices = Config.Instance.SuppressPermissionFailureNotices; + // 区域与出生点提示无权建筑。 + TShock.Config.Settings.SuppressPermissionFailureNotices = Config.Instance.SuppressPermissionFailureNotices; - // 禁止修改后的天顶剑。 - TShock.Config.Settings.DisableModifiedZenith = Config.Instance.DisableModifiedZenith; + // 禁止修改后的天顶剑。 + TShock.Config.Settings.DisableModifiedZenith = Config.Instance.DisableModifiedZenith; - // 禁用自定义死亡信息。 - TShock.Config.Settings.DisableCustomDeathMessages = Config.Instance.DisableCustomDeathMessages; + // 禁用自定义死亡信息。 + TShock.Config.Settings.DisableCustomDeathMessages = Config.Instance.DisableCustomDeathMessages; - #endregion + #endregion - #region Apply Chat Settings + #region Apply Chat Settings - // 指定用于启动命令的字符串。 - TShock.Config.Settings.CommandSpecifier = Config.Instance.CommandSpecifier; + // 指定用于启动命令的字符串。 + TShock.Config.Settings.CommandSpecifier = Config.Instance.CommandSpecifier; - // 指定用于静默启动命令的字符串。 - TShock.Config.Settings.CommandSilentSpecifier = Config.Instance.CommandSilentSpecifier; + // 指定用于静默启动命令的字符串。 + TShock.Config.Settings.CommandSilentSpecifier = Config.Instance.CommandSilentSpecifier; - // 禁用将日志作为消息发送给具有日志权限的玩家。 - TShock.Config.Settings.DisableSpewLogs = Config.Instance.DisableSpewLogs; + // 禁用将日志作为消息发送给具有日志权限的玩家。 + TShock.Config.Settings.DisableSpewLogs = Config.Instance.DisableSpewLogs; - // 阻止 OnSecondUpdate 检查写入日志文件。 - TShock.Config.Settings.DisableSecondUpdateLogs = Config.Instance.DisableSecondUpdateLogs; + // 阻止 OnSecondUpdate 检查写入日志文件。 + TShock.Config.Settings.DisableSecondUpdateLogs = Config.Instance.DisableSecondUpdateLogs; - // 超级管理员组的聊天颜色。 - TShock.Config.Settings.SuperAdminChatRGB = Config.Instance.SuperAdminChatRGB; + // 超级管理员组的聊天颜色。 + TShock.Config.Settings.SuperAdminChatRGB = Config.Instance.SuperAdminChatRGB; - // 超级管理员的聊天前缀。 - TShock.Config.Settings.SuperAdminChatPrefix = Config.Instance.SuperAdminChatPrefix; + // 超级管理员的聊天前缀。 + TShock.Config.Settings.SuperAdminChatPrefix = Config.Instance.SuperAdminChatPrefix; - // 超级管理员的聊天后缀。 - TShock.Config.Settings.SuperAdminChatSuffix = Config.Instance.SuperAdminChatSuffix; + // 超级管理员的聊天后缀。 + TShock.Config.Settings.SuperAdminChatSuffix = Config.Instance.SuperAdminChatSuffix; - // 是否在玩家加入时基于其 IP 地址宣布玩家的地理位置。 - TShock.Config.Settings.EnableGeoIP = Config.Instance.EnableGeoIP; + // 是否在玩家加入时基于其 IP 地址宣布玩家的地理位置。 + TShock.Config.Settings.EnableGeoIP = Config.Instance.EnableGeoIP; - // 是否在玩家加入时向具有日志权限的用户显示玩家的 IP 地址。 - TShock.Config.Settings.DisplayIPToAdmins = Config.Instance.DisplayIPToAdmins; + // 是否在玩家加入时向具有日志权限的用户显示玩家的 IP 地址。 + TShock.Config.Settings.DisplayIPToAdmins = Config.Instance.DisplayIPToAdmins; - // 更改游戏内聊天格式。 - TShock.Config.Settings.ChatFormat = Config.Instance.ChatFormat; + // 更改游戏内聊天格式。 + TShock.Config.Settings.ChatFormat = Config.Instance.ChatFormat; - // 更改使用头顶聊天时的玩家名称格式。 - TShock.Config.Settings.ChatAboveHeadsFormat = Config.Instance.ChatAboveHeadsFormat; + // 更改使用头顶聊天时的玩家名称格式。 + TShock.Config.Settings.ChatAboveHeadsFormat = Config.Instance.ChatAboveHeadsFormat; - // 是否在玩家头顶显示聊天消息。 - TShock.Config.Settings.EnableChatAboveHeads = Config.Instance.EnableChatAboveHeads; + // 是否在玩家头顶显示聊天消息。 + TShock.Config.Settings.EnableChatAboveHeads = Config.Instance.EnableChatAboveHeads; - // 用于广播消息的颜色的 RGB 值。 - TShock.Config.Settings.BroadcastRGB = Config.Instance.BroadcastRGB; + // 用于广播消息的颜色的 RGB 值。 + TShock.Config.Settings.BroadcastRGB = Config.Instance.BroadcastRGB; - #endregion + #endregion - #region Apply MySQL Settings + #region Apply MySQL Settings - // 存储数据时使用的数据库类型: sqlite/mysql。 - TShock.Config.Settings.StorageType = Config.Instance.StorageType; + // 存储数据时使用的数据库类型: sqlite/mysql。 + TShock.Config.Settings.StorageType = Config.Instance.StorageType; - // 本服务器的数据库路径。 - TShock.Config.Settings.SqliteDBPath = Config.Instance.SqliteDBPath; + // 本服务器的数据库路径。 + TShock.Config.Settings.SqliteDBPath = Config.Instance.SqliteDBPath; - // Mysql连接的ip和端口。 - TShock.Config.Settings.MySqlHost = Config.Instance.MySqlHost; + // Mysql连接的ip和端口。 + TShock.Config.Settings.MySqlHost = Config.Instance.MySqlHost; - // Mysql的数据库名称。 - TShock.Config.Settings.MySqlDbName = Config.Instance.MySqlDbName; + // Mysql的数据库名称。 + TShock.Config.Settings.MySqlDbName = Config.Instance.MySqlDbName; - // Mysql的用户名。 - TShock.Config.Settings.MySqlUsername = Config.Instance.MySqlUsername; + // Mysql的用户名。 + TShock.Config.Settings.MySqlUsername = Config.Instance.MySqlUsername; - // Mysql的密码。 - TShock.Config.Settings.MySqlPassword = Config.Instance.MySqlPassword; + // Mysql的密码。 + TShock.Config.Settings.MySqlPassword = Config.Instance.MySqlPassword; - // 是否把日志存入数据库。 - TShock.Config.Settings.UseSqlLogs = Config.Instance.UseSqlLogs; + // 是否把日志存入数据库。 + TShock.Config.Settings.UseSqlLogs = Config.Instance.UseSqlLogs; - // Sql日志返回文本日志之前连接次数。 - TShock.Config.Settings.RevertToTextLogsOnSqlFailures = Config.Instance.RevertToTextLogsOnSqlFailures; + // Sql日志返回文本日志之前连接次数。 + TShock.Config.Settings.RevertToTextLogsOnSqlFailures = Config.Instance.RevertToTextLogsOnSqlFailures; - #endregion + #endregion - #region Apply REST API Settings + #region Apply REST API Settings - // 开启 Rest API。 - TShock.Config.Settings.RestApiEnabled = Config.Instance.RestApiEnabled; + // 开启 Rest API。 + TShock.Config.Settings.RestApiEnabled = Config.Instance.RestApiEnabled; - // Rest的端口。 - TShock.Config.Settings.RestApiPort = Config.Instance.RestApiPort; + // Rest的端口。 + TShock.Config.Settings.RestApiPort = Config.Instance.RestApiPort; - // 记录Rest连线。 - TShock.Config.Settings.LogRest = Config.Instance.LogRest; + // 记录Rest连线。 + TShock.Config.Settings.LogRest = Config.Instance.LogRest; - // 开启对Rest的权限认证。 - TShock.Config.Settings.EnableTokenEndpointAuthentication = Config.Instance.EnableTokenEndpointAuthentication; + // 开启对Rest的权限认证。 + TShock.Config.Settings.EnableTokenEndpointAuthentication = Config.Instance.EnableTokenEndpointAuthentication; - // Rest连接失败的请求次数。 - TShock.Config.Settings.RESTMaximumRequestsPerInterval = Config.Instance.RESTMaximumRequestsPerInterval; + // Rest连接失败的请求次数。 + TShock.Config.Settings.RESTMaximumRequestsPerInterval = Config.Instance.RESTMaximumRequestsPerInterval; - // Rest连接请求次数间隔/分钟。 - TShock.Config.Settings.RESTRequestBucketDecreaseIntervalMinutes = Config.Instance.RESTRequestBucketDecreaseIntervalMinutes; + // Rest连接请求次数间隔/分钟。 + TShock.Config.Settings.RESTRequestBucketDecreaseIntervalMinutes = Config.Instance.RESTRequestBucketDecreaseIntervalMinutes; - // Rest外部应用权限表。 - foreach (var tokenEntry in Config.Instance.ApplicationRestTokens) - { - if (!TShock.Config.Settings.ApplicationRestTokens.ContainsKey(tokenEntry.Key)) + // Rest外部应用权限表。 + foreach (var tokenEntry in Config.Instance.ApplicationRestTokens) { - TShock.Config.Settings.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; + if (!TShock.Config.Settings.ApplicationRestTokens.ContainsKey(tokenEntry.Key)) + { + TShock.Config.Settings.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; + } + else + { + // 如果键已经存在,可以选择更新或保持现有值不变,这里选择更新 + TShock.Config.Settings.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; + } } - else - { - // 如果键已经存在,可以选择更新或保持现有值不变,这里选择更新 - TShock.Config.Settings.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; - } - } - #endregion - - TShock.Config.Write(Path.Combine(TShock.SavePath, "config.json")); + #endregion + TShock.Config.Write(Path.Combine(TShock.SavePath, "config.json")); + this.OnReload(args.Player); + } + catch (Exception ex) + { + Console.WriteLine($"同步配置时出错: {ex.Message}"); + } } - private void CTC() + private void CTC(CommandArgs args) { - // 从服务器当前配置更新到自定义配置文件 - #region Sync ServerSettings to Config - Config.Instance.ServerPassword = TShock.Config.Settings.ServerPassword; - Config.Instance.ServerPort = TShock.Config.Settings.ServerPort; - Config.Instance.MaxSlots = TShock.Config.Settings.MaxSlots; - Config.Instance.ReservedSlots = TShock.Config.Settings.ReservedSlots; - Config.Instance.ServerName = TShock.Config.Settings.ServerName; - Config.Instance.UseServerName = TShock.Config.Settings.UseServerName; - Config.Instance.LogPath = TShock.Config.Settings.LogPath; - Config.Instance.DebugLogs = TShock.Config.Settings.DebugLogs; - Config.Instance.DisableLoginBeforeJoin = TShock.Config.Settings.DisableLoginBeforeJoin; - Config.Instance.IgnoreChestStacksOnLoad = TShock.Config.Settings.IgnoreChestStacksOnLoad; - Config.Instance.WorldTileProvider = TShock.Config.Settings.WorldTileProvider; - #endregion - // 应用备份和保存设置 - #region Apply Backup and Save Settings + try + { + this.OnReload(args.Player);//先重载 + // 从服务器当前配置更新到自定义配置文件 + #region Sync ServerSettings to Config + Config.Instance.ServerPassword = TShock.Config.Settings.ServerPassword; + Config.Instance.ServerPort = TShock.Config.Settings.ServerPort; + Config.Instance.MaxSlots = TShock.Config.Settings.MaxSlots; + Config.Instance.ReservedSlots = TShock.Config.Settings.ReservedSlots; + Config.Instance.ServerName = TShock.Config.Settings.ServerName; + Config.Instance.UseServerName = TShock.Config.Settings.UseServerName; + Config.Instance.LogPath = TShock.Config.Settings.LogPath; + Config.Instance.DebugLogs = TShock.Config.Settings.DebugLogs; + Config.Instance.DisableLoginBeforeJoin = TShock.Config.Settings.DisableLoginBeforeJoin; + Config.Instance.IgnoreChestStacksOnLoad = TShock.Config.Settings.IgnoreChestStacksOnLoad; + Config.Instance.WorldTileProvider = TShock.Config.Settings.WorldTileProvider; + #endregion + // 应用备份和保存设置 + #region Apply Backup and Save Settings - Config.Instance.AutoSave = TShock.Config.Settings.AutoSave; - Config.Instance.AnnounceSave = TShock.Config.Settings.AnnounceSave; - Config.Instance.ShowBackupAutosaveMessages = TShock.Config.Settings.ShowBackupAutosaveMessages; - Config.Instance.BackupInterval = TShock.Config.Settings.BackupInterval; - Config.Instance.BackupKeepFor = TShock.Config.Settings.BackupKeepFor; - Config.Instance.SaveWorldOnCrash = TShock.Config.Settings.SaveWorldOnCrash; - Config.Instance.SaveWorldOnLastPlayerExit = TShock.Config.Settings.SaveWorldOnLastPlayerExit; + Config.Instance.AutoSave = TShock.Config.Settings.AutoSave; + Config.Instance.AnnounceSave = TShock.Config.Settings.AnnounceSave; + Config.Instance.ShowBackupAutosaveMessages = TShock.Config.Settings.ShowBackupAutosaveMessages; + Config.Instance.BackupInterval = TShock.Config.Settings.BackupInterval; + Config.Instance.BackupKeepFor = TShock.Config.Settings.BackupKeepFor; + Config.Instance.SaveWorldOnCrash = TShock.Config.Settings.SaveWorldOnCrash; + Config.Instance.SaveWorldOnLastPlayerExit = TShock.Config.Settings.SaveWorldOnLastPlayerExit; - #endregion - #region Apply World Settings + #endregion + #region Apply World Settings - // 入侵事件的大小乘数 - Config.Instance.InvasionMultiplier = TShock.Config.Settings.InvasionMultiplier; + // 入侵事件的大小乘数 + Config.Instance.InvasionMultiplier = TShock.Config.Settings.InvasionMultiplier; - // 默认刷怪生成上限 - Config.Instance.DefaultMaximumSpawns = TShock.Config.Settings.DefaultMaximumSpawns; + // 默认刷怪生成上限 + Config.Instance.DefaultMaximumSpawns = TShock.Config.Settings.DefaultMaximumSpawns; - // 刷怪间隔(数值越低,敌人生成越频繁) - Config.Instance.DefaultSpawnRate = TShock.Config.Settings.DefaultSpawnRate; + // 刷怪间隔(数值越低,敌人生成越频繁) + Config.Instance.DefaultSpawnRate = TShock.Config.Settings.DefaultSpawnRate; - // 是否启用无限制入侵事件(仍需手动触发) - Config.Instance.InfiniteInvasion = TShock.Config.Settings.InfiniteInvasion; + // 是否启用无限制入侵事件(仍需手动触发) + Config.Instance.InfiniteInvasion = TShock.Config.Settings.InfiniteInvasion; - // 设置 PvP 模式 - Config.Instance.PvPMode = TShock.Config.Settings.PvPMode; + // 设置 PvP 模式 + Config.Instance.PvPMode = TShock.Config.Settings.PvPMode; - // 启用出生点保护 - Config.Instance.SpawnProtection = TShock.Config.Settings.SpawnProtection; + // 启用出生点保护 + Config.Instance.SpawnProtection = TShock.Config.Settings.SpawnProtection; - // 出生点保护范围(单位:格) - Config.Instance.SpawnProtectionRadius = TShock.Config.Settings.SpawnProtectionRadius; + // 出生点保护范围(单位:格) + Config.Instance.SpawnProtectionRadius = TShock.Config.Settings.SpawnProtectionRadius; - // 启用放置物块范围检查 - Config.Instance.RangeChecks = TShock.Config.Settings.RangeChecks; + // 启用放置物块范围检查 + Config.Instance.RangeChecks = TShock.Config.Settings.RangeChecks; - // 禁止非硬核玩家连接 - Config.Instance.HardcoreOnly = TShock.Config.Settings.HardcoreOnly; + // 禁止非硬核玩家连接 + Config.Instance.HardcoreOnly = TShock.Config.Settings.HardcoreOnly; - // 禁止软核玩家连接 - Config.Instance.MediumcoreOnly = TShock.Config.Settings.MediumcoreOnly; + // 禁止软核玩家连接 + Config.Instance.MediumcoreOnly = TShock.Config.Settings.MediumcoreOnly; - // 禁止非软核玩家连接 - Config.Instance.SoftcoreOnly = TShock.Config.Settings.SoftcoreOnly; + // 禁止非软核玩家连接 + Config.Instance.SoftcoreOnly = TShock.Config.Settings.SoftcoreOnly; - // 禁用方块放置或移除 - Config.Instance.DisableBuild = TShock.Config.Settings.DisableBuild; + // 禁用方块放置或移除 + Config.Instance.DisableBuild = TShock.Config.Settings.DisableBuild; - // 禁止困难模式 - Config.Instance.DisableHardmode = TShock.Config.Settings.DisableHardmode; + // 禁止困难模式 + Config.Instance.DisableHardmode = TShock.Config.Settings.DisableHardmode; - // 禁止生成地牢守卫 - Config.Instance.DisableDungeonGuardian = TShock.Config.Settings.DisableDungeonGuardian; + // 禁止生成地牢守卫 + Config.Instance.DisableDungeonGuardian = TShock.Config.Settings.DisableDungeonGuardian; - // 禁用小丑炸弹生成 - Config.Instance.DisableClownBombs = TShock.Config.Settings.DisableClownBombs; + // 禁用小丑炸弹生成 + Config.Instance.DisableClownBombs = TShock.Config.Settings.DisableClownBombs; - // 禁用雪球炸弹生成 - Config.Instance.DisableSnowBalls = TShock.Config.Settings.DisableSnowBalls; + // 禁用雪球炸弹生成 + Config.Instance.DisableSnowBalls = TShock.Config.Settings.DisableSnowBalls; - // 禁用死亡时掉落墓碑 - Config.Instance.DisableTombstones = TShock.Config.Settings.DisableTombstones; + // 禁用死亡时掉落墓碑 + Config.Instance.DisableTombstones = TShock.Config.Settings.DisableTombstones; - // 禁用 Skeletron Prime 炸弹生成 - Config.Instance.DisablePrimeBombs = TShock.Config.Settings.DisablePrimeBombs; + // 禁用 Skeletron Prime 炸弹生成 + Config.Instance.DisablePrimeBombs = TShock.Config.Settings.DisablePrimeBombs; - // 强制世界时间为白天或黑夜 - Config.Instance.ForceTime = TShock.Config.Settings.ForceTime; + // 强制世界时间为白天或黑夜 + Config.Instance.ForceTime = TShock.Config.Settings.ForceTime; - // 当PvP启用时,禁用隐身药水的效果 - Config.Instance.DisableInvisPvP = TShock.Config.Settings.DisableInvisPvP; + // 当PvP启用时,禁用隐身药水的效果 + Config.Instance.DisableInvisPvP = TShock.Config.Settings.DisableInvisPvP; - // 禁止移动范围(未登录时) - Config.Instance.MaxRangeForDisabled = TShock.Config.Settings.MaxRangeForDisabled; + // 禁止移动范围(未登录时) + Config.Instance.MaxRangeForDisabled = TShock.Config.Settings.MaxRangeForDisabled; - // 保护区域箱子 - Config.Instance.RegionProtectChests = TShock.Config.Settings.RegionProtectChests; + // 保护区域箱子 + Config.Instance.RegionProtectChests = TShock.Config.Settings.RegionProtectChests; - // 保护区域箱子是否上锁 - Config.Instance.RegionProtectGemLocks = TShock.Config.Settings.RegionProtectGemLocks; + // 保护区域箱子是否上锁 + Config.Instance.RegionProtectGemLocks = TShock.Config.Settings.RegionProtectGemLocks; - // 忽略检查玩家是否可以更新弹幕 - Config.Instance.IgnoreProjUpdate = TShock.Config.Settings.IgnoreProjUpdate; + // 忽略检查玩家是否可以更新弹幕 + Config.Instance.IgnoreProjUpdate = TShock.Config.Settings.IgnoreProjUpdate; - // 忽略检查玩家是否可以销毁弹幕 - Config.Instance.IgnoreProjKill = TShock.Config.Settings.IgnoreProjKill; + // 忽略检查玩家是否可以销毁弹幕 + Config.Instance.IgnoreProjKill = TShock.Config.Settings.IgnoreProjKill; - // 允许玩家破坏易碎方块 - Config.Instance.AllowCutTilesAndBreakables = TShock.Config.Settings.AllowCutTilesAndBreakables; + // 允许玩家破坏易碎方块 + Config.Instance.AllowCutTilesAndBreakables = TShock.Config.Settings.AllowCutTilesAndBreakables; - // 允许在通常不能建造的地方放置冰块 - Config.Instance.AllowIce = TShock.Config.Settings.AllowIce; + // 允许在通常不能建造的地方放置冰块 + Config.Instance.AllowIce = TShock.Config.Settings.AllowIce; - // 允许猩红在困难模式下蔓延 - Config.Instance.AllowCrimsonCreep = TShock.Config.Settings.AllowCrimsonCreep; + // 允许猩红在困难模式下蔓延 + Config.Instance.AllowCrimsonCreep = TShock.Config.Settings.AllowCrimsonCreep; - // 允许腐化在困难模式下蔓延 - Config.Instance.AllowCorruptionCreep = TShock.Config.Settings.AllowCorruptionCreep; + // 允许腐化在困难模式下蔓延 + Config.Instance.AllowCorruptionCreep = TShock.Config.Settings.AllowCorruptionCreep; - // 允许神圣在困难模式下蔓延 - Config.Instance.AllowHallowCreep = TShock.Config.Settings.AllowHallowCreep; + // 允许神圣在困难模式下蔓延 + Config.Instance.AllowHallowCreep = TShock.Config.Settings.AllowHallowCreep; - // 统计200格之间的雕像生成NPC数量 - Config.Instance.StatueSpawn200 = TShock.Config.Settings.StatueSpawn200; + // 统计200格之间的雕像生成NPC数量 + Config.Instance.StatueSpawn200 = TShock.Config.Settings.StatueSpawn200; - // 统计600格之间的雕像生成NPC数量 - Config.Instance.StatueSpawn600 = TShock.Config.Settings.StatueSpawn600; + // 统计600格之间的雕像生成NPC数量 + Config.Instance.StatueSpawn600 = TShock.Config.Settings.StatueSpawn600; - // 统计整个世界雕像生成NPC数量 - Config.Instance.StatueSpawnWorld = TShock.Config.Settings.StatueSpawnWorld; + // 统计整个世界雕像生成NPC数量 + Config.Instance.StatueSpawnWorld = TShock.Config.Settings.StatueSpawnWorld; - // 阻止禁用物品生成或指令获取 - Config.Instance.PreventBannedItemSpawn = TShock.Config.Settings.PreventBannedItemSpawn; + // 阻止禁用物品生成或指令获取 + Config.Instance.PreventBannedItemSpawn = TShock.Config.Settings.PreventBannedItemSpawn; - // 阻止玩家死后与世界互动 - Config.Instance.PreventDeadModification = TShock.Config.Settings.PreventDeadModification; + // 阻止玩家死后与世界互动 + Config.Instance.PreventDeadModification = TShock.Config.Settings.PreventDeadModification; - // 阻止玩家放置无效风格的方块 - Config.Instance.PreventInvalidPlaceStyle = TShock.Config.Settings.PreventInvalidPlaceStyle; + // 阻止玩家放置无效风格的方块 + Config.Instance.PreventInvalidPlaceStyle = TShock.Config.Settings.PreventInvalidPlaceStyle; - // 强制圣诞节事件全年发生 - Config.Instance.ForceXmas = TShock.Config.Settings.ForceXmas; + // 强制圣诞节事件全年发生 + Config.Instance.ForceXmas = TShock.Config.Settings.ForceXmas; - // 强制万圣节事件全年发生 - Config.Instance.ForceHalloween = TShock.Config.Settings.ForceHalloween; + // 强制万圣节事件全年发生 + Config.Instance.ForceHalloween = TShock.Config.Settings.ForceHalloween; - // 允许管理员获取禁用物品 - Config.Instance.AllowAllowedGroupsToSpawnBannedItems = TShock.Config.Settings.AllowAllowedGroupsToSpawnBannedItems; + // 允许管理员获取禁用物品 + Config.Instance.AllowAllowedGroupsToSpawnBannedItems = TShock.Config.Settings.AllowAllowedGroupsToSpawnBannedItems; - // 玩家复活时间(秒) - Config.Instance.RespawnSeconds = TShock.Config.Settings.RespawnSeconds; + // 玩家复活时间(秒) + Config.Instance.RespawnSeconds = TShock.Config.Settings.RespawnSeconds; - // 玩家BOSS战复活时间(秒) - Config.Instance.RespawnBossSeconds = TShock.Config.Settings.RespawnBossSeconds; + // 玩家BOSS战复活时间(秒) + Config.Instance.RespawnBossSeconds = TShock.Config.Settings.RespawnBossSeconds; - // 是否提示BOSS生成或事件入侵 - Config.Instance.AnonymousBossInvasions = TShock.Config.Settings.AnonymousBossInvasions; + // 是否提示BOSS生成或事件入侵 + Config.Instance.AnonymousBossInvasions = TShock.Config.Settings.AnonymousBossInvasions; - // 检测玩家血量上限(超过会被网住) - Config.Instance.MaxHP = TShock.Config.Settings.MaxHP; + // 检测玩家血量上限(超过会被网住) + Config.Instance.MaxHP = TShock.Config.Settings.MaxHP; - // 检测玩家蓝量上限(惩罚同上) - Config.Instance.MaxMP = TShock.Config.Settings.MaxMP; + // 检测玩家蓝量上限(惩罚同上) + Config.Instance.MaxMP = TShock.Config.Settings.MaxMP; - // 爆炸影响范围(单位:方块) - Config.Instance.BombExplosionRadius = TShock.Config.Settings.BombExplosionRadius; + // 爆炸影响范围(单位:方块) + Config.Instance.BombExplosionRadius = TShock.Config.Settings.BombExplosionRadius; - // 是否直接给予玩家物品到其背包中(需要SSC支持) - Config.Instance.GiveItemsDirectly = TShock.Config.Settings.GiveItemsDirectly; + // 是否直接给予玩家物品到其背包中(需要SSC支持) + Config.Instance.GiveItemsDirectly = TShock.Config.Settings.GiveItemsDirectly; - #endregion - #region Apply Login and Ban Settings + #endregion + #region Apply Login and Ban Settings - // 默认将新注册的用户放入的组名。 - Config.Instance.DefaultRegistrationGroupName = TShock.Config.Settings.DefaultRegistrationGroupName; + // 默认将新注册的用户放入的组名。 + Config.Instance.DefaultRegistrationGroupName = TShock.Config.Settings.DefaultRegistrationGroupName; - // 默认将未注册玩家放入的组名。 - Config.Instance.DefaultGuestGroupName = TShock.Config.Settings.DefaultGuestGroupName; + // 默认将未注册玩家放入的组名。 + Config.Instance.DefaultGuestGroupName = TShock.Config.Settings.DefaultGuestGroupName; - // 记住玩家离开的位置,基于玩家的 IP。此设置不会在服务器重启后保存。 - Config.Instance.RememberLeavePos = TShock.Config.Settings.RememberLeavePos; + // 记住玩家离开的位置,基于玩家的 IP。此设置不会在服务器重启后保存。 + Config.Instance.RememberLeavePos = TShock.Config.Settings.RememberLeavePos; - // 最大登录失败尝试次数,超过此次数后踢出玩家。 - Config.Instance.MaximumLoginAttempts = TShock.Config.Settings.MaximumLoginAttempts; + // 最大登录失败尝试次数,超过此次数后踢出玩家。 + Config.Instance.MaximumLoginAttempts = TShock.Config.Settings.MaximumLoginAttempts; - // 是否在中核玩家死亡时将其踢出。 - Config.Instance.KickOnMediumcoreDeath = TShock.Config.Settings.KickOnMediumcoreDeath; + // 是否在中核玩家死亡时将其踢出。 + Config.Instance.KickOnMediumcoreDeath = TShock.Config.Settings.KickOnMediumcoreDeath; - // 如果中核玩家死亡,将给出的踢出原因。 - Config.Instance.MediumcoreKickReason = TShock.Config.Settings.MediumcoreKickReason; + // 如果中核玩家死亡,将给出的踢出原因。 + Config.Instance.MediumcoreKickReason = TShock.Config.Settings.MediumcoreKickReason; - // 是否在中核玩家死亡时将其封禁。 - Config.Instance.BanOnMediumcoreDeath = TShock.Config.Settings.BanOnMediumcoreDeath; + // 是否在中核玩家死亡时将其封禁。 + Config.Instance.BanOnMediumcoreDeath = TShock.Config.Settings.BanOnMediumcoreDeath; - // 如果中核玩家死亡,将给出的封禁原因。 - Config.Instance.MediumcoreBanReason = TShock.Config.Settings.MediumcoreBanReason; + // 如果中核玩家死亡,将给出的封禁原因。 + Config.Instance.MediumcoreBanReason = TShock.Config.Settings.MediumcoreBanReason; - // 默认情况下,禁用 IP 封禁(如果没有传递参数到封禁命令)。 - Config.Instance.DisableDefaultIPBan = TShock.Config.Settings.DisableDefaultIPBan; + // 默认情况下,禁用 IP 封禁(如果没有传递参数到封禁命令)。 + Config.Instance.DisableDefaultIPBan = TShock.Config.Settings.DisableDefaultIPBan; - // 根据 whitelist.txt 文件中的 IP 地址启用或禁用白名单。 - Config.Instance.EnableWhitelist = TShock.Config.Settings.EnableWhitelist; + // 根据 whitelist.txt 文件中的 IP 地址启用或禁用白名单。 + Config.Instance.EnableWhitelist = TShock.Config.Settings.EnableWhitelist; - // 玩家尝试加入时,如果不在白名单中,将给出的踢出原因。 - Config.Instance.WhitelistKickReason = TShock.Config.Settings.WhitelistKickReason; + // 玩家尝试加入时,如果不在白名单中,将给出的踢出原因。 + Config.Instance.WhitelistKickReason = TShock.Config.Settings.WhitelistKickReason; - // 当服务器已满,玩家尝试加入时的踢出原因。 - Config.Instance.ServerFullReason = TShock.Config.Settings.ServerFullReason; + // 当服务器已满,玩家尝试加入时的踢出原因。 + Config.Instance.ServerFullReason = TShock.Config.Settings.ServerFullReason; - // 当服务器已满且没有保留插槽时,玩家尝试加入时的踢出原因。 - Config.Instance.ServerFullNoReservedReason = TShock.Config.Settings.ServerFullNoReservedReason; + // 当服务器已满且没有保留插槽时,玩家尝试加入时的踢出原因。 + Config.Instance.ServerFullNoReservedReason = TShock.Config.Settings.ServerFullNoReservedReason; - // 是否在硬核玩家死亡时将其踢出。 - Config.Instance.KickOnHardcoreDeath = TShock.Config.Settings.KickOnHardcoreDeath; + // 是否在硬核玩家死亡时将其踢出。 + Config.Instance.KickOnHardcoreDeath = TShock.Config.Settings.KickOnHardcoreDeath; - // 硬核玩家死亡时的踢出原因。 - Config.Instance.HardcoreKickReason = TShock.Config.Settings.HardcoreKickReason; + // 硬核玩家死亡时的踢出原因。 + Config.Instance.HardcoreKickReason = TShock.Config.Settings.HardcoreKickReason; - // 是否在硬核玩家死亡时将其封禁。 - Config.Instance.BanOnHardcoreDeath = TShock.Config.Settings.BanOnHardcoreDeath; + // 是否在硬核玩家死亡时将其封禁。 + Config.Instance.BanOnHardcoreDeath = TShock.Config.Settings.BanOnHardcoreDeath; - // 硬核玩家死亡时的封禁原因。 - Config.Instance.HardcoreBanReason = TShock.Config.Settings.HardcoreBanReason; + // 硬核玩家死亡时的封禁原因。 + Config.Instance.HardcoreBanReason = TShock.Config.Settings.HardcoreBanReason; - // 如果启用了 GeoIP,将踢出被识别为使用代理的用户。 - Config.Instance.KickProxyUsers = TShock.Config.Settings.KickProxyUsers; + // 如果启用了 GeoIP,将踢出被识别为使用代理的用户。 + Config.Instance.KickProxyUsers = TShock.Config.Settings.KickProxyUsers; - // 是否要求所有玩家在游戏前注册或登录。 - Config.Instance.RequireLogin = TShock.Config.Settings.RequireLogin; + // 是否要求所有玩家在游戏前注册或登录。 + Config.Instance.RequireLogin = TShock.Config.Settings.RequireLogin; - // 允许用户登录任何账号,即使用户名与角色名不匹配。 - Config.Instance.AllowLoginAnyUsername = TShock.Config.Settings.AllowLoginAnyUsername; + // 允许用户登录任何账号,即使用户名与角色名不匹配。 + Config.Instance.AllowLoginAnyUsername = TShock.Config.Settings.AllowLoginAnyUsername; - // 允许用户注册与角色名不匹配的用户名。 - Config.Instance.AllowRegisterAnyUsername = TShock.Config.Settings.AllowRegisterAnyUsername; + // 允许用户注册与角色名不匹配的用户名。 + Config.Instance.AllowRegisterAnyUsername = TShock.Config.Settings.AllowRegisterAnyUsername; - // 新用户账户的最小密码长度。不能低于 4。 - Config.Instance.MinimumPasswordLength = TShock.Config.Settings.MinimumPasswordLength; + // 新用户账户的最小密码长度。不能低于 4。 + Config.Instance.MinimumPasswordLength = TShock.Config.Settings.MinimumPasswordLength; - // 确定 BCrypt 工作因子。增加此因子后,所有密码将在验证时升级为新工作因子。计算轮数是 2^n。增加时请谨慎。范围:5-31。 - Config.Instance.BCryptWorkFactor = TShock.Config.Settings.BCryptWorkFactor; + // 确定 BCrypt 工作因子。增加此因子后,所有密码将在验证时升级为新工作因子。计算轮数是 2^n。增加时请谨慎。范围:5-31。 + Config.Instance.BCryptWorkFactor = TShock.Config.Settings.BCryptWorkFactor; - // 禁止用户使用客户端 UUID 登录。 - Config.Instance.DisableUUIDLogin = TShock.Config.Settings.DisableUUIDLogin; + // 禁止用户使用客户端 UUID 登录。 + Config.Instance.DisableUUIDLogin = TShock.Config.Settings.DisableUUIDLogin; - // 踢出未发送 UUID 的客户端。 - Config.Instance.KickEmptyUUID = TShock.Config.Settings.KickEmptyUUID; + // 踢出未发送 UUID 的客户端。 + Config.Instance.KickEmptyUUID = TShock.Config.Settings.KickEmptyUUID; - // 如果在 1 秒钟内绘制的瓷砖数量超过此数值,将禁用玩家。 - Config.Instance.TilePaintThreshold = TShock.Config.Settings.TilePaintThreshold; + // 如果在 1 秒钟内绘制的瓷砖数量超过此数值,将禁用玩家。 + Config.Instance.TilePaintThreshold = TShock.Config.Settings.TilePaintThreshold; - // 是否在超出 TilePaint 阈值时踢出玩家。 - Config.Instance.KickOnTilePaintThresholdBroken = TShock.Config.Settings.KickOnTilePaintThresholdBroken; + // 是否在超出 TilePaint 阈值时踢出玩家。 + Config.Instance.KickOnTilePaintThresholdBroken = TShock.Config.Settings.KickOnTilePaintThresholdBroken; - // 玩家或 NPC 可造成的最大伤害。 - Config.Instance.MaxDamage = TShock.Config.Settings.MaxDamage; + // 玩家或 NPC 可造成的最大伤害。 + Config.Instance.MaxDamage = TShock.Config.Settings.MaxDamage; - // 投射物可造成的最大伤害。 - Config.Instance.MaxProjDamage = TShock.Config.Settings.MaxProjDamage; + // 投射物可造成的最大伤害。 + Config.Instance.MaxProjDamage = TShock.Config.Settings.MaxProjDamage; - // 是否在超出 MaxDamage 阈值时踢出玩家。 - Config.Instance.KickOnDamageThresholdBroken = TShock.Config.Settings.KickOnDamageThresholdBroken; + // 是否在超出 MaxDamage 阈值时踢出玩家。 + Config.Instance.KickOnDamageThresholdBroken = TShock.Config.Settings.KickOnDamageThresholdBroken; - // 如果在 1 秒内杀死的瓷砖数量超过此值,将禁用玩家并撤销其操作。 - Config.Instance.TileKillThreshold = TShock.Config.Settings.TileKillThreshold; + // 如果在 1 秒内杀死的瓷砖数量超过此值,将禁用玩家并撤销其操作。 + Config.Instance.TileKillThreshold = TShock.Config.Settings.TileKillThreshold; - // 是否在超出 TileKill 阈值时踢出玩家。 - Config.Instance.KickOnTileKillThresholdBroken = TShock.Config.Settings.KickOnTileKillThresholdBroken; + // 是否在超出 TileKill 阈值时踢出玩家。 + Config.Instance.KickOnTileKillThresholdBroken = TShock.Config.Settings.KickOnTileKillThresholdBroken; - // 如果在 1 秒内放置的瓷砖数量超过此值,将禁用玩家并撤销其操作。 - Config.Instance.TilePlaceThreshold = TShock.Config.Settings.TilePlaceThreshold; + // 如果在 1 秒内放置的瓷砖数量超过此值,将禁用玩家并撤销其操作。 + Config.Instance.TilePlaceThreshold = TShock.Config.Settings.TilePlaceThreshold; - // 是否在超出 TilePlace 阈值时踢出玩家。 - Config.Instance.KickOnTilePlaceThresholdBroken = TShock.Config.Settings.KickOnTilePlaceThresholdBroken; + // 是否在超出 TilePlace 阈值时踢出玩家。 + Config.Instance.KickOnTilePlaceThresholdBroken = TShock.Config.Settings.KickOnTilePlaceThresholdBroken; - // 如果在 1 秒内超出此液体设置数值,将禁用玩家。 - Config.Instance.TileLiquidThreshold = TShock.Config.Settings.TileLiquidThreshold; + // 如果在 1 秒内超出此液体设置数值,将禁用玩家。 + Config.Instance.TileLiquidThreshold = TShock.Config.Settings.TileLiquidThreshold; - // 是否在超出 TileLiquid 阈值时踢出玩家。 - Config.Instance.KickOnTileLiquidThresholdBroken = TShock.Config.Settings.KickOnTileLiquidThresholdBroken; + // 是否在超出 TileLiquid 阈值时踢出玩家。 + Config.Instance.KickOnTileLiquidThresholdBroken = TShock.Config.Settings.KickOnTileLiquidThresholdBroken; - // 是否忽略水晶子弹的碎片在投射物阈值统计中。 - Config.Instance.ProjIgnoreShrapnel = TShock.Config.Settings.ProjIgnoreShrapnel; + // 是否忽略水晶子弹的碎片在投射物阈值统计中。 + Config.Instance.ProjIgnoreShrapnel = TShock.Config.Settings.ProjIgnoreShrapnel; - // 如果在 1 秒内超出此投射物创建数,将禁用玩家。 - Config.Instance.ProjectileThreshold = TShock.Config.Settings.ProjectileThreshold; + // 如果在 1 秒内超出此投射物创建数,将禁用玩家。 + Config.Instance.ProjectileThreshold = TShock.Config.Settings.ProjectileThreshold; - // 是否在超出 Projectile 阈值时踢出玩家。 - Config.Instance.KickOnProjectileThresholdBroken = TShock.Config.Settings.KickOnProjectileThresholdBroken; + // 是否在超出 Projectile 阈值时踢出玩家。 + Config.Instance.KickOnProjectileThresholdBroken = TShock.Config.Settings.KickOnProjectileThresholdBroken; - // 如果在 1 秒内发送的 HealOtherPlayer 包超过此数值,将禁用玩家。 - Config.Instance.HealOtherThreshold = TShock.Config.Settings.HealOtherThreshold; + // 如果在 1 秒内发送的 HealOtherPlayer 包超过此数值,将禁用玩家。 + Config.Instance.HealOtherThreshold = TShock.Config.Settings.HealOtherThreshold; - // 是否在超出 HealOther 阈值时踢出玩家。 - Config.Instance.KickOnHealOtherThresholdBroken = TShock.Config.Settings.KickOnHealOtherThresholdBroken; + // 是否在超出 HealOther 阈值时踢出玩家。 + Config.Instance.KickOnHealOtherThresholdBroken = TShock.Config.Settings.KickOnHealOtherThresholdBroken; - // 区域与出生点提示无权建筑。 - Config.Instance.SuppressPermissionFailureNotices = TShock.Config.Settings.SuppressPermissionFailureNotices; + // 区域与出生点提示无权建筑。 + Config.Instance.SuppressPermissionFailureNotices = TShock.Config.Settings.SuppressPermissionFailureNotices; - // 禁止修改后的天顶剑。 - Config.Instance.DisableModifiedZenith = TShock.Config.Settings.DisableModifiedZenith; + // 禁止修改后的天顶剑。 + Config.Instance.DisableModifiedZenith = TShock.Config.Settings.DisableModifiedZenith; - // 禁用自定义死亡信息。 - Config.Instance.DisableCustomDeathMessages = TShock.Config.Settings.DisableCustomDeathMessages; + // 禁用自定义死亡信息。 + Config.Instance.DisableCustomDeathMessages = TShock.Config.Settings.DisableCustomDeathMessages; - #endregion - #region Apply MySQL Settings + #endregion + #region Apply MySQL Settings - // 存储数据时使用的数据库类型: sqlite/mysql。 - Config.Instance.StorageType = TShock.Config.Settings.StorageType; + // 存储数据时使用的数据库类型: sqlite/mysql。 + Config.Instance.StorageType = TShock.Config.Settings.StorageType; - // 本服务器的数据库路径。 - Config.Instance.SqliteDBPath = TShock.Config.Settings.SqliteDBPath; + // 本服务器的数据库路径。 + Config.Instance.SqliteDBPath = TShock.Config.Settings.SqliteDBPath; - // Mysql连接的ip和端口。 - Config.Instance.MySqlHost = TShock.Config.Settings.MySqlHost; + // Mysql连接的ip和端口。 + Config.Instance.MySqlHost = TShock.Config.Settings.MySqlHost; - // Mysql的数据库名称。 - Config.Instance.MySqlDbName = TShock.Config.Settings.MySqlDbName; + // Mysql的数据库名称。 + Config.Instance.MySqlDbName = TShock.Config.Settings.MySqlDbName; - // Mysql的用户名。 - Config.Instance.MySqlUsername = TShock.Config.Settings.MySqlUsername; + // Mysql的用户名。 + Config.Instance.MySqlUsername = TShock.Config.Settings.MySqlUsername; - // Mysql的密码。 - Config.Instance.MySqlPassword = TShock.Config.Settings.MySqlPassword; + // Mysql的密码。 + Config.Instance.MySqlPassword = TShock.Config.Settings.MySqlPassword; - // 是否把日志存入数据库。 - Config.Instance.UseSqlLogs = TShock.Config.Settings.UseSqlLogs; + // 是否把日志存入数据库。 + Config.Instance.UseSqlLogs = TShock.Config.Settings.UseSqlLogs; - // Sql日志返回文本日志之前连接次数。 - Config.Instance.RevertToTextLogsOnSqlFailures = TShock.Config.Settings.RevertToTextLogsOnSqlFailures; + // Sql日志返回文本日志之前连接次数。 + Config.Instance.RevertToTextLogsOnSqlFailures = TShock.Config.Settings.RevertToTextLogsOnSqlFailures; - #endregion + #endregion - #region Apply REST API Settings + #region Apply REST API Settings - // 开启 Rest API。 - Config.Instance.RestApiEnabled = TShock.Config.Settings.RestApiEnabled; + // 开启 Rest API。 + Config.Instance.RestApiEnabled = TShock.Config.Settings.RestApiEnabled; - // Rest的端口。 - Config.Instance.RestApiPort = TShock.Config.Settings.RestApiPort; + // Rest的端口。 + Config.Instance.RestApiPort = TShock.Config.Settings.RestApiPort; - // 记录Rest连线。 - Config.Instance.LogRest = TShock.Config.Settings.LogRest; + // 记录Rest连线。 + Config.Instance.LogRest = TShock.Config.Settings.LogRest; - // 开启对Rest的权限认证。 - Config.Instance.EnableTokenEndpointAuthentication = TShock.Config.Settings.EnableTokenEndpointAuthentication; + // 开启对Rest的权限认证。 + Config.Instance.EnableTokenEndpointAuthentication = TShock.Config.Settings.EnableTokenEndpointAuthentication; - // Rest连接失败的请求次数。 - Config.Instance.RESTMaximumRequestsPerInterval = TShock.Config.Settings.RESTMaximumRequestsPerInterval; + // Rest连接失败的请求次数。 + Config.Instance.RESTMaximumRequestsPerInterval = TShock.Config.Settings.RESTMaximumRequestsPerInterval; - // Rest连接请求次数间隔/分钟。 - Config.Instance.RESTRequestBucketDecreaseIntervalMinutes = TShock.Config.Settings.RESTRequestBucketDecreaseIntervalMinutes; + // Rest连接请求次数间隔/分钟。 + Config.Instance.RESTRequestBucketDecreaseIntervalMinutes = TShock.Config.Settings.RESTRequestBucketDecreaseIntervalMinutes; - // Rest外部应用权限表。 - foreach (var tokenEntry in TShock.Config.Settings.ApplicationRestTokens) - { - if (!Config.Instance.ApplicationRestTokens.ContainsKey(tokenEntry.Key)) + // Rest外部应用权限表。 + foreach (var tokenEntry in TShock.Config.Settings.ApplicationRestTokens) { - Config.Instance.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; + if (!Config.Instance.ApplicationRestTokens.ContainsKey(tokenEntry.Key)) + { + Config.Instance.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; + } + else + { + // 如果键已经存在,可以选择更新或保持现有值不变,这里选择更新 + Config.Instance.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; + } } - else - { - // 如果键已经存在,可以选择更新或保持现有值不变,这里选择更新 - Config.Instance.ApplicationRestTokens[tokenEntry.Key] = tokenEntry.Value; - } - } - #endregion - Config.Save(); + #endregion + Config.Save(); + this.OnReload(args.Player); + } + catch (Exception ex) + { + Console.WriteLine($"同步配置时出错: {ex.Message}"); + } } } \ No newline at end of file diff --git a/src/ZHIPlayerManager/README.md b/src/ZHIPlayerManager/README.md index affb3c443..71c364b7c 100644 --- a/src/ZHIPlayerManager/README.md +++ b/src/ZHIPlayerManager/README.md @@ -160,6 +160,8 @@ public class ExtraData ``` ## 更新日志 ``` +v.1.0.2.3 +vi和vs指令展示玩家背包固定为图标(暂时尝试) v.1.0.2.1 修复/zmodify的同步问题 v.1.0.1.2 diff --git a/src/ZHIPlayerManager/ZHIPM.Initialize.cs b/src/ZHIPlayerManager/ZHIPM.Initialize.cs index 748549b56..576f3682b 100644 --- a/src/ZHIPlayerManager/ZHIPM.Initialize.cs +++ b/src/ZHIPlayerManager/ZHIPM.Initialize.cs @@ -111,7 +111,7 @@ private void MySSCSave(CommandArgs args) return; } - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; @@ -153,7 +153,7 @@ private void MySSCSaveAuto(CommandArgs args) return; } - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; @@ -195,7 +195,7 @@ private void ViewMySSCSave(CommandArgs args) //查询本人 if (args.Parameters.Count == 0 || (args.Parameters.Count == 1 && int.TryParse(args.Parameters[0], out _))) { - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; @@ -314,7 +314,7 @@ private void ViewMySSCSave(CommandArgs args) } string text; - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { text = GetItemsString(items, NetItem.MaxInventory); text = FormatArrangement(text, 30, " "); @@ -358,7 +358,7 @@ private void SSCClone(CommandArgs args) return; } - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; @@ -951,7 +951,7 @@ private void ZResetPlayerDB(CommandArgs args) { if (ZPDataBase.ClearALLZPlayerDB(ZPDataBase)) { - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendMessage(GetString("所有玩家的备份数据均已重置"), broadcastColor); TSPlayer.All.SendMessage(GetString("所有玩家的备份数据均已重置"), broadcastColor); @@ -1032,7 +1032,7 @@ private void ZResetPlayerEX(CommandArgs args) if (ZPExtraDB.ClearALLZPlayerExtraDB(ZPExtraDB)) { edPlayers.Clear(); - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendMessage(GetString("所有玩家的额外数据均已重置"), broadcastColor); TSPlayer.All.SendMessage(GetString("所有玩家的额外数据均已重置"), broadcastColor); @@ -1136,7 +1136,7 @@ private void ZResetPlayer(CommandArgs args) catch { } TShock.DB.Query("delete from tsCharacter"); - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendMessage(GetString("所有玩家的人物数据均已重置"), broadcastColor); } @@ -1225,7 +1225,7 @@ private void ZResetPlayerAll(CommandArgs args) return; } - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendMessage(GetString($"玩家已全部初始化"), new Color(0, 255, 0)); TSPlayer.All.SendMessage(GetString($"所有玩家的所有数据均已全部初始化"), broadcastColor); @@ -1250,7 +1250,8 @@ private void ViewInvent(CommandArgs args) } //显示模式 - var model = args.Player.IsLoggedIn ? 0 : 1; + var model = args.Player.RealPlayer ? 0 : 1; + //var model = 0; var name = args.Parameters[0]; var list = this.BestFindPlayerByNameOrIndex(name); @@ -1499,8 +1500,7 @@ private void ViewInventDisorder(CommandArgs args) return; } - var model = args.Player.IsLoggedIn ? 0 : 1; - + var model = args.Player.RealPlayer ? 0 : 1; var name = args.Parameters[0]; var list = this.BestFindPlayerByNameOrIndex(name); if (list.Count > 0) @@ -1660,13 +1660,13 @@ private void ViewState(CommandArgs args) var name = args.Parameters[0]; var list = this.BestFindPlayerByNameOrIndex(name); - if (name.Equals("me", StringComparison.OrdinalIgnoreCase) && args.Player.IsLoggedIn) + if (name.Equals("me", StringComparison.OrdinalIgnoreCase) && args.Player.RealPlayer) { list.Clear(); list.Add(args.Player); } - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { if (list.Any()) { @@ -2270,7 +2270,7 @@ private void Clear(CommandArgs args) if (args.Parameters.Count == 1 && args.Parameters[0].Equals("useless", StringComparison.OrdinalIgnoreCase)) { this.clearTimer = Timer + 1200L; - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendMessage(GetString("服务器将在20秒后清理世界内所有无用NPC,射弹和物品"), new Color(255, 0, 0)); } @@ -2638,7 +2638,7 @@ private void HideTips(CommandArgs args) return; } - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; @@ -2726,7 +2726,7 @@ private void ZhiExportPlayer(CommandArgs args) var player = this.CreateAPlayer(one.Key.Name, one.Value)!; if (this.ExportPlayer(player, ZPExtraDB.getPlayerExtraDBTime(one.Key.ID))) { - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { args.Player.SendMessage(GetString($"用户 [{player.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player.name}.plr"), new Color(0, 255, 0)); } @@ -2739,7 +2739,7 @@ private void ZhiExportPlayer(CommandArgs args) } else { - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString($"用户 [{one.Key}] 因数据错误导出失败")); } @@ -2765,7 +2765,7 @@ private void ZhiExportPlayer(CommandArgs args) ZipFile.CreateFromDirectory(sourcePath, destPath, CompressionLevel.SmallestSize, false); Directory.Delete(sourcePath, true); sb.AppendLine(GetString($"已打包为{TShock.SavePath}/Zhipm/{worldName + this.now}.zip")); - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(sb.ToString()); } @@ -2995,7 +2995,7 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine(args.Player.IsLoggedIn ? GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name))}") : GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name), 1)}")); + sb.AppendLine(args.Player.RealPlayer ? GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name))}") : GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name), 1)}")); } args.Player.SendMessage(sb.ToString(), TextColor()); @@ -3020,7 +3020,7 @@ private void ZhiSortPlayer(CommandArgs args) for (var i = 0; i < count; i++) { - sb.AppendLine(args.Player.IsLoggedIn ? GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name))}") : GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name), 1)}")); + sb.AppendLine(args.Player.RealPlayer ? GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name))}") : GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name), 1)}")); } args.Player.SendMessage(sb.ToString(), TextColor()); @@ -3031,7 +3031,7 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine(args.Player.IsLoggedIn ? GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name))}") : GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name), 1)}")); + sb.AppendLine(args.Player.RealPlayer ? GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name))}") : GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.Cointostring(this.GetPlayerCoin(list[i].Name), 1)}")); } args.Player.SendMessage(sb.ToString(), TextColor()); @@ -3559,7 +3559,7 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } @@ -3591,7 +3591,7 @@ private void ZhiSortPlayer(CommandArgs args) for (var i = 0; i < count; i++) { - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } @@ -3609,7 +3609,7 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - if (args.Player.IsLoggedIn) + if (args.Player.RealPlayer) { sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } @@ -3787,7 +3787,7 @@ private void SuperBan(CommandArgs args) } } - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendMessage(GetString($"用户 {user.Name} 已被 {args.Player.Name} 封禁"), broadcastColor); } @@ -4965,7 +4965,7 @@ private void Function(CommandArgs args) if (config.AllowPlayerRespawnAtLastDeathPoint) { - if (!args.Player.IsLoggedIn) + if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; diff --git a/src/ZHIPlayerManager/ZHIPM.cs b/src/ZHIPlayerManager/ZHIPM.cs index 287a154a5..4ef430fb3 100644 --- a/src/ZHIPlayerManager/ZHIPM.cs +++ b/src/ZHIPlayerManager/ZHIPM.cs @@ -15,7 +15,7 @@ public partial class ZHIPM : TerrariaPlugin public override string Description => GetString("玩家管理,提供修改玩家的任何信息,允许玩家备份,可以回档等操作"); public override string Name => System.Reflection.Assembly.GetExecutingAssembly().GetName().Name!; - public override Version Version => new Version(1, 0, 2, 2); + public override Version Version => new Version(1, 0, 2, 3); #region 字段或属性 ///