diff --git a/InstallTShock.ps1 b/InstallTShock.ps1 deleted file mode 100644 index 14cc0022..00000000 --- a/InstallTShock.ps1 +++ /dev/null @@ -1,109 +0,0 @@ -Add-Type -AssemblyName System.Windows.Forms - -function Get-DownloadUrl { - [CmdletBinding()] - param( - [Parameter(Mandatory=$false, Position=0)] - [string]$url = "https://api.github.com/repos/Pryaxis/TShock/releases/latest" - ) - - process { - try { - $response = Invoke-WebRequest -Uri $url -UseBasicParsing - - # 检查HTTP状态码 - if ($response.StatusCode -ne 200) { - throw "Failed to retrieve the resource at '$url'. Status code: $($response.StatusCode)" - } - - $json = $response.Content | ConvertFrom-Json - - if (-not ($json -and $json.assets[3].browser_download_url)) { - throw "The JSON content at '$url' does not contain a valid 'browser_download_url' property." - } - - return $json.assets[3].browser_download_url - } - catch [System.Net.WebException], [System.Management.Automation.PSInvocationException] { - # 处理可能的网络异常和JSON解析异常 - throw "Error when attempting to get version from '$url': $_" - } - } -} - -function Get-Dotnet{ - $dotnetVersions = dotnet --list-runtimes - $hasNet6OrHigher = $false - foreach ($version in $dotnetVersions) { - if ($version -match "^Microsoft\.NETCore\.App\s+(\d+\.\d+)\.") { - $majorVersion = [int]$Matches[1] - if ($majorVersion -ge 6) { - $hasNet6OrHigher = $true - break - } - } - } - if(-not $hasNet6OrHigher){ - Write-Host ".net6 is not installed, start installing .net" - $scriptUrl = "https://dot.net/v1/dotnet-install.ps1" - # 下载并执行安装脚本 - Invoke-WebRequest -Uri $scriptUrl -OutFile "dotnet-install.ps1" - powershell -ExecutionPolicy ByPass -File ./dotnet-install.ps1 -Runtime "dotnet" -NoPath - } -} - - -function Get-TShockZip{ - param( - [Parameter(Mandatory=$true)] - [string]$proxy - ) - - process { - try { - $download_url = Get-DownloadUrl - $url = $proxy + $download_url - if($null -eq $download_url){ - throw "Not Get TShock Version Info!" - } - Write-Host "Download $url...." - #禁用进度条,进度条可能会导致下载变慢! - #$ProgressPreference = 'SilentlyContinue' - $zipFile = "./TShock.zip" - - $response = Invoke-WebRequest -Uri $url -UseBasicParsing - # 检查HTTP状态码 - if ($response.StatusCode -ne 200) { - throw "Failed to retrieve the resource at '$url'. Status code: $($response.StatusCode)" - } - [IO.File]::WriteAllBytes($zipFile, $response.Content) - Write-Host "Ready to start unzipping TShock.zip...." - Expand-Archive -Path "./TShock.zip" -DestinationPath "./TShockServer/" - Remove-Item -Path $zipFile -Force - $result = [System.Windows.Forms.MessageBox]::Show("Start TShock.Server ?", "Hint", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question) - if ($result -eq [System.Windows.Forms.DialogResult]::Yes) { - Set-Location ./TShockServer - Start-Process -FilePath ./TShock.Server.exe -ArgumentList "-lang 7" - } - }catch [System.Net.WebException], [System.Management.Automation.PSInvocationException] { - # 处理可能的网络异常 - throw "Error when attempting to get zip from '$url': $_" - } - } -} - -Get-Dotnet -$proxys = "https://gh.ddlc.top/","https://gh.llkk.cc/","https://mirror.ghproxy.com/","https://github.moeyy.xyz/","https://ghproxy.net/" -Write-Host "Places Choice Proxy Download TShock!" -$i = 1 -foreach($url in $proxys){ - Write-Host $i"." $url - $i = $i + 1 -} -$choice = Read-Host -$index = [int]$choice -if ($proxys -ge 0 -and ($index -1) -lt $proxys.Length){ - Get-TShockZip -proxy $proxys[$index - 1] -}else{ - Write-Host "Input Number Error!" -} \ No newline at end of file diff --git a/README.md b/README.md index 8b62d95e..c413bb23 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
[![TShockPlugin](https://socialify.git.ci/UnrealMultiple/TShockPlugin/image?description=1&descriptionEditable=%E4%B8%80%E4%B8%AATShock%E6%94%B6%E9%9B%86%E4%BB%93%E5%BA%93&font=Inter&forks=1&issues=1&language=1&logo=https%3A%2F%2Fgithub.com%2FUnrealMultiple%2FTShockPlugin%2Fblob%2Fmaster%2Ficon.png%3Fraw%3Dtrue&name=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Auto)](https://github.com/UnrealMultiple/TShockPlugin) -[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/UnrealMultiple/TShockPlugin/.github%2Fworkflows%2Fplugins_publish.yml)](https://github.com/UnrealMultiple/TShockPlugin/actions) +[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/UnrealMultiple/TShockPlugin/.github%2Fworkflows%2Fbuild.yml)](https://github.com/UnrealMultiple/TShockPlugin/actions) [![GitHub contributors](https://img.shields.io/github/contributors/UnrealMultiple/TShockPlugin?style=flat)](https://github.com/UnrealMultiple/TShockPlugin/graphs/contributors) [![NET6](https://img.shields.io/badge/Core-%20.NET_6-blue)](https://dotnet.microsoft.com/zh-cn/) [![QQ](https://img.shields.io/badge/QQ-EB1923?logo=tencent-qq&logoColor=white)](https://qm.qq.com/cgi-bin/qm/qr?k=54tOesIU5g13yVBNFIuMBQ6AzjgE6f0m&jump_from=webapi&authKey=6jzafzJEqQGzq7b2mAHBw+Ws5uOdl83iIu7CvFmrfm/Xxbo2kNHKSNXJvDGYxhSW) @@ -30,13 +30,10 @@ - Gitee发布(国内推荐): [Plugins.zip](https://gitee.com/kksjsj/TShockPlugin/releases/download/V1.0.0.0/Plugins.zip) - Github发布: [Plugins.zip](https://github.com/UnrealMultiple/TShockPlugin/releases/download/V1.0.0.0/Plugins.zip) - -## 如何安装TShock -- 如果你是Window用户可以选择使用以下命令一次性安装(在pwsh中运行此命令即可) -``` -curl -o install.ps1 https://gitee.com/kksjsj/TShockPlugin/raw/master/InstallTShock.ps1 -powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas -``` +#### AutoPluginManager插件 (本仓库推出的插件管理器) + /apm l 列出所有插件 + /apm i <插件名> 一键安装插件 + /apm u [插件名] 检查并且更新插件 ## 开发者注意事项 diff --git a/README_en.md b/README_en.md index 593783d9..d74d568a 100644 --- a/README_en.md +++ b/README_en.md @@ -29,14 +29,10 @@ - Github Release: [Plugins.zip](https://github.com/UnrealMultiple/TShockPlugin/releases/download/V1.0.0.0/Plugins.zip) - Gitee Release: [Plugins.zip](https://gitee.com/kksjsj/TShockPlugin/releases/download/V1.0.0.0/Plugins.zip) - -## How to Install TShock -- If you are a Windows user, you can choose to install it using the following command (run this command in pwsh): -```powershell -curl -o install.ps1 https://github.com/UnrealMultiple/TShockPlugin/blob/master/InstallTShock.ps1 -powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas -``` - +#### AutoPluginManager + /apm l List all plugins + /apm i One-click install plugin + /apm u [plugin name] Check and update plugin ## Developer Notes > Coding Standards @@ -60,8 +56,8 @@ powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas
Plugin List -| Plugin Name | Plugin Description | Precondition | -|------------------------------------------------------------------|:----------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------:| +| Plugin Name | Plugin Description | Precondition | +|----------------------------------------------------------------------|:----------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------:| | [ChattyBridge](src/ChattyBridge/README.md) | Used for cross-server chat. | No | | [EconomicsAPI](src/EconomicsAPI/README.md) | Economic plugin prerequisite | No | | [Economics.RPG](src/Economics.RPG/README.md) | RPG | [EconomicsAPI](src/EconomicsAPI/README.md) | @@ -75,7 +71,7 @@ powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas | [Economics.Task](src/Economics.Task/README.md) | Task plugin | [EconomicsAPI](src/EconomicsAPI/README.md)
[Economics.RPG](src/https://github.com/UnrealMultiple/TShockPlugin/blob/master/Economics.RPG/README.md) | | [CreateSpawn](src/CreateSpawn/README.md) | Spawn point building generation | No | | [AutoBroadcast](src/AutoBroadcast/README.md) | Automatic broadcast | No | -| [AutoTeam](src/AutoTeam/README.md) | AutoTeam | No | +| [AutoTeam](src/AutoTeam/README_EN.md) | AutoTeam | No | | [BridgeBuilder](src/BridgeBuilder/README.md) | Quick bridge laying | No | | [OnlineGiftPackage](src/OnlineGiftPackage/README.md) | Online gift pack | No | | [LifemaxExtra](src/LifemaxExtra/README.md) | Eat more Life Fruits/Life Crystal | No | @@ -84,9 +80,9 @@ powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas | [ShortCommand](src/ShortCommand/README.md) | Short Command | No | | [ProgressBag](src/ProgressBag/README.md) | Progress gift pack | No | | [CriticalHit](src/CriticalHit/README.md) | Hit prompt | No | -| [Back](src/Back/README.md) | Return to the point of death | No | +| [Back](src/Back/README_EN.md) | Return to the point of death | No | | [BanNpc](src/BanNpc/README.md) | Prevent monster generation | No | -| [MapTeleport](src/MapTp/README.md) | Double-click the map to teleport. | No | +| [MapTeleport](src/MapTp/READM_EN.md) | Double-click the map to teleport. | No | | [RandReSpawn](src/RandRespawn/README.md) | Random spawn point | No | | [CGive](src/CGive/README.md) | Offline commands | No | | [RainbowChat](src/RainbowChat/README.md) | Random chat color | No | @@ -115,7 +111,7 @@ powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas | [AutoClear](src/Autoclear/README.md) | Intelligent automatic cleaning | No | | [EssentialsPlus](src/EssentialsPlus/README.md) | More management commands | No | | [ShowArmors](src/ShowArmors/README.md) | Display equipment bar | No | -| [VeinMiner](src/VeinMiner/README.md) | Chain mining | No | +| [VeinMiner](src/VeinMiner/README_EN.md) | Chain mining | No | | [PersonalPermission](src/PersonalPermission/README.md) | Set permissions individually for players | No | | [ItemPreserver](src/ItemPreserver/README.md) | Specified items do not consume | No | | [SimultaneousUseFix](src/SimultaneousUseFix/README.md) | Solve problems like stuck double hammer and star spin machine gun | [Chireiden.TShock.Omni](src/https://github.com/sgkoishi/yaaiomni/releases) | @@ -124,14 +120,14 @@ powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas | [BuildMaster](src/BuildMaster/README.md) | Red Bean Mini Game·Master Builder Mode | [MiniGamesAPI](src/MiniGamesAPI/README.md) | | [journeyUnlock](src/journeyUnlock/README.md) | Unlock Journey Items | No | | [ListPlugins](src/ListPlugins/README.md) | List Installed Plugins | No | -| [BagPing](src/BagPing/README.md) | Mark Treasure Bag on Map | No | +| [BagPing](src/BagPing/README_EN.md) | Mark Treasure Bag on Map | No | | [ServerTools](src/ServerTools/README.md) | Server Management Tools | No | | [Platform](src/Platform/README.md) | Determine Player Device | No | | [CaiLib](src/CaiLib/README.md) | Cai’s Preload Library | No | | [GenerateMap](src/GenerateMap/README.md) | Generate Map Image | [CaiLib](src/CaiLib/README.md) | | [RestInventory](src/RestInventory/README.md) | Provide REST Query Backpack Interface | No | | [WikiLangPackLoader](src/WikiLangPackLoader/README.md) | Load Chinese Wiki Language Pack for Server | No | -| [HelpPlus](src/HelpPlus/README.md) | Fix and Enhance Help Command | No | +| [HelpPlus](src/HelpPlus/README_EN.md) | Fix and Enhance Help Command | No | | [CaiBot](src/CaiBot/README.md) | CaiBot(QQ) Adapter Plugin | Built-in Precondition | | [HouseRegion](src/HouseRegion/README.md) | Land Claiming Plugin | No | | [SignInSign](src/SignInSign/README.md) | Signboard Login Plugin | No | @@ -160,7 +156,7 @@ powershell -ExecutionPolicy ByPass -File ./install.ps1 -verb runas | [SpawnInfra](src/SpawnInfra/README.md) | Generate Basic Infrastructure | No | | [CNPCShop](src/CNPCShop/README.md) | Custom NPC Shop | No | | [SessionSentinel](src/SessionSentinel/README.md) | Handle Players Not Sending Data Packets for a Long Time | No | -| [TeleportRequest](src/TeleportRequest/README.md) | Teleport Request | No | +| [TeleportRequest](src/TeleportRequest/README_EN.md) | Teleport Request | No | | [CaiRewardChest](src/CaiRewardChest/README.md) | Convert Naturally Generated Chests into Reward Chests that Everyone Can Claim Once | No | | [ProxyProtocolSocket](src/ProxyProtocolSocket/README.md) | Accept proxy protocol connections | No | | [UnseenInventory](src/UnseenInventory/README.md) | Allows the server to generate items that are normally 'unobtainable'. | No | diff --git a/Usage.txt b/Usage.txt index 8817c786..c3cc9d47 100644 --- a/Usage.txt +++ b/Usage.txt @@ -1,3 +1,4 @@ +简体中文: [使用说明] 1. 本仓库所有插件都开源免费,按GNU General Public License v3.0许可授权使用。 2. 使用插件前请详细阅读每个插件的文档(md,或在 https://tr.monika.love/resources/104/ 查看) @@ -8,4 +9,17 @@ pdb: 插件的调试文件,和dll放在一起即可,安装后插件报错可 md: 仓库插件的READEME文件,如果没有md查看器,可以在 https://tr.monika.love/resources/104/ 的插件列表中查看每个插件的文档、 LICENSE: 插件仓库的开源协议(GNU General Public License v3.0) Plugins.json: 插件仓库插件的版本信息,一般用于自动更新 -TShockPlugin.md: 插件仓库的文档文件,有插件列表和一些说明 \ No newline at end of file +TShockPlugin.md: 插件仓库的文档文件,有插件列表和一些说明 + +English: +[Instructions] +1. All plugins in this repository are open-source and free to use under the GNU General Public License v3.0. +2. Please read the documentation for each plugin (md files, or view at https://tr.monika.love/resources/104/) before using the plugins. +3. If you encounter any issues while using the latest version of the plugins from this repository, you can ask questions on GitHub through Issues. +[File Functions] +dll: The main plugin file, to be placed in the ServerPlugins folder. +pdb: The plugin’s debug file, to be placed together with the dll. It provides more detailed error messages to help developers quickly locate errors. +md: The README file for the repository plugins. If you don’t have an md viewer, you can view the documentation for each plugin in the plugin list at https://tr.monika.love/resources/104/. +LICENSE: The open-source license for the plugin repository (GNU General Public License v3.0). +Plugins.json: The version information for the repository plugins, generally used for automatic updates. +TShockPlugin.md: The documentation file for the plugin repository, containing the plugin list and some instructions. \ No newline at end of file diff --git a/scripts/BuildHelper.py b/scripts/BuildHelper.py deleted file mode 100644 index ffcfdb97..00000000 --- a/scripts/BuildHelper.py +++ /dev/null @@ -1,91 +0,0 @@ -import os -import glob -import shutil -import sys -import zipfile -import requests - -def zip_files_in_folder(folder_path, zip_file_path): - with zipfile.ZipFile(zip_file_path, 'w', compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zipf: - for foldername, subfolders, filenames in os.walk(folder_path): - for filename in filenames: - file_path = os.path.join(foldername, filename) - arcname = os.path.relpath(file_path, folder_path) - zipf.write(file_path, arcname=arcname) - print(f"📦 压缩包已生成: {zip_file_path}") - - -if __name__ == '__main__': - print(f"🚀 开始执行打包脚本...(By Cai 😋)") - build_type = sys.argv[1] - - print(f"🗑️ 开始删除json文件...") - for file in glob.glob(os.path.join(f"out/{build_type}/", "*.json")): - os.remove(file) - print(f"✅ 已删除文件: {file}") - print("✅ json文件删除成功!") - - print("📝 开始移动README.md...") - cwd = os.getcwd() - for dir_name in os.listdir(cwd): - dir_path = os.path.join(cwd, dir_name) - if os.path.isdir(dir_path): - for file_name in os.listdir(dir_path): - try: - if file_name.endswith('.csproj'): - source_path = os.path.join(dir_path, 'README.md') - destination_path = os.path.join(cwd, 'out', f'{build_type}', file_name.replace('.csproj', '.md')) - shutil.copyfile(source_path, destination_path) - print(f"🔍 找到README.md({destination_path})") - except: - print(f"⚠️ README移动失败({file_name})") - - - os.makedirs(f'out/{build_type}/Plugins', exist_ok=True) - - out_dir = f'out/{build_type}' - files = [f for f in os.listdir(out_dir) if os.path.isfile(os.path.join(out_dir, f))] - - - for file in files: - shutil.move(os.path.join(out_dir, file), os.path.join(f'out/{build_type}/Plugins', file)) - - shutil.copyfile('README.md', f"out/{build_type}/TShockPlugin.md") - print("✅ README.md移动成功!") - - shutil.copyfile('Usage.txt', f"out/{build_type}/使用前须知.txt") - print("✅ 使用前须知.txt移动成功!") - - shutil.copyfile('Plugins.json', f"out/{build_type}/Plugins.json") - print("✅ Plugins.json移动成功!") - - shutil.copyfile('LICENSE', f"out/{build_type}/LICENSE") - print("✅ 开源协议移动成功!") - - print("📦 准备打包插件...") - zip_files_in_folder(f"out/{build_type}", "Plugins.zip") - print("📦 插件打包成功!") - if build_type == "Release" and len(sys.argv) > 2: - gitee_token = sys.argv[2] - owner = 'kksjsj' - repo = 'TShockPlugin' - release_id = 431070 - headers = { - 'Authorization': f'token {gitee_token}' - } - files = { - 'file': open('Plugins.zip', 'rb') - } - attachments = requests.get(f"https://gitee.com/api/v5/repos/{owner}/{repo}/releases/{release_id}/attach_files?&page=1&per_page=100&direction=asc",headers=headers).json() - for attachment in attachments: - response = requests.delete(f"https://gitee.com/api/v5/repos/{owner}/{repo}/releases/{release_id}/attach_files/{attachment['id']}",headers=headers) - print(f'🗑️ 附件 {attachment["name"]} 删除{"成功" if response.status_code == 204 else "失败"}:{response.status_code}') - - response = requests.post(f"https://gitee.com/api/v5/repos/{owner}/{repo}/releases/{release_id}/attach_files", headers=headers, files=files) - if response.status_code == 201: - print('✨ Gitee插件包上传成功!') - print('下载链接:', response.json()['browser_download_url']) - else: - print('❓Gitee插件包上传失败:', response.status_code) - print(response.json()) - diff --git a/src/AutoReset/AutoResetPlugin.cs b/src/AutoReset/AutoResetPlugin.cs index 37a022b9..b7cc1a1a 100644 --- a/src/AutoReset/AutoResetPlugin.cs +++ b/src/AutoReset/AutoResetPlugin.cs @@ -32,7 +32,7 @@ public AutoResetPlugin(Main game) : base(game) public override string Name => "AutoReset"; - public override Version Version => new(2024, 8, 25); + public override Version Version => new(2024, 9, 1); public override string Author => "cc04 & Leader & 棱镜 & Cai & 肝帝熙恩"; @@ -42,8 +42,8 @@ public override void Initialize() { this.LoadConfig(); Commands.ChatCommands.Add(new Command("reset.admin", this.ResetCmd, "reset", "重置世界")); + Commands.ChatCommands.Add(new Command("reset.admin", this.ResetDataCmd, "resetdata", "重置数据")); Commands.ChatCommands.Add(new Command("", this.OnWho, "who", "playing", "online")); - Commands.ChatCommands.Add(new Command("reset.admin", this.ResetSetting, "rs", "重置设置")); ServerApi.Hooks.ServerJoin.Register(this, this.OnServerJoin, int.MaxValue); ServerApi.Hooks.WorldSave.Register(this, this.OnWorldSave, int.MaxValue); @@ -52,6 +52,12 @@ public override void Initialize() ; } + private void ResetDataCmd(CommandArgs args) + { + this.PostReset(); + TSPlayer.All.SendSuccessMessage(GetString("[AutoReset]服务器数据重置成功~")); + } + protected override void Dispose(bool disposing) { if (disposing) @@ -89,7 +95,7 @@ private void ReloadConfig(ReloadEventArgs e) File.WriteAllText(this._configPath, Config.ToJson()); } - e.Player.SendSuccessMessage("[AutoReset]自动重置插件配置已重载"); + e.Player.SendSuccessMessage(GetString("[AutoReset]自动重置插件配置已重载")); } private void LoadConfig() @@ -138,12 +144,12 @@ private void OnWho(CommandArgs args) if (args.Player.RealPlayer) { args.Player.SendInfoMessage( - $"[i:3611]击杀自动重置:{Lang.GetNPCName(Config.KillToReset.NpcId)}({Config.KillToReset.KillCount}/{Config.KillToReset.NeedKillCount})"); + GetString($"[i:3611]击杀自动重置:{Lang.GetNPCName(Config.KillToReset.NpcId)}({Config.KillToReset.KillCount}/{Config.KillToReset.NeedKillCount})")); } else { args.Player.SendInfoMessage( - $"📝击杀自动重置:{Lang.GetNPCName(Config.KillToReset.NpcId)}({Config.KillToReset.KillCount}/{Config.KillToReset.NeedKillCount})"); + GetString($"📝击杀自动重置:{Lang.GetNPCName(Config.KillToReset.NpcId)}({Config.KillToReset.KillCount}/{Config.KillToReset.NeedKillCount})")); } } @@ -151,10 +157,10 @@ private void OnWho(CommandArgs args) switch (status) { case Status.Cleaning: - args.Player.SendInfoMessage("重置数据中, 请稍后..."); + args.Player.SendInfoMessage(GetString("重置数据中, 请稍后...")); break; case Status.Generating: - args.Player.SendInfoMessage("生成地图中: " + this.GetProgress()); + args.Player.SendInfoMessage(GetString("生成地图中: ") + this.GetProgress()); break; case Status.Available: break; @@ -170,7 +176,7 @@ private void CountKill(NpcKilledEventArgs args) File.WriteAllText(this._configPath, Config.ToJson()); TShock.Utils.Broadcast( string.Format( - $"[自动重置]服务器中已经击杀{Lang.GetNPCName(Config.KillToReset.NpcId)}{Config.KillToReset.KillCount}/{Config.KillToReset.NeedKillCount}"), + GetString($"[AutoReset]服务器中已经击杀{Lang.GetNPCName(Config.KillToReset.NpcId)}{Config.KillToReset.KillCount}/{Config.KillToReset.NeedKillCount}")), Color.Orange); if (Config.KillToReset.NeedKillCount <= Config.KillToReset.KillCount) { @@ -189,16 +195,16 @@ private void ResetCmd(CommandArgs e) Task.Run(delegate { this._status = Status.Cleaning; - TShock.Utils.Broadcast("[自动重置]服务器即将开始重置...", Color.Orange); + TShock.Utils.Broadcast(GetString("[AutoReset]服务器即将开始重置..."), Color.Orange); for (var i = 60; i >= 0; i--) { - TShock.Utils.Broadcast(string.Format("[自动重置]{0}s后关闭服务器...", i), Color.Orange); + TShock.Utils.Broadcast(string.Format(GetString("[AutoReset]{0}s后关闭服务器..."), i), Color.Orange); Thread.Sleep(1000); } TShock.Players.ForEach(delegate (TSPlayer? p) { - p?.Kick("[自动重置]服务器已开始重置...", true, true); + p?.Kick(GetString("[AutoReset]服务器已开始重置..."), true, true); }); @@ -280,20 +286,16 @@ void ShowHelpText() List lines = new() { "/rs info", - "/rs name <地图名>", - "/rs seed <种子>", - "或", - "/rs 信息", - "/rs 名字 <地图名>", - "/rs 种子 <种子>" + GetString("/rs name <地图名>"), + GetString("/rs seed <种子>"), }; PaginationTools.SendPage( op, pageNumber, lines, new PaginationTools.Settings { - HeaderFormat = "帮助 ({0}/{1}):", - FooterFormat = "输入 {0}rs help {{0}} 查看更多".SFormat(Commands.Specifier) + HeaderFormat = GetString("帮助 ({0}/{1}):"), + FooterFormat = GetString("输入 {0}rs help {{0}} 查看更多").SFormat(Commands.Specifier) } ); } @@ -319,8 +321,8 @@ void ShowHelpText() // 世界信息 case "信息": case "info": - op.SendInfoMessage($"地图名: {(Config.SetWorld.Name ?? Main.worldName)}\n" + - $"种子: {(Config.SetWorld.Seed ?? "随机")}"); + op.SendInfoMessage(GetString($"地图名: {(Config.SetWorld.Name ?? Main.worldName)}\n") + + GetString($"种子: {(Config.SetWorld.Seed ?? GetString("随机"))}")); break; case "名字": case "name": @@ -328,13 +330,13 @@ void ShowHelpText() { Config.SetWorld.Name = null; File.WriteAllText(this._configPath, Config.ToJson()); - op.SendSuccessMessage("世界名字已设置为跟随原世界"); + op.SendSuccessMessage(GetString("世界名字已设置为跟随原世界")); } else { Config.SetWorld.Name = args.Parameters[1]; File.WriteAllText(this._configPath, Config.ToJson()); - op.SendSuccessMessage("世界名字已设置为 " + args.Parameters[1]); + op.SendSuccessMessage(GetString("世界名字已设置为 ") + args.Parameters[1]); } break; @@ -344,7 +346,7 @@ void ShowHelpText() { Config.SetWorld.Seed = null; File.WriteAllText(this._configPath, Config.ToJson()); - op.SendSuccessMessage("世界种子已设为随机"); + op.SendSuccessMessage(GetString("世界种子已设为随机")); } else { @@ -363,7 +365,7 @@ void ShowHelpText() Config.SetWorld.Seed = string.Join(" ", seedParts); File.WriteAllText(this._configPath, Config.ToJson()); - op.SendSuccessMessage("世界种子已设置为:" + Config.SetWorld.Seed); + op.SendSuccessMessage(GetString("世界种子已设置为:") + Config.SetWorld.Seed); } break; @@ -380,7 +382,7 @@ private void PostReset() } catch (Exception ex) { - TShock.Log.ConsoleWarn($"[AutoReset]重置SQL({c})执行失败: {ex.Message}"); + TShock.Log.ConsoleWarn(GetString($"[AutoReset]重置SQL({c})执行失败: {ex.Message}")); } }); foreach (var keyValuePair in Config.Files!) @@ -399,7 +401,7 @@ private void PostReset() } catch (Exception ex) { - TShock.Log.ConsoleWarn($"[AutoReset]重置文件({keyValuePair.Key})替换失败: {ex.Message}"); + TShock.Log.ConsoleWarn(GetString($"[AutoReset]重置文件({keyValuePair.Key})替换失败: {ex.Message}")); } } @@ -420,11 +422,11 @@ private void OnServerJoin(JoinEventArgs args) switch (status) { case Status.Cleaning: - plr.Disconnect("[AutoReset]重置数据中,请稍后..."); + plr.Disconnect(GetString("[AutoReset]重置数据中,请稍后...")); args.Handled = true; break; case Status.Generating: - plr.Disconnect("[AutoReset]生成地图中:\n" + this.GetProgress()); + plr.Disconnect(GetString("[AutoReset]生成地图中:\n") + this.GetProgress()); args.Handled = true; break; case Status.Available: diff --git a/src/AutoReset/README.md b/src/AutoReset/README.md index 798e28fa..da86abae 100644 --- a/src/AutoReset/README.md +++ b/src/AutoReset/README.md @@ -7,18 +7,19 @@ ## 更新日志 ``` -v.2024.8.25 - +v.2024.9.1 +添加英文翻译,添加resetdata以重置数据不生成地图 v.2024.8.24 尝试完善卸载函数 ``` ## 指令 -| 语法 | 权限 | 说明 | -| -------------- | :-----------------: | :------: | -| /reset 或 /重置世界 | reset.admin | 重置世界| -| /rs 或 /重置设置 | reset.admin | 重置设置| +| 语法 | 权限 | 说明 | +|---------------------| :-----------------: |:----:| +| /reset 或 /重置世界 | reset.admin | 重置世界 | +| /resetdata 或 /重置数据 | reset.admin | 重置数据 | +| /rs 或 /重置设置 | reset.admin | 重置设置 | ## 文件位置 diff --git a/src/AutoReset/README_EN.md b/src/AutoReset/README_EN.md new file mode 100644 index 00000000..7ab1a735 --- /dev/null +++ b/src/AutoReset/README_EN.md @@ -0,0 +1,52 @@ +# AutoReset / OneKeyReset + +- Authors: cc04 & Leader & 棱镜 & Cai & 肝帝熙恩 +- Fully automatic reset plugin, fully customizable reset, freeing your hands. + +## Commands + +| Command | Permission | Details | +|-------------|:-----------:|:-----------------------------:| +| /reset | reset.admin | Generating map and reset data | +| /resetdata | reset.admin | Only reset data | +| /rs | reset.admin | Reset Setting | + + +## Config +> Configuration file location:tshock/AutoReset/reset_config.json +```json +{ + "替换文件": { //Replace Files + "/tshock/原神.json": "原神.json", // Replace /tshock/原神.json with 原神.json + "/tshock/XSB数据缓存.json": "" // Delete /tshock/XSB数据缓存.json + }, + "击杀重置": { // Kill to reset setting + "击杀重置开关": false, // Enable or disable the kill to reset feature + "已击杀次数": 0, // Current kill count + "生物ID": 50, // NPC ID of the creature to be killed + "需要击杀次数": 50 // Number of kills required to trigger the reset + }, + "重置后指令": [ // Commands to execute after reset + "/reload", // Reload the server + "/初始化进度补给箱", + "/rpg reset" + ], + "重置前指令": [ // Commands to execute before reset + "/结算金币" + ], + "重置后SQL命令": [ // SQL commands to execute after reset + "DELETE FROM tsCharacter" // Delete all characters from the tsCharacter table + ], + "地图预设": { // Map presets + "地图名": null, // Name of the map + "地图种子": null // Seed of the map + }, + "重置提醒": false, // Enable or disable CaiBot reset reminders (CaiBot is a QQ Group BOT) + "CaiBot服务器令牌": "西江超级可爱喵" // CaiBot server token +} +``` + +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/AutoReset/Utils.cs b/src/AutoReset/Utils.cs index 6fd0ac5e..29965ba9 100644 --- a/src/AutoReset/Utils.cs +++ b/src/AutoReset/Utils.cs @@ -22,7 +22,7 @@ public static void CallApi() .Result; if (response.StatusCode != HttpStatusCode.OK) { - TShock.Log.ConsoleWarn($"[自动重置]调用API失败! (状态码: {(int) response.StatusCode})"); + TShock.Log.ConsoleWarn(GetString($"[自动重置]调用API失败! (状态码: {(int) response.StatusCode})")); } } catch (Exception ex) diff --git a/src/AutoReset/i18n/en-US.po b/src/AutoReset/i18n/en-US.po new file mode 100644 index 00000000..2cf81852 --- /dev/null +++ b/src/AutoReset/i18n/en-US.po @@ -0,0 +1,124 @@ +msgid "" +msgstr "" +"Project-Id-Version: AutoReset\n" +"POT-Creation-Date: 2024-09-01 11:28:02+0800\n" +"PO-Revision-Date: 2024-09-01 10:15+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\Utils.cs:25 +#, csharp-format +msgid "[自动重置]调用API失败! (状态码: {0})" +msgstr "[AutoReset] API call failed! (Status code: {0})" + +#: ..\..\AutoResetPlugin.cs:325 +#, csharp-format +msgid "种子: {0}" +msgstr "Seed: {0}" + +#: ..\..\AutoResetPlugin.cs:290 +msgid "/rs seed <种子>" +msgstr "/rs seed " + +#: ..\..\AutoResetPlugin.cs:349 +msgid "世界种子已设为随机" +msgstr "The world seed has been set to random" + +#: ..\..\AutoResetPlugin.cs:324 +#, csharp-format +msgid "地图名: {0}\n" +msgstr "Map name: {0}\n" + +#: ..\..\AutoResetPlugin.cs:198 +msgid "[AutoReset]服务器即将开始重置..." +msgstr "[AutoReset] The server is about to reset…" + +#: ..\..\AutoResetPlugin.cs:385 +#, csharp-format +msgid "[AutoReset]重置SQL({0})执行失败: {1}" +msgstr "[AutoReset] Resetting SQL ({0}) failed: {1}" + +#: ..\..\AutoResetPlugin.cs:160 +msgid "重置数据中, 请稍后..." +msgstr "Resetting data, please wait…" + +#: ..\..\AutoResetPlugin.cs:333 +msgid "世界名字已设置为跟随原世界" +msgstr "The world name has been set to follow the original world" + +#: ..\..\AutoResetPlugin.cs:368 +msgid "世界种子已设置为:" +msgstr "The world seed has been set to:" + +#: ..\..\AutoResetPlugin.cs:163 +msgid "生成地图中: " +msgstr "Generating map… " + +#: ..\..\AutoResetPlugin.cs:404 +#, csharp-format +msgid "[AutoReset]重置文件({0})替换失败: {1}" +msgstr "[AutoReset] Resetting file ({0}) failed: {1}" + +#: ..\..\AutoResetPlugin.cs:298 +msgid "输入 {0}rs help {{0}} 查看更多" +msgstr "Type {0}rs help {{0}} for more information" + +#: ..\..\AutoResetPlugin.cs:98 +msgid "[AutoReset]自动重置插件配置已重载" +msgstr "[AutoReset] Auto-reset plugin configuration reloaded" + +#: ..\..\AutoResetPlugin.cs:58 +msgid "[AutoReset]服务器数据重置成功~" +msgstr "[AutoReset] Server data reset successfully~" + +#: ..\..\AutoResetPlugin.cs:425 +msgid "[AutoReset]重置数据中,请稍后..." +msgstr "[AutoReset] Resetting data, please wait…" + +#: ..\..\AutoResetPlugin.cs:147 +#, csharp-format +msgid "[i:3611]击杀自动重置:{0}({1}/{2})" +msgstr "[i:3611] Auto-reset on kill: {0} ({1}/{2})" + +#: ..\..\AutoResetPlugin.cs:339 +msgid "世界名字已设置为 " +msgstr "[AutoReset] The world name has been set to " + +#: ..\..\AutoResetPlugin.cs:429 +msgid "[AutoReset]生成地图中:\n" +msgstr "[AutoReset] Generating map…\n" + +#: ..\..\AutoResetPlugin.cs:297 +msgid "帮助 ({0}/{1}):" +msgstr "Help ({0}/{1}):" + +#: ..\..\AutoResetPlugin.cs:289 +msgid "/rs name <地图名>" +msgstr "/rs name " + +#: ..\..\AutoResetPlugin.cs:325 +msgid "随机" +msgstr "Random" + +#: ..\..\AutoResetPlugin.cs:179 +#, csharp-format +msgid "[AutoReset]服务器中已经击杀{0}{1}/{2}" +msgstr "[AutoReset] {0}{1}/{2} have been killed in the server." + +#: ..\..\AutoResetPlugin.cs:152 +#, csharp-format +msgid "📝击杀自动重置:{0}({1}/{2})" +msgstr "📝 Auto-reset on kill: {0} ({1}/{2})" + +#: ..\..\AutoResetPlugin.cs:201 +msgid "[AutoReset]{0}s后关闭服务器..." +msgstr "[AutoReset] The server will shut down in {0}s..." + +#: ..\..\AutoResetPlugin.cs:207 +msgid "[AutoReset]服务器已开始重置..." +msgstr "[AutoReset] The server has started resetting." diff --git a/src/AutoReset/i18n/template.pot b/src/AutoReset/i18n/template.pot new file mode 100644 index 00000000..d31b3fce --- /dev/null +++ b/src/AutoReset/i18n/template.pot @@ -0,0 +1,126 @@ +msgid "" +msgstr "" +"Project-Id-Version: AutoReset\n" +"POT-Creation-Date: 2024-09-01 11:28:02+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:02+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\Utils.cs:25 +#, csharp-format +msgid "[自动重置]调用API失败! (状态码: {0})" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:325 +#, csharp-format +msgid "种子: {0}" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:290 +msgid "/rs seed <种子>" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:349 +msgid "世界种子已设为随机" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:324 +#, csharp-format +msgid "" +"地图名: {0}\n" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:198 +msgid "[AutoReset]服务器即将开始重置..." +msgstr "" + +#: ..\..\AutoResetPlugin.cs:385 +#, csharp-format +msgid "[AutoReset]重置SQL({0})执行失败: {1}" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:160 +msgid "重置数据中, 请稍后..." +msgstr "" + +#: ..\..\AutoResetPlugin.cs:333 +msgid "世界名字已设置为跟随原世界" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:368 +msgid "世界种子已设置为:" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:163 +msgid "生成地图中: " +msgstr "" + +#: ..\..\AutoResetPlugin.cs:404 +#, csharp-format +msgid "[AutoReset]重置文件({0})替换失败: {1}" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:298 +msgid "输入 {0}rs help {{0}} 查看更多" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:98 +msgid "[AutoReset]自动重置插件配置已重载" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:58 +msgid "[AutoReset]服务器数据重置成功~" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:425 +msgid "[AutoReset]重置数据中,请稍后..." +msgstr "" + +#: ..\..\AutoResetPlugin.cs:147 +#, csharp-format +msgid "[i:3611]击杀自动重置:{0}({1}/{2})" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:339 +msgid "世界名字已设置为 " +msgstr "" + +#: ..\..\AutoResetPlugin.cs:429 +msgid "" +"[AutoReset]生成地图中:\n" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:297 +msgid "帮助 ({0}/{1}):" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:289 +msgid "/rs name <地图名>" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:325 +msgid "随机" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:179 +#, csharp-format +msgid "[AutoReset]服务器中已经击杀{0}{1}/{2}" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:152 +#, csharp-format +msgid "📝击杀自动重置:{0}({1}/{2})" +msgstr "" + +#: ..\..\AutoResetPlugin.cs:201 +msgid "[AutoReset]{0}s后关闭服务器..." +msgstr "" + +#: ..\..\AutoResetPlugin.cs:207 +msgid "[AutoReset]服务器已开始重置..." +msgstr "" + diff --git a/src/AutoTeam/AutoTeamPlus.cs b/src/AutoTeam/AutoTeamPlus.cs index 19122b29..701000e1 100644 --- a/src/AutoTeam/AutoTeamPlus.cs +++ b/src/AutoTeam/AutoTeamPlus.cs @@ -10,7 +10,7 @@ namespace autoteam; public class Autoteam : TerrariaPlugin { public override string Author => "十七改,肝帝熙恩改"; - public override Version Version => new Version(2, 4, 1); + public override Version Version => new Version(2, 4, 2); public override string Description => "自动队伍"; public override string Name => "AutoTeamPlus"; public static Configuration Config; @@ -29,7 +29,7 @@ private static void LoadConfig() private static void ReloadConfig(ReloadEventArgs args) { LoadConfig(); - args.Player?.SendSuccessMessage("[{0}] 重新加载配置完毕。", typeof(Autoteam).Name); + args.Player?.SendSuccessMessage(GetString("[AutoTeam] 重新加载配置完毕。")); } public override void Initialize() @@ -61,7 +61,7 @@ private void TogglePlugin(CommandArgs args) if (parameters.Count < 1) { - player.SendErrorMessage("用法: /autoteam "); + player.SendErrorMessage(GetString("用法: /autoteam ")); return; } @@ -70,14 +70,14 @@ private void TogglePlugin(CommandArgs args) { case "on": Config.Enabled = true; - player.SendSuccessMessage("AutoTeamPlus 插件已启用."); + player.SendSuccessMessage(GetString("AutoTeamPlus 插件已启用.")); break; case "off": Config.Enabled = false; - player.SendSuccessMessage("AutoTeamPlus 插件已禁用."); + player.SendSuccessMessage(GetString("AutoTeamPlus 插件已禁用.")); break; default: - player.SendErrorMessage("无效的操作。请使用 'on' 或 'off'。"); + player.SendErrorMessage(GetString("无效的操作。请使用 'on' 或 'off'。")); break; } } @@ -127,11 +127,11 @@ private void SetTeam(TSPlayer player) if (teamIndex != -1) { player.SetTeam(teamIndex); - player.SendInfoMessage($"你的队伍已切换为 {teamName}."); + player.SendInfoMessage(GetString($"你的队伍已切换为 {teamName}.")); } else { - player.SendInfoMessage("未配置,可随意切换."); + player.SendInfoMessage(GetString("未配置,可随意切换.")); } } diff --git a/src/AutoTeam/README.md b/src/AutoTeam/README.md index 00d338b3..4ad9d8b9 100644 --- a/src/AutoTeam/README.md +++ b/src/AutoTeam/README.md @@ -7,6 +7,8 @@ ## 更新日志 ``` +v2.4.2 +添加英文翻译 v2.4.1 补全卸载函数 ``` diff --git a/src/AutoTeam/README_EN.md b/src/AutoTeam/README_EN.md new file mode 100644 index 00000000..6b6db7fa --- /dev/null +++ b/src/AutoTeam/README_EN.md @@ -0,0 +1,29 @@ +# AutoTeamPlus + +- Authors: 十七,肝帝熙恩 +- Source: No +- 自动分配一个组的玩家到特定队伍 + +## Commands + +| Command | Permission | Details | +|------------------|:---------------:| :------: | +| /autoteam or /at | autoteam.toggle | Toggle the automatic team assignment feature. | +| No | noautoteam | Having this permission will not automatically assign you to a team. | + +## Config +> Configuration file location:tshock/AutoTeamPlus.json +```json +{ + "组的队伍": { //Group -> Team + "组名字": "队伍名称中文或English",//本行和下面两行均可改 + "default": "red", + "admin": "green" + }, + "开启插件": true //Enable +} +``` +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/AutoTeam/i18n/en-US.po b/src/AutoTeam/i18n/en-US.po new file mode 100644 index 00000000..3e1db1ec --- /dev/null +++ b/src/AutoTeam/i18n/en-US.po @@ -0,0 +1,41 @@ +msgid "" +msgstr "" +"Project-Id-Version: AutoTeam\n" +"POT-Creation-Date: 2024-09-01 11:28:03+0800\n" +"PO-Revision-Date: 2024-09-01 11:23+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\AutoTeamPlus.cs:134 +msgid "未配置,可随意切换." +msgstr "Not configured, can freely switch teams." + +#: ..\..\AutoTeamPlus.cs:130 +#, csharp-format +msgid "你的队伍已切换为 {0}." +msgstr "Your team has been switched to {0}." + +#: ..\..\AutoTeamPlus.cs:64 +msgid "用法: /autoteam " +msgstr "Usage: /autoteam " + +#: ..\..\AutoTeamPlus.cs:77 +msgid "AutoTeamPlus 插件已禁用." +msgstr "The AutoTeamPlus plugin has been disabled." + +#: ..\..\AutoTeamPlus.cs:73 +msgid "AutoTeamPlus 插件已启用." +msgstr "The AutoTeamPlus plugin has been enabled." + +#: ..\..\AutoTeamPlus.cs:32 +msgid "[AutoTeam] 重新加载配置完毕。" +msgstr "[AutoTeam] Configuration reloaded successfully." + +#: ..\..\AutoTeamPlus.cs:80 +msgid "无效的操作。请使用 'on' 或 'off'。" +msgstr "Invalid operation. Please use ‘on’ or ‘off’." diff --git a/src/AutoTeam/i18n/template.pot b/src/AutoTeam/i18n/template.pot new file mode 100644 index 00000000..bb326db1 --- /dev/null +++ b/src/AutoTeam/i18n/template.pot @@ -0,0 +1,41 @@ +msgid "" +msgstr "" +"Project-Id-Version: AutoTeam\n" +"POT-Creation-Date: 2024-09-01 11:28:03+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:03+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\AutoTeamPlus.cs:134 +msgid "未配置,可随意切换." +msgstr "" + +#: ..\..\AutoTeamPlus.cs:130 +#, csharp-format +msgid "你的队伍已切换为 {0}." +msgstr "" + +#: ..\..\AutoTeamPlus.cs:64 +msgid "用法: /autoteam " +msgstr "" + +#: ..\..\AutoTeamPlus.cs:77 +msgid "AutoTeamPlus 插件已禁用." +msgstr "" + +#: ..\..\AutoTeamPlus.cs:73 +msgid "AutoTeamPlus 插件已启用." +msgstr "" + +#: ..\..\AutoTeamPlus.cs:32 +msgid "[AutoTeam] 重新加载配置完毕。" +msgstr "" + +#: ..\..\AutoTeamPlus.cs:80 +msgid "无效的操作。请使用 'on' 或 'off'。" +msgstr "" + diff --git a/src/Back/BackPlugin.cs b/src/Back/BackPlugin.cs index 9c9ed904..55246a07 100644 --- a/src/Back/BackPlugin.cs +++ b/src/Back/BackPlugin.cs @@ -14,7 +14,7 @@ public class BackPlugin : TerrariaPlugin public override string Author => "Megghy,熙恩改"; public override string Description => "允许玩家传送回死亡地点"; public override string Name => "BackPlugin"; - public override Version Version => new Version(1, 0, 0, 4); + public override Version Version => new Version(1, 0, 0, 5); public static Configuration Config; public BackPlugin(Main game) : base(game) { @@ -29,7 +29,7 @@ private static void LoadConfig() private static void ReloadConfig(ReloadEventArgs args) { LoadConfig(); - args.Player?.SendSuccessMessage("[{0}] 重新加载配置完毕。", typeof(BackPlugin).Name); + args.Player?.SendSuccessMessage(GetString("[Back] 重新加载配置完毕。")); } public override void Initialize() { @@ -40,7 +40,7 @@ public override void Initialize() Commands.ChatCommands.Add(new Command("back", this.Back, "back") { - HelpText = "返回最后一次死亡的位置", + HelpText = GetString("返回最后一次死亡的位置"), AllowServer = false }); } @@ -74,32 +74,32 @@ private void Back(CommandArgs args) if (args.Player.TPlayer.dead) { - args.Player.SendErrorMessage("你尚未复活,无法传送回死亡地点."); + args.Player.SendErrorMessage(GetString("你尚未复活,无法传送回死亡地点.")); } else if (data != Point.Zero) { if (!this.CanUseCommand(args.Player)) { var remainingCooldown = this.GetRemainingCooldown(args.Player); - args.Player.SendErrorMessage($"你还需要等待 {remainingCooldown.TotalSeconds:F} 秒才能再次使用此命令."); + args.Player.SendErrorMessage(GetString($"你还需要等待 {remainingCooldown.TotalSeconds:F} 秒才能再次使用此命令.")); return; } try { args.Player.Teleport(data.X, data.Y, 1); - args.Player.SendSuccessMessage($"已传送至死亡地点 [c/8DF9D8:<{data.X / 16} - {data.Y / 16}>]."); + args.Player.SendSuccessMessage(GetString($"已传送至死亡地点 [c/8DF9D8:<{data.X / 16} - {data.Y / 16}>].")); this.SetCooldown(args.Player); } catch (Exception ex) { - TShock.Log.Error($"BackPlugin: 传送玩家 {args.Player.Name} 时发生错误: {ex}"); + TShock.Log.Error(GetString($"BackPlugin: 传送玩家 {args.Player.Name} 时发生错误: {ex}")); } } else { - args.Player.SendErrorMessage("你还未死亡过"); + args.Player.SendErrorMessage(GetString("你还未死亡过")); } } diff --git a/src/Back/README.md b/src/Back/README.md index e4b9b4ef..c45b3835 100644 --- a/src/Back/README.md +++ b/src/Back/README.md @@ -7,6 +7,8 @@ ## 更新日志 ``` +v1.0.0.5 +更新英文翻译 v1.0.0.4 补全卸载函数 ``` diff --git a/src/Back/README_EN.md b/src/Back/README_EN.md new file mode 100644 index 00000000..8eeff931 --- /dev/null +++ b/src/Back/README_EN.md @@ -0,0 +1,24 @@ +# Back + +- Authors: Megghy,肝帝熙恩 +- Source: TShock QQ Group +- It can return to the player’s last death location and allows for customizable cooldown time. + +## Commands + +| Command | Permission | Details | +| -------------- |:----------:|:-------------------------:| +| /back | back | Return to Death Location | + +## Config +> Configuration file location:tshock/Back.json +```json +{ + "back冷却时间": 20 //Cool Down Time +} +``` + +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/Back/i18n/en-US.po b/src/Back/i18n/en-US.po new file mode 100644 index 00000000..da9a3046 --- /dev/null +++ b/src/Back/i18n/en-US.po @@ -0,0 +1,44 @@ +msgid "" +msgstr "" +"Project-Id-Version: Back\n" +"POT-Creation-Date: 2024-09-01 11:28:03+0800\n" +"PO-Revision-Date: 2024-09-01 11:24+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\BackPlugin.cs:43 +msgid "返回最后一次死亡的位置" +msgstr "Return to the last death location" + +#: ..\..\BackPlugin.cs:102 +msgid "你还未死亡过" +msgstr "You have not died yet" + +#: ..\..\BackPlugin.cs:97 +#, csharp-format +msgid "BackPlugin: 传送玩家 {0} 时发生错误: {1}" +msgstr "BackPlugin: Error occurred while teleporting player {0}: {1}" + +#: ..\..\BackPlugin.cs:91 +#, csharp-format +msgid "已传送至死亡地点 [c/8DF9D8:<{0} - {1}>]." +msgstr "Teleported to death location [c/8DF9D8:<{0} - {1}>]." + +#: ..\..\BackPlugin.cs:84 +#, csharp-format +msgid "你还需要等待 {0:F} 秒才能再次使用此命令." +msgstr "You need to wait {0:F} seconds before using this command again." + +#: ..\..\BackPlugin.cs:77 +msgid "你尚未复活,无法传送回死亡地点." +msgstr "" +"You have not respawned yet and cannot teleport back to the death location." + +#: ..\..\BackPlugin.cs:32 +msgid "[Back] 重新加载配置完毕。" +msgstr "[Back] Configuration reloaded successfully." diff --git a/src/Back/i18n/template.pot b/src/Back/i18n/template.pot new file mode 100644 index 00000000..756e4e12 --- /dev/null +++ b/src/Back/i18n/template.pot @@ -0,0 +1,43 @@ +msgid "" +msgstr "" +"Project-Id-Version: Back\n" +"POT-Creation-Date: 2024-09-01 11:28:03+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:04+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\BackPlugin.cs:43 +msgid "返回最后一次死亡的位置" +msgstr "" + +#: ..\..\BackPlugin.cs:102 +msgid "你还未死亡过" +msgstr "" + +#: ..\..\BackPlugin.cs:97 +#, csharp-format +msgid "BackPlugin: 传送玩家 {0} 时发生错误: {1}" +msgstr "" + +#: ..\..\BackPlugin.cs:91 +#, csharp-format +msgid "已传送至死亡地点 [c/8DF9D8:<{0} - {1}>]." +msgstr "" + +#: ..\..\BackPlugin.cs:84 +#, csharp-format +msgid "你还需要等待 {0:F} 秒才能再次使用此命令." +msgstr "" + +#: ..\..\BackPlugin.cs:77 +msgid "你尚未复活,无法传送回死亡地点." +msgstr "" + +#: ..\..\BackPlugin.cs:32 +msgid "[Back] 重新加载配置完毕。" +msgstr "" + diff --git a/src/BagPing/BagPing.cs b/src/BagPing/BagPing.cs index 846f1667..d02db710 100644 --- a/src/BagPing/BagPing.cs +++ b/src/BagPing/BagPing.cs @@ -17,7 +17,7 @@ public class BagPing : TerrariaPlugin public override string Name => "BagPing"; - public override Version Version => new Version(1, 0, 1); + public override Version Version => new Version(1, 0, 3); public BagPing(Main game) : base(game) @@ -47,7 +47,7 @@ private void OnNpcKilled(NpcKilledEventArgs e) if (e.npc.boss) { TSPlayer.All.SendSuccessMessage(TShock.Utils.ItemTag(new Item() { netID = 3318, stack = 1, prefix = 0 }) - + $"宝藏袋掉落在坐标({(int) e.npc.position.X / 16},{(int) e.npc.position.Y / 16}),已在小地图上标记!"); + +GetString( $"宝藏袋掉落在坐标({(int) e.npc.position.X / 16},{(int) e.npc.position.Y / 16}),已在小地图上标记!")); Task.Run(() => { for (var i = 0; i < 4; i++) diff --git a/src/BagPing/README.md b/src/BagPing/README.md index c98026f1..53335f55 100644 --- a/src/BagPing/README.md +++ b/src/BagPing/README.md @@ -6,6 +6,8 @@ ## 更新日志 ``` +1.0.3 +添加英文翻译 1.0.1 修改了描述 ``` diff --git a/src/BagPing/README_EN.md b/src/BagPing/README_EN.md new file mode 100644 index 00000000..0e848e07 --- /dev/null +++ b/src/BagPing/README_EN.md @@ -0,0 +1,9 @@ +# BagPing + +- Authors: Cai +- Source: [github](https://github.com/THEXN/CaiPlugins) +- Mark the dropped Boss bags on the map (60 seconds). +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love \ No newline at end of file diff --git a/src/BagPing/i18n/en-US.po b/src/BagPing/i18n/en-US.po new file mode 100644 index 00000000..ae56a115 --- /dev/null +++ b/src/BagPing/i18n/en-US.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: BagPing\n" +"POT-Creation-Date: 2024-09-01 11:20:42+0800\n" +"PO-Revision-Date: 2024-09-01 11:25+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\BagPing.cs:50 +#, csharp-format +msgid "宝藏袋掉落在坐标({0},{1}),已在小地图上标记!" +msgstr "The Boss Bag has dropped at coordinates ({0},{1}) and has been marked on the mini-map!" diff --git a/src/BagPing/i18n/template.pot b/src/BagPing/i18n/template.pot new file mode 100644 index 00000000..4fd4262e --- /dev/null +++ b/src/BagPing/i18n/template.pot @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: BagPing\n" +"POT-Creation-Date: 2024-09-01 11:28:04+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:05+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\BagPing.cs:50 +#, csharp-format +msgid "宝藏袋掉落在坐标({0},{1}),已在小地图上标记!" +msgstr "" + diff --git a/src/Challenger/i18n/template.pot b/src/Challenger/i18n/template.pot index 3adeb7bd..5af9e2e6 100644 --- a/src/Challenger/i18n/template.pot +++ b/src/Challenger/i18n/template.pot @@ -248,6 +248,7 @@ msgid "" "或其上级合成物时,帕拉丁之锤伤害翻倍" msgstr "" + #: ../../Challenger/Challenger.cs:1383 msgid "" "【皇家凝胶】\n" diff --git a/src/HelpPlus/Help.cs b/src/HelpPlus/Help.cs index 5b7eb365..e161d000 100644 --- a/src/HelpPlus/Help.cs +++ b/src/HelpPlus/Help.cs @@ -43,7 +43,7 @@ public override void Initialize() private void GeneralHooks_ReloadEvent(ReloadEventArgs e) { Config.Read(); - e.Player.SendSuccessMessage("[HelpPlus]插件配置已重载!"); + e.Player.SendSuccessMessage(GetString("[HelpPlus]插件配置已重载!")); } private static bool IsWhiteSpace(char c) @@ -182,7 +182,7 @@ private static void Help(CommandArgs args) var Specifier = TShock.Config.Settings.CommandSpecifier; if (args.Parameters.Count > 1) { - args.Player.SendErrorMessage(string.Format("无效用法.正确用法: {0}help <命令/页码>", Specifier)); + args.Player.SendErrorMessage(GetString( "无效用法.正确用法: {0}help <命令/页码>", Specifier)); return; } @@ -200,8 +200,8 @@ where cmd.CanRun(args.Player) && (cmd.Name != "setup" || TShock.SetupToken != 0) PaginationTools.SendPage(args.Player, pageNumber, PaginationTools.BuildLinesFromTerms(cmdNames), new PaginationTools.Settings { - HeaderFormat = "命令列表 ({0}/{1}):", - FooterFormat = string.Format("输入 {0}help {{0}} 翻页.", Specifier) + HeaderFormat = GetString("命令列表 ({0}/{1}):"), + FooterFormat = GetString("输入 {0}help {{0}} 翻页.", Specifier) }); } else @@ -215,17 +215,17 @@ where cmd.CanRun(args.Player) && (cmd.Name != "setup" || TShock.SetupToken != 0) var command = Commands.ChatCommands.Find(c => c.Names.Contains(commandName)); if (command == null) { - args.Player.SendErrorMessage("无效命令."); + args.Player.SendErrorMessage(GetString("无效命令.")); return; } if (!command.CanRun(args.Player)) { - args.Player.SendErrorMessage("你没有权限查询此命令."); + args.Player.SendErrorMessage(GetString("你没有权限查询此命令.")); return; } - args.Player.SendSuccessMessage(string.Format("{0}{1}的帮助:", Specifier, command.Name)); + args.Player.SendSuccessMessage(GetString("{0}{1}的帮助:", Specifier, command.Name)); if (command.HelpDesc == null) { args.Player.SendWarningMessage(command.HelpText); @@ -240,24 +240,24 @@ where cmd.CanRun(args.Player) && (cmd.Name != "setup" || TShock.SetupToken != 0) if (command.Names.Count > 1) { - args.Player.SendInfoMessage($"别名: [c/00ffff:{string.Join(',', command.Names)}]"); + args.Player.SendInfoMessage(GetString($"别名: [c/00ffff:{string.Join(',', command.Names)}]")); } args.Player.SendInfoMessage( - $"权限: {(command.Permissions.Count == 0 || command.Permissions.Count(i => i == "") == command.Permissions.Count ? "[c/c2ff39:无权限限制]" : "[c/bf0705:" + string.Join(',', command.Permissions) + "]")}"); + GetString($"权限: {(command.Permissions.Count == 0 || command.Permissions.Count(i => i == "") == command.Permissions.Count ? GetString("[c/c2ff39:无权限限制]") : "[c/bf0705:" + string.Join(',', command.Permissions) + "]")}")); args.Player.SendInfoMessage( - $"来源插件: [c/8500ff:{command.CommandDelegate.Method.DeclaringType.Assembly.FullName.Split(',').First()}]"); + GetString($"来源插件: [c/8500ff:{command.CommandDelegate.Method.DeclaringType.Assembly.FullName.Split(',').First()}]")); if (!command.AllowServer) { - args.Player.SendInfoMessage("*此命令只能游戏内执行"); + args.Player.SendInfoMessage(GetString("*此命令只能游戏内执行")); } if (!command.DoLog) { - args.Player.SendInfoMessage("*此命令不记录命令参数"); + args.Player.SendInfoMessage(GetString("*此命令不记录命令参数")); } - args.Player.SendInfoMessage("*本插件只能查询主命令权限,详细权限请使用/whynot查看!"); + args.Player.SendInfoMessage(GetString("*本插件只能查询主命令权限,详细权限请使用/whynot查看!")); } } diff --git a/src/HelpPlus/README.md b/src/HelpPlus/README.md index 11d3f398..5ca3b77f 100644 --- a/src/HelpPlus/README.md +++ b/src/HelpPlus/README.md @@ -9,8 +9,9 @@ ## 更新日志 ``` -- v1.0.0 修复Help需要权限的奇怪问题 +- v2024.9.1.1 更新翻译 - v2024.7.28.1 修复/death、/roll等原版命令 +- v1.0.0 修复Help需要权限的奇怪问题 ``` ## 指令 diff --git a/src/HelpPlus/README_EN.md b/src/HelpPlus/README_EN.md new file mode 100644 index 00000000..ca9dadc2 --- /dev/null +++ b/src/HelpPlus/README_EN.md @@ -0,0 +1,44 @@ +# HelpPlus + +- Authors: Cai +- Source: Here + Fix the issue where the /help command cannot be used in non-English Lang. + Add a brief prompt for /help. + Use /help to see more detailed command help. + + +## Commands + +| Command | Permission | Details | +|-----------------|:----------:| :------: | +| help | no | view the list of commands | +| /help | no | view detailed help for the command | + +## Config +> Configuration file location:tshock/HelpPlus.json + +```json +{ + "简短提示开关": true, //Enable brief prompt + "简短提示对应": { //Brief prompt setting + "user": "用户管理", + "login": "登录", + "logout": "登出", + "password": "修改密码", + "register": "注册", + "accountinfo": "账号信息", + "ban": "封禁", + "broadcast": "广播", + ...... + "deal": "交易", + "igen": "快速构建", + "relive": "复活NPC", + "bossinfo": "进度查询" + } +} +``` + +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/HelpPlus/i18n/en-US.po b/src/HelpPlus/i18n/en-US.po new file mode 100644 index 00000000..0a5c6e4b --- /dev/null +++ b/src/HelpPlus/i18n/en-US.po @@ -0,0 +1,74 @@ +msgid "" +msgstr "" +"Project-Id-Version: HelpPlus\n" +"POT-Creation-Date: 2024-09-01 11:28:06+0800\n" +"PO-Revision-Date: 2024-09-01 11:52+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\Help.cs:46 +msgid "[HelpPlus]插件配置已重载!" +msgstr "[HelpPlus] Plugin configuration reloaded!" + +#: ..\..\Help.cs:257 +msgid "*此命令不记录命令参数" +msgstr "*This command does not log command parameters" + +#: ..\..\Help.cs:185 +#, csharp-format +msgid "无效用法.正确用法: {0}help <命令/页码>" +msgstr "Invalid usage. Correct usage: {0}help " + +#: ..\..\Help.cs:203 +msgid "命令列表 ({0}/{1}):" +msgstr "Command list ({0}/{1}):" + +#: ..\..\Help.cs:218 +msgid "无效命令." +msgstr "Invalid command." + +#: ..\..\Help.cs:247 +#, csharp-format +msgid "权限: {0}" +msgstr "Permission: {0}" + +#: ..\..\Help.cs:252 +msgid "*此命令只能游戏内执行" +msgstr "*This command can only be executed in-game" + +#: ..\..\Help.cs:243 +#, csharp-format +msgid "别名: [c/00ffff:{0}]" +msgstr "Alias: [c/00ffff:{0}]" + +#: ..\..\Help.cs:249 +#, csharp-format +msgid "来源插件: [c/8500ff:{0}]" +msgstr "Source plugin: [c/8500ff:{0}]" + +#: ..\..\Help.cs:247 +msgid "[c/c2ff39:无权限限制]" +msgstr "[c/c2ff39:No permission restrictions]" + +#: ..\..\Help.cs:228 +#, csharp-format +msgid "{0}{1}的帮助:" +msgstr "Help for {0}{1}:" + +#: ..\..\Help.cs:224 +msgid "你没有权限查询此命令." +msgstr "You do not have permission to query this command." + +#: ..\..\Help.cs:204 +#, csharp-format +msgid "输入 {0}help {{0}} 翻页." +msgstr "Type {0}help {{0}} to turn the page." + +#: ..\..\Help.cs:260 +msgid "*本插件只能查询主命令权限,详细权限请使用/whynot查看!" +msgstr "*This plugin can only query main command permissions, for detailed permissions please use /whynot!" diff --git a/src/HelpPlus/i18n/template.pot b/src/HelpPlus/i18n/template.pot new file mode 100644 index 00000000..1d0ac82d --- /dev/null +++ b/src/HelpPlus/i18n/template.pot @@ -0,0 +1,74 @@ +msgid "" +msgstr "" +"Project-Id-Version: HelpPlus\n" +"POT-Creation-Date: 2024-09-01 11:28:06+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:06+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\Help.cs:46 +msgid "[HelpPlus]插件配置已重载!" +msgstr "" + +#: ..\..\Help.cs:257 +msgid "*此命令不记录命令参数" +msgstr "" + +#: ..\..\Help.cs:185 +#, csharp-format +msgid "无效用法.正确用法: {0}help <命令/页码>" +msgstr "" + +#: ..\..\Help.cs:203 +msgid "命令列表 ({0}/{1}):" +msgstr "" + +#: ..\..\Help.cs:218 +msgid "无效命令." +msgstr "" + +#: ..\..\Help.cs:247 +#, csharp-format +msgid "权限: {0}" +msgstr "" + +#: ..\..\Help.cs:252 +msgid "*此命令只能游戏内执行" +msgstr "" + +#: ..\..\Help.cs:243 +#, csharp-format +msgid "别名: [c/00ffff:{0}]" +msgstr "" + +#: ..\..\Help.cs:249 +#, csharp-format +msgid "来源插件: [c/8500ff:{0}]" +msgstr "" + +#: ..\..\Help.cs:247 +msgid "[c/c2ff39:无权限限制]" +msgstr "" + +#: ..\..\Help.cs:228 +#, csharp-format +msgid "{0}{1}的帮助:" +msgstr "" + +#: ..\..\Help.cs:224 +msgid "你没有权限查询此命令." +msgstr "" + +#: ..\..\Help.cs:204 +#, csharp-format +msgid "输入 {0}help {{0}} 翻页." +msgstr "" + +#: ..\..\Help.cs:260 +msgid "*本插件只能查询主命令权限,详细权限请使用/whynot查看!" +msgstr "" + diff --git a/src/MapTp/MapTeleport.cs b/src/MapTp/MapTeleport.cs index 840647e6..25e38906 100644 --- a/src/MapTp/MapTeleport.cs +++ b/src/MapTp/MapTeleport.cs @@ -12,7 +12,7 @@ public MapTeleport(Main game) : base(game) { this.Order = 1; } - public override Version Version => new Version(1, 0, 1); + public override Version Version => new Version(1, 0, 2); public override string Author => "Nova4334,肝帝熙恩汉化适配1449"; public override string Name => "MapTeleport"; public override string Description => "允许玩家传送到地图上的选定位置."; @@ -49,7 +49,7 @@ private void teleport(object unused, GetDataHandlers.ReadNetModuleEventArgs args } else { - args.Player.SendErrorMessage("您正在尝试传送到实心方块中。请在地图上选择一个不包含实心方块的地方,然后重试."); + args.Player.SendErrorMessage(GetString("您正在尝试传送到实心方块中。请在地图上选择一个不包含实心方块的地方,然后重试.")); } return; diff --git a/src/MapTp/README.md b/src/MapTp/README.md index cf69cd1c..5927b9c7 100644 --- a/src/MapTp/README.md +++ b/src/MapTp/README.md @@ -8,23 +8,25 @@ ## 更新日志 ``` +v1.0.2 +添加英文翻译 v1.0.1 完善卸载函数 ``` ## 指令 -| 语法 | 权限 | 说明 | -| -------------- | :-----------------: | :------: | -| 无 | maptp.noclip | 允许双击传送(不包括实心方块)| -| 无 | maptp | 允许双击传送(包括实心方块)| +| Command | Perminsion | 说明 | +|---------|:------------:| :------: | +| None | maptp.noclip | Allows double-click teleportation (excluding solid blocks)| +| None | maptp | Allows double-click teleportation (including solid blocks)| ## 配置 ``` 暂无 ``` -## 反馈 -- 优先发issued -> 共同维护的插件库:https://github.com/UnrealMultiple/TShockPlugin -- 次优先:TShock官方群:816771079 -- 大概率看不到但是也可以:国内社区trhub.cn ,bbstr.net , tr.monika.love +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/MapTp/README_EN.md b/src/MapTp/README_EN.md new file mode 100644 index 00000000..9fb419e3 --- /dev/null +++ b/src/MapTp/README_EN.md @@ -0,0 +1,18 @@ +# Maptp + +- Authors: Nova4334,肝帝熙恩 +- Source: Unknown +- Players with permission can open the map and double-click to go to the specified location. +- Further determine whether to allow teleportation to solid blocks. + +## Commands + +| Command | Permission | Details | +| -------------- | :-----------------: | :------: | +| 无 | maptp.noclip | 允许双击传送(不包括实心方块)| +| 无 | maptp | 允许双击传送(包括实心方块)| + +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/MapTp/i18n/en-US.po b/src/MapTp/i18n/en-US.po new file mode 100644 index 00000000..70c95e48 --- /dev/null +++ b/src/MapTp/i18n/en-US.po @@ -0,0 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: MapTp\n" +"POT-Creation-Date: 2024-09-01 11:20:45+0800\n" +"PO-Revision-Date: 2024-09-01 11:27+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\MapTeleport.cs:52 +msgid "您正在尝试传送到实心方块中。请在地图上选择一个不包含实心方块的地方,然后重试." +msgstr "You are attempting to teleport into a solid block. Please select a location on the map that does not contain solid blocks and try again." diff --git a/src/MapTp/i18n/template.pot b/src/MapTp/i18n/template.pot new file mode 100644 index 00000000..cb025e14 --- /dev/null +++ b/src/MapTp/i18n/template.pot @@ -0,0 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: MapTp\n" +"POT-Creation-Date: 2024-09-01 11:28:07+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:07+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\MapTeleport.cs:52 +msgid "您正在尝试传送到实心方块中。请在地图上选择一个不包含实心方块的地方,然后重试." +msgstr "" + diff --git a/src/TeleportRequest/README.md b/src/TeleportRequest/README.md index 8cbd9466..51307eaf 100644 --- a/src/TeleportRequest/README.md +++ b/src/TeleportRequest/README.md @@ -7,7 +7,7 @@ ## 更新日志 ``` -暂无 +v1.0.2 添加英文翻译 ``` ## 指令 diff --git a/src/TeleportRequest/README_EN.md b/src/TeleportRequest/README_EN.md new file mode 100644 index 00000000..222fde25 --- /dev/null +++ b/src/TeleportRequest/README_EN.md @@ -0,0 +1,30 @@ +# TeleportRequest + +- Authors: MarioE, 修改者: Dr.Toxic,肝帝熙恩 +- Source: [github](https://github.com/MarioE/TeleportRequest) +- The teleportation request needs to be accepted or denied by the recipient before the teleportation occurs, which is referred to as tpa. + +## Commands + +| Command | Permission | Details | +|-----------------------| :---------------------: | :------------------- | +| `/atp` | `tprequest.gettpr` | Accept teleport request | +| `/autodeny` ` | `tprequest.tpauto` | Automatically deny all teleport requests | +| `/autoaccept` ` | `tprequest.tpauto` | Automatically accept all teleport requests | +| `/dtp` | `tprequest.gettpr` | Deny teleport request | +| `/tpahere ` ` | `tprequest.tpat` | Request to teleport the specified player to your current location | +| `/tpa ` ` | `tprequest.tpat` | Request to teleport to the specified player’s current location | + + +## Config +> Configuration file location:tshock/tpconfig.json +```json +{ + "间隔秒数": 3, //Interval Seconds + "超时次数": 3 //Timeout Count +} +``` +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/TeleportRequest/TeleportRequest.cs b/src/TeleportRequest/TeleportRequest.cs index a51c8d35..d4ed8e8f 100644 --- a/src/TeleportRequest/TeleportRequest.cs +++ b/src/TeleportRequest/TeleportRequest.cs @@ -27,7 +27,7 @@ public class TeleportRequest : TerrariaPlugin public override string Name => "传送请求"; - public override Version Version => new(1, 0, 1); + public override Version Version => new(1, 0, 2); public TeleportRequest(Main game) : base(game) @@ -72,14 +72,14 @@ private void OnElapsed(object sender, ElapsedEventArgs e) tPRequest.timeout--; if (tPRequest.timeout == 0) { - tSPlayer2.SendErrorMessage("传送请求已超时."); - tSPlayer.SendInfoMessage("玩家[{0}]的传送请求已超时.", tSPlayer2.Name); + tSPlayer2.SendErrorMessage(GetString("传送请求已超时.")); + tSPlayer.SendInfoMessage(GetString("玩家[{0}]的传送请求已超时.", tSPlayer2.Name)); continue; } - var format = string.Format("玩家[{{0}}]要求传送到你当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))", Commands.Specifier); + var format = GetString("玩家[{{0}}]要求传送到你当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))", Commands.Specifier); if (tPRequest.dir) { - format = string.Format("你被请求传送到玩家[{{0}}]的当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))", Commands.Specifier); + format = GetString("你被请求传送到玩家[{{0}}]的当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))", Commands.Specifier); } tSPlayer.SendInfoMessage(format, tSPlayer2.Name); } @@ -90,32 +90,32 @@ private void OnInitialize(EventArgs e) Commands.ChatCommands.Add(new Command("tprequest.gettpr", this.TPAccept, "接受tp", "atp") { AllowServer = false, - HelpText = "接受传送请求." + HelpText = GetString("接受传送请求.") }); Commands.ChatCommands.Add(new Command("tprequest.tpauto", this.TPAutoDeny, "自动拒绝tp", "autodeny") { AllowServer = false, - HelpText = "自动拒绝所有人的传送请求." + HelpText = GetString("自动拒绝所有人的传送请求.") }); Commands.ChatCommands.Add(new Command("tprequest.tpauto", this.TPAutoAccept, "自动接受tp", "autoaccept") { AllowServer = false, - HelpText = "自动接受所有人的传送请求." + HelpText = GetString("自动接受所有人的传送请求.") }); Commands.ChatCommands.Add(new Command("tprequest.gettpr", this.TPDeny, "拒绝tp", "dtp") { AllowServer = false, - HelpText = "拒绝传送请求." + HelpText = GetString("拒绝传送请求.") }); Commands.ChatCommands.Add(new Command("tprequest.tpat", this.TPAHere, "tpahere") { AllowServer = false, - HelpText = "发出把指定玩家传送到你当前位置的请求." + HelpText = GetString("发出把指定玩家传送到你当前位置的请求.") }); Commands.ChatCommands.Add(new Command("tprequest.tpat", this.TPA, "tpa") { AllowServer = false, - HelpText = "发出传送到指定玩家当前位置的请求." + HelpText = GetString("发出传送到指定玩家当前位置的请求.") }); this.SetupConfig(); this.Timer = new System.Timers.Timer(tpConfig.IntervalInSeconds * 1000); @@ -134,29 +134,29 @@ private void TPA(CommandArgs e) { if (e.Parameters.Count == 0) { - e.Player.SendErrorMessage("格式错误! 正确格式为: {0}tpa <玩家>", Commands.Specifier); + e.Player.SendErrorMessage(GetString("格式错误! 正确格式为: {0}tpa <玩家>", Commands.Specifier)); return; } var search = string.Join(" ", e.Parameters.ToArray()); var list = TSPlayer.FindByNameOrID(search); if (list.Count == 0) { - e.Player.SendErrorMessage("找不到这位玩家!"); + e.Player.SendErrorMessage(GetString("找不到这位玩家!")); return; } if (list.Count > 1) { - e.Player.SendErrorMessage("匹对到多于一位玩家!"); + e.Player.SendErrorMessage(GetString("匹对到多于一位玩家!")); return; } if (list[0].Equals(e.Player)) { - e.Player.SendErrorMessage("禁止向自己发送传送请求!"); + e.Player.SendErrorMessage(GetString("禁止向自己发送传送请求!")); return; } if ((!list[0].TPAllow || this.TPAllows[list[0].Index]) && !e.Player.Group.HasPermission(Permissions.tpoverride)) { - e.Player.SendErrorMessage("你无法传送到玩家[{0}].", list[0].Name); + e.Player.SendErrorMessage(GetString("你无法传送到玩家[{0}].", list[0].Name)); return; } if ((list[0].TPAllow && this.TPacpt[list[0].Index]) || e.Player.Group.HasPermission(Permissions.tpoverride)) @@ -166,8 +166,8 @@ private void TPA(CommandArgs e) var tSPlayer2 = flag ? e.Player : TShock.Players[list[0].Index]; if (tSPlayer.Teleport(tSPlayer2.X, tSPlayer2.Y, 1)) { - tSPlayer.SendSuccessMessage("已经传送到玩家[{0}]的当前位置.", tSPlayer2.Name); - tSPlayer2.SendSuccessMessage("玩家[{0}]已传送到你的当前位置.", tSPlayer.Name); + tSPlayer.SendSuccessMessage(GetString("已经传送到玩家[{0}]的当前位置.", tSPlayer2.Name)); + tSPlayer2.SendSuccessMessage(GetString("玩家[{0}]已传送到你的当前位置.", tSPlayer.Name)); } return; } @@ -176,14 +176,14 @@ private void TPA(CommandArgs e) var tPRequest = this.TPRequests[i]; if (tPRequest.timeout > 0 && tPRequest.dst == list[0].Index) { - e.Player.SendErrorMessage("玩家[{0}]已被其他玩家发出传送请求.", list[0].Name); + e.Player.SendErrorMessage(GetString("玩家[{0}]已被其他玩家发出传送请求.", list[0].Name)); return; } } this.TPRequests[e.Player.Index].dir = false; this.TPRequests[e.Player.Index].dst = (byte) list[0].Index; this.TPRequests[e.Player.Index].timeout = tpConfig.TimeoutCount + 1; - e.Player.SendSuccessMessage("已成功向玩家[{0}]发出传送请求.", list[0].Name); + e.Player.SendSuccessMessage(GetString("已成功向玩家[{0}]发出传送请求.", list[0].Name)); } private void TPAccept(CommandArgs e) @@ -197,38 +197,38 @@ private void TPAccept(CommandArgs e) var tSPlayer2 = tPRequest.dir ? TShock.Players[i] : e.Player; if (tSPlayer.Teleport(tSPlayer2.X, tSPlayer2.Y, 1)) { - tSPlayer.SendSuccessMessage("已经传送到玩家[{0}]的当前位置.", tSPlayer2.Name); - tSPlayer2.SendSuccessMessage("玩家[{0}]已传送到你的当前位置.", tSPlayer.Name); + tSPlayer.SendSuccessMessage(GetString("已经传送到玩家[{0}]的当前位置.", tSPlayer2.Name)); + tSPlayer2.SendSuccessMessage(GetString("玩家[{0}]已传送到你的当前位置.", tSPlayer.Name)); } tPRequest.timeout = 0; return; } } - e.Player.SendErrorMessage("你暂时没有收到其他玩家的传送请求."); + e.Player.SendErrorMessage(GetString("你暂时没有收到其他玩家的传送请求.")); } private void TPAHere(CommandArgs e) { if (e.Parameters.Count == 0) { - e.Player.SendErrorMessage("格式错误! 正确格式为: {0}tpahere <玩家>", Commands.Specifier); + e.Player.SendErrorMessage(GetString("格式错误! 正确格式为: {0}tpahere <玩家>", Commands.Specifier)); return; } var search = string.Join(" ", e.Parameters.ToArray()); var list = TSPlayer.FindByNameOrID(search); if (list.Count == 0) { - e.Player.SendErrorMessage("找不到这位玩家!"); + e.Player.SendErrorMessage(GetString("找不到这位玩家!")); return; } if (list.Count > 1) { - e.Player.SendErrorMessage("匹对到多于一位玩家!"); + e.Player.SendErrorMessage(GetString("匹对到多于一位玩家!")); return; } if ((!list[0].TPAllow || this.TPAllows[list[0].Index]) && !e.Player.Group.HasPermission(Permissions.tpoverride)) { - e.Player.SendErrorMessage("你无法传送到玩家[{0}].", list[0].Name); + e.Player.SendErrorMessage(GetString("你无法传送到玩家[{0}]."), list[0].Name); return; } if ((list[0].TPAllow && this.TPacpt[list[0].Index]) || e.Player.Group.HasPermission(Permissions.tpoverride)) @@ -238,8 +238,8 @@ private void TPAHere(CommandArgs e) var tSPlayer2 = flag ? e.Player : TShock.Players[list[0].Index]; if (tSPlayer.Teleport(tSPlayer2.X, tSPlayer2.Y, 1)) { - tSPlayer.SendSuccessMessage("已经传送到玩家[{0}]的当前位置.", tSPlayer2.Name); - tSPlayer2.SendSuccessMessage("玩家[{0}]已传送到你的当前位置.", tSPlayer.Name); + tSPlayer.SendSuccessMessage(GetString("已经传送到玩家[{0}]的当前位置."), tSPlayer2.Name); + tSPlayer2.SendSuccessMessage(GetString("玩家[{0}]已传送到你的当前位置."), tSPlayer.Name); } return; } @@ -248,25 +248,25 @@ private void TPAHere(CommandArgs e) var tPRequest = this.TPRequests[i]; if (tPRequest.timeout > 0 && tPRequest.dst == list[0].Index) { - e.Player.SendErrorMessage("玩家[{0}]已被其他玩家发出传送请求.", list[0].Name); + e.Player.SendErrorMessage(GetString("玩家[{0}]已被其他玩家发出传送请求."), list[0].Name); return; } } this.TPRequests[e.Player.Index].dir = true; this.TPRequests[e.Player.Index].dst = (byte) list[0].Index; this.TPRequests[e.Player.Index].timeout = tpConfig.TimeoutCount + 1; - e.Player.SendSuccessMessage("已成功向玩家[{0}]发出传送请求.", list[0].Name); + e.Player.SendSuccessMessage(GetString("已成功向玩家[{0}]发出传送请求."), list[0].Name); } private void TPAutoDeny(CommandArgs e) { if (this.TPacpt[e.Player.Index]) { - e.Player.SendErrorMessage("请先解除自动接受传送"); + e.Player.SendErrorMessage(GetString("请先解除自动接受传送")); return; } this.TPAllows[e.Player.Index] = !this.TPAllows[e.Player.Index]; - e.Player.SendInfoMessage("{0}自动拒绝传送请求.", this.TPAllows[e.Player.Index] ? "启用" : "解除"); + e.Player.SendInfoMessage(GetString("{0}自动拒绝传送请求.", this.TPAllows[e.Player.Index] ? GetString("启用") : GetString("解除"))); } private void TPDeny(CommandArgs e) @@ -276,24 +276,24 @@ private void TPDeny(CommandArgs e) var tPRequest = this.TPRequests[i]; if (tPRequest.timeout > 0 && tPRequest.dst == e.Player.Index) { - e.Player.SendSuccessMessage("已拒绝玩家[{0}]的传送请求.", TShock.Players[i].Name); - TShock.Players[i].SendErrorMessage("玩家[{0}]拒绝你的传送请求.", e.Player.Name); + e.Player.SendSuccessMessage(GetString("已拒绝玩家[{0}]的传送请求.", TShock.Players[i].Name)); + TShock.Players[i].SendErrorMessage(GetString("玩家[{0}]拒绝你的传送请求.", e.Player.Name)); tPRequest.timeout = 0; return; } } - e.Player.SendErrorMessage("你暂时没有收到其他玩家的传送请求."); + e.Player.SendErrorMessage(GetString("你暂时没有收到其他玩家的传送请求.")); } private void TPAutoAccept(CommandArgs e) { if (this.TPAllows[e.Player.Index]) { - e.Player.SendErrorMessage("请先解除自动拒绝传送"); + e.Player.SendErrorMessage(GetString("请先解除自动拒绝传送")); return; } this.TPacpt[e.Player.Index] = !this.TPacpt[e.Player.Index]; - e.Player.SendInfoMessage("{0}自动接受传送请求.", this.TPacpt[e.Player.Index] ? "启用" : "解除"); + e.Player.SendInfoMessage(GetString("{0}自动接受传送请求.", this.TPacpt[e.Player.Index] ? GetString("启用") : GetString("解除"))); } private void SetupConfig() @@ -308,10 +308,7 @@ private void SetupConfig() } catch (Exception ex) { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("TPR配置发生错误"); - Console.ForegroundColor = ConsoleColor.Gray; - TShock.Log.ConsoleError("TPR配置出现异常"); + TShock.Log.ConsoleError(GetString("TPR配置出现异常")); TShock.Log.ConsoleError(ex.ToString()); } } @@ -319,6 +316,6 @@ private void SetupConfig() private void ReloadTPR(ReloadEventArgs args) { this.SetupConfig(); - args.Player?.SendSuccessMessage("[{0}] 重新加载配置完毕。", typeof(TeleportRequest).Name); + args.Player?.SendSuccessMessage(GetString("[TeleportRequest] 重新加载配置完毕。")); } } \ No newline at end of file diff --git a/src/TeleportRequest/i18n/en-US.po b/src/TeleportRequest/i18n/en-US.po new file mode 100644 index 00000000..f5e4aa7d --- /dev/null +++ b/src/TeleportRequest/i18n/en-US.po @@ -0,0 +1,147 @@ +msgid "" +msgstr "" +"Project-Id-Version: TeleportRequest\n" +"POT-Creation-Date: 2024-09-01 11:28:07+0800\n" +"PO-Revision-Date: 2024-09-01 11:32+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ..\..\TeleportRequest.cs:98 +msgid "自动拒绝所有人的传送请求." +msgstr "Automatically deny all teleport requests." + +#: ..\..\TeleportRequest.cs:137 +#, csharp-format +msgid "格式错误! 正确格式为: {0}tpa <玩家>" +msgstr "Syntax error! The correct syntax is: {0}tpa " + +#: ..\..\TeleportRequest.cs:269 +#, csharp-format +msgid "{0}自动拒绝传送请求." +msgstr "{0} automatically denies teleport requests." + +#: ..\..\TeleportRequest.cs:214 +#, csharp-format +msgid "格式错误! 正确格式为: {0}tpahere <玩家>" +msgstr "Syntax error! The correct syntax is: {0}tpahere " + +#: ..\..\TeleportRequest.cs:169 ..\..\TeleportRequest.cs:200 ..\..\TeleportRequest.cs:241 +msgid "已经传送到玩家[{0}]的当前位置." +msgstr "Teleported to player [{0}]'s current location." + +#: ..\..\TeleportRequest.cs:113 +msgid "发出把指定玩家传送到你当前位置的请求." +msgstr "Request to teleport the specified player to your current location." + +#: ..\..\TeleportRequest.cs:296 +#, csharp-format +msgid "{0}自动接受传送请求." +msgstr "{0} automatically accepts teleport requests." + +#: ..\..\TeleportRequest.cs:280 +#, csharp-format +msgid "玩家[{0}]拒绝你的传送请求." +msgstr "Player [{0}] denied your teleport request." + +#: ..\..\TeleportRequest.cs:118 +msgid "发出传送到指定玩家当前位置的请求." +msgstr "Request to teleport to the specified player's current location." + +#: ..\..\TeleportRequest.cs:265 +msgid "请先解除自动接受传送" +msgstr "Please disable automatic acceptance of teleport requests first." + +#: ..\..\TeleportRequest.cs:108 +msgid "拒绝传送请求." +msgstr "Deny teleport request." + +#: ..\..\TeleportRequest.cs:149 ..\..\TeleportRequest.cs:226 +msgid "匹对到多于一位玩家!" +msgstr "Matched more than one player!" + +#: ..\..\TeleportRequest.cs:207 ..\..\TeleportRequest.cs:285 +msgid "你暂时没有收到其他玩家的传送请求." +msgstr "You have not received any teleport requests from other players." + +#: ..\..\TeleportRequest.cs:319 +msgid "[TeleportRequest] 重新加载配置完毕。" +msgstr "[TeleportRequest] Configuration reloaded successfully." + +#: ..\..\TeleportRequest.cs:82 +#, csharp-format +msgid "你被请求传送到玩家[{{0}}]的当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))" +msgstr "" +"You are requested to teleport to player [{{0}}]'s current location. ({0} accept tp ({0}atp) or {0} deny tp ({0}dtp))" + +#: ..\..\TeleportRequest.cs:159 ..\..\TeleportRequest.cs:231 +msgid "你无法传送到玩家[{0}]." +msgstr "You cannot teleport to player [{0}]." + +#: ..\..\TeleportRequest.cs:269 ..\..\TeleportRequest.cs:296 +msgid "启用" +msgstr "Enable" + +#: ..\..\TeleportRequest.cs:186 ..\..\TeleportRequest.cs:258 +msgid "已成功向玩家[{0}]发出传送请求." +msgstr "Successfully sent a teleport request to player [{0}]." + +#: ..\..\TeleportRequest.cs:170 ..\..\TeleportRequest.cs:201 ..\..\TeleportRequest.cs:242 +msgid "玩家[{0}]已传送到你的当前位置." +msgstr "Player [{0}] has teleported to your current location." + +#: ..\..\TeleportRequest.cs:269 ..\..\TeleportRequest.cs:296 +msgid "解除" +msgstr "Disable" + +#: ..\..\TeleportRequest.cs:93 +msgid "接受传送请求." +msgstr "Accept teleport request." + +#: ..\..\TeleportRequest.cs:179 ..\..\TeleportRequest.cs:251 +msgid "玩家[{0}]已被其他玩家发出传送请求." +msgstr "Player [{0}] has been requested to teleport by another player." + +#: ..\..\TeleportRequest.cs:79 +#, csharp-format +msgid "玩家[{{0}}]要求传送到你当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))" +msgstr "" +"Player [{{0}}] requests to teleport to your current location. ({0} accept tp ({0}atp) or {0} deny tp ({0}dtp))" + +#: ..\..\TeleportRequest.cs:103 +msgid "自动接受所有人的传送请求." +msgstr "Automatically accept all teleport requests." + +#: ..\..\TeleportRequest.cs:75 +msgid "传送请求已超时." +msgstr "Teleport request has timed out." + +#: ..\..\TeleportRequest.cs:144 ..\..\TeleportRequest.cs:221 +msgid "找不到这位玩家!" +msgstr "Player not found!" + +#: ..\..\TeleportRequest.cs:292 +msgid "请先解除自动拒绝传送" +msgstr "Please disable automatic denial of teleport requests first." + +#: ..\..\TeleportRequest.cs:76 +#, csharp-format +msgid "玩家[{0}]的传送请求已超时." +msgstr "Player [{0}]'s teleport request has timed out." + +#: ..\..\TeleportRequest.cs:311 +msgid "TPR配置出现异常" +msgstr "TPR configuration error" + +#: ..\..\TeleportRequest.cs:279 +#, csharp-format +msgid "已拒绝玩家[{0}]的传送请求." +msgstr "Denied player [{0}]'s teleport request." + +#: ..\..\TeleportRequest.cs:154 +msgid "禁止向自己发送传送请求!" +msgstr "You are sending teleport requests to yourself!" diff --git a/src/TeleportRequest/i18n/template.pot b/src/TeleportRequest/i18n/template.pot new file mode 100644 index 00000000..f872f697 --- /dev/null +++ b/src/TeleportRequest/i18n/template.pot @@ -0,0 +1,157 @@ +msgid "" +msgstr "" +"Project-Id-Version: TeleportRequest\n" +"POT-Creation-Date: 2024-09-01 11:28:07+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:08+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\TeleportRequest.cs:98 +msgid "自动拒绝所有人的传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:137 +#, csharp-format +msgid "格式错误! 正确格式为: {0}tpa <玩家>" +msgstr "" + +#: ..\..\TeleportRequest.cs:269 +#, csharp-format +msgid "{0}自动拒绝传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:214 +#, csharp-format +msgid "格式错误! 正确格式为: {0}tpahere <玩家>" +msgstr "" + +#: ..\..\TeleportRequest.cs:169 +#: ..\..\TeleportRequest.cs:200 +#: ..\..\TeleportRequest.cs:241 +msgid "已经传送到玩家[{0}]的当前位置." +msgstr "" + +#: ..\..\TeleportRequest.cs:113 +msgid "发出把指定玩家传送到你当前位置的请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:296 +#, csharp-format +msgid "{0}自动接受传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:280 +#, csharp-format +msgid "玩家[{0}]拒绝你的传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:118 +msgid "发出传送到指定玩家当前位置的请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:265 +msgid "请先解除自动接受传送" +msgstr "" + +#: ..\..\TeleportRequest.cs:108 +msgid "拒绝传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:149 +#: ..\..\TeleportRequest.cs:226 +msgid "匹对到多于一位玩家!" +msgstr "" + +#: ..\..\TeleportRequest.cs:207 +#: ..\..\TeleportRequest.cs:285 +msgid "你暂时没有收到其他玩家的传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:319 +msgid "[TeleportRequest] 重新加载配置完毕。" +msgstr "" + +#: ..\..\TeleportRequest.cs:82 +#, csharp-format +msgid "你被请求传送到玩家[{{0}}]的当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))" +msgstr "" + +#: ..\..\TeleportRequest.cs:159 +#: ..\..\TeleportRequest.cs:231 +msgid "你无法传送到玩家[{0}]." +msgstr "" + +#: ..\..\TeleportRequest.cs:269 +#: ..\..\TeleportRequest.cs:296 +msgid "启用" +msgstr "" + +#: ..\..\TeleportRequest.cs:186 +#: ..\..\TeleportRequest.cs:258 +msgid "已成功向玩家[{0}]发出传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:170 +#: ..\..\TeleportRequest.cs:201 +#: ..\..\TeleportRequest.cs:242 +msgid "玩家[{0}]已传送到你的当前位置." +msgstr "" + +#: ..\..\TeleportRequest.cs:269 +#: ..\..\TeleportRequest.cs:296 +msgid "解除" +msgstr "" + +#: ..\..\TeleportRequest.cs:93 +msgid "接受传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:179 +#: ..\..\TeleportRequest.cs:251 +msgid "玩家[{0}]已被其他玩家发出传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:79 +#, csharp-format +msgid "玩家[{{0}}]要求传送到你当前位置. ({0}接受tp ({0}atp) 或 {0}拒绝tp ({0}dtp))" +msgstr "" + +#: ..\..\TeleportRequest.cs:103 +msgid "自动接受所有人的传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:75 +msgid "传送请求已超时." +msgstr "" + +#: ..\..\TeleportRequest.cs:144 +#: ..\..\TeleportRequest.cs:221 +msgid "找不到这位玩家!" +msgstr "" + +#: ..\..\TeleportRequest.cs:292 +msgid "请先解除自动拒绝传送" +msgstr "" + +#: ..\..\TeleportRequest.cs:76 +#, csharp-format +msgid "玩家[{0}]的传送请求已超时." +msgstr "" + +#: ..\..\TeleportRequest.cs:311 +msgid "TPR配置出现异常" +msgstr "" + +#: ..\..\TeleportRequest.cs:279 +#, csharp-format +msgid "已拒绝玩家[{0}]的传送请求." +msgstr "" + +#: ..\..\TeleportRequest.cs:154 +msgid "禁止向自己发送传送请求!" +msgstr "" + diff --git a/src/VeinMiner/README_EN.md b/src/VeinMiner/README_EN.md new file mode 100644 index 00000000..526504d4 --- /dev/null +++ b/src/VeinMiner/README_EN.md @@ -0,0 +1,84 @@ +# VeinMiner + +- Authors: Megghy|YSpoof|Maxthegreat99|肝帝熙恩|Cai +- Source: [github](https://github.com/Maxthegreat99/TSHockVeinMiner) +- To quickly mine veins of ore + +> [!IMPORTANT] +> To enable vein mining, you need the `veinminer` permission. +> Authorization command: `/group addperm default veinminer` (default is the default group, you can replace it with the group you need) + +## Commands + +| Command | Permission | Details | +|----------------|:----------:|:---------------------------------------:| +| /vm | veinminer | Toggle vein mining | +| /vm [Any agrs] | veinminer | Toggle vein mining notification message | + +## Config +> Configuration file location:tshock/VeinMiner.json +```json +{ + "启用": true, //Enable + "广播": true, //Broadcast + "放入背包": true, //Put ores into player's inventory + "矿石类型": [ //TileID which will be mined by VeinMiner + 7, + 166, + 6, + 167, + 9, + 168, + 8 + ], + "兑换规则": [ //Exchange rules + { + "仅给予物品": false, //Only give item + "最小尺寸": 0, //Min size + "类型": 0, //Tile ID + "物品": null //Item + } + ] +} +``` +### Example +```json +{ + "启用": true, //Enable + "广播": true, //Broadcast + "放入背包": true, //Put ores into player's inventory + "矿石类型": [ //TileID which will be mined by VeinMiner + 7, + 166, + 6, + 167, + 9, + 168 + ], + "兑换规则": [ //Exchange rules + { + "仅给予物品": true, //Item + "最小尺寸": 10, //Min size + "类型": 168, //Tile ID + "物品": { + "666": 1, //"ItemID": stack + "669": 1 + } + }, + { + "仅给予物品": true, + "最小尺寸": 10, + "类型": 8, + "物品": { + "662": 5, + "219": 1 + } + } + ] +} +``` + +## FeedBack +- Github Issue -> TShockPlugin Repo: https://github.com/UnrealMultiple/TShockPlugin +- TShock QQ Group: 816771079 +- China Terraria Forum: trhub.cn, bbstr.net, tr.monika.love diff --git a/src/VeinMiner/i18n/template.pot b/src/VeinMiner/i18n/template.pot index 098d6788..42e98cf2 100644 --- a/src/VeinMiner/i18n/template.pot +++ b/src/VeinMiner/i18n/template.pot @@ -36,7 +36,11 @@ msgstr "" #: ../../VeinMiner.cs:129 #, csharp-format -msgid "[c/95CFA6:] 背包已满,还需空位:[c/95CFA6:{0}] ." +msgid "[c/95CFA6:] 正在挖掘 [c/95CFA6:{0} {1}]." +msgstr "" + +#: ..\..\Config.cs:32 +msgid " 配置已重新加载。" msgstr "" #: ../../VeinMiner.cs:151 @@ -44,6 +48,7 @@ msgstr "" msgid "[c/95CFA6:] 背包已满,需额外空位:[c/95CFA6:{0}] 以放入 [c/95CFA6:{1}] ." msgstr "" + #: ../../Config.cs:38 msgid " 读取配置文件失败。" msgstr "" diff --git a/src/ZHIPlayerManager/ZHIPM.DB.cs b/src/ZHIPlayerManager/ZHIPM.DB.cs index 038bedd5..6fb70148 100644 --- a/src/ZHIPlayerManager/ZHIPM.DB.cs +++ b/src/ZHIPlayerManager/ZHIPM.DB.cs @@ -143,9 +143,7 @@ public PlayerData ReadZPlayerDB(TSPlayer player, int acctid, int slot = 1) } catch (Exception ex) { - TShock.Log.Error("错误:ReadZPlayerDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ReadZPlayerDB " + ex.ToString()); - Console.WriteLine("错误:ReadZPlayerDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:ReadZPlayerDB ") + ex); return playerData; } } @@ -217,9 +215,7 @@ public bool WriteZPlayerDB(TSPlayer player, int slot) } catch (Exception ex) { - TShock.Log.Error("错误:WriteZPlayerDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:WriteZPlayerDB " + ex.ToString()); - Console.WriteLine("错误:WriteZPlayerDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:WriteZPlayerDB ") + ex); return false; } } @@ -269,9 +265,7 @@ public bool WriteZPlayerDB(TSPlayer player, int slot) } catch (Exception ex2) { - TShock.Log.Error("错误:WriteZPlayerDB 2 " + ex2.ToString()); - TSPlayer.All.SendErrorMessage("错误:WriteZPlayerDB 2 " + ex2.ToString()); - Console.WriteLine("错误:WriteZPlayerDB 2 " + ex2.ToString()); + TShock.Log.ConsoleError(GetString("错误:WriteZPlayerDB 2 ") + ex2); return false; } } @@ -304,9 +298,7 @@ public int getZPlayerDBMaxSlot(TSPlayer player, int acctid, out List tex } catch (Exception ex) { - TShock.Log.Error("错误:getZPlayerDBMaxSlot " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:getZPlayerDBMaxSlot " + ex.ToString()); - Console.WriteLine("错误:getZPlayerDBMaxSlot " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:getZPlayerDBMaxSlot ") + ex); } return num; } @@ -332,16 +324,14 @@ public bool AddZPlayerDB(TSPlayer player) { this.database.Query("UPDATE " + this.tableName + " SET AccAndSlot = @0 WHERE AccAndSlot = @1;", new object[] { - player.Account.ID.ToString() + "-" + i.ToString(), - player.Account.ID.ToString() + "-" + (i - 1).ToString() + player.Account.ID + "-" + i, + player.Account.ID + "-" + (i - 1) }); } } catch (Exception ex) { - TShock.Log.Error("错误:AddZPlayerDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:AddZPlayerDB " + ex.ToString()); - Console.WriteLine("错误:AddZPlayerDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:AddZPlayerDB ") + ex); return false; } return this.WriteZPlayerDB(player, 1); @@ -362,9 +352,7 @@ public bool AddZPlayerDB(TSPlayer player) } catch (Exception ex2) { - TShock.Log.Error("错误:AddZPlayerDB 1 " + ex2.ToString()); - TSPlayer.All.SendErrorMessage("错误:AddZPlayerDB 1 " + ex2.ToString()); - Console.WriteLine("错误:AddZPlayerDB 1 " + ex2.ToString()); + TShock.Log.ConsoleError(GetString("错误:AddZPlayerDB 1 ") + ex2.ToString()); return false; } return this.AddZPlayerDB(player); @@ -387,9 +375,7 @@ public bool ClearALLZPlayerDB(ZplayerDB zdb) } catch (Exception ex) { - TShock.Log.Error("错误:ClearALLZPlayerDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ClearALLZPlayerDB " + ex.ToString()); - Console.WriteLine("错误:ClearALLZPlayerDB " + ex.ToString()); + TShock.Log.Error(GetString("错误:ClearALLZPlayerDB ") + ex); return false; } } @@ -412,9 +398,7 @@ public bool ClearZPlayerDB(int account) } catch (Exception ex) { - TShock.Log.Error("错误:ClearZPlayerDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ClearZPlayerDB " + ex.ToString()); - Console.WriteLine("错误:ClearZPlayerDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:ClearZPlayerDB ") + ex); return false; } } @@ -498,9 +482,7 @@ public ZplayerExtraDB(IDbConnection db) } catch (Exception ex) { - TShock.Log.Error("错误:ReadExtraDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ReadExtraDB " + ex.ToString()); - Console.WriteLine("错误:ReadExtraDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:ReadExtraDB ") + ex.ToString()); return null; } } @@ -549,9 +531,7 @@ public bool WriteExtraDB(ExtraData ed) } catch (Exception ex) { - TShock.Log.Error("错误:WriteExtraDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:WriteExtraDB " + ex.ToString()); - Console.WriteLine("错误:WriteExtraDB " + ex.ToString()); + TShock.Log.Error(GetString("错误:WriteExtraDB ") + ex); return false; } } @@ -576,9 +556,7 @@ public bool WriteExtraDB(ExtraData ed) } catch (Exception ex2) { - TShock.Log.Error("错误:WriteExtraDB 2 " + ex2.ToString()); - TSPlayer.All.SendErrorMessage("错误:WriteExtraDB 2 " + ex2.ToString()); - Console.WriteLine("错误:WriteExtraDB 2 " + ex2.ToString()); + TShock.Log.ConsoleError(GetString("错误:WriteExtraDB 2 ") + ex2); return false; } } @@ -599,9 +577,7 @@ public bool ClearALLZPlayerExtraDB(ZplayerExtraDB zedb) } catch (Exception ex) { - TShock.Log.Error("错误:ClearALLZPlayerExtraDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ClearALLZPlayerExtraDB " + ex.ToString()); - Console.WriteLine("错误:ClearALLZPlayerExtraDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:ClearALLZPlayerExtraDB ") + ex.ToString()); return false; } } @@ -624,9 +600,7 @@ public bool ClearZPlayerExtraDB(int account) } catch (Exception ex) { - TShock.Log.Error("错误:ClearZPlayerExtraDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ClearZPlayerExtraDB " + ex.ToString()); - Console.WriteLine("错误:ClearZPlayerExtraDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:ClearZPlayerExtraDB ") + ex); return false; } } @@ -700,9 +674,8 @@ public List ListAllExtraDB(ExtraDataDate extraDataDate = ExtraDataDat } catch (Exception ex) { - TShock.Log.Error("错误:ListAllExtraDB " + ex.ToString()); - TSPlayer.All.SendErrorMessage("错误:ListAllExtraDB " + ex.ToString()); - Console.WriteLine("错误:ListAllExtraDB " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:ListAllExtraDB ") + ex.ToString()); + return list; } } diff --git a/src/ZHIPlayerManager/ZHIPM.Initialize.cs b/src/ZHIPlayerManager/ZHIPM.Initialize.cs index ecd2ab69..7e176a93 100644 --- a/src/ZHIPlayerManager/ZHIPM.Initialize.cs +++ b/src/ZHIPlayerManager/ZHIPM.Initialize.cs @@ -14,55 +14,55 @@ namespace ZHIPlayerManager; public partial class ZHIPM : TerrariaPlugin { /// - /// 帮助指令方法指令 + /// 帮助指令方法指令 /// /// private void Help(CommandArgs args) { if (args.Parameters.Count != 0) { - args.Player.SendInfoMessage("输入 /zhelp 来查看指令帮助"); + args.Player.SendInfoMessage(GetString("输入 /zhelp 来查看指令帮助")); } else { - args.Player.SendMessage("输入 /zsave 来备份自己的人物存档\n" + - "输入 /zsaveauto 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能\n" + - "输入 /zvisa 来查看自己的人物备份\n" + - "输入 /zvisa name 来查看该玩家的第几个人物备份\n" + - "输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n" + - "输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示\n" + - "输入 /zback 来读取该玩家的人物存档\n" + - "输入 /zback 来读取该玩家的第几个人物存档\n" + - "输入 /zclone 将玩家1的人物数据复制给玩家2\n" + - "输入 /zclone 将该玩家的人物数据复制给自己\n" + - "输入 /zmodify help 查看修改玩家数据的指令帮助\n" + - "输入 /vi 来查看该玩家的库存\n" + - "输入 /vid 来查看该玩家的库存,不分类\n" + - "输入 /vs 来查看该玩家的状态\n" + - "输入 /vs me 来查看自己的状态\n" + - "输入 /zfre 来冻结该玩家\n" + - "输入 /zunfre 来解冻该玩家\n" + - "输入 /zunfre all 来解冻所有玩家\n" + - "输入 /zsort help 来查看排序系列指令帮助\n" + - "输入 /zout 来导出该玩家的人物存档\n" + - "输入 /zout all 来导出所有人物的存档并压缩打包\n" + - "输入 /zreset help 来查看zreset系列指令帮助\n" + - "输入 /zban add 来封禁无论是否在线的玩家,reason 可不填\n" + - "输入 /zban add uuid 来封禁uuid\n" + - "输入 /zban add ip 来封禁ip\n" + - "输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n" + - "输入 /zclear buff 来清理该玩家的所有Buff\n" + - "输入 /zclear buff all 来清理所有玩家所有Buff\n" + - "输入 /zbpos 来返回上次死亡地点\n" /*+ - "输入 /zfind 来查找当前哪些玩家拥有此物品"*/, - TextColor() - ); + args.Player.SendMessage(GetString("输入 /zsave 来备份自己的人物存档\n") + + GetString("输入 /zsaveauto 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能\n") + + GetString("输入 /zvisa 来查看自己的人物备份\n") + + GetString("输入 /zvisa name 来查看该玩家的第几个人物备份\n") + + GetString("输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n") + + GetString("输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示\n") + + GetString("输入 /zback 来读取该玩家的人物存档\n") + + GetString("输入 /zback 来读取该玩家的第几个人物存档\n") + + GetString("输入 /zclone 将玩家1的人物数据复制给玩家2\n") + + GetString("输入 /zclone 将该玩家的人物数据复制给自己\n") + + GetString("输入 /zmodify help 查看修改玩家数据的指令帮助\n") + + GetString("输入 /vi 来查看该玩家的库存\n") + + GetString("输入 /vid 来查看该玩家的库存,不分类\n") + + GetString("输入 /vs 来查看该玩家的状态\n") + + GetString("输入 /vs me 来查看自己的状态\n") + + GetString("输入 /zfre 来冻结该玩家\n") + + GetString("输入 /zunfre 来解冻该玩家\n") + + GetString("输入 /zunfre all 来解冻所有玩家\n") + + GetString("输入 /zsort help 来查看排序系列指令帮助\n") + + GetString("输入 /zout 来导出该玩家的人物存档\n") + + GetString("输入 /zout all 来导出所有人物的存档并压缩打包\n") + + GetString("输入 /zreset help 来查看zreset系列指令帮助\n") + + GetString("输入 /zban add 来封禁无论是否在线的玩家,reason 可不填\n") + + GetString("输入 /zban add uuid 来封禁uuid\n") + + GetString("输入 /zban add ip 来封禁ip\n") + + GetString("输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n") + + GetString("输入 /zclear buff 来清理该玩家的所有Buff\n") + + GetString("输入 /zclear buff all 来清理所有玩家所有Buff\n") + + GetString("输入 /zbpos 来返回上次死亡地点\n") /*+ + GetString("输入 /zfind 来查找当前哪些玩家拥有此物品")*/, + TextColor() + ); } } /// - /// 回档指令方法指令 + /// 回档指令方法指令 /// /// private void MySSCBack(CommandArgs args) @@ -72,61 +72,67 @@ private void MySSCBack(CommandArgs args) this.MySSCBack2(args, 1); return; } + if (args.Parameters.Count == 2) { if (!int.TryParse(args.Parameters[1], out var num)) { - args.Player.SendInfoMessage("输入 /zback 来读取该玩家的最新人物存档\n输入 /zback 来读取该玩家的第几个人物存档"); + args.Player.SendInfoMessage(GetString("输入 /zback 来读取该玩家的最新人物存档\n输入 /zback 来读取该玩家的第几个人物存档")); return; } + if (num < 1 || num > config.MaxBackupsPerPlayer) { - args.Player.SendInfoMessage($"玩家最多有 {config.MaxBackupsPerPlayer} 个备份存档,范围 1 ~ {config.MaxBackupsPerPlayer},请重新输入"); + args.Player.SendInfoMessage(GetString($"玩家最多有 {config.MaxBackupsPerPlayer} 个备份存档,范围 1 ~ {config.MaxBackupsPerPlayer},请重新输入")); return; } + this.MySSCBack2(args, num); } else { - args.Player.SendInfoMessage("输入 /zback 来读取该玩家的最新人物存档\n输入 /zback 来读取该玩家的第几个人物存档"); + args.Player.SendInfoMessage(GetString("输入 /zback 来读取该玩家的最新人物存档\n输入 /zback 来读取该玩家的第几个人物存档")); } } /// - /// 保存指令方法指令 + /// 保存指令方法指令 /// /// private void MySSCSave(CommandArgs args) { if (args.Parameters.Count != 0) { - args.Player.SendInfoMessage("输入 /zsave 来备份自己的人物存档"); + args.Player.SendInfoMessage(GetString("输入 /zsave 来备份自己的人物存档")); return; } + if (!args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("对象不正确,请检查您的状态,您是否为游戏内玩家?"); + args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; } + if (ZPDataBase.AddZPlayerDB(args.Player)) { - var extraData = edPlayers.Find((ExtraData x) => x.Name == args.Player.Name); + var extraData = edPlayers.Find(x => x.Name == args.Player.Name); if (extraData != null) { ZPExtraDB.WriteExtraDB(extraData); } - args.Player.SendMessage("您的备份保存成功!", new Color(0, 255, 0)); + + args.Player.SendMessage(GetString("您的备份保存成功!"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("您的备份保存失败!请尝试重进游戏重试", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("您的备份保存失败!请尝试重进游戏重试"), new Color(255, 0, 0)); } } /// - /// 自动备份指令 + /// 自动备份指令 /// /// /// @@ -134,63 +140,69 @@ private void MySSCSaveAuto(CommandArgs args) { if (!config.EnablePlayerAutoBackup) { - args.Player.SendMessage("自动备份被禁用,请联系管理员询问详情", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("自动备份被禁用,请联系管理员询问详情"), new Color(255, 0, 0)); return; } + if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zsaveauto [minute] 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能"); + args.Player.SendInfoMessage(GetString("输入 /zsaveauto [minute] 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能")); return; } + if (!args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("对象不正确,请检查您的状态,您是否为游戏内玩家?"); + args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; } + if (int.TryParse(args.Parameters[0], out var num)) { if (num < 0) { - args.Player.SendInfoMessage("数字不合理"); + args.Player.SendInfoMessage(GetString("数字不合理")); return; } + var ex = edPlayers.Find(x => x.Name == args.Player.Name); if (ex == null) { - args.Player.SendInfoMessage("修改失败,请重进服务器重试"); + args.Player.SendInfoMessage(GetString("修改失败,请重进服务器重试")); return; } + ex.backuptime = num; if (num != 0) { - args.Player.SendMessage("修改成功,你的存档将每隔 " + num + " 分钟自动备份一次,请注意存档覆盖情况,这可能会覆盖你手动备份的部分", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"修改成功,你的存档将每隔{num}分钟自动备份一次,请注意存档覆盖情况,这可能会覆盖你手动备份的部分"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("修改成功,你的自动备份已关", new Color(0, 255, 0)); + args.Player.SendMessage(GetString("修改成功,你的自动备份已关"), new Color(0, 255, 0)); } } else { - args.Player.SendInfoMessage("输入 /zsaveauto [minute] 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能"); + args.Player.SendInfoMessage(GetString("输入 /zsaveauto [minute] 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能")); } } /// - /// 查看我的存档方法指令 + /// 查看我的存档方法指令 /// /// private void ViewMySSCSave(CommandArgs args) { //查询本人 - if (args.Parameters.Count == 0 || args.Parameters.Count == 1 && int.TryParse(args.Parameters[0], out var num1)) + if (args.Parameters.Count == 0 || (args.Parameters.Count == 1 && int.TryParse(args.Parameters[0], out var num1))) { if (!args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("对象不正确,请检查您的状态,您是否为游戏内玩家?"); + args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; } + int slot; if (args.Parameters.Count == 0) { @@ -201,15 +213,17 @@ private void ViewMySSCSave(CommandArgs args) var num = int.Parse(args.Parameters[0]); if (num < 1 || num > config.MaxBackupsPerPlayer) { - args.Player.SendInfoMessage($"玩家最多有 {config.MaxBackupsPerPlayer} 个备份存档,范围 1 ~ {config.MaxBackupsPerPlayer},请重新输入"); + args.Player.SendInfoMessage(GetString($"玩家最多有 {config.MaxBackupsPerPlayer} 个备份存档,范围 1 ~ {config.MaxBackupsPerPlayer},请重新输入")); return; } + slot = num; } + var playerData = ZPDataBase.ReadZPlayerDB(args.Player, args.Player.Account.ID, slot); if (playerData == null || !playerData.exists) { - args.Player.SendInfoMessage("您还未备份"); + args.Player.SendInfoMessage(GetString("您还未备份")); } else { @@ -220,15 +234,16 @@ private void ViewMySSCSave(CommandArgs args) items[i].stack = playerData.inventory[i].Stack; items[i].prefix = playerData.inventory[i].PrefixId; } - var text = GetItemsString(items, NetItem.MaxInventory, 0); + + var text = GetItemsString(items, NetItem.MaxInventory); text = FormatArrangement(text, 30, " "); - var str = "您的备份 [ " + args.Player.Account.ID + " - " + slot + " ] 的内容为:\n" + text; + var str = GetString($"您的备份[{args.Player.Account.ID} - {slot}]的内容为:\n") + text; args.Player.SendInfoMessage(str); } } //查询他人 - else if (args.Parameters.Count == 1 || args.Parameters.Count == 2 && int.TryParse(args.Parameters[1], out var num2)) + else if (args.Parameters.Count == 1 || (args.Parameters.Count == 2 && int.TryParse(args.Parameters[1], out var num2))) { int slot; if (args.Parameters.Count == 1) @@ -240,9 +255,10 @@ private void ViewMySSCSave(CommandArgs args) var num = int.Parse(args.Parameters[1]); if (num < 1 || num > config.MaxBackupsPerPlayer) { - args.Player.SendInfoMessage($"玩家最多有 {config.MaxBackupsPerPlayer} 个备份存档,范围 1 ~ {config.MaxBackupsPerPlayer},请重新输入"); + args.Player.SendInfoMessage(GetString($"玩家最多有 {config.MaxBackupsPerPlayer} 个备份存档,范围 1 ~ {config.MaxBackupsPerPlayer},请重新输入")); return; } + slot = num; } @@ -253,7 +269,7 @@ private void ViewMySSCSave(CommandArgs args) { args.Player.SendInfoMessage(this.offlineplayer); var users = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[0], true); - if (users.Count == 1 || users.Count > 1 && users.Exists(x => x.Name == args.Parameters[0])) + if (users.Count == 1 || (users.Count > 1 && users.Exists(x => x.Name == args.Parameters[0]))) { if (users.Count == 1) { @@ -283,10 +299,11 @@ private void ViewMySSCSave(CommandArgs args) ID = list[0].Account.ID; playerfullname = list[0].Name; } + var playerData = ZPDataBase.ReadZPlayerDB(new TSPlayer(-1), ID, slot); if (playerData == null || !playerData.exists) { - args.Player.SendInfoMessage("该玩家还未备份"); + args.Player.SendInfoMessage(GetString("该玩家还未备份")); } else { @@ -297,51 +314,56 @@ private void ViewMySSCSave(CommandArgs args) items[i].stack = playerData.inventory[i].Stack; items[i].prefix = playerData.inventory[i].PrefixId; } + var text = ""; if (args.Player.IsLoggedIn) { - text = GetItemsString(items, NetItem.MaxInventory, 0); + text = GetItemsString(items, NetItem.MaxInventory); text = FormatArrangement(text, 30, " "); } else { text = GetItemsString(items, NetItem.MaxInventory, 1); } - var str = "玩家 [ " + playerfullname + " ] 备份 [ " + ID + " - " + slot + " ] 的内容为:\n" + text; + + var str = GetString($"玩家[{playerfullname}]备份 [{ID} - {slot}] 的内容为:\n") + text; args.Player.SendInfoMessage(str); } } else { - args.Player.SendInfoMessage("输入 /zvisa [num] 来查看自己的第几个人物备份\n输入 /zvisa name [num] 来查看该玩家的第几个人物备份"); + args.Player.SendInfoMessage(GetString("输入 /zvisa [num] 来查看自己的第几个人物备份\n输入 /zvisa name [num] 来查看该玩家的第几个人物备份")); } } /// - /// 克隆另一个人的数据的方法指令 + /// 克隆另一个人的数据的方法指令 /// /// private void SSCClone(CommandArgs args) { if (args.Parameters.Count == 0 || args.Parameters.Count > 2) { - args.Player.SendInfoMessage("输入 /zclone [name1] [name2] 将玩家1的人物数据复制给玩家2\n输入 /zclone [name] 将该玩家的人物数据复制给自己"); + args.Player.SendInfoMessage(GetString("输入 /zclone [name1] [name2] 将玩家1的人物数据复制给玩家2\n输入 /zclone [name] 将该玩家的人物数据复制给自己")); return; } + if (args.Parameters.Count == 1) { if (args.Parameters[0] == args.Player.Name) { - args.Player.SendMessage("克隆失败!请不要克隆自己", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!请不要克隆自己"), new Color(255, 0, 0)); return; } + if (!args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("对象不正确,请检查您的状态,您是否为游戏内玩家?"); + args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; } + var list = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); //找不到人,查离线 if (list.Count == 0) @@ -356,24 +378,24 @@ private void SSCClone(CommandArgs args) args.Player.SendInfoMessage(this.noplayer); return; } - else if (users.Count > 1) + + if (users.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); return; } - else - { - user = users[0]; - } + + user = users[0]; } + var playerData = TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), user.ID); if (this.UpdatePlayerAll(args.Player, playerData)) { - args.Player.SendMessage("克隆成功!您已将玩家 [" + user.Name + "] 的数据克隆到你身上", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"克隆成功!您已将玩家[{user.Name}]的数据克隆到你身上"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } } //人太多,舍弃 @@ -390,14 +412,15 @@ private void SSCClone(CommandArgs args) playerData.exists = true; if (this.UpdatePlayerAll(args.Player, playerData)) { - args.Player.SendMessage("克隆成功!您已将玩家 [" + list[0].Name + "] 的数据克隆到你身上", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"克隆成功!您已将玩家[{ list[0].Name}]的数据克隆到你身上"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } } } + if (args.Parameters.Count == 2) { var player1 = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); @@ -407,113 +430,121 @@ private void SSCClone(CommandArgs args) args.Player.SendInfoMessage(this.manyplayer); return; } + //都在线的情况 if (player1.Count == 1 && player2.Count == 1) { if (player1[0].Name == player2[0].Name) { - args.Player.SendInfoMessage("请不要对同一个人进行克隆"); + args.Player.SendInfoMessage(GetString("请不要对同一个人进行克隆")); return; } + player1[0].PlayerData.CopyCharacter(player1[0]); player1[0].PlayerData.exists = true; if (this.UpdatePlayerAll(player2[0], player1[0].PlayerData)) { if (args.Player.Account.ID != player2[0].Account.ID) { - args.Player.SendMessage($"克隆成功!您已将玩家 [{player1[0].Name}] 的数据克隆到 [{player2[0].Name}] 身上", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"克隆成功!您已将玩家 [{player1[0].Name}] 的数据克隆到 [{player2[0].Name}] 身上"), new Color(0, 255, 0)); } else { - player2[0].SendMessage("克隆成功!已将玩家 [" + player1[0].Name + "] 的数据克隆到你身上", new Color(0, 255, 0)); + player2[0].SendMessage(GetString("克隆成功!已将玩家 [" + player1[0].Name + "] 的数据克隆到你身上"), new Color(0, 255, 0)); } } else { - args.Player.SendMessage("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } + return; } + //赋值者不在线,被赋值者在线的情况 if (player1.Count == 0 && player2.Count == 1) { - args.Player.SendInfoMessage("玩家1不在线,正在查询离线数据"); + args.Player.SendInfoMessage(GetString("玩家1不在线,正在查询离线数据")); var user1 = TShock.UserAccounts.GetUserAccountByName(args.Parameters[0]); var user1s = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[0], true); if (user1 == null) { if (user1s.Count == 0) { - args.Player.SendInfoMessage("玩家1不存在"); + args.Player.SendInfoMessage(GetString("玩家1不存在")); return; } - else if (user1s.Count > 1) + + if (user1s.Count > 1) { - args.Player.SendInfoMessage("玩家1不唯一"); + args.Player.SendInfoMessage(GetString("玩家1不唯一")); return; } - else - { - user1 = user1s[0]; - } + + user1 = user1s[0]; } + var playerData1 = TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), user1.ID); if (this.UpdatePlayerAll(player2[0], playerData1)) { if (args.Player.Account.ID != player2[0].Account.ID) { - args.Player.SendMessage($"克隆成功!您已将玩家 [{user1.Name}] 的数据克隆到玩家 [{player2[0].Name}]身上", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"克隆成功!您已将玩家 [{user1.Name}] 的数据克隆到玩家 [{player2[0].Name}]身上"), new Color(0, 255, 0)); } else { - player2[0].SendMessage("克隆成功!已将玩家 [" + user1.Name + "] 的数据克隆到你身上", new Color(0, 255, 0)); + player2[0].SendMessage(GetString("克隆成功!已将玩家 [" + user1.Name + "] 的数据克隆到你身上"), new Color(0, 255, 0)); } } else { - args.Player.SendMessage("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } + return; } + //赋值者在线,被赋值者不在线的情况 if (player1.Count == 1 && player2.Count == 0) { - args.Player.SendInfoMessage("玩家2不在线,正在查询离线数据"); + args.Player.SendInfoMessage(GetString("玩家2不在线,正在查询离线数据")); var user2 = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]); var user2s = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[1], true); if (user2 == null) { if (user2s.Count == 0) { - args.Player.SendInfoMessage("玩家2不存在"); + args.Player.SendInfoMessage(GetString("玩家2不存在")); return; } - else if (user2s.Count > 1) + + if (user2s.Count > 1) { - args.Player.SendInfoMessage("玩家2不唯一"); + args.Player.SendInfoMessage(GetString("玩家2不唯一")); return; } - else - { - user2 = user2s[0]; - } + + user2 = user2s[0]; } + var playerData1 = player1[0].PlayerData; playerData1.exists = true; if (this.UpdateTshockDBCharac(user2.ID, playerData1)) { - args.Player.SendMessage($"克隆成功!您已将玩家 [{player1[0].Name}] 的数据克隆到玩家 [{user2.Name}] 身上", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"克隆成功!您已将玩家 [{player1[0].Name}] 的数据克隆到玩家 [{user2.Name}] 身上"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } + return; } + //都不在线 if (player1.Count == 0 && player2.Count == 0) { - args.Player.SendInfoMessage("玩家都不在线,正在查询离线数据"); + args.Player.SendInfoMessage(GetString("玩家都不在线,正在查询离线数据")); var user1 = TShock.UserAccounts.GetUserAccountByName(args.Parameters[0]); var user1s = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[0], true); var user2 = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]); @@ -522,100 +553,102 @@ private void SSCClone(CommandArgs args) { if (user1s.Count == 0) { - args.Player.SendInfoMessage("玩家1不存在"); + args.Player.SendInfoMessage(GetString("玩家1不存在")); return; } - else if (user1s.Count > 1) + + if (user1s.Count > 1) { - args.Player.SendInfoMessage("玩家1不唯一"); + args.Player.SendInfoMessage(GetString("玩家1不唯一")); return; } - else - { - user1 = user1s[0]; - } + + user1 = user1s[0]; } + if (user2 == null) { if (user2s.Count == 0) { - args.Player.SendInfoMessage("玩家2不存在"); + args.Player.SendInfoMessage(GetString("玩家2不存在")); return; } - else if (user2s.Count > 1) + + if (user2s.Count > 1) { - args.Player.SendInfoMessage("玩家2不唯一"); + args.Player.SendInfoMessage(GetString("玩家2不唯一")); return; } - else - { - user2 = user2s[0]; - } + + user2 = user2s[0]; } + var playerData = TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), user1.ID); if (this.UpdateTshockDBCharac(user2.ID, playerData)) { - args.Player.SendMessage($"克隆成功!您已将玩家 [{user1.Name}] 的数据克隆到玩家 [{user2.Name}] 身上", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"克隆成功!您已将玩家 [{user1.Name}] 的数据克隆到玩家 [{user2.Name}] 身上"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } - return; } } } /// - /// 修改人物数据方法指令 + /// 修改人物数据方法指令 /// /// private void SSCModify(CommandArgs args) { if (args.Parameters.Count != 1 && args.Parameters.Count != 3) { - args.Player.SendInfoMessage("输入 /zmodify help 查看修改玩家数据的指令帮助"); + args.Player.SendInfoMessage(GetString("输入 /zmodify help 查看修改玩家数据的指令帮助")); return; } + if (args.Parameters.Count == 1) { if (args.Parameters[0].Equals("help", StringComparison.OrdinalIgnoreCase)) { var temp = config.EnablePointTracking ? "\n输入 /zmodify [name] point [num] 来修改玩家点数" : ""; args.Player.SendMessage( - "输入 /zmodify [name] life [num] 来修改玩家的血量\n" + - "输入 /zmodify [name] lifemax [num] 来修改玩家的血量上限\n" + - "输入 /zmodify [name] mana [num] 来修改玩家的魔力\n" + - "输入 /zmodify [name] manamax [num] 来修改玩家的魔力上限\n" + - "输入 /zmodify [name] fish [num] 来修改玩家的渔夫任务数\n" + - "输入 /zmodify [name] torch [0或1] 来关闭或开启火把神增益\n" + - "输入 /zmodify [name] demmon [0或1] 来关闭或开启恶魔心增益\n" + - "输入 /zmodify [name] bread [0或1] 来关闭或开启工匠面包增益\n" + - "输入 /zmodify [name] heart [0或1] 来关闭或开启埃癸斯水晶增益\n" + - "输入 /zmodify [name] fruit [0或1] 来关闭或开启埃癸斯果增益\n" + - "输入 /zmodify [name] star [0或1] 来关闭或开启奥术水晶增益\n" + - "输入 /zmodify [name] pearl [0或1] 来关闭或开启银河珍珠增益\n" + - "输入 /zmodify [name] worm [0或1] 来关闭或开启粘性蠕虫增益\n" + - "输入 /zmodify [name] ambrosia [0或1] 来关闭或开启珍馐增益\n" + - "输入 /zmodify [name] cart [0或1] 来关闭或开启超级矿车增益\n" + - "输入 /zmodify [name] all [0或1] 来关闭或开启所有玩家增益" + temp + GetString("输入 /zmodify [name] life [num] 来修改玩家的血量\n") + + GetString("输入 /zmodify [name] lifemax [num] 来修改玩家的血量上限\n") + + GetString("输入 /zmodify [name] mana [num] 来修改玩家的魔力\n") + + GetString("输入 /zmodify [name] manamax [num] 来修改玩家的魔力上限\n") + + GetString("输入 /zmodify [name] fish [num] 来修改玩家的渔夫任务数\n") + + GetString("输入 /zmodify [name] torch [0或1] 来关闭或开启火把神增益\n") + + GetString("输入 /zmodify [name] demmon [0或1] 来关闭或开启恶魔心增益\n") + + GetString("输入 /zmodify [name] bread [0或1] 来关闭或开启工匠面包增益\n") + + GetString("输入 /zmodify [name] heart [0或1] 来关闭或开启埃癸斯水晶增益\n") + + GetString("输入 /zmodify [name] fruit [0或1] 来关闭或开启埃癸斯果增益\n") + + GetString("输入 /zmodify [name] pearl [0或1] 来关闭或开启银河珍珠增益\n") + + GetString("输入 /zmodify [name] worm [0或1] 来关闭或开启粘性蠕虫增益\n") + + GetString("输入 /zmodify [name] ambrosia [0或1] 来关闭或开启珍馐增益\n") + + GetString("输入 /zmodify [name] cart [0或1] 来关闭或开启超级矿车增益\n") + + GetString("输入 /zmodify [name] all [0或1] 来关闭或开启所有玩家增益") + temp , TextColor()); } else { - args.Player.SendInfoMessage("输入 /zmodify help 查看修改玩家数据的指令帮助"); + args.Player.SendInfoMessage(GetString("输入 /zmodify help 查看修改玩家数据的指令帮助")); } + return; } + if (args.Parameters.Count == 3) { //对参数3先判断是不是数据,不是数字结束 if (!int.TryParse(args.Parameters[2], out var num)) { - args.Player.SendInfoMessage("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助"); + args.Player.SendInfoMessage(GetString("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助")); return; } + //再判断能不能找到人的情况 var players = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); if (players.Count > 1) @@ -623,38 +656,39 @@ private void SSCModify(CommandArgs args) args.Player.SendInfoMessage(this.manyplayer); return; } + //在线能找到 if (players.Count == 1) { if (args.Parameters[1].Equals("life", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.statLife = num; - players[0].SendData(PacketTypes.PlayerHp, "", players[0].Index, 0f, 0f, 0f, 0); + players[0].SendData(PacketTypes.PlayerHp, "", players[0].Index); players[0].SendMessage("您的生命值已被修改为:" + num, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("lifemax", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.statLifeMax = num; - players[0].SendData(PacketTypes.PlayerHp, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的生命上限已被修改为:" + num, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerHp, "", players[0].Index); + players[0].SendMessage(GetString("您的生命上限已被修改为:") + num, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("mana", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.statMana = num; - players[0].SendData(PacketTypes.PlayerMana, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的魔力值已被修改为:" + num, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerMana, "", players[0].Index); + players[0].SendMessage(GetString("您的魔力值已被修改为:") + num, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("manamax", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.statManaMax = num; - players[0].SendData(PacketTypes.PlayerMana, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的魔力上限已被修改为:" + num, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerMana, "", players[0].Index); + players[0].SendMessage(GetString("您的魔力上限已被修改为:") + num, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("fish", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.anglerQuestsFinished = num; - players[0].SendData(PacketTypes.NumberOfAnglerQuestsCompleted, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的渔夫任务完成数已被修改为:" + num, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.NumberOfAnglerQuestsCompleted, "", players[0].Index); + players[0].SendMessage(GetString("您的渔夫任务完成数已被修改为:") + num, new Color(0, 255, 0)); } else if (config.EnablePointTracking && args.Parameters[1].Equals("point", StringComparison.OrdinalIgnoreCase)) { @@ -662,78 +696,78 @@ private void SSCModify(CommandArgs args) if (ex != null) { ex.point = num; - players[0].SendMessage("您的点数已被修改为:" + num, new Color(0, 255, 0)); + players[0].SendMessage(GetString("您的点数已被修改为:") + num, new Color(0, 255, 0)); } else { - args.Player.SendInfoMessage("不可预料的错误,请重试或让该玩家重进游戏"); + args.Player.SendInfoMessage(GetString("不可预料的错误,请重试或让该玩家重进游戏")); return; } } else if (num != 0 && num != 1) { - args.Player.SendInfoMessage("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助"); + args.Player.SendInfoMessage(GetString("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助")); return; } else if (args.Parameters[1].Equals("torch", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.unlockedBiomeTorches = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的火把神增益开启状态:" + players[0].TPlayer.unlockedBiomeTorches, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的火把神增益开启状态:") + players[0].TPlayer.unlockedBiomeTorches, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("demmon", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.extraAccessory = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的恶魔心增益开启状态:" + players[0].TPlayer.extraAccessory, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的恶魔心增益开启状态:") + players[0].TPlayer.extraAccessory, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("bread", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.ateArtisanBread = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的工匠面包增益开启状态:" + players[0].TPlayer.ateArtisanBread, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的工匠面包增益开启状态:") + players[0].TPlayer.ateArtisanBread, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("heart", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.usedAegisCrystal = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的埃癸斯水晶增益开启状态:" + players[0].TPlayer.usedAegisCrystal, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的埃癸斯水晶增益开启状态:" )+ players[0].TPlayer.usedAegisCrystal, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("fruit", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.usedAegisFruit = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的埃癸斯果增益开启状态:" + players[0].TPlayer.usedAegisFruit, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的埃癸斯果增益开启状态:") + players[0].TPlayer.usedAegisFruit, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("star", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.usedArcaneCrystal = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的奥术水晶增益开启状态:" + players[0].TPlayer.usedArcaneCrystal, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的奥术水晶增益开启状态:") + players[0].TPlayer.usedArcaneCrystal, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("pearl", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.usedGalaxyPearl = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的银河珍珠增益开启状态:" + players[0].TPlayer.usedGalaxyPearl, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的银河珍珠增益开启状态:") + players[0].TPlayer.usedGalaxyPearl, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("worm", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.usedGummyWorm = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的粘性蠕虫增益开启状态:" + players[0].TPlayer.usedGummyWorm, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的粘性蠕虫增益开启状态:") + players[0].TPlayer.usedGummyWorm, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("ambrosia", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.usedAmbrosia = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的珍馐增益开启状态:" + players[0].TPlayer.usedAmbrosia, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的珍馐增益开启状态:") + players[0].TPlayer.usedAmbrosia, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("cart", StringComparison.OrdinalIgnoreCase)) { players[0].TPlayer.unlockedSuperCart = num != 0; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的超级矿车增益开启状态:" + players[0].TPlayer.unlockedSuperCart, new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的超级矿车增益开启状态:") + players[0].TPlayer.unlockedSuperCart, new Color(0, 255, 0)); } else if (args.Parameters[1].Equals("all", StringComparison.OrdinalIgnoreCase)) { @@ -749,8 +783,8 @@ private void SSCModify(CommandArgs args) players[0].TPlayer.usedGummyWorm = true; players[0].TPlayer.usedAmbrosia = true; players[0].TPlayer.unlockedSuperCart = true; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的所有永久增益均开启", new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的所有永久增益均开启"), new Color(0, 255, 0)); } else if (num == 0) { @@ -764,15 +798,16 @@ private void SSCModify(CommandArgs args) players[0].TPlayer.usedGummyWorm = false; players[0].TPlayer.usedAmbrosia = false; players[0].TPlayer.unlockedSuperCart = false; - players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index, 0f, 0f, 0f, 0); - players[0].SendMessage("您的所有永久增益均关闭", new Color(0, 255, 0)); + players[0].SendData(PacketTypes.PlayerInfo, "", players[0].Index); + players[0].SendMessage(GetString("您的所有永久增益均关闭"), new Color(0, 255, 0)); } else { - args.Player.SendInfoMessage("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助"); + args.Player.SendInfoMessage(GetString("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助")); } } - args.Player.SendMessage("修改成功!", new Color(0, 255, 0)); + + args.Player.SendMessage(GetString("修改成功!"), new Color(0, 255, 0)); } //不在线,修改离线数据 else if (players.Count == 0) @@ -787,164 +822,98 @@ private void SSCModify(CommandArgs args) args.Player.SendInfoMessage(this.noplayer); return; } - else if (users.Count > 1) + + if (users.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); return; } - else - { - user = users[0]; - } + + user = users[0]; } + try { if (args.Parameters[1].Equals("life", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET Health = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET Health = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("lifemax", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET MaxHealth= @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET MaxHealth= @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("mana", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET Mana = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET Mana = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("manamax", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET MaxMana = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET MaxMana = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("fish", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET questsCompleted = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET questsCompleted = @0 WHERE Account = @1;", num, user.ID); } else if (config.EnablePointTracking && args.Parameters[1].Equals("point", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE Zhipm_PlayerExtra SET point = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE Zhipm_PlayerExtra SET point = @0 WHERE Account = @1;", num, user.ID); } else if (num != 0 && num != 1) { - args.Player.SendInfoMessage("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助"); + args.Player.SendInfoMessage(GetString("格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助")); return; } else if (args.Parameters[1].Equals("torch", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET unlockedBiomeTorches = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET unlockedBiomeTorches = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("demmon", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET extraSlot = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET extraSlot = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("bread", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET ateArtisanBread = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET ateArtisanBread = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("crystal", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET usedAegisCrystal = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET usedAegisCrystal = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("fruit", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET usedAegisFruit = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET usedAegisFruit = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("arcane", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET usedArcaneCrystal = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET usedArcaneCrystal = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("pearl", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET usedGalaxyPearl = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET usedGalaxyPearl = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("worm", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET usedGummyWorm = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET usedGummyWorm = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("ambrosia", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET usedAmbrosia = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET usedAmbrosia = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("cart", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET unlockedSuperCart = @0 WHERE Account = @1;", new object[] - { - num, - user.ID - }); + TShock.DB.Query("UPDATE tsCharacter SET unlockedSuperCart = @0 WHERE Account = @1;", num, user.ID); } else if (args.Parameters[1].Equals("all", StringComparison.OrdinalIgnoreCase)) { - TShock.DB.Query("UPDATE tsCharacter SET unlockedBiomeTorches = @1, extraSlot = @2, ateArtisanBread = @3, usedAegisCrystal = @4, usedAegisFruit = @5, usedArcaneCrystal = @6, usedGalaxyPearl = @7, usedGummyWorm = @8, usedAmbrosia = @9, unlockedSuperCart = @10 WHERE Account = @0;", new object[] - { - user.ID, num, num, num, num, num, num, num, num, num, num - }); + TShock.DB.Query("UPDATE tsCharacter SET unlockedBiomeTorches = @1, extraSlot = @2, ateArtisanBread = @3, usedAegisCrystal = @4, usedAegisFruit = @5, usedArcaneCrystal = @6, usedGalaxyPearl = @7, usedGummyWorm = @8, usedAmbrosia = @9, unlockedSuperCart = @10 WHERE Account = @0;", user.ID, num, num, num, num, num, num, num, num, num, num); } - args.Player.SendMessage("修改成功!", new Color(0, 255, 0)); + + args.Player.SendMessage(GetString("修改成功!"), new Color(0, 255, 0)); } catch (Exception ex) { - args.Player.SendMessage("修改失败!错误:" + ex.ToString(), new Color(255, 0, 0)); - TShock.Log.Error("修改失败!错误:" + ex.ToString()); + args.Player.SendMessage(GetString("修改失败!错误:") + ex, new Color(255, 0, 0)); + TShock.Log.Error(GetString("修改失败!错误:") + ex); } } } @@ -952,33 +921,34 @@ private void SSCModify(CommandArgs args) /// - /// 重置用户备份数据库方法指令 + /// 重置用户备份数据库方法指令 /// /// private void ZResetPlayerDB(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zresetdb [name] 来清理该玩家的备份数据\n输入 /zresetdb all 来清理所有玩家的备份数据"); + args.Player.SendInfoMessage(GetString("输入 /zresetdb [name] 来清理该玩家的备份数据\n输入 /zresetdb all 来清理所有玩家的备份数据")); return; } + if (args.Parameters[0].Equals("all", StringComparison.OrdinalIgnoreCase)) { if (ZPDataBase.ClearALLZPlayerDB(ZPDataBase)) { if (!args.Player.IsLoggedIn) { - args.Player.SendMessage("所有玩家的备份数据均已重置", broadcastColor); - TSPlayer.All.SendMessage("所有玩家的备份数据均已重置", broadcastColor); + args.Player.SendMessage(GetString("所有玩家的备份数据均已重置"), broadcastColor); + TSPlayer.All.SendMessage(GetString("所有玩家的备份数据均已重置"), broadcastColor); } else { - TSPlayer.All.SendMessage("所有玩家的备份数据均已重置", broadcastColor); + TSPlayer.All.SendMessage(GetString("所有玩家的备份数据均已重置"), broadcastColor); } } else { - args.Player.SendMessage("重置失败", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败"), new Color(255, 0, 0)); } } else @@ -989,19 +959,22 @@ private void ZResetPlayerDB(CommandArgs args) args.Player.SendInfoMessage(this.manyplayer); return; } + if (list.Count == 1) { if (ZPDataBase.ClearZPlayerDB(list[0].Account.ID)) { - args.Player.SendMessage($"已重置玩家 [ {list[0].Name} ] 的备份数据", new Color(0, 255, 0)); - list[0].SendMessage("您的备份数据已重置", broadcastColor); + args.Player.SendMessage(GetString($"已重置玩家 [ {list[0].Name} ] 的备份数据"), new Color(0, 255, 0)); + list[0].SendMessage(GetString("您的备份数据已重置"), broadcastColor); } else { - args.Player.SendMessage("重置失败", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败"), new Color(255, 0, 0)); } + return; } + if (list.Count == 0) { args.Player.SendInfoMessage(this.offlineplayer); @@ -1014,11 +987,11 @@ private void ZResetPlayerDB(CommandArgs args) { if (ZPDataBase.ClearZPlayerDB(user.ID)) { - args.Player.SendMessage($"已重置离线玩家 [ {user.Name} ] 的备份数据", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"已重置离线玩家 [ {user.Name} ] 的备份数据"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("重置失败", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败"), new Color(255, 0, 0)); } } } @@ -1027,16 +1000,17 @@ private void ZResetPlayerDB(CommandArgs args) /// - /// 重置用户额外数据库方法指令 + /// 重置用户额外数据库方法指令 /// /// private void ZResetPlayerEX(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zresetex [name] 来清理该玩家的额外数据\n输入 /zresetex all 来清理所有玩家的额外数据"); + args.Player.SendInfoMessage(GetString("输入 /zresetex [name] 来清理该玩家的额外数据\n输入 /zresetex all 来清理所有玩家的额外数据")); return; } + if (args.Parameters[0].Equals("all", StringComparison.OrdinalIgnoreCase)) { if (ZPExtraDB.ClearALLZPlayerExtraDB(ZPExtraDB)) @@ -1044,40 +1018,45 @@ private void ZResetPlayerEX(CommandArgs args) edPlayers.Clear(); if (!args.Player.IsLoggedIn) { - args.Player.SendMessage("所有玩家的额外数据均已重置", broadcastColor); - TSPlayer.All.SendMessage("所有玩家的额外数据均已重置", broadcastColor); + args.Player.SendMessage(GetString("所有玩家的额外数据均已重置"), broadcastColor); + TSPlayer.All.SendMessage(GetString("所有玩家的额外数据均已重置"), broadcastColor); } else { - TSPlayer.All.SendMessage("所有玩家的额外数据均已重置", broadcastColor); + TSPlayer.All.SendMessage(GetString("所有玩家的额外数据均已重置"), broadcastColor); } } else { - args.Player.SendMessage("重置失败", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败"), new Color(255, 0, 0)); } + return; } + var tSPlayers = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); if (tSPlayers.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); return; } + if (tSPlayers.Count == 1) { if (ZPExtraDB.ClearZPlayerExtraDB(tSPlayers[0].Account.ID)) { - edPlayers.RemoveAll((ExtraData x) => x.Name == tSPlayers[0].Name); - args.Player.SendMessage($"已重置玩家 [ {tSPlayers[0].Name} ] 的额外数据", new Color(0, 255, 0)); - tSPlayers[0].SendMessage("您的额外数据已重置", broadcastColor); + edPlayers.RemoveAll(x => x.Name == tSPlayers[0].Name); + args.Player.SendMessage(GetString($"已重置玩家 [ {tSPlayers[0].Name} ] 的额外数据"), new Color(0, 255, 0)); + tSPlayers[0].SendMessage(GetString("您的额外数据已重置"), broadcastColor); } else { - args.Player.SendMessage("重置失败", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败"), new Color(255, 0, 0)); } + return; } + if (tSPlayers.Count == 0) { args.Player.SendInfoMessage(this.offlineplayer); @@ -1090,11 +1069,11 @@ private void ZResetPlayerEX(CommandArgs args) { if (ZPExtraDB.ClearZPlayerExtraDB(user.ID)) { - args.Player.SendMessage($"已重置离线玩家 [ {user.Name} ] 的额外数据", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"已重置离线玩家 [ {user.Name} ] 的额外数据"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("重置失败", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败"), new Color(255, 0, 0)); } } } @@ -1102,30 +1081,32 @@ private void ZResetPlayerEX(CommandArgs args) /// - /// 重置玩家的人物数据方法指令 + /// 重置玩家的人物数据方法指令 /// /// private void ZResetPlayer(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zreset 来清理该玩家的人物数据\n输入 /zreset all 来清理所有玩家的人物数据"); + args.Player.SendInfoMessage(GetString("输入 /zreset 来清理该玩家的人物数据\n输入 /zreset all 来清理所有玩家的人物数据")); return; } + if (args.Parameters[0].Equals("help", StringComparison.OrdinalIgnoreCase)) { args.Player.SendInfoMessage( - "输入 /zresetdb 来清理该玩家的备份数据\n" + - "输入 /zresetdb all 来清理所有玩家的备份数据\n" + - "输入 /zresetex 来清理该玩家的额外数据\n" + - "输入 /zresetex all 来清理所有玩家的额外数据\n" + - "输入 /zreset 来清理该玩家的人物数据\n" + - "输入 /zreset all 来清理所有玩家的人物数据\n" + - "输入 /zresetallplayers 来清理所有玩家的所有数据" - , TextColor()); + GetString("输入 /zresetdb 来清理该玩家的备份数据\n") + + GetString("输入 /zresetdb all 来清理所有玩家的备份数据\n") + + GetString("输入 /zresetex 来清理该玩家的额外数据\n") + + GetString("输入 /zresetex all 来清理所有玩家的额外数据\n") + + GetString("输入 /zreset 来清理该玩家的人物数据\n") + + GetString("输入 /zreset all 来清理所有玩家的人物数据\n") + + GetString("输入 /zresetallplayers 来清理所有玩家的所有数据") + , TextColor()); return; } - else if (args.Parameters[0].Equals("all", StringComparison.OrdinalIgnoreCase)) + + if (args.Parameters[0].Equals("all", StringComparison.OrdinalIgnoreCase)) { try { @@ -1138,24 +1119,28 @@ private void ZResetPlayer(CommandArgs args) } } catch { } + TShock.DB.Query("delete from tsCharacter"); if (!args.Player.IsLoggedIn) { - args.Player.SendMessage("所有玩家的人物数据均已重置", broadcastColor); - TSPlayer.All.SendMessage("所有玩家的人物数据均已重置", broadcastColor); + args.Player.SendMessage(GetString("所有玩家的人物数据均已重置"), broadcastColor); + TSPlayer.All.SendMessage(GetString("所有玩家的人物数据均已重置"), broadcastColor); } else { - TSPlayer.All.SendMessage("所有玩家的人物数据均已重置", broadcastColor); + TSPlayer.All.SendMessage(GetString("所有玩家的人物数据均已重置"), broadcastColor); } + return; } + var list = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); if (list.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); return; } + if (list.Count == 0) { args.Player.SendInfoMessage(this.offlineplayer); @@ -1168,42 +1153,44 @@ private void ZResetPlayer(CommandArgs args) { if (TShock.CharacterDB.RemovePlayer(user.ID)) { - args.Player.SendMessage($"已重置离线玩家 [ {user.Name} ] 的数据", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"已重置离线玩家 [ {user.Name} ] 的数据"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("重置失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("重置失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"), new Color(255, 0, 0)); } } + return; } + if (list.Count == 1) { if (this.ResetPlayer(list[0]) | TShock.CharacterDB.RemovePlayer(list[0].Account.ID)) { - args.Player.SendMessage($"已重置玩家 [ {list[0].Name} ] 的数据", new Color(0, 255, 0)); - list[0].SendMessage("您的人物数据已被重置", broadcastColor); + args.Player.SendMessage(GetString($"已重置玩家 [ {list[0].Name} ] 的数据"), new Color(0, 255, 0)); + list[0].SendMessage(GetString("您的人物数据已被重置"), broadcastColor); } else { - args.Player.SendInfoMessage("重置失败"); + args.Player.SendInfoMessage(GetString("重置失败")); } - return; } } /// - /// 重置所有用户所有数据方法指令 + /// 重置所有用户所有数据方法指令 /// /// private void ZResetPlayerAll(CommandArgs args) { if (args.Parameters.Count != 0) { - args.Player.SendInfoMessage("输入 /zresetallplayers 来清理所有玩家的所有数据"); + args.Player.SendInfoMessage(GetString($"输入 /zresetallplayers 来清理所有玩家的所有数据")); return; } + try { foreach (var tsplayer in TShock.Players) @@ -1213,6 +1200,7 @@ private void ZResetPlayerAll(CommandArgs args) this.ResetPlayer(tsplayer); } } + TShock.DB.Query("delete from tsCharacter"); ZPDataBase.ClearALLZPlayerDB(ZPDataBase); ZPExtraDB.ClearALLZPlayerExtraDB(ZPExtraDB); @@ -1220,33 +1208,35 @@ private void ZResetPlayerAll(CommandArgs args) } catch (Exception ex) { - args.Player.SendMessage("清理失败 ZResetPlayerAll :" + ex.ToString(), new Color(255, 0, 0)); - TShock.Log.Error("清理失败 ZResetPlayerAll :" + ex.ToString()); + args.Player.SendMessage(GetString($"清理失败 ZResetPlayerAll :") + ex, new Color(255, 0, 0)); + TShock.Log.Error(GetString($"清理失败 ZResetPlayerAll :") + ex); return; } + if (!args.Player.IsLoggedIn) { - args.Player.SendMessage("玩家已全部初始化", new Color(0, 255, 0)); - TSPlayer.All.SendMessage("所有玩家的所有数据均已全部初始化", broadcastColor); + args.Player.SendMessage(GetString($"玩家已全部初始化"), new Color(0, 255, 0)); + TSPlayer.All.SendMessage(GetString($"所有玩家的所有数据均已全部初始化"), broadcastColor); } else { - TShock.Utils.Broadcast("所有玩家的所有数据均已全部初始化", broadcastColor); + TShock.Utils.Broadcast(GetString($"所有玩家的所有数据均已全部初始化"), broadcastColor); } } /// - /// 分类查阅指令 + /// 分类查阅指令 /// /// private void ViewInvent(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /vi <玩家名> 来查看该玩家的库存"); + args.Player.SendInfoMessage(GetString($"输入 /vi <玩家名> 来查看该玩家的库存")); return; } + //显示模式 var model = args.Player.IsLoggedIn ? 0 : 1; @@ -1291,16 +1281,16 @@ private void ViewInvent(CommandArgs args) if (list.Count == 1) { - sb.AppendLine("玩家 【" + li.Name + "】 的所有库存如下:"); + sb.AppendLine(GetString($"玩家 【{li.Name}】 的所有库存如下:")); } else { - sb.AppendLine("多个结果 玩家 【" + li.Name + "】 的所有库存如下:"); + sb.AppendLine(GetString($"多个结果 玩家 【{li.Name}】 的所有库存如下:")); } if (inventory.Length > 0 && inventory != null && inventory != "") { - sb.AppendLine("背包:"); + sb.AppendLine(GetString($"背包:")); if (model == 0) { sb.AppendLine(FormatArrangement(inventory, 30, " ")); @@ -1310,69 +1300,80 @@ private void ViewInvent(CommandArgs args) sb.AppendLine(inventory); } } + //装备栏 if (armor.Length > 0 && armor != null && armor != "") { - sb.AppendLine("盔甲 + 饰品 + 时装:"); - sb.AppendLine("当前装备栏:"); + sb.AppendLine(GetString($"盔甲 + 饰品 + 时装:")); + sb.AppendLine(GetString($"当前装备栏:")); sb.AppendLine(armor); } + if (armor1.Length > 0 && armor1 != null && armor1 != "") { - sb.AppendLine("装备栏1:"); + sb.AppendLine(GetString($"装备栏1:")); sb.AppendLine(armor1); } + if (armor2.Length > 0 && armor2 != null && armor2 != "") { - sb.AppendLine("装备栏2:"); + sb.AppendLine(GetString($"装备栏2:")); sb.AppendLine(armor2); } + if (armor3.Length > 0 && armor3 != null && armor3 != "") { - sb.AppendLine("装备栏3:"); + sb.AppendLine(GetString($"装备栏3:")); sb.AppendLine(armor3); } + //染料 if (dyestuff.Length > 0 && dyestuff != null && dyestuff != "") { - sb.AppendLine("当前染料:"); + sb.AppendLine(GetString($"当前染料:")); sb.AppendLine(dyestuff); } + if (dyestuff1.Length > 0 && dyestuff1 != null && dyestuff1 != "") { - sb.AppendLine("染料1:"); + sb.AppendLine(GetString($"染料1:")); sb.AppendLine(dyestuff1); } + if (dyestuff2.Length > 0 && dyestuff2 != null && dyestuff2 != "") { - sb.AppendLine("染料2:"); + sb.AppendLine(GetString($"染料2:")); sb.AppendLine(dyestuff2); } + if (dyestuff3.Length > 0 && dyestuff3 != null && dyestuff3 != "") { - sb.AppendLine("染料3:"); + sb.AppendLine(GetString($"染料3:")); sb.AppendLine(dyestuff3); } if (misc.Length > 0 && misc != null && misc != "") { - sb.AppendLine("宠物 + 矿车 + 坐骑 + 钩爪:"); + sb.AppendLine(GetString($"宠物 + 矿车 + 坐骑 + 钩爪:")); sb.AppendLine(misc); } + if (miscDye.Length > 0 && miscDye != null && miscDye != "") { - sb.AppendLine("宠物 矿车 坐骑 钩爪 染料:"); + sb.AppendLine(GetString($"宠物 矿车 坐骑 钩爪 染料:")); sb.AppendLine(miscDye); } + if (trash != "") { - sb.AppendLine("垃圾桶:"); + sb.AppendLine(GetString($"垃圾桶:")); sb.AppendLine(trash); } + if (pig.Length > 0 && pig != null && pig != "") { - sb.AppendLine("猪猪储蓄罐:"); + sb.AppendLine(GetString($"猪猪储蓄罐:")); if (model == 0) { sb.AppendLine(FormatArrangement(pig, 30, " ")); @@ -1382,9 +1383,10 @@ private void ViewInvent(CommandArgs args) sb.AppendLine(pig); } } + if (safe.Length > 0 && safe != null && safe != "") { - sb.AppendLine("保险箱:"); + sb.AppendLine(GetString($"保险箱:")); if (model == 0) { sb.AppendLine(FormatArrangement(safe, 30, " ")); @@ -1394,9 +1396,10 @@ private void ViewInvent(CommandArgs args) sb.AppendLine(safe); } } + if (forge.Length > 0 && forge != null && forge != "") { - sb.AppendLine("护卫熔炉:"); + sb.AppendLine(GetString($"护卫熔炉:")); if (model == 0) { sb.AppendLine(FormatArrangement(forge, 30, " ")); @@ -1406,9 +1409,10 @@ private void ViewInvent(CommandArgs args) sb.AppendLine(forge); } } + if (vault.Length > 0 && vault != null && vault != "") { - sb.AppendLine("虚空金库:"); + sb.AppendLine(GetString($"虚空金库:")); if (model == 0) { sb.AppendLine(FormatArrangement(vault, 30, " ")); @@ -1418,13 +1422,14 @@ private void ViewInvent(CommandArgs args) sb.AppendLine(vault); } } + if (sb.Length > 0 && sb != null && !string.IsNullOrEmpty(sb.ToString())) { - args.Player.SendMessage(sb.ToString() + "\n", TextColor()); + args.Player.SendMessage(sb + "\n", TextColor()); } else { - args.Player.SendInfoMessage("玩家 【" + li.Name + "】 未携带任何东西"); + args.Player.SendInfoMessage(GetString($"玩家 【{li.Name}】 未携带任何东西")); } } } @@ -1433,7 +1438,7 @@ private void ViewInvent(CommandArgs args) args.Player.SendInfoMessage(this.offlineplayer); var users = new Dictionary(); var temp = TShock.UserAccounts.GetUserAccountsByName(name, true); - if (temp.Count == 1 || temp.Count > 1 && temp.Exists(x => x.Name == name)) + if (temp.Count == 1 || (temp.Count > 1 && temp.Exists(x => x.Name == name))) { if (temp.Count == 1) { @@ -1451,7 +1456,7 @@ private void ViewInvent(CommandArgs args) { users.Add(u, temp2); } - else//如果未找到就说明,你找到名字完全符合的没有charater数据,那么返回之前的多个模糊查找的结果 + else //如果未找到就说明,你找到名字完全符合的没有charater数据,那么返回之前的多个模糊查找的结果 { foreach (var t in temp) { @@ -1475,6 +1480,7 @@ private void ViewInvent(CommandArgs args) } } } + if (users.Count == 0) { args.Player.SendInfoMessage(this.noplayer); @@ -1494,16 +1500,16 @@ private void ViewInvent(CommandArgs args) { if (users.Count > 1) { - args.Player.SendMessage("多个结果 玩家 【" + p.Key.Name + "】 的所有库存如下:" + "\n" + offAll, TextColor()); + args.Player.SendMessage(GetString($"多个结果 玩家 【{p.Key.Name}】 的所有库存如下:" + "\n") + offAll, TextColor()); } else { - args.Player.SendMessage("玩家 【" + p.Key.Name + "】 的所有库存如下:" + "\n" + offAll, TextColor()); + args.Player.SendMessage(GetString($"玩家 【{p.Key.Name}】 的所有库存如下:") + "\n" + offAll, TextColor()); } } else { - args.Player.SendInfoMessage("玩家 【" + p.Key.Name + "】 未携带任何东西\n"); + args.Player.SendInfoMessage(GetString($"玩家 【{p.Key.Name}】 未携带任何东西\n")); } } } @@ -1512,16 +1518,17 @@ private void ViewInvent(CommandArgs args) /// - /// 不分类查阅指令 + /// 不分类查阅指令 /// /// private void ViewInventDisorder(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /vid <玩家名> 来查看该玩家的库存,不进行排列"); + args.Player.SendInfoMessage(GetString($"输入 /vid <玩家名> 来查看该玩家的库存,不进行排列")); return; } + var model = args.Player.IsLoggedIn ? 0 : 1; var name = args.Parameters[0]; @@ -1572,16 +1579,16 @@ private void ViewInventDisorder(CommandArgs args) { if (list.Count == 1) { - args.Player.SendMessage("玩家 【" + li.Name + "】 的所有库存如下:\n" + all + "\n", TextColor()); + args.Player.SendMessage(GetString($"玩家 【{li.Name}】 的所有库存如下:\n") + all + "\n", TextColor()); } else { - args.Player.SendMessage("多个结果 玩家 【" + li.Name + "】 的所有库存如下:\n" + all + "\n", TextColor()); + args.Player.SendMessage(GetString($"多个结果 玩家 【{li.Name}】 的所有库存如下:\n") + all + "\n", TextColor()); } } else { - args.Player.SendInfoMessage("玩家 【" + li.Name + "】未携带任何东西\n"); + args.Player.SendInfoMessage(GetString($"玩家 【{li.Name}】未携带任何东西\n")); } } } @@ -1590,7 +1597,7 @@ private void ViewInventDisorder(CommandArgs args) args.Player.SendInfoMessage(this.offlineplayer); var users = new Dictionary(); var temp = TShock.UserAccounts.GetUserAccountsByName(name, true); - if (temp.Count == 1 || temp.Count > 1 && temp.Exists(x => x.Name == name)) + if (temp.Count == 1 || (temp.Count > 1 && temp.Exists(x => x.Name == name))) { if (temp.Count == 1) { @@ -1608,7 +1615,7 @@ private void ViewInventDisorder(CommandArgs args) { users.Add(u, temp2); } - else//如果未找到就说明,你找到名字完全符合的没有charater数据,那么返回之前的多个模糊查找的结果 + else //如果未找到就说明,你找到名字完全符合的没有charater数据,那么返回之前的多个模糊查找的结果 { foreach (var t in temp) { @@ -1632,6 +1639,7 @@ private void ViewInventDisorder(CommandArgs args) } } } + if (users.Count == 0) { args.Player.SendInfoMessage(this.noplayer); @@ -1650,16 +1658,16 @@ private void ViewInventDisorder(CommandArgs args) { if (users.Count > 1) { - args.Player.SendMessage("多个结果 玩家 【" + p.Key.Name + "】 的所有库存如下:" + "\n" + offAll + "\n", TextColor()); + args.Player.SendMessage(GetString($"多个结果 玩家 【{p.Key.Name}】 的所有库存如下:") + "\n" + offAll + "\n", TextColor()); } else { - args.Player.SendMessage("玩家 【" + p.Key.Name + "】 的所有库存如下:" + "\n" + offAll + "\n", TextColor()); + args.Player.SendMessage(GetString($"玩家 【{p.Key.Name}】 的所有库存如下:") + "\n" + offAll + "\n", TextColor()); } } else { - args.Player.SendInfoMessage("玩家 【" + p.Key.Name + "】 未携带任何东西\n"); + args.Player.SendInfoMessage(GetString($"玩家 【{p.Key.Name}】 未携带任何东西\n")); } } } @@ -1668,7 +1676,7 @@ private void ViewInventDisorder(CommandArgs args) /// - /// 查询玩家的状态 + /// 查询玩家的状态 /// /// /// @@ -1676,9 +1684,10 @@ private void ViewState(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /vs <玩家名> 来查看该玩家的状态"); + args.Player.SendInfoMessage(GetString("输入 /vs <玩家名> 来查看该玩家的状态")); return; } + var name = args.Parameters[0]; var list = this.BestFindPlayerByNameOrIndex(name); if (name.Equals("me", StringComparison.OrdinalIgnoreCase) && args.Player.IsLoggedIn) @@ -1693,12 +1702,12 @@ private void ViewState(CommandArgs args) { var sb = new StringBuilder(); var ex = edPlayers.Find(x => x.Name == list[0].Name); - sb.AppendLine("玩家 【" + list[0].Name + "】 的状态如下:"); - sb.AppendLine("最大生命值[i:29]:" + list[0].TPlayer.statLifeMax + " 当前生命值[i:58]:" + list[0].TPlayer.statLife); - sb.AppendLine("最大魔力值[i:109]:" + list[0].TPlayer.statManaMax2 + " 当前魔力值[i:184]:" + list[0].TPlayer.statMana); - sb.AppendLine("完成渔夫任务数[i:3120]:" + list[0].TPlayer.anglerQuestsFinished); - sb.AppendLine("库存硬币数[i:855]:" + this.cointostring(this.getPlayerCoin(list[0].Name))); - sb.Append("各种buff[i:678]:"); + sb.AppendLine(GetString($"玩家 【{list[0].Name}】 的状态如下:")); + sb.AppendLine(GetString("最大生命值[i:29]:") + list[0].TPlayer.statLifeMax +GetString(" 当前生命值[i:58]:") + list[0].TPlayer.statLife); + sb.AppendLine(GetString("最大魔力值[i:109]:") + list[0].TPlayer.statManaMax2 + GetString(" 当前魔力值[i:184]:") + list[0].TPlayer.statMana); + sb.AppendLine(GetString("完成渔夫任务数[i:3120]:") + list[0].TPlayer.anglerQuestsFinished); + sb.AppendLine(GetString("库存硬币数[i:855]:") + this.cointostring(this.getPlayerCoin(list[0].Name))); + sb.Append(GetString("各种buff[i:678]:")); var flag = 0; foreach (var buff in list[0].TPlayer.buffType) { @@ -1712,90 +1721,104 @@ private void ViewState(CommandArgs args) } } } + if (flag == 0) { - sb.Append("无"); + sb.Append(GetString("无")); } + sb.AppendLine(); - sb.Append("各种永久增益:"); + sb.Append("GetString(各种永久增益:"); flag = 0; if (list[0].TPlayer.extraAccessory) { flag++; sb.Append("[i:3335] "); } + if (list[0].TPlayer.unlockedBiomeTorches) { flag++; sb.Append("[i:5043] "); } + if (list[0].TPlayer.ateArtisanBread) { flag++; sb.Append("[i:5326] "); } + if (list[0].TPlayer.usedAegisCrystal) { flag++; sb.Append("[i:5337] "); } + if (list[0].TPlayer.usedAegisFruit) { flag++; sb.Append("[i:5338] "); } + if (list[0].TPlayer.usedArcaneCrystal) { flag++; sb.Append("[i:5339] "); } + if (list[0].TPlayer.usedGalaxyPearl) { flag++; sb.Append("[i:5340] "); } + if (list[0].TPlayer.usedGummyWorm) { flag++; sb.Append("[i:5341] "); } + if (list[0].TPlayer.usedAmbrosia) { flag++; sb.Append("[i:5342] "); } + if (list[0].TPlayer.unlockedSuperCart) { flag++; sb.Append("[i:5289]"); } + if (flag == 0) { - sb.Append("无"); + sb.Append(GetString("无")); } + sb.AppendLine(); if (ex != null) { if (config.EnableOnlineTimeTracking) { - sb.AppendLine("在线时长[i:3099]:" + this.timetostring(ex.time)); + sb.AppendLine(GetString("在线时长[i:3099]:") + this.timetostring(ex.time)); } if (config.EnableDeathCountTracking) { - sb.AppendLine("死亡次数[i:321]:" + ex.deathCount); + sb.AppendLine(GetString("死亡次数[i:321]:") + ex.deathCount); } if (config.EnableNpcKillTracking) { - sb.AppendLine("已击杀生物数[i:3095]:" + ex.killNPCnum + " 个"); - sb.AppendLine("已击杀Boss[i:3868]:" + DictionaryToVSString(ex.killBossID)); - sb.AppendLine("已击杀罕见生物[i:4274]:" + DictionaryToVSString(ex.killRareNPCID)); + sb.AppendLine(GetString($"已击杀生物数[i:3095]:{ex.killNPCnum} 个")); + sb.AppendLine(GetString("已击杀Boss[i:3868]:") + DictionaryToVSString(ex.killBossID)); + sb.AppendLine(GetString("已击杀罕见生物[i:4274]:") + DictionaryToVSString(ex.killRareNPCID)); } + if (config.EnablePointTracking && config.EnableNpcKillTracking) { - sb.AppendLine("点数[i:575]:" + ex.point); + sb.AppendLine(GetString("点数[i:575]:") + ex.point); } } @@ -1806,7 +1829,7 @@ private void ViewState(CommandArgs args) args.Player.SendInfoMessage(this.offlineplayer); var users = new Dictionary(); var temp = TShock.UserAccounts.GetUserAccountsByName(name, true); - if (temp.Count == 1 || temp.Count > 1 && temp.Exists(x => x.Name == name)) + if (temp.Count == 1 || (temp.Count > 1 && temp.Exists(x => x.Name == name))) { if (temp.Count == 1) { @@ -1848,6 +1871,7 @@ private void ViewState(CommandArgs args) } } } + if (users.Count == 0) { args.Player.SendInfoMessage(this.noplayer); @@ -1860,95 +1884,107 @@ private void ViewState(CommandArgs args) var ex = ZPExtraDB.ReadExtraDB(p.Key.ID); if (users.Count == 1) { - sb.AppendLine("玩家 【" + p.Key.Name + "】 的状态如下:"); + sb.AppendLine($"玩家 【{p.Key.Name}】 的状态如下:"); } else { - sb.AppendLine("多个结果 玩家 【" + p.Key.Name + "】 的状态如下:"); + sb.AppendLine(GetString($"多个结果 玩家 【{p.Key.Name}】 的状态如下:")); } - sb.AppendLine("最大生命值[i:29]:" + p.Value.maxHealth + " 当前生命值[i:58]:" + p.Value.health); - sb.AppendLine("最大魔力值[i:109]:" + p.Value.maxMana + " 当前魔力值[i:184]:" + p.Value.mana); - sb.AppendLine("完成渔夫任务数[i:3120]:" + p.Value.questsCompleted); - sb.AppendLine("库存硬币数[i:855]:" + this.cointostring(this.getPlayerCoin(p.Key.Name))); - sb.Append("各种永久增益:"); + sb.AppendLine(GetString("最大生命值[i:29]:") + p.Value.maxHealth + GetString(" 当前生命值[i:58]:") + p.Value.health); + sb.AppendLine(GetString("最大魔力值[i:109]:") + p.Value.maxMana + GetString(" 当前魔力值[i:184]:") + p.Value.mana); + sb.AppendLine(GetString("完成渔夫任务数[i:3120]:") + p.Value.questsCompleted); + sb.AppendLine(GetString("库存硬币数[i:855]:") + this.cointostring(this.getPlayerCoin(p.Key.Name))); + sb.Append(GetString("各种永久增益:")); var flag = 0; if (p.Value.extraSlot != null && p.Value.extraSlot.GetValueOrDefault() == 1) { flag++; sb.Append("[i:3335] "); } + if (p.Value.unlockedBiomeTorches == 1) { flag++; sb.Append("[i:5043] "); } + if (p.Value.ateArtisanBread == 1) { flag++; sb.Append("[i:5326] "); } + if (p.Value.usedAegisCrystal == 1) { flag++; sb.Append("[i:5337] "); } + if (p.Value.usedAegisFruit == 1) { flag++; sb.Append("[i:5338] "); } + if (p.Value.usedArcaneCrystal == 1) { flag++; sb.Append("[i:5339] "); } + if (p.Value.usedGalaxyPearl == 1) { flag++; sb.Append("[i:5340] "); } + if (p.Value.usedGummyWorm == 1) { flag++; sb.Append("[i:5341] "); } + if (p.Value.usedAmbrosia == 1) { flag++; sb.Append("[i:5342] "); } + if (p.Value.unlockedSuperCart == 1) { flag++; sb.Append("[i:5289]"); } + if (flag == 0) { - sb.Append("无"); + sb.Append(GetString("无")); } + sb.AppendLine(); if (ex != null) { if (config.EnableOnlineTimeTracking) { - sb.AppendLine("在线时长[i:3099]:" + this.timetostring(ex.time)); + sb.AppendLine(GetString("在线时长[i:3099]:") + this.timetostring(ex.time)); } if (config.EnableDeathCountTracking) { - sb.AppendLine("死亡次数[i:321]:" + ex.deathCount); + sb.AppendLine(GetString("死亡次数[i:321]:") + ex.deathCount); } if (config.EnableNpcKillTracking) { - sb.AppendLine("已击杀生物数[i:3095]:" + ex.killNPCnum + " 个"); - sb.AppendLine("已击杀Boss[i:3868]:" + DictionaryToVSString(ex.killBossID)); - sb.AppendLine("已击杀罕见生物[i:4274]:" + DictionaryToVSString(ex.killRareNPCID)); + sb.AppendLine(GetString($"已击杀生物数[i:3095]:{ex.killNPCnum} 个")); + sb.AppendLine(GetString("已击杀Boss[i:3868]:") + DictionaryToVSString(ex.killBossID)); + sb.AppendLine(GetString("已击杀罕见生物[i:4274]:") + DictionaryToVSString(ex.killRareNPCID)); } + if (config.EnablePointTracking && config.EnableNpcKillTracking) { - sb.AppendLine("点数[i:575]:" + ex.point); + sb.AppendLine(GetString("点数[i:575]:") + ex.point); } } @@ -1963,12 +1999,12 @@ private void ViewState(CommandArgs args) { var sb = new StringBuilder(); var ex = edPlayers.Find(x => x.Name == list[0].Name); - sb.AppendLine("玩家 【" + list[0].Name + "】 的状态如下:"); - sb.AppendLine("最大生命值:" + list[0].TPlayer.statLifeMax + " 当前生命值:" + list[0].TPlayer.statLife); - sb.AppendLine("最大魔力值:" + list[0].TPlayer.statManaMax2 + " 当前魔力值:" + list[0].TPlayer.statMana); - sb.AppendLine("完成渔夫任务数:" + list[0].TPlayer.anglerQuestsFinished); - sb.AppendLine("库存硬币数:" + this.cointostring(this.getPlayerCoin(list[0].Name), 1)); - sb.Append("各种buff:"); + sb.AppendLine(GetString($"玩家 【{list[0].Name}】 的状态如下:")); + sb.AppendLine(GetString("最大生命值:") + list[0].TPlayer.statLifeMax + GetString(" 当前生命值:") + list[0].TPlayer.statLife); + sb.AppendLine(GetString("最大魔力值:") + list[0].TPlayer.statManaMax2 + GetString(" 当前魔力值:") + list[0].TPlayer.statMana); + sb.AppendLine(GetString("完成渔夫任务数:") + list[0].TPlayer.anglerQuestsFinished); + sb.AppendLine(GetString("库存硬币数:") + this.cointostring(this.getPlayerCoin(list[0].Name), 1)); + sb.Append(GetString("各种buff:")); var flag = 0; foreach (var buff in list[0].TPlayer.buffType) { @@ -1978,90 +2014,104 @@ private void ViewState(CommandArgs args) sb.Append(Lang.GetBuffName(buff) + " "); } } + if (flag == 0) { - sb.Append("无"); + sb.Append(GetString("无")); } + sb.AppendLine(); - sb.Append("各种永久增益:"); + sb.Append(GetString("各种永久增益:")); flag = 0; if (list[0].TPlayer.extraAccessory) { flag++; sb.Append(Lang.GetItemNameValue(3335) + " "); } + if (list[0].TPlayer.unlockedBiomeTorches) { flag++; sb.Append(Lang.GetItemNameValue(5043) + " "); } + if (list[0].TPlayer.ateArtisanBread) { flag++; sb.Append(Lang.GetItemNameValue(5326) + " "); } + if (list[0].TPlayer.usedAegisCrystal) { flag++; sb.Append(Lang.GetItemNameValue(5337) + " "); } + if (list[0].TPlayer.usedAegisFruit) { flag++; sb.Append(Lang.GetItemNameValue(5338) + " "); } + if (list[0].TPlayer.usedArcaneCrystal) { flag++; sb.Append(Lang.GetItemNameValue(5339) + " "); } + if (list[0].TPlayer.usedGalaxyPearl) { flag++; sb.Append(Lang.GetItemNameValue(5340) + " "); } + if (list[0].TPlayer.usedGummyWorm) { flag++; sb.Append(Lang.GetItemNameValue(5341) + " "); } + if (list[0].TPlayer.usedAmbrosia) { flag++; sb.Append(Lang.GetItemNameValue(5342) + " "); } + if (list[0].TPlayer.unlockedSuperCart) { flag++; sb.Append(Lang.GetItemNameValue(5289)); } + if (flag == 0) { - sb.Append("无"); + sb.Append(GetString("无")); } + sb.AppendLine(); if (ex != null) { if (config.EnableOnlineTimeTracking) { - sb.AppendLine("在线时长:" + this.timetostring(ex.time)); + sb.AppendLine(GetString("在线时长:") + this.timetostring(ex.time)); } if (config.EnableDeathCountTracking) { - sb.AppendLine("死亡次数:" + ex.deathCount); + sb.AppendLine(GetString("死亡次数:") + ex.deathCount); } if (config.EnableNpcKillTracking) { - sb.AppendLine("已击杀生物数:" + ex.killNPCnum + " 个"); - sb.AppendLine("已击杀Boss:" + DictionaryToVSString(ex.killBossID, false)); - sb.AppendLine("已击杀罕见生物:" + DictionaryToVSString(ex.killRareNPCID, false)); + sb.AppendLine(GetString($"已击杀生物数:{ex.killNPCnum} 个")); + sb.AppendLine(GetString("已击杀Boss:") + DictionaryToVSString(ex.killBossID, false)); + sb.AppendLine(GetString("已击杀罕见生物:") + DictionaryToVSString(ex.killRareNPCID, false)); } + if (config.EnableNpcKillTracking && config.EnablePointTracking) { - sb.AppendLine("点数:" + ex.point); + sb.AppendLine(GetString("点数:") + ex.point); } } @@ -2072,7 +2122,7 @@ private void ViewState(CommandArgs args) args.Player.SendInfoMessage(this.offlineplayer); var users = new Dictionary(); var temp = TShock.UserAccounts.GetUserAccountsByName(name, true); - if (temp.Count == 1 || temp.Count > 1 && temp.Exists(x => x.Name == name)) + if (temp.Count == 1 || (temp.Count > 1 && temp.Exists(x => x.Name == name))) { if (temp.Count == 1) { @@ -2118,6 +2168,7 @@ private void ViewState(CommandArgs args) } } } + if (users.Count == 0) { args.Player.SendInfoMessage(this.noplayer); @@ -2130,95 +2181,107 @@ private void ViewState(CommandArgs args) var ex = ZPExtraDB.ReadExtraDB(p.Key.ID); if (users.Count == 1) { - sb.AppendLine("玩家 【" + p.Key.Name + "】 的状态如下:"); + sb.AppendLine(GetString($"玩家 【{p.Key.Name}】 的状态如下:")); } else { - sb.AppendLine("多个结果 玩家 【" + p.Key.Name + "】 的状态如下:"); + sb.AppendLine(GetString($"多个结果 玩家 【{p.Key.Name}】 的状态如下:")); } - sb.AppendLine("最大生命值:" + p.Value.maxHealth + " 当前生命值:" + p.Value.health); - sb.AppendLine("最大魔力值:" + p.Value.maxMana + " 当前魔力值:" + p.Value.mana); - sb.AppendLine("完成渔夫任务数:" + p.Value.questsCompleted); - sb.AppendLine("库存硬币数:" + this.cointostring(this.getPlayerCoin(p.Key.Name), 1)); - sb.Append("各种永久增益:"); + sb.AppendLine(GetString("最大生命值:") + p.Value.maxHealth + GetString(" 当前生命值:") + p.Value.health); + sb.AppendLine(GetString("最大魔力值:") + p.Value.maxMana + GetString(" 当前魔力值:") + p.Value.mana); + sb.AppendLine(GetString("完成渔夫任务数:") + p.Value.questsCompleted); + sb.AppendLine(GetString("库存硬币数:") + this.cointostring(this.getPlayerCoin(p.Key.Name), 1)); + sb.Append(GetString("各种永久增益:")); var flag = 0; if (p.Value.extraSlot != null && p.Value.extraSlot.GetValueOrDefault() == 1) { flag++; sb.Append(Lang.GetItemNameValue(3335) + " "); } + if (p.Value.unlockedBiomeTorches == 1) { flag++; sb.Append(Lang.GetItemNameValue(5043) + " "); } + if (p.Value.ateArtisanBread == 1) { flag++; sb.Append(Lang.GetItemNameValue(5326) + " "); } + if (p.Value.usedAegisCrystal == 1) { flag++; sb.Append(Lang.GetItemNameValue(5337) + " "); } + if (p.Value.usedAegisFruit == 1) { flag++; sb.Append(Lang.GetItemNameValue(5338) + " "); } + if (p.Value.usedArcaneCrystal == 1) { flag++; sb.Append(Lang.GetItemNameValue(5339) + " "); } + if (p.Value.usedGalaxyPearl == 1) { flag++; sb.Append(Lang.GetItemNameValue(5340) + " "); } + if (p.Value.usedGummyWorm == 1) { flag++; sb.Append(Lang.GetItemNameValue(5341) + " "); } + if (p.Value.usedAmbrosia == 1) { flag++; sb.Append(Lang.GetItemNameValue(5342) + " "); } + if (p.Value.unlockedSuperCart == 1) { flag++; sb.Append(Lang.GetItemNameValue(5289)); } + if (flag == 0) { sb.Append("无"); } + sb.AppendLine(); if (ex != null) { if (config.EnableOnlineTimeTracking) { - sb.AppendLine("在线时长:" + this.timetostring(ex.time)); + sb.AppendLine(GetString("在线时长:") + this.timetostring(ex.time)); } if (config.EnableDeathCountTracking) { - sb.AppendLine("死亡次数:" + ex.deathCount); + sb.AppendLine(GetString("死亡次数:") + ex.deathCount); } if (config.EnableNpcKillTracking) { - sb.AppendLine("已击杀生物数:" + ex.killNPCnum + " 个"); - sb.AppendLine("已击杀Boss:" + DictionaryToVSString(ex.killBossID, false)); - sb.AppendLine("已击杀罕见生物:" + DictionaryToVSString(ex.killRareNPCID, false)); + sb.AppendLine(GetString("已击杀生物数:") + ex.killNPCnum + " 个"); + sb.AppendLine(GetString("已击杀Boss:") + DictionaryToVSString(ex.killBossID, false)); + sb.AppendLine(GetString("已击杀罕见生物:") + DictionaryToVSString(ex.killRareNPCID, false)); } + if (config.EnablePointTracking && config.EnableNpcKillTracking) { - sb.AppendLine("点数:" + ex.point); + sb.AppendLine(GetString("点数:") + ex.point); } } @@ -2231,25 +2294,26 @@ private void ViewState(CommandArgs args) /// - /// 清理 + /// 清理 /// /// private void Clear(CommandArgs args) { if (args.Parameters.Count < 1 || args.Parameters.Count > 2) { - args.Player.SendInfoMessage("输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n输入 /zclear buff 来清理该玩家的所有Buff\n输入 /zclear buff all 来清理所有玩家所有Buff"); + args.Player.SendInfoMessage(GetString("输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n输入 /zclear buff 来清理该玩家的所有Buff\n输入 /zclear buff all 来清理所有玩家所有Buff")); return; } + if (args.Parameters.Count == 1 && args.Parameters[0].Equals("useless", StringComparison.OrdinalIgnoreCase)) { this.cleartime = Timer + 1200L; if (!args.Player.IsLoggedIn) { - args.Player.SendMessage("服务器将在20秒后清理世界内所有无用NPC,射弹和物品", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("服务器将在20秒后清理世界内所有无用NPC,射弹和物品"), new Color(255, 0, 0)); } - TSPlayer.All.SendMessage("服务器将在20秒后清理世界内所有无用NPC,射弹和物品", new Color(255, 0, 0)); + TSPlayer.All.SendMessage(GetString("服务器将在20秒后清理世界内所有无用NPC,射弹和物品"), new Color(255, 0, 0)); } else if (args.Parameters.Count == 2 && args.Parameters[0].Equals("buff", StringComparison.OrdinalIgnoreCase)) { @@ -2262,13 +2326,15 @@ private void Clear(CommandArgs args) this.clearAllBuffFromPlayer(tSPlayer); } } - args.Player.SendMessage($"所有玩家的所有Buff均已消除", new Color(0, 255, 0)); + + args.Player.SendMessage(GetString("所有玩家的所有Buff均已消除"), new Color(0, 255, 0)); return; } + var ts = this.BestFindPlayerByNameOrIndex(args.Parameters[1]); if (ts.Count == 0) { - args.Player.SendInfoMessage("该玩家不在线或不存在"); + args.Player.SendInfoMessage(GetString("该玩家不在线或不存在")); } else if (ts.Count > 1) { @@ -2277,18 +2343,18 @@ private void Clear(CommandArgs args) else { this.clearAllBuffFromPlayer(ts[0]); - args.Player.SendMessage($"玩家 [ {ts[0].Name} ] 的所有Buff均已消除", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [ {ts[0].Name} ] 的所有Buff均已消除"), new Color(0, 255, 0)); } } else { - args.Player.SendInfoMessage("输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n输入 /zclear buff 来清理该玩家的所有Buff\n输入 /zclear buff all 来清理所有玩家所有Buff"); + args.Player.SendInfoMessage(GetString("输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n输入 /zclear buff 来清理该玩家的所有Buff\n输入 /zclear buff all 来清理所有玩家所有Buff")); } } /// - /// 游戏更新,用来实现人物额外数据如时间的同步增加,这里实现对进服人员的添加和time自增 + /// 游戏更新,用来实现人物额外数据如时间的同步增加,这里实现对进服人员的添加和time自增 /// /// private void OnGameUpdate(EventArgs args) @@ -2306,7 +2372,7 @@ private void OnGameUpdate(EventArgs args) if (tsp != null && tsp.IsLoggedIn) { //如果当前玩家已存在,那么更新额外数据 - var extraData = edPlayers.Find((ExtraData x) => x.Name == tsp.Name); + var extraData = edPlayers.Find(x => x.Name == tsp.Name); if (extraData != null) { if (config.EnableOnlineTimeTracking) @@ -2317,12 +2383,13 @@ private void OnGameUpdate(EventArgs args) if (config.EnablePointTracking) { extraData.point += 1000; - this.SendText(tsp, "点数奖励 + 1000", broadcastColor, tsp.TPlayer.Center); + this.SendText(tsp, GetString("点数奖励 + 1000"), broadcastColor, tsp.TPlayer.Center); } + tsp.SendMessage("您已经在线了 " + this.timetostring(extraData.time), broadcastColor); - TShock.Log.Info("玩家 " + extraData.Name + " 已经在线了 " + this.timetostring(extraData.time)); - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(tsp.TPlayer.Center, 4), tsp.Index, -1); - Projectile.NewProjectile(null, tsp.TPlayer.Center, -Vector2.UnitY * 4f, Main.rand.Next(415, 419), 0, 0f, -1, 0f, 0f, 0f); + TShock.Log.Info(GetString($"玩家 {extraData.Name} 已经在线了 {this.timetostring(extraData.time)}")); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(tsp.TPlayer.Center, 4), tsp.Index); + Projectile.NewProjectile(null, tsp.TPlayer.Center, -Vector2.UnitY * 4f, Main.rand.Next(415, 419), 0, 0f); } } } @@ -2351,15 +2418,16 @@ private void OnGameUpdate(EventArgs args) if (config.EnablePlayerAutoBackup && Timer % 3600L == 0L) { foreach (var ex in edPlayers) - {//到达备份间隔时长,备份一次 + { + //到达备份间隔时长,备份一次 foreach (var ts in TShock.Players) { if (ts != null && ts.IsLoggedIn && ts.Name == ex.Name && ex.backuptime != 0L && Timer % (3600L * ex.backuptime) == 0L) { ZPExtraDB.WriteExtraDB(ex); ZPDataBase.AddZPlayerDB(ts); - ts.SendMessage("已自动备份您的人物存档,自动保存您的额外数据", new Color(0, 255, 0)); - TShock.Log.Info($"玩家【{ts.Name}】的人物存档和额外数据已备份和保存"); + ts.SendMessage(GetString("已自动备份您的人物存档,自动保存您的额外数据"), new Color(0, 255, 0)); + TShock.Log.Info(GetString($"玩家【{ts.Name}】的人物存档和额外数据已备份和保存")); } } } @@ -2369,9 +2437,19 @@ private void OnGameUpdate(EventArgs args) //清理世界无效数据处理 if (Timer > this.cleartime) { - var asset = new List { - NPCID.Creeper, NPCID.LunarTowerNebula, NPCID.LunarTowerSolar, NPCID.LunarTowerStardust, NPCID.LunarTowerVortex, - 68,128,129,130,131,400 + var asset = new List + { + NPCID.Creeper, + NPCID.LunarTowerNebula, + NPCID.LunarTowerSolar, + NPCID.LunarTowerStardust, + NPCID.LunarTowerVortex, + 68, + 128, + 129, + 130, + 131, + 400 }; foreach (var v in Main.npc) @@ -2379,9 +2457,10 @@ private void OnGameUpdate(EventArgs args) if (v.active && !v.boss && !v.townNPC && !asset.Contains(v.netID)) { v.active = false; - NetMessage.SendData(23, -1, -1, null, v.whoAmI, 0f, 0f, 0f, 0, 0, 0); + NetMessage.SendData(23, -1, -1, null, v.whoAmI); } } + foreach (var v in Main.projectile) { if (v.active) @@ -2390,16 +2469,18 @@ private void OnGameUpdate(EventArgs args) TSPlayer.All.SendData(PacketTypes.ProjectileDestroy, "", v.identity, v.owner); } } + foreach (var v in Main.item) { if (v.active) { v.active = false; - TSPlayer.All.SendData(PacketTypes.ItemDrop, "", v.whoAmI, 0f, 0f, 0f, 0); + TSPlayer.All.SendData(PacketTypes.ItemDrop, "", v.whoAmI); } } + this.cleartime = long.MaxValue; - TSPlayer.All.SendMessage("已清理所有射弹,物品,无用NPC", new Color(65, 165, 238)); + TSPlayer.All.SendMessage(GetString("已清理所有射弹,物品,无用NPC"), new Color(65, 165, 238)); } } @@ -2410,7 +2491,7 @@ private void OnGameUpdate(EventArgs args) { TShock.Players.ForEach(x => { - if (x != null && x.IsLoggedIn && (x.UUID.Equals(v.uuid) || x.Name.Equals(v.name) || !string.IsNullOrEmpty(v.IPs) && !string.IsNullOrEmpty(x.IP) && this.IPStostringIPs(v.IPs).Contains(x.IP))) + if (x != null && x.IsLoggedIn && (x.UUID.Equals(v.uuid) || x.Name.Equals(v.name) || (!string.IsNullOrEmpty(v.IPs) && !string.IsNullOrEmpty(x.IP) && this.IPStostringIPs(v.IPs).Contains(x.IP)))) { for (var i = 0; i < 22; i++) { @@ -2435,25 +2516,27 @@ private void OnGameUpdate(EventArgs args) break; } } - x.SendData(PacketTypes.PlayerBuff, "", x.Index, 0f, 0f, 0f, 0); - x.SetBuff(149, 720);//网住 - x.SetBuff(156, 720);//石化 + + x.SendData(PacketTypes.PlayerBuff, "", x.Index); + x.SetBuff(149, 720); //网住 + x.SetBuff(156, 720); //石化 x.SetBuff(47, 300); //冰冻 x.SetBuff(23, 300); //诅咒 x.SetBuff(31, 300); //困惑 x.SetBuff(80, 300); //灯火管制 x.SetBuff(88, 300); //混沌 - x.SetBuff(120, 300);//臭气 - x.SetBuff(145, 300);//月食 - x.SetBuff(163, 300);//阻塞 - x.SetBuff(199, 300);//创意震撼 - x.SetBuff(160, 300);//眩晕 - x.SetBuff(197, 300);//粘液 + x.SetBuff(120, 300); //臭气 + x.SetBuff(145, 300); //月食 + x.SetBuff(163, 300); //阻塞 + x.SetBuff(199, 300); //创意震撼 + x.SetBuff(160, 300); //眩晕 + x.SetBuff(197, 300); //粘液 if (Timer % 240L == 0) { - x.SendInfoMessage("您已被冻结,详情请询问管理员"); - this.SendText(x, "您已被冻结", Color.Red, x.TPlayer.Center); + x.SendInfoMessage(GetString("您已被冻结,详情请询问管理员")); + this.SendText(x, GetString("您已被冻结"), Color.Red, x.TPlayer.Center); } + x.Teleport(v.pos.X, v.pos.Y); if (Timer > v.clock + 90) { @@ -2466,12 +2549,13 @@ private void OnGameUpdate(EventArgs args) break; } } + if (!flag) { - NetMessage.SendPlayerDeath(x.Index, PlayerDeathReason.ByCustomReason(""), int.MaxValue, new Random().Next(-1, 1), false, -1, -1); + NetMessage.SendPlayerDeath(x.Index, PlayerDeathReason.ByCustomReason(""), int.MaxValue, new Random().Next(-1, 1), false); if (Timer % 240L == 0) { - x.SendInfoMessage("不要耍小聪明"); + x.SendInfoMessage(GetString("不要耍小聪明")); } } } @@ -2483,7 +2567,7 @@ private void OnGameUpdate(EventArgs args) /// - /// 对进入服务器的玩家进行一些限制 + /// 对进入服务器的玩家进行一些限制 /// /// private void OnServerJoin(JoinEventArgs args) @@ -2492,51 +2576,52 @@ private void OnServerJoin(JoinEventArgs args) { return; } + if (config.EnableSpecialNameBan) { var tsplayer = TShock.Players[args.Who]; if (string.IsNullOrWhiteSpace(tsplayer.Name)) { - tsplayer.Kick("请不要起空名字", true); + tsplayer.Kick(GetString("请不要起空名字"), true); } else if (int.TryParse(tsplayer.Name, out var num) || double.TryParse(tsplayer.Name, out var num2)) { - tsplayer.Kick("请不要起纯数字名字", true); + tsplayer.Kick(GetString("请不要起纯数字名字"), true); } else if ((tsplayer.Name[0] >= ' ' && tsplayer.Name[0] <= '/') || (tsplayer.Name[0] >= ':' && tsplayer.Name[0] <= '@') || (tsplayer.Name[0] > '[' && tsplayer.Name[0] <= '`') || (tsplayer.Name[0] >= '{' && tsplayer.Name[0] <= '~')) { - tsplayer.Kick("请不要在名字中使用特殊符号", true); + tsplayer.Kick(GetString("请不要在名字中使用特殊符号"), true); } else if (tsplayer.Name.Equals("all", StringComparison.OrdinalIgnoreCase)) { - tsplayer.Kick("你的名字含有指令关键字: all ,请更换", true); + tsplayer.Kick(GetString("你的名字含有指令关键字: all ,请更换"), true); } else if (tsplayer.Name.Equals("time", StringComparison.OrdinalIgnoreCase)) { - tsplayer.Kick("你的名字含有指令关键字: time ,请更换", true); + tsplayer.Kick(GetString("你的名字含有指令关键字: time ,请更换"), true); } else if (tsplayer.Name.Equals("help", StringComparison.OrdinalIgnoreCase)) { - tsplayer.Kick("你的名字含有指令关键字: help ,请更换", true); + tsplayer.Kick(GetString("你的名字含有指令关键字: help ,请更换"), true); } else if (tsplayer.Name.Equals("me", StringComparison.OrdinalIgnoreCase)) { - tsplayer.Kick("你的名字含有指令关键字: me ,请更换", true); + tsplayer.Kick(GetString("你的名字含有指令关键字: me ,请更换"), true); } else if (tsplayer.Name.Equals("uuid", StringComparison.OrdinalIgnoreCase)) { - tsplayer.Kick("你的名字含有指令关键字: uuid ,请更换", true); + tsplayer.Kick(GetString("你的名字含有指令关键字: uuid ,请更换"), true); } else if (tsplayer.Name.Equals("ip", StringComparison.OrdinalIgnoreCase)) { - tsplayer.Kick("你的名字含有指令关键字: ip ,请更换", true); + tsplayer.Kick(GetString("你的名字含有指令关键字: ip ,请更换"), true); } } } /// - /// 对离开服务区的玩家的额外数据库,进行保存 + /// 对离开服务区的玩家的额外数据库,进行保存 /// /// private void OnServerLeave(LeaveEventArgs args) @@ -2545,6 +2630,7 @@ private void OnServerLeave(LeaveEventArgs args) { return; } + //清理掉这个离开服务器的玩家的额外数据内存 foreach (var v in edPlayers) { @@ -2555,6 +2641,7 @@ private void OnServerLeave(LeaveEventArgs args) break; } } + //顺便遍历下整个edplayers,移除所有和tsplayers不同步的元素,免得越堆越多 for (var i = 0; i < edPlayers.Count; i++) { @@ -2563,9 +2650,11 @@ private void OnServerLeave(LeaveEventArgs args) { if (p != null && p.IsLoggedIn && (p.Name == edPlayers[i].Name || p.Account.ID == edPlayers[i].Account)) { - flag = true; break; + flag = true; + break; } } + if (!flag) { ZPExtraDB.WriteExtraDB(edPlayers[i]); @@ -2577,19 +2666,20 @@ private void OnServerLeave(LeaveEventArgs args) /// - /// 对提示隐藏的指令 + /// 对提示隐藏的指令 /// /// private void HideTips(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示"); + args.Player.SendInfoMessage(GetString("输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示")); return; } + if (!args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("对象不正确,请检查您的状态,您是否为游戏内玩家?"); + args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; } @@ -2600,7 +2690,7 @@ private void HideTips(CommandArgs args) if (x.Name == args.Player.Name) { x.hideKillTips = !x.hideKillTips; - args.Player.SendMessage($"修改成功,您现在已{(x.hideKillTips ? "隐藏" : "启用")}击杀数提示", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"修改成功,您现在已{(x.hideKillTips ? GetString("隐藏") : GetString("启用"))}击杀数提示"), new Color(0, 255, 0)); } }); } @@ -2611,36 +2701,37 @@ private void HideTips(CommandArgs args) if (x.Name == args.Player.Name) { x.hidePointTips = !x.hidePointTips; - args.Player.SendMessage($"修改成功,您现在已{(x.hidePointTips ? "隐藏" : "启用")}点数提示", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"修改成功,您现在已{(x.hidePointTips ? GetString("隐藏") : GetString("启用"))}点数提示"), new Color(0, 255, 0)); } }); } else if (!config.EnableNpcKillTracking && args.Parameters[0].Equals("kill", StringComparison.OrdinalIgnoreCase)) { - args.Player.SendInfoMessage("未启用击杀NPC统计,该功能不可用"); + args.Player.SendInfoMessage(GetString("未启用击杀NPC统计,该功能不可用")); } else if (!config.EnablePointTracking && args.Parameters[0].Equals("point", StringComparison.OrdinalIgnoreCase)) { - args.Player.SendInfoMessage("未启用点数统计,该功能不可用"); + args.Player.SendInfoMessage(GetString("未启用点数统计,该功能不可用")); } else { - args.Player.SendInfoMessage("输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示"); + args.Player.SendInfoMessage(GetString("输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示")); } } /// - /// 导出这个玩家的人物存档 + /// 导出这个玩家的人物存档 /// /// private void ZhiExportPlayer(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zout 来导出该玩家的人物存档\n输入 /zout all 来导出所有人物的存档"); + args.Player.SendInfoMessage(GetString("输入 /zout 来导出该玩家的人物存档\n输入 /zout all 来导出所有人物的存档")); return; } + //对每个导出的文件夹做时间名称后缀 this.now = "_" + this.FormatFileName(DateTime.Now.ToString()); if (args.Parameters[0].Equals("all", StringComparison.OrdinalIgnoreCase)) @@ -2657,8 +2748,9 @@ private void ZhiExportPlayer(CommandArgs args) players.Add(user, TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), num)); } } - args.Player.SendMessage("预计导出所有用户存档数目:" + players.Count, new Color(100, 233, 255)); - TShock.Log.Info("预计导出所有用户存档数目:" + players.Count.ToString()); + + args.Player.SendMessage(GetString("预计导出所有用户存档数目:") + players.Count, new Color(100, 233, 255)); + TShock.Log.Info(GetString("预计导出所有用户存档数目:") + players.Count); if (players.Count < 1) { return; @@ -2674,29 +2766,32 @@ private void ZhiExportPlayer(CommandArgs args) { if (args.Player.IsLoggedIn) { - args.Player.SendMessage($"用户 [{player!.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player!.name}.plr", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"用户 [{player!.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player!.name}.plr"), new Color(0, 255, 0)); } else { - sb.AppendLine($"用户 [{player!.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player!.name}.plr"); + sb.AppendLine(GetString($"用户 [{player!.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player!.name}.plr")); } - TShock.Log.Info($"用户 [{player!.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player!.name}.plr"); + + TShock.Log.Info(GetString($"用户 [{player!.name}] 已导出,目录:tshock/Zhipm/{worldName + this.now}/{player!.name}.plr")); } else { if (args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("用户 [" + one.Key + "] 因数据错误导出失败"); + args.Player.SendInfoMessage(GetString($"用户 [{one.Key}] 因数据错误导出失败")); } else { - sb.AppendLine($"用户 [{one.Key.Name}] 因数据错误导出失败"); + sb.AppendLine(GetString($"用户 [{one.Key.Name}] 因数据错误导出失败")); } + failedcount++; - TShock.Log.Info($"用户 [{one.Key.Name}] 因数据错误导出失败"); + TShock.Log.Info(GetString($"用户 [{one.Key.Name}] 因数据错误导出失败")); } } - sb.AppendLine($"{failedcount} 名用户因数据错误导出失败"); + + sb.AppendLine(GetString($"{failedcount} 名用户因数据错误导出失败")); //压缩打包 var sourcePath = $"{TShock.SavePath}/Zhipm/{worldName + this.now}"; var destPath = $"{TShock.SavePath}/Zhipm/{worldName + this.now}.zip"; @@ -2707,58 +2802,57 @@ private void ZhiExportPlayer(CommandArgs args) ZipFile.CreateFromDirectory(sourcePath, destPath, CompressionLevel.SmallestSize, false); Directory.Delete(sourcePath, true); - sb.AppendLine($"已打包为{TShock.SavePath}/Zhipm/{worldName + this.now}.zip"); + sb.AppendLine(GetString($"已打包为{TShock.SavePath}/Zhipm/{worldName + this.now}.zip")); if (!args.Player.IsLoggedIn) { args.Player.SendInfoMessage(sb.ToString()); } else { - args.Player.SendSuccessMessage($"{failedcount} 名用户因数据残缺导出失败\n已全部打包为{TShock.SavePath}/Zhipm/{worldName + this.now}.zip"); + args.Player.SendSuccessMessage(GetString($"{failedcount} 名用户因数据残缺导出失败\n已全部打包为{TShock.SavePath}/Zhipm/{worldName + this.now}.zip")); } } catch (Exception ex) { - TShock.Log.Error("错误 ZhiExportPlayer :" + ex.ToString()); - args.Player.SendErrorMessage("错误 ZhiExportPlayer :" + ex.ToString()); - Console.WriteLine("错误 ZhiExportPlayer :" + ex.ToString()); + TShock.Log.ConsoleInfo(GetString("错误 ZhiExportPlayer :") + ex); } + return; } + //只导出一人或搜到的多人 var list = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); - if (list.Count == 0)//查不到,开始模糊搜索 + if (list.Count == 0) //查不到,开始模糊搜索 { args.Player.SendInfoMessage(this.offlineplayer); var users = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[0], true); - if (users.Count == 1 || users.Count > 1 && users.Exists(x => x.Name == args.Parameters[0])) + if (users.Count == 1 || (users.Count > 1 && users.Exists(x => x.Name == args.Parameters[0]))) { if (users.Count > 1) { users[0] = users.Find(x => x.Name == args.Parameters[0]); } + var playerData = TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), users[0].ID); var player = this.CreateAPlayer(args.Parameters[0], playerData); if (this.ExportPlayer(player, ZPExtraDB.getPlayerExtraDBTime(users[0].ID))) { - args.Player.SendMessage($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{args.Parameters[0]}.plr", new Color(0, 255, 0)); - TShock.Log.Info($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{args.Parameters[0]}.plr"); + args.Player.SendMessage(GetString($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{args.Parameters[0]}.plr"), new Color(0, 255, 0)); + TShock.Log.Info(GetString($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{args.Parameters[0]}.plr")); } else { - args.Player.SendErrorMessage("导出失败,因数据错误"); - TShock.Log.Info("导出失败,因数据错误"); + args.Player.SendErrorMessage(GetString("导出失败,因数据错误")); + TShock.Log.Info(GetString("导出失败,因数据错误")); } } else if (users.Count == 0) { args.Player.SendInfoMessage(this.noplayer); - return; } else if (users.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); - return; } } else if (list.Count > 1) @@ -2767,78 +2861,90 @@ private void ZhiExportPlayer(CommandArgs args) } else if (this.ExportPlayer(list[0].TPlayer, ZPExtraDB.getPlayerExtraDBTime(list[0].Account.ID))) { - args.Player.SendMessage($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{list[0].Name}.plr", new Color(0, 255, 0)); - TShock.Log.Info($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{list[0].Name}.plr"); + args.Player.SendMessage(GetString($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{list[0].Name}.plr"), new Color(0, 255, 0)); + TShock.Log.Info(GetString($"导出成功!目录:tshock/Zhipm/{Main.worldName + this.now}/{list[0].Name}.plr")); } else { - args.Player.SendErrorMessage("导出失败,因输入错误"); - TShock.Log.Info("导出失败,因输入错误"); + args.Player.SendErrorMessage(GetString("导出失败,因输入错误")); + TShock.Log.Info(GetString("导出失败,因输入错误")); } } /// - /// 对玩家在线时常进行排序 + /// 对玩家在线时常进行排序 /// /// private void ZhiSortPlayer(CommandArgs args) { if (args.Parameters.Count != 1 && args.Parameters.Count != 2) { - args.Player.SendInfoMessage("输入 /zsort help 来查看排序系列指令帮助"); + args.Player.SendInfoMessage(GetString("输入 /zsort help 来查看排序系列指令帮助")); return; } + //帮助指令 if (args.Parameters[0].Equals("help", StringComparison.OrdinalIgnoreCase)) { - var temp1 = config.EnableOnlineTimeTracking ? ("输入 /zsort time 来查看人物在线时间排行榜前十名\n" + - "输入 /zsort time [num] 来查看当前[num]个人物在线时间排行榜\n" + - "输入 /zsort time all 来查看所有玩家在线时常排行榜\n") : ""; - var temp2 = config.EnableNpcKillTracking ? ("\n输入 /zsort kill [num] 来查看当前[num]个人物击杀生物数排行榜\n" + - "输入 /zsort kill 来查看人物击杀生物数排行榜前十名\n" + - "输入 /zsort kill all 来查看所有玩家击杀生物数排行榜\n" + - "输入 /zsort boss [num] 来查看当前[num]个人物击杀Boss总数排行榜\n" + - "输入 /zsort boss 来查看人物击杀Boss总数排行榜前十名\n" + - "输入 /zsort boss all 来查看所有玩家击杀Boss总数排行榜\n" + - "输入 /zsort rarenpc [num] 来查看当前[num]个人物击杀罕见生物总数排行榜\n" + - "输入 /zsort rarenpc 来查看人物击杀罕见生物总数排行榜前十名\n" + - "输入 /zsort rarenpc all 来查看所有玩家击杀罕见生物总数排行榜") : ""; - var temp3 = config.EnablePointTracking ? ("\n输入 /zsort point [num] 来查看当前[num]个人物点数排行榜\n" + - "输入 /zsort point 来查看人物点数排行榜前十名\n" + - "输入 /zsort point all 来查看所有玩家点数排行榜") : ""; - var temp4 = config.EnableDeathCountTracking ? ("\n输入 /zsort death [num] 来查看当前[num]个人物死亡次数排行榜\n" + - "输入 /zsort death 来查看人物死亡次数排行榜前十名\n" + - "输入 /zsort death all 来查看所有玩家死亡次数排行榜") : ""; - var temp5 = config.EnableDeathCountTracking && config.EnableOnlineTimeTracking ? - ("\n输入 /zsort clumsy 来查看人物手残排行榜前十名\n" + - "输入 /zsort clumsy [num] 来查看当前[num]个人物手残排行榜\n" + - "输入 /zsort clumsy all 来查看所有玩家手残排行榜") : ""; + var temp1 = config.EnableOnlineTimeTracking + ? GetString("输入 /zsort time 来查看人物在线时间排行榜前十名\n") + + GetString("输入 /zsort time [num] 来查看当前[num]个人物在线时间排行榜\n") + + GetString("输入 /zsort time all 来查看所有玩家在线时常排行榜\n") + : ""; + var temp2 = config.EnableNpcKillTracking + ? GetString("\n输入 /zsort kill [num] 来查看当前[num]个人物击杀生物数排行榜\n") + + GetString("输入 /zsort kill 来查看人物击杀生物数排行榜前十名\n") + + GetString("输入 /zsort kill all 来查看所有玩家击杀生物数排行榜\n" )+ + GetString("输入 /zsort boss [num] 来查看当前[num]个人物击杀Boss总数排行榜\n" )+ + GetString("输入 /zsort boss 来查看人物击杀Boss总数排行榜前十名\n") + + GetString("输入 /zsort boss all 来查看所有玩家击杀Boss总数排行榜\n") + + GetString("输入 /zsort rarenpc [num] 来查看当前[num]个人物击杀罕见生物总数排行榜\n") + + GetString("输入 /zsort rarenpc 来查看人物击杀罕见生物总数排行榜前十名\n") + + GetString("输入 /zsort rarenpc all 来查看所有玩家击杀罕见生物总数排行榜") + : ""; + var temp3 = config.EnablePointTracking + ? GetString("\n输入 /zsort point [num] 来查看当前[num]个人物点数排行榜\n") + + GetString("输入 /zsort point 来查看人物点数排行榜前十名\n") + + GetString("输入 /zsort point all 来查看所有玩家点数排行榜") + : ""; + var temp4 = config.EnableDeathCountTracking + ? GetString("\n输入 /zsort death [num] 来查看当前[num]个人物死亡次数排行榜\n") + + GetString("输入 /zsort death 来查看人物死亡次数排行榜前十名\n") + + GetString("输入 /zsort death all 来查看所有玩家死亡次数排行榜") + : ""; + var temp5 = config.EnableDeathCountTracking && config.EnableOnlineTimeTracking + ? GetString("\n输入 /zsort clumsy 来查看人物手残排行榜前十名\n") + + GetString("输入 /zsort clumsy [num] 来查看当前[num]个人物手残排行榜\n") + + GetString("输入 /zsort clumsy all 来查看所有玩家手残排行榜") + : ""; args.Player.SendMessage( temp1 + - "输入 /zsort coin 来查看人物硬币数目排行榜前十名\n" + - "输入 /zsort coin [num] 来查看当前[num]个人物硬币数目排行榜\n" + - "输入 /zsort coin all 来查看所有玩家硬币数目排行榜\n" + - "输入 /zsort fish 来查看人物任务鱼数目排行榜前十名\n" + - "输入 /zsort fish [num] 来查看当前[num]个人物任务鱼数目排行榜\n" + - "输入 /zsort fish all 来查看所有玩家任务鱼数目排行榜" + - temp4 + temp2 + temp3 + temp5 + GetString("输入 /zsort coin 来查看人物硬币数目排行榜前十名\n") + + GetString("输入 /zsort coin [num] 来查看当前[num]个人物硬币数目排行榜\n") + + GetString("输入 /zsort coin all 来查看所有玩家硬币数目排行榜\n") + + GetString("输入 /zsort fish 来查看人物任务鱼数目排行榜前十名\n") + + GetString("输入 /zsort fish [num] 来查看当前[num]个人物任务鱼数目排行榜\n") + + GetString("输入 /zsort fish all 来查看所有玩家任务鱼数目排行榜") + + temp4 + temp2 + temp3 + temp5 , TextColor()); return; } //时间排序 - else if (config.EnableOnlineTimeTracking && args.Parameters[0].Equals("time", StringComparison.OrdinalIgnoreCase)) + + if (config.EnableOnlineTimeTracking && args.Parameters[0].Equals("time", StringComparison.OrdinalIgnoreCase)) { // time 排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(ExtraDataDate.time, false); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); } else if (args.Parameters.Count == 1) { @@ -2847,11 +2953,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 在线时长 {this.timetostring(list[i].time)}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 在线时长 {this.timetostring(list[i].time)}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -2861,19 +2969,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 在线时长 {this.timetostring(list[i].time)}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 在线时长 {this.timetostring(list[i].time)}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -2882,14 +2993,15 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 在线时长 {this.timetostring(list[i].time)}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 在线时长 {this.timetostring(list[i].time)}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort time [num] 来查看当前[num]个人物在线时间排行榜\n输入 /zsort time 来查看人物在线时间排行榜前十名\n输入 /zsort time all 来查看所有玩家在线时常排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort time [num] 来查看当前[num]个人物在线时间排行榜\n输入 /zsort time 来查看人物在线时间排行榜前十名\n输入 /zsort time all 来查看所有玩家在线时常排行榜")); } } } @@ -2905,11 +3017,13 @@ private void ZhiSortPlayer(CommandArgs args) list.Add(TShock.UserAccounts.GetUserAccountByID(num)); } } + if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + list.Sort((p1, p2) => this.getPlayerCoin(p2.Name).CompareTo(this.getPlayerCoin(p1.Name))); if (args.Parameters.Count == 1) { @@ -2918,18 +3032,20 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { if (args.Player.IsLoggedIn) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name))}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name))}")); } else { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name), 1)}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name), 1)}")); } } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -2939,26 +3055,29 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { if (args.Player.IsLoggedIn) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name))}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name))}")); } else { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name), 1)}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name), 1)}")); } } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -2969,19 +3088,20 @@ private void ZhiSortPlayer(CommandArgs args) { if (args.Player.IsLoggedIn) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name))}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name))}")); } else { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name), 1)}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总硬币数 {this.cointostring(this.getPlayerCoin(list[i].Name), 1)}")); } } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort coin 来查看人物硬币数目排行榜前十名\n输入 /zsort coin [num] 来查看当前[num]个人物硬币数目排行榜\n输入 /zsort coin all 来查看所有玩家硬币数目排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort coin 来查看人物硬币数目排行榜前十名\n输入 /zsort coin [num] 来查看当前[num]个人物硬币数目排行榜\n输入 /zsort coin all 来查看所有玩家硬币数目排行榜")); } } } @@ -2997,11 +3117,13 @@ private void ZhiSortPlayer(CommandArgs args) list.Add(TShock.UserAccounts.GetUserAccountByID(num)); } } + if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + if (args.Parameters.Count == 1) { var num = 10; @@ -3009,11 +3131,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总完成任务鱼数 {TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), list[i].ID).questsCompleted}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总完成任务鱼数 {TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), list[i].ID).questsCompleted}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3023,19 +3147,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总完成任务鱼数 {TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), list[i].ID).questsCompleted}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总完成任务鱼数 {TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), list[i].ID).questsCompleted}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3044,28 +3171,31 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 总完成任务鱼数 {TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), list[i].ID).questsCompleted}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 总完成任务鱼数 {TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), list[i].ID).questsCompleted}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort fish 来查看人物任务鱼数目排行榜前十名\n输入 /zsort fish [num] 来查看当前[num]个人物任务鱼数目排行榜\n输入 /zsort fish all 来查看所有玩家任务鱼数目排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort fish 来查看人物任务鱼数目排行榜前十名\n输入 /zsort fish [num] 来查看当前[num]个人物任务鱼数目排行榜\n输入 /zsort fish all 来查看所有玩家任务鱼数目排行榜")); } } } //斩杀数排序 else if (config.EnableNpcKillTracking && args.Parameters[0].Equals("kill", StringComparison.OrdinalIgnoreCase)) - { //排序前先保存 + { + //排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(ExtraDataDate.killNPCnum, false); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); } else if (args.Parameters.Count == 1) { @@ -3074,11 +3204,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀生物总数 {list[i].killNPCnum} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀生物总数 {list[i].killNPCnum} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3088,19 +3220,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀生物总数 {list[i].killNPCnum} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀生物总数 {list[i].killNPCnum} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3109,30 +3244,34 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀生物总数 {list[i].killNPCnum} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀生物总数 {list[i].killNPCnum} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort kill [num] 来查看当前[num]个人物击杀生物数排行榜\n输入 /zsort kill 来查看人物击杀生物数排行榜前十名\n输入 /zsort kill all 来查看所有玩家击杀生物数排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort kill [num] 来查看当前[num]个人物击杀生物数排行榜\n输入 /zsort kill 来查看人物击杀生物数排行榜前十名\n输入 /zsort kill all 来查看所有玩家击杀生物数排行榜")); } } } //斩杀Boss排序 else if (config.EnableNpcKillTracking && args.Parameters[0].Equals("boss", StringComparison.OrdinalIgnoreCase)) - { //排序前先保存 + { + //排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + list.Sort((p1, p2) => this.getKillNumFromDictionary(p2.killBossID).CompareTo(this.getKillNumFromDictionary(p1.killBossID))); if (args.Parameters.Count == 1) { @@ -3141,11 +3280,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀Boss总数 {this.getKillNumFromDictionary(list[i].killBossID)} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀Boss总数 {this.getKillNumFromDictionary(list[i].killBossID)} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3155,19 +3296,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀Boss总数 {this.getKillNumFromDictionary(list[i].killBossID)} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀Boss总数 {this.getKillNumFromDictionary(list[i].killBossID)} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3176,30 +3320,34 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀Boss总数 {this.getKillNumFromDictionary(list[i].killBossID)} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀Boss总数 {this.getKillNumFromDictionary(list[i].killBossID)} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort boss [num] 来查看当前[num]个人物击杀Boss总数排行榜\n输入 /zsort boss 来查看人物击杀Boss总数排行榜前十名\n输入 /zsort boss all 来查看所有玩家击杀Boss总数排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort boss [num] 来查看当前[num]个人物击杀Boss总数排行榜\n输入 /zsort boss 来查看人物击杀Boss总数排行榜前十名\n输入 /zsort boss all 来查看所有玩家击杀Boss总数排行榜")); } } } //斩杀罕见生物排序 else if (config.EnableNpcKillTracking && args.Parameters[0].Equals("rarenpc", StringComparison.OrdinalIgnoreCase)) - { //排序前先保存 + { + //排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + list.Sort((p1, p2) => this.getKillNumFromDictionary(p2.killRareNPCID).CompareTo(this.getKillNumFromDictionary(p1.killRareNPCID))); if (args.Parameters.Count == 1) { @@ -3208,11 +3356,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀罕见生物总数 {this.getKillNumFromDictionary(list[i].killRareNPCID)} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀罕见生物总数 {this.getKillNumFromDictionary(list[i].killRareNPCID)} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3222,19 +3372,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString("当前最多 " + list.Count + " 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀罕见生物总数 {this.getKillNumFromDictionary(list[i].killRareNPCID)} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀罕见生物总数 {this.getKillNumFromDictionary(list[i].killRareNPCID)} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3243,30 +3396,34 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 击杀罕见生物总数 {this.getKillNumFromDictionary(list[i].killRareNPCID)} 个"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 击杀罕见生物总数 {this.getKillNumFromDictionary(list[i].killRareNPCID)} 个")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort rarenpc [num] 来查看当前[num]个人物击杀罕见生物总数排行榜\n输入 /zsort rarenpc 来查看人物击杀罕见生物总数排行榜前十名\n输入 /zsort rarenpc all 来查看所有玩家击杀罕见生物总数排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort rarenpc [num] 来查看当前[num]个人物击杀罕见生物总数排行榜\n输入 /zsort rarenpc 来查看人物击杀罕见生物总数排行榜前十名\n输入 /zsort rarenpc all 来查看所有玩家击杀罕见生物总数排行榜")); } } } //点数排行 else if (config.EnablePointTracking && args.Parameters[0].Equals("point", StringComparison.OrdinalIgnoreCase)) - { //排序前先保存 + { + //排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(ExtraDataDate.point, false); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + if (args.Parameters.Count == 1) { var num = 10; @@ -3274,11 +3431,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 点数 {list[i].point} "); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 点数 {list[i].point} ")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3288,19 +3447,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 点数 {list[i].point}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 点数 {list[i].point}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3309,30 +3471,34 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 点数 {list[i].point}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 点数 {list[i].point}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort point [num] 来查看当前[num]个人物点数排行榜\n输入 /zsort point 来查看人物点数排行榜前十名\n输入 /zsort point all 来查看所有玩家点数排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort point [num] 来查看当前[num]个人物点数排行榜\n输入 /zsort point 来查看人物点数排行榜前十名\n输入 /zsort point all 来查看所有玩家点数排行榜")); } } } //死亡次数排行 else if (config.EnableDeathCountTracking && args.Parameters[0].Equals("death", StringComparison.OrdinalIgnoreCase)) - {//排序前先保存 + { + //排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(ExtraDataDate.deathCount, false); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + if (args.Parameters.Count == 1) { var num = 10; @@ -3340,11 +3506,13 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 死亡次数 {list[i].deathCount} "); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 死亡次数 {list[i].deathCount} ")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3354,19 +3522,22 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 死亡次数 {list[i].deathCount}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 死亡次数 {list[i].deathCount}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3375,30 +3546,34 @@ private void ZhiSortPlayer(CommandArgs args) var sb = new StringBuilder(); for (var i = 0; i < list.Count; i++) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 死亡次数 {list[i].deathCount}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 死亡次数 {list[i].deathCount}")); } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort death [num] 来查看当前[num]个人物死亡次数排行榜\n输入 /zsort death 来查看人物死亡次数排行榜前十名\n输入 /zsort death all 来查看所有玩家死亡次数排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort death [num] 来查看当前[num]个人物死亡次数排行榜\n输入 /zsort death 来查看人物死亡次数排行榜前十名\n输入 /zsort death all 来查看所有玩家死亡次数排行榜")); } } } //菜鸡榜 else if (config.EnableDeathCountTracking && config.EnableOnlineTimeTracking && args.Parameters[0].Equals("clumsy", StringComparison.OrdinalIgnoreCase)) - {//排序前先保存 + { + //排序前先保存 foreach (var ex in edPlayers) { ZPExtraDB.WriteExtraDB(ex); } + var list = ZPExtraDB.ListAllExtraDB(); if (list.Count == 0) { - args.Player.SendInfoMessage("没有任何数据"); + args.Player.SendInfoMessage(GetString("没有任何数据")); return; } + list.Sort((p1, p2) => { double k1 = 0.0, k2 = 0.0; @@ -3406,10 +3581,12 @@ private void ZhiSortPlayer(CommandArgs args) { k1 = p1.deathCount * 100.0 / p1.time; } + if (p2.time > 0L) { k2 = p2.deathCount * 100.0 / p2.time; } + return k2.CompareTo(k1); }); if (args.Parameters.Count == 1) @@ -3419,18 +3596,20 @@ private void ZhiSortPlayer(CommandArgs args) { num = list.Count; } + var sb = new StringBuilder(); for (var i = 0; i < num; i++) { if (args.Player.IsLoggedIn) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } else { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3440,26 +3619,29 @@ private void ZhiSortPlayer(CommandArgs args) { if (count <= 0) { - args.Player.SendInfoMessage("数字无效"); + args.Player.SendInfoMessage(GetString("数字无效")); return; } + var sb = new StringBuilder(); if (count > list.Count) { - sb.AppendLine("当前最多 " + list.Count + " 人"); + sb.AppendLine(GetString($"当前最多 {list.Count} 人")); count = list.Count; } + for (var i = 0; i < count; i++) { if (args.Player.IsLoggedIn) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } else { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } @@ -3470,52 +3652,55 @@ private void ZhiSortPlayer(CommandArgs args) { if (args.Player.IsLoggedIn) { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } else { - sb.AppendLine($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}"); + sb.AppendLine(GetString($"第 {i + 1} 名:【{list[i].Name}】 菜鸡值 {list[i].deathCount * 1000.0 / list[i].time:0.00}")); } } + args.Player.SendMessage(sb.ToString(), TextColor()); TShock.Log.Info(sb.ToString()); } else { - args.Player.SendInfoMessage("输入 /zsort clumsy 来查看人物手残排行榜前十名\n输入 /zsort clumsy [num] 来查看当前[num]个人物手残排行榜\n输入 /zsort clumsy all 来查看所有玩家手残排行榜"); + args.Player.SendInfoMessage(GetString("输入 /zsort clumsy 来查看人物手残排行榜前十名\n输入 /zsort clumsy [num] 来查看当前[num]个人物手残排行榜\n输入 /zsort clumsy all 来查看所有玩家手残排行榜")); } } } else { - args.Player.SendInfoMessage("输入 /zsort help 来查看排序系列指令帮助"); + args.Player.SendInfoMessage(GetString("输入 /zsort help 来查看排序系列指令帮助")); } } /// - /// 办掉离线或在线的玩家,超级ban指令 + /// 办掉离线或在线的玩家,超级ban指令 /// /// private void SuperBan(CommandArgs args) { if (args.Parameters.Count < 2) { - args.Player.SendInfoMessage("输入 /zban add [reason] 来封禁无论是否在线的玩家,reason 可不填\n" + - "输入 /zban add uuid [reason] 来封禁uuid\n" + - "输入 /zban add ip [reason] 来封禁ip"); + args.Player.SendInfoMessage(GetString("输入 /zban add [reason] 来封禁无论是否在线的玩家,reason 可不填\n") + + GetString("输入 /zban add uuid [reason] 来封禁uuid\n") + + GetString("输入 /zban add ip [reason] 来封禁ip")); return; } + if (args.Parameters[0].Equals("add", StringComparison.OrdinalIgnoreCase)) { if (args.Parameters[1].Equals("uuid", StringComparison.OrdinalIgnoreCase)) { if (args.Parameters.Count < 3 || string.IsNullOrWhiteSpace(args.Parameters[2])) { - args.Player.SendInfoMessage("参数过少"); + args.Player.SendInfoMessage(GetString("参数过少")); return; } - var reason = args.Parameters.Count == 4 ? args.Parameters[3] : "检测到违规行为,请联系管理员"; + + var reason = args.Parameters.Count == 4 ? args.Parameters[3] : GetString("检测到违规行为,请联系管理员"); TSPlayer? suspect = null; foreach (var v in TShock.Players) { @@ -3525,26 +3710,28 @@ private void SuperBan(CommandArgs args) break; } } + if (suspect != null && suspect.Ban(reason, "ZHIPlayerManager by " + args.Player.Name)) { - args.Player.SendMessage($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁", broadcastColor); - TShock.Log.Info($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁"); + args.Player.SendMessage(GetString($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁"), broadcastColor); + TShock.Log.Info(GetString($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁")); } else { TShock.Bans.InsertBan("uuid:" + args.Parameters[2], reason, "ZHIPlayerManager by " + args.Player.Name, DateTime.UtcNow, DateTime.MaxValue); - TSPlayer.All.SendMessage($"uuid: {args.Parameters[2]} 已被 {args.Player.Name} 封禁", broadcastColor); - TShock.Log.Info($"uuid: {args.Parameters[2]} 已被 {args.Player.Name} 封禁"); + TSPlayer.All.SendMessage(GetString($"uuid: {args.Parameters[2]} 已被 {args.Player.Name} 封禁"), broadcastColor); + TShock.Log.Info(GetString($"uuid: {args.Parameters[2]} 已被 {args.Player.Name} 封禁")); } } else if (args.Parameters[1].Equals("ip", StringComparison.OrdinalIgnoreCase)) { if (args.Parameters.Count < 3 || string.IsNullOrWhiteSpace(args.Parameters[2])) { - args.Player.SendInfoMessage("参数过少"); + args.Player.SendInfoMessage(GetString("参数过少")); return; } - var reason = args.Parameters.Count == 4 ? args.Parameters[3] : "检测到违规行为,请联系管理员"; + + var reason = args.Parameters.Count == 4 ? args.Parameters[3] : GetString("检测到违规行为,请联系管理员"); TSPlayer? suspect = null; foreach (var v in TShock.Players) { @@ -3554,19 +3741,20 @@ private void SuperBan(CommandArgs args) break; } } + if (suspect != null && suspect.Ban(reason, "ZHIPlayerManager by " + args.Player.Name)) { - args.Player.SendMessage($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁", broadcastColor); - TShock.Log.Info($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁"); + args.Player.SendMessage(GetString($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁"), broadcastColor); + TShock.Log.Info(GetString($"用户 {suspect.Name} 已被 {args.Player.Name} 封禁")); } else { TShock.Bans.InsertBan("ip:" + args.Parameters[2], reason, "ZHIPlayerManager by " + args.Player.Name, DateTime.UtcNow, DateTime.MaxValue); - TSPlayer.All.SendMessage($"ip: {args.Parameters[2]} 已被 {args.Player.Name} 封禁", broadcastColor); - TShock.Log.Info($"ip: {args.Parameters[2]} 已被 {args.Player.Name} 封禁"); + TSPlayer.All.SendMessage(GetString($"ip: {args.Parameters[2]} 已被 {args.Player.Name} 封禁"), broadcastColor); + TShock.Log.Info(GetString($"ip: {args.Parameters[2]} 已被 {args.Player.Name} 封禁")); } } - else//正常封禁玩家 + else //正常封禁玩家 { var list = this.BestFindPlayerByNameOrIndex(args.Parameters[1]); //封禁原因,可不填 @@ -3575,13 +3763,14 @@ private void SuperBan(CommandArgs args) { if (list[0].Ban(reason, "ZHIPlayerManager by " + args.Player.Name)) { - args.Player.SendMessage($"用户 {list[0].Name} 已被 {args.Player.Name} 封禁", broadcastColor); - TShock.Log.Info($"用户 {list[0].Name} 已被 {args.Player.Name} 封禁"); + args.Player.SendMessage(GetString($"用户 {list[0].Name} 已被 {args.Player.Name} 封禁"), broadcastColor); + TShock.Log.Info(GetString($"用户 {list[0].Name} 已被 {args.Player.Name} 封禁")); } else - { //实际上这个情况永远不会发生,因为Ban方法的返回值就没返回false过 - args.Player.SendInfoMessage($"用户 {list[0].Name} 封禁失败,可能该玩家已被封禁或所在组被禁止封禁"); - TShock.Log.Info($"用户 {list[0].Name} 封禁失败,可能该玩家已被封禁或所在组被禁止封禁"); + { + //实际上这个情况永远不会发生,因为Ban方法的返回值就没返回false过 + args.Player.SendInfoMessage(GetString($"用户 {list[0].Name} 封禁失败,可能该玩家已被封禁或所在组被禁止封禁")); + TShock.Log.Info(GetString($"用户 {list[0].Name} 封禁失败,可能该玩家已被封禁或所在组被禁止封禁")); } } else if (list.Count > 1) @@ -3595,7 +3784,7 @@ private void SuperBan(CommandArgs args) var user = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]); if (user == null) { - args.Player.SendInfoMessage("精准查找未找到,正在尝试模糊查找"); + args.Player.SendInfoMessage(GetString("精准查找未找到,正在尝试模糊查找")); var users = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[1], true); if (users.Count == 1) { @@ -3603,15 +3792,16 @@ private void SuperBan(CommandArgs args) } else if (users.Count > 1) { - args.Player.SendInfoMessage("人数不唯一,为避免误封,请重新输入。若玩家名称带有空格可用英文引号将名称整个括起来"); + args.Player.SendInfoMessage(GetString("人数不唯一,为避免误封,请重新输入。若玩家名称带有空格可用英文引号将名称整个括起来")); return; } else { - args.Player.SendInfoMessage(this.noplayer + "。若玩家名称带有空格可用英文引号将名称整个括起来"); + args.Player.SendInfoMessage(this.noplayer + GetString("。若玩家名称带有空格可用英文引号将名称整个括起来")); return; } } + if (!string.IsNullOrWhiteSpace(user.Name)) { TShock.Bans.InsertBan("acc:" + user.Name, reason, "ZHIPlayerManager by " + args.Player.Name, DateTime.UtcNow, DateTime.MaxValue); @@ -3633,27 +3823,28 @@ private void SuperBan(CommandArgs args) } } } + if (!args.Player.IsLoggedIn) { - args.Player.SendMessage($"用户 {user.Name} 已被 {args.Player.Name} 封禁", broadcastColor); + args.Player.SendMessage(GetString($"用户 {user.Name} 已被 {args.Player.Name} 封禁"), broadcastColor); } - TSPlayer.All.SendMessage($"用户 {user.Name} 已被 {args.Player.Name} 封禁", broadcastColor); - TShock.Log.Info($"用户 {user.Name} 已被 {args.Player.Name} 封禁"); + TSPlayer.All.SendMessage(GetString($"用户 {user.Name} 已被 {args.Player.Name} 封禁"), broadcastColor); + TShock.Log.Info(GetString($"用户 {user.Name} 已被 {args.Player.Name} 封禁")); } } } else { - args.Player.SendInfoMessage("输入 /zban add [name] [reason] 来封禁无论是否在线的玩家,reason 可不填\n" + - "输入 /zban add uuid [uuid] [reason] 来封禁uuid\n" + - "输入 /zban add ip [ip] [reason] 来封禁ip"); + args.Player.SendInfoMessage(GetString("输入 /zban add [name] [reason] 来封禁无论是否在线的玩家,reason 可不填\n") + + GetString("输入 /zban add uuid [uuid] [reason] 来封禁uuid\n") + + GetString("输入 /zban add ip [ip] [reason] 来封禁ip")); } } /// - /// 冻结该玩家,禁止他做出任何操作 + /// 冻结该玩家,禁止他做出任何操作 /// /// /// @@ -3661,9 +3852,10 @@ private void ZFreeze(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zfre [name] 来冻结该玩家"); + args.Player.SendInfoMessage(GetString("输入 /zfre [name] 来冻结该玩家")); return; } + var ts = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); if (ts.Count == 0) { @@ -3673,39 +3865,37 @@ private void ZFreeze(CommandArgs args) { if (frePlayers.Exists(x => x.name == user.Name && x.uuid == user.UUID && (x.IPs == null ? true : x.IPs.Equals(user.KnownIps)))) { - args.Player.SendMessage($"玩家 [{user.Name}] 已冻结过!", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{user.Name}] 已冻结过!"), new Color(0, 255, 0)); } else { frePlayers.Add(new MessPlayer(user.ID, user.Name, user.UUID, user.KnownIps, Vector2.Zero)); - args.Player.SendMessage($"玩家 [{user.Name}] 冻结成功", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{user.Name}] 冻结成功"), new Color(0, 255, 0)); } } else { - args.Player.SendInfoMessage("精准查找未找到,正在尝试模糊查找"); + args.Player.SendInfoMessage(GetString("精准查找未找到,正在尝试模糊查找")); var users = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[0], true); if (users.Count == 1) { if (frePlayers.Exists(x => x.name == users[0].Name && x.uuid == users[0].UUID && (x.IPs == null ? true : x.IPs.Equals(users[0].KnownIps)))) { - args.Player.SendMessage($"玩家 [{users[0].Name}] 已冻结过!", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{users[0].Name}] 已冻结过!"), new Color(0, 255, 0)); } else { frePlayers.Add(new MessPlayer(users[0].ID, users[0].Name, users[0].UUID, users[0].KnownIps, Vector2.Zero)); - args.Player.SendMessage($"玩家 [{users[0].Name}] 冻结成功", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{users[0].Name}] 冻结成功"), new Color(0, 255, 0)); } } else if (users.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); - return; } else { args.Player.SendInfoMessage(this.noplayer); - return; } } } @@ -3717,20 +3907,20 @@ private void ZFreeze(CommandArgs args) { if (frePlayers.Exists(x => x.name == ts[0].Name && x.uuid == ts[0].UUID && (x.IPs == null ? true : x.IPs.Equals(ts[0].Account.KnownIps)))) { - args.Player.SendMessage($"玩家 [{ts[0].Name}] 已冻结过!", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{ts[0].Name}] 已冻结过!"), new Color(0, 255, 0)); } else { this.clearAllBuffFromPlayer(ts[0]); frePlayers.Add(new MessPlayer(ts[0].Account.ID, ts[0].Name, ts[0].UUID, ts[0].Account.KnownIps, ts[0].TPlayer.Center)); - args.Player.SendMessage($"玩家 [{ts[0].Name}] 冻结成功", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{ts[0].Name}] 冻结成功"), new Color(0, 255, 0)); } } } /// - /// 取消冻结该玩家 + /// 取消冻结该玩家 /// /// /// @@ -3738,9 +3928,10 @@ private void ZUnFreeze(CommandArgs args) { if (args.Parameters.Count != 1) { - args.Player.SendInfoMessage("输入 /zunfre [name] 来解冻该玩家\n输入 /zunfre all 来解冻所有玩家"); + args.Player.SendInfoMessage(GetString("输入 /zunfre [name] 来解冻该玩家\n输入 /zunfre all 来解冻所有玩家")); return; } + if (args.Parameters[0].Equals("all", StringComparison.OrdinalIgnoreCase)) { frePlayers.ForEach(x => @@ -3752,9 +3943,10 @@ private void ZUnFreeze(CommandArgs args) } }); frePlayers.Clear(); - args.Player.SendMessage("所有玩家均已解冻", new Color(0, 255, 0)); + args.Player.SendMessage(GetString("所有玩家均已解冻"), new Color(0, 255, 0)); return; } + var ts = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); if (ts.Count == 0) { @@ -3762,41 +3954,40 @@ private void ZUnFreeze(CommandArgs args) var user = TShock.UserAccounts.GetUserAccountByName(args.Parameters[0]); if (user != null) { - var c = frePlayers.RemoveAll(x => x.uuid == user.UUID || x.name == user.Name || !string.IsNullOrEmpty(x.IPs) && !string.IsNullOrEmpty(user.KnownIps) && this.IPStostringIPs(x.IPs).Any(y => this.IPStostringIPs(user.KnownIps).Contains(y)) || string.IsNullOrEmpty(x.IPs) && string.IsNullOrEmpty(user.KnownIps)); + var c = frePlayers.RemoveAll(x => x.uuid == user.UUID || x.name == user.Name || (!string.IsNullOrEmpty(x.IPs) && !string.IsNullOrEmpty(user.KnownIps) && this.IPStostringIPs(x.IPs).Any(y => this.IPStostringIPs(user.KnownIps).Contains(y))) || (string.IsNullOrEmpty(x.IPs) && string.IsNullOrEmpty(user.KnownIps))); if (c > 0) { - args.Player.SendMessage($"玩家 [{user.Name}] 已解冻", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{user.Name}] 已解冻"), new Color(0, 255, 0)); } else { - args.Player.SendMessage($"玩家 [{user.Name}] 未被冻结!", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{user.Name}] 未被冻结!"), new Color(0, 255, 0)); } } else { - args.Player.SendInfoMessage("精准查找未找到,正在尝试模糊查找"); + args.Player.SendInfoMessage(GetString("精准查找未找到,正在尝试模糊查找")); var users = TShock.UserAccounts.GetUserAccountsByName(args.Parameters[0], true); if (users.Count > 1) { args.Player.SendInfoMessage(this.manyplayer); return; } - else if (users.Count == 0) + + if (users.Count == 0) { args.Player.SendInfoMessage(this.noplayer); return; } + + var c = frePlayers.RemoveAll(x => x.uuid == users[0].UUID || x.name == users[0].Name || (!string.IsNullOrEmpty(x.IPs) && !string.IsNullOrEmpty(users[0].KnownIps) && this.IPStostringIPs(x.IPs).Any(y => this.IPStostringIPs(users[0].KnownIps).Contains(y))) || (string.IsNullOrEmpty(x.IPs) && string.IsNullOrEmpty(users[0].KnownIps))); + if (c > 0) + { + args.Player.SendMessage(GetString($"玩家 [{users[0].Name}] 已解冻"), new Color(0, 255, 0)); + } else { - var c = frePlayers.RemoveAll(x => x.uuid == users[0].UUID || x.name == users[0].Name || !string.IsNullOrEmpty(x.IPs) && !string.IsNullOrEmpty(users[0].KnownIps) && this.IPStostringIPs(x.IPs).Any(y => this.IPStostringIPs(users[0].KnownIps).Contains(y)) || string.IsNullOrEmpty(x.IPs) && string.IsNullOrEmpty(users[0].KnownIps)); - if (c > 0) - { - args.Player.SendMessage($"玩家 [{users[0].Name}] 已解冻", new Color(0, 255, 0)); - } - else - { - args.Player.SendMessage($"玩家 [{users[0].Name}] 未被冻结", new Color(0, 255, 0)); - } + args.Player.SendMessage(GetString($"玩家 [{users[0].Name}] 未被冻结"), new Color(0, 255, 0)); } } } @@ -3806,23 +3997,23 @@ private void ZUnFreeze(CommandArgs args) } else { - var c = frePlayers.RemoveAll(x => x.uuid == ts[0].UUID || x.name == ts[0].Name || !string.IsNullOrEmpty(x.IPs) && !string.IsNullOrEmpty(ts[0].IP) && this.IPStostringIPs(x.IPs).Any(x => ts[0].IP == x)); + var c = frePlayers.RemoveAll(x => x.uuid == ts[0].UUID || x.name == ts[0].Name || (!string.IsNullOrEmpty(x.IPs) && !string.IsNullOrEmpty(ts[0].IP) && this.IPStostringIPs(x.IPs).Any(x => ts[0].IP == x))); if (c > 0) { this.clearAllBuffFromPlayer(ts[0]); - args.Player.SendMessage($"玩家 [{ts[0].Name}] 已解冻", new Color(0, 255, 0)); - ts[0].SendMessage("您已被解冻", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{ts[0].Name}] 已解冻"), new Color(0, 255, 0)); + ts[0].SendMessage(GetString("您已被解冻"), new Color(0, 255, 0)); } else { - args.Player.SendMessage($"玩家 [{ts[0].Name}] 未被冻结", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{ts[0].Name}] 未被冻结"), new Color(0, 255, 0)); } } } /// - /// 击中npc时进行标记 + /// 击中npc时进行标记 /// /// private void OnNpcStrike(NpcStrikeEventArgs args) @@ -3842,29 +4033,26 @@ private void OnNpcStrike(NpcStrikeEventArgs args) //这个生物是否以前被击中过 var strike = strikeNPC.Find(x => x.index == args.Npc.whoAmI && x.id == args.Npc.netID); if (strike != null && strike.name != string.Empty) - { //如果击中过,寻找击中他的玩家是否被记录 + { + //如果击中过,寻找击中他的玩家是否被记录 if (strike.playerAndDamage.ContainsKey(players[0].Account.ID)) - { //已被记录,那么伤害记录加数值 - if (args.Damage <= TShock.Config.Settings.MaxDamage && args.Damage <= TShock.Config.Settings.MaxProjDamage)//不正常的伤害应舍去 + { + //已被记录,那么伤害记录加数值 + if (args.Damage <= TShock.Config.Settings.MaxDamage && args.Damage <= TShock.Config.Settings.MaxProjDamage) //不正常的伤害应舍去 { strike.playerAndDamage[players[0].Account.ID] += args.Damage; strike.AllDamage += args.Damage; } } - else//否则,创建新的 player->damage + else //否则,创建新的 player->damage { strike.playerAndDamage.Add(players[0].Account.ID, args.Damage); strike.AllDamage += args.Damage; } } - else//如果没有击中过,创建新的 npc + else //如果没有击中过,创建新的 npc { - var snpc = new StrikeNPC - { - id = args.Npc.netID, - index = args.Npc.whoAmI, - name = args.Npc.FullName - }; + var snpc = new StrikeNPC { id = args.Npc.netID, index = args.Npc.whoAmI, name = args.Npc.FullName }; if (config.EnablePointTracking) { @@ -3905,12 +4093,13 @@ private void OnNpcStrike(NpcStrikeEventArgs args) -23 or -22 or 173 or 239 or 240 or 181 or 6 or -12 or -11 or 7 or 8 or 9 => args.Npc.value + 200, //毒兔兔等可量产化的生物 464 or 465 or 57 or 47 => 0, - _ => args.Npc.value, + _ => args.Npc.value }; if (!Main.hardMode) { switch (snpc.id) - {//肉前真菌敌怪价格降低 2/3 + { + //肉前真菌敌怪价格降低 2/3 case 254: case 255: case 257: @@ -3920,8 +4109,8 @@ private void OnNpcStrike(NpcStrikeEventArgs args) case 261: case 634: case 635: - snpc.value /= 3; break; - default: break; + snpc.value /= 3; + break; } } @@ -3941,7 +4130,7 @@ private void OnNpcStrike(NpcStrikeEventArgs args) { //世界吞噬者 13 or 14 or 15 or 325 or 327 or 564 or 565 or 576 or 577 or 551 or 344 or 345 or 346 or 517 or 422 or 493 or 507 or 68 => true, - _ => args.Npc.boss, + _ => args.Npc.boss }; snpc.playerAndDamage.Add(players[0].Account.ID, args.Damage); snpc.AllDamage += args.Damage; @@ -3951,7 +4140,7 @@ private void OnNpcStrike(NpcStrikeEventArgs args) /// - /// 杀死npc时计数 + /// 杀死npc时计数 /// /// private void OnNPCKilled(NpcKilledEventArgs args) @@ -3969,7 +4158,8 @@ private void OnNPCKilled(NpcKilledEventArgs args) //毁灭者的处理,这个npc的死亡钩子只记录他的头,所以这里没有写135和136,并且没有放在 for (int i = 0; i < strikeNPC.Count; i++) 里,因为这个boss可能没有被击中过头部 //为什么移到外面,因为用于判断毁灭者死亡条件的头部可能一直不会被击中 if (args.npc.netID == 134) - {//遍历所有被击中过的strikeNPC,记录 135 和 136 的击中情况 + { + //遍历所有被击中过的strikeNPC,记录 135 和 136 的击中情况 foreach (var sss in strikeNPC) { if (sss.id == 134 || sss.id == 135 || sss.id == 136) @@ -3987,11 +4177,13 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + var sum = 0; foreach (var des in this.Destroyer) { sum += des.Value; } + foreach (var x in edPlayers) { if (this.Destroyer.TryGetValue(x.Account, out var value)) @@ -4004,9 +4196,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (2000f * value / sum); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4027,7 +4219,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4035,6 +4227,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { this.SendKillBossMessage(args.npc.FullName, this.Destroyer, sum); @@ -4045,8 +4238,10 @@ private void OnNPCKilled(NpcKilledEventArgs args) return; } //肉山同理,肉山嘴巴 - else if (args.npc.netID == 113) - {//遍历所有被击中过的strikeNPC,记录 113 和 114 的击中情况 + + if (args.npc.netID == 113) + { + //遍历所有被击中过的strikeNPC,记录 113 和 114 的击中情况 foreach (var sss in strikeNPC) { if (sss.id == 113 || sss.id == 114) @@ -4064,11 +4259,13 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + var sum = 0; foreach (var fw in this.FleshWall) { sum += fw.Value; } + foreach (var x in edPlayers) { if (this.FleshWall.TryGetValue(x.Account, out var value)) @@ -4081,9 +4278,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (2000f * value / sum); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4104,7 +4301,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4112,9 +4309,10 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { - this.SendKillBossMessage("血肉墙", this.FleshWall, sum); + this.SendKillBossMessage(GetString("血肉墙"), this.FleshWall, sum); } this.FleshWall.Clear(); @@ -4129,7 +4327,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) { switch (strikeNPC[i].id) { - case 13://世界吞噬者特殊处理,特殊点:可以有多个头,只有最后一个头死亡时计入击杀 + case 13: //世界吞噬者特殊处理,特殊点:可以有多个头,只有最后一个头死亡时计入击杀 case 14: case 15: { @@ -4138,9 +4336,11 @@ private void OnNPCKilled(NpcKilledEventArgs args) { if (n.whoAmI != args.npc.whoAmI && (n.type == 13 || n.type == 14 || n.type == 15) && n.active) { - flag = false; break;//如果boss被杀死,设为true + flag = false; + break; //如果boss被杀死,设为true } } + foreach (var ss in strikeNPC[i].playerAndDamage) { if (this.Eaterworld.ContainsKey(ss.Key)) @@ -4152,6 +4352,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.Eaterworld.Add(ss.Key, ss.Value); } } + if (flag) { var sum = 0; @@ -4159,6 +4360,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) { sum += eater.Value; } + foreach (var x in edPlayers) { if (this.Eaterworld.TryGetValue(x.Account, out var value)) @@ -4171,9 +4373,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (1250f * value / sum); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4194,7 +4396,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4202,6 +4404,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { this.SendKillBossMessage(args.npc.FullName, this.Eaterworld, sum); @@ -4212,8 +4415,8 @@ private void OnNPCKilled(NpcKilledEventArgs args) return; } } - break; - case 492://荷兰飞船的处理,特殊点:本体不可被击中,在其他炮塔全死亡后计入击杀 + break; + case 492: //荷兰飞船的处理,特殊点:本体不可被击中,在其他炮塔全死亡后计入击杀 { var flag = true; var index = -1; @@ -4223,11 +4426,13 @@ private void OnNPCKilled(NpcKilledEventArgs args) { flag = false; } + if (n.netID == 491) { index = n.whoAmI; } } + if (index >= 0) { var st = strikeNPC.Find(x => x.id == 491); @@ -4252,6 +4457,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (flag) { var airship = strikeNPC.Find(x => x.id == 491); @@ -4260,6 +4466,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) strikeNPC.RemoveAll(x => x.id == 491 || x.id == 492 || x.id != Main.npc[x.index].netID || !Main.npc[x.index].active); return; } + foreach (var x in edPlayers) { if (airship.playerAndDamage.TryGetValue(x.Account, out var value)) @@ -4272,9 +4479,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (airship.value * value / airship.AllDamage / 100); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4295,7 +4502,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4303,6 +4510,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { this.SendKillBossMessage(airship.name, airship.playerAndDamage, airship.AllDamage); @@ -4312,8 +4520,8 @@ private void OnNPCKilled(NpcKilledEventArgs args) return; } } - break; - case 398://月球领主的处理,特殊点,本体可被击中,但肢体会假死,击中肢体也应该算入本体中 + break; + case 398: //月球领主的处理,特殊点,本体可被击中,但肢体会假死,击中肢体也应该算入本体中 { var strikenpcs = strikeNPC.FindAll(x => x.id == 397 || x.id == 396); if (strikenpcs.Count > 0) @@ -4335,6 +4543,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + foreach (var x in edPlayers) { if (strikeNPC[i].playerAndDamage.TryGetValue(x.Account, out var value)) @@ -4347,9 +4556,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (value * 1f / strikeNPC[i].AllDamage * strikeNPC[i].value / 100); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4370,7 +4579,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4378,15 +4587,16 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { - this.SendKillBossMessage("月亮领主", strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage); + this.SendKillBossMessage(GetString("月亮领主"), strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage); } strikeNPC.RemoveAll(x => x.id == 398 || x.id == 397 || x.id == 396 || x.id != Main.npc[x.index].netID || !Main.npc[x.index].active); return; } - case 127://机械骷髅王的处理,特殊点,本体可能被击中,其他肢体可能会死 + case 127: //机械骷髅王的处理,特殊点,本体可能被击中,其他肢体可能会死 case 128: case 129: case 130: @@ -4403,15 +4613,17 @@ private void OnNPCKilled(NpcKilledEventArgs args) index = n.whoAmI; } } - if (index == -1)//我认为不可能发生这种情况 + + if (index == -1) //我认为不可能发生这种情况 { strikeNPC.RemoveAll(x => x.id == 127 || x.id == 128 || x.id == 129 || x.id == 130 || x.id == 131 || x.id != Main.npc[x.index].netID || !Main.npc[x.index].active); return; } + strike = new StrikeNPC(index, 127, Main.npc[index].FullName, true, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage, 300000); strikeNPC.Add(strike); } - else if (strikeNPC[i].id != 127)//把肢体受伤计算加入到本体头部中 + else if (strikeNPC[i].id != 127) //把肢体受伤计算加入到本体头部中 { foreach (var v in strikeNPC[i].playerAndDamage) { @@ -4427,6 +4639,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (strikeNPC[i].id == 127) { foreach (var x in edPlayers) @@ -4441,9 +4654,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (value * 1.0f / strikeNPC[i].AllDamage * strikeNPC[i].value / 100); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4464,7 +4677,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4472,6 +4685,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { this.SendKillBossMessage(args.npc.FullName, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage); @@ -4481,8 +4695,8 @@ private void OnNPCKilled(NpcKilledEventArgs args) return; } } - break; - case 245://石巨人的特殊处理 + break; + case 245: //石巨人的特殊处理 case 246: case 247: case 248: @@ -4498,15 +4712,17 @@ private void OnNPCKilled(NpcKilledEventArgs args) index = n.whoAmI; } } - if (index == -1)//不可能发生这种情况 + + if (index == -1) //不可能发生这种情况 { strikeNPC.RemoveAll(x => x.id == 245 || x.id == 246 || x.id == 247 || x.id == 248 || x.id != Main.npc[x.index].netID || !Main.npc[x.index].active); return; } + strike = new StrikeNPC(index, 245, Main.npc[index].FullName, true, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage, 400000); strikeNPC.Add(strike); } - else if (strikeNPC[i].id != 245)//把除了本体以外的肢体的伤害计算加到本体上 + else if (strikeNPC[i].id != 245) //把除了本体以外的肢体的伤害计算加到本体上 { foreach (var v in strikeNPC[i].playerAndDamage) { @@ -4522,6 +4738,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (strikeNPC[i].id == 245) { foreach (var x in edPlayers) @@ -4536,9 +4753,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (value * 1.0f / strikeNPC[i].AllDamage * strikeNPC[i].value / 100); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4559,7 +4776,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4567,6 +4784,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { this.SendKillBossMessage(args.npc.FullName, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage); @@ -4576,8 +4794,8 @@ private void OnNPCKilled(NpcKilledEventArgs args) return; } } - break; - case 266://克苏鲁之脑的特殊处理 + break; + case 266: //克苏鲁之脑的特殊处理 case 267: { var strike = strikeNPC.Find(x => x.id == 266); @@ -4591,15 +4809,17 @@ private void OnNPCKilled(NpcKilledEventArgs args) index = n.whoAmI; } } - if (index == -1)//不可能发生这种情况 + + if (index == -1) //不可能发生这种情况 { strikeNPC.RemoveAll(x => x.id == 266 || x.id == 267 || x.id != Main.npc[x.index].netID || !Main.npc[x.index].active); return; } + strike = new StrikeNPC(index, 266, Main.npc[index].FullName, true, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage, 125000); strikeNPC.Add(strike); } - else if (strikeNPC[i].id != 266)//把除了本体以外的飞眼怪的伤害计算加到本体上 + else if (strikeNPC[i].id != 266) //把除了本体以外的飞眼怪的伤害计算加到本体上 { foreach (var v in strikeNPC[i].playerAndDamage) { @@ -4615,6 +4835,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (strikeNPC[i].id == 266) { foreach (var x in edPlayers) @@ -4629,9 +4850,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) point = (int) (value * 1.0f / strikeNPC[i].AllDamage * strikeNPC[i].value / 100); if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4652,7 +4873,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); if (!x.hidePointTips && config.EnablePointTracking) { this.SendAllText(temp[0], $"+ {point} $", new Color(255, 100, 255), new Color(150, 75, 150), temp[0].TPlayer.Center); @@ -4660,6 +4881,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard) { this.SendKillBossMessage(args.npc.FullName, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage); @@ -4669,7 +4891,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) return; } } - break; + break; default: { foreach (var x in edPlayers) @@ -4694,9 +4916,9 @@ private void OnNPCKilled(NpcKilledEventArgs args) if (point < 0 || point >= int.MaxValue) { - TShock.Log.Error("错误的点数:" + point); - TSPlayer.All.SendInfoMessage("错误的点数:" + point); + TShock.Log.ConsoleError(GetString("错误的点数:") + point); } + x.point += point >= 0 && point < int.MaxValue ? point : 1; } @@ -4712,7 +4934,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } - if (args.npc.rarity > 0 || config.CreaturesTreatedAsRareForKills.Count > 0 && config.CreaturesTreatedAsRareForKills.Contains(args.npc.netID)) + if (args.npc.rarity > 0 || (config.CreaturesTreatedAsRareForKills.Count > 0 && config.CreaturesTreatedAsRareForKills.Contains(args.npc.netID))) { if (x.killRareNPCID.ContainsKey(strikeNPC[i].id)) { @@ -4742,9 +4964,10 @@ private void OnNPCKilled(NpcKilledEventArgs args) this.SendAllText(temp[0], "kill + 1", Color.White, Color.Gray, args.npc.Center - (Vector2.UnitY * 10)); } } + if (strikeNPC[i].isBoss) { - NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index, -1); + NetMessage.PlayNetSound(new NetMessage.NetSoundInfo(temp[0].TPlayer.Center, 4), temp[0].Index); } if (!x.hidePointTips && config.EnablePointTracking) @@ -4754,16 +4977,19 @@ private void OnNPCKilled(NpcKilledEventArgs args) } } } + if (config.EnableBossDamageLeaderboard && (args.npc.boss || args.npc.netID == 551 || args.npc.netID == 125 || args.npc.netID == 126 || config.AdditionalCreaturesForDamageLeaderboard.Contains(args.npc.netID))) { this.SendKillBossMessage(args.npc.FullName, strikeNPC[i].playerAndDamage, strikeNPC[i].AllDamage); } + strikeNPC.RemoveAt(i); strikeNPC.RemoveAll(x => x.id != Main.npc[x.index].netID || !Main.npc[x.index].active); return; } } } + //清理因为意外导致的不正确的数据 if (i >= 0 && (strikeNPC[i].id != Main.npc[strikeNPC[i].index].netID || !Main.npc[strikeNPC[i].index].active)) { @@ -4775,7 +5001,7 @@ private void OnNPCKilled(NpcKilledEventArgs args) /// - /// 记录死亡事件 + /// 记录死亡事件 /// /// /// @@ -4792,6 +5018,7 @@ private void OnPlayerKilled(object? sender, GetDataHandlers.KillMeEventArgs e) { ext.deathCount++; } + if (config.EnablePointTracking && !avoid) { var temp = (long) (ext.point * 0.01f * config.PointsLossMultiplierOnDeath); @@ -4802,15 +5029,16 @@ private void OnPlayerKilled(object? sender, GetDataHandlers.KillMeEventArgs e) if (ext.point >= temp) { - e.Player.SendInfoMessage("您遗失了:" + temp + " 点数"); + e.Player.SendInfoMessage(GetString($"您遗失了:{temp} 点数")); ext.point -= temp; } else { - e.Player.SendInfoMessage("您遗失了:" + ext.point + " 点数,已扣完"); + e.Player.SendInfoMessage(GetString($"您遗失了:{ext.point} 点数,已扣完")); ext.point = 0; } } + if (config.AllowPlayerRespawnAtLastDeathPoint && !avoid) { ext.deadPos = e.Player.TPlayer.Center; @@ -4819,53 +5047,56 @@ private void OnPlayerKilled(object? sender, GetDataHandlers.KillMeEventArgs e) /// - /// 功能 + /// 功能 /// /// private void Function(CommandArgs args) { if (args.Parameters.Count > 0) { - args.Player.SendInfoMessage("输入 /zbpos 来返回上次死亡地点"); + args.Player.SendInfoMessage(GetString("输入 /zbpos 来返回上次死亡地点")); return; } + if (config.AllowPlayerRespawnAtLastDeathPoint) { if (!args.Player.IsLoggedIn) { - args.Player.SendInfoMessage("对象不正确,请检查您的状态,您是否为游戏内玩家?"); + args.Player.SendInfoMessage(GetString("对象不正确,请检查您的状态,您是否为游戏内玩家?")); return; } + var ex = edPlayers.Find(x => x.Name == args.Player.Name); if (ex == null) { - args.Player.SendInfoMessage("数据异常,请重试"); + args.Player.SendInfoMessage(GetString("数据异常,请重试")); } else if (ex.deadPos == Vector2.Zero) { - args.Player.SendInfoMessage("你没有上次死亡的地点"); + args.Player.SendInfoMessage(GetString("你没有上次死亡的地点")); } else if (ex.point >= config.RespawnCostPoints || !config.EnablePointTracking) { if (config.EnablePointTracking) { ex.point -= config.RespawnCostPoints > 0 ? config.RespawnCostPoints : 0; - TSPlayer.All.SendInfoMessage($"玩家 {args.Player.Name} 已传送到上次死亡地点" + (config.RespawnCostPoints > 0 ? $",消耗点数 {config.RespawnCostPoints}" : "")); + TSPlayer.All.SendInfoMessage($"玩家 {args.Player.Name} 已传送到上次死亡地点{(config.RespawnCostPoints > 0 ? GetString($",消耗点数 {config.RespawnCostPoints}") : "")}"); } else { - TSPlayer.All.SendInfoMessage($"玩家 {args.Player.Name} 已传送到上次死亡地点"); + TSPlayer.All.SendInfoMessage(GetString($"玩家 {args.Player.Name} 已传送到上次死亡地点")); } + args.Player.Teleport(ex.deadPos.X, ex.deadPos.Y); } else { - args.Player.SendInfoMessage("点数不足,无法回溯上次死亡地点"); + args.Player.SendInfoMessage(GetString("点数不足,无法回溯上次死亡地点")); } } else { - args.Player.SendInfoMessage("未被允许死亡回调传送,请在配置文件中修改"); + args.Player.SendInfoMessage(GetString("未被允许死亡回调传送,请在配置文件中修改")); } } @@ -4882,7 +5113,7 @@ private void FindItem(CommandArgs args) return; } - + using (QueryResult queryResult = TShock.DB.QueryReader("SELECT * FROM tsCharacter")) { if (queryResult.Read()) @@ -4899,13 +5130,13 @@ private void FindItem(CommandArgs args) playerData.extraSlot = new int?(queryResult.Get("extraSlot")); } } - + } */ /// - /// 重新加载配置 + /// 重新加载配置 /// /// private void OnReload(ReloadEventArgs e) @@ -4914,8 +5145,9 @@ private void OnReload(ReloadEventArgs e) if (config.MaxBackupsPerPlayer < 1) { config.MaxBackupsPerPlayer = 5; - e.Player.SendMessage("备份存档数目最小为 1 ,请不要输入无效值,已修改为默认 5", new Color(255, 0, 0)); + e.Player.SendMessage(GetString("备份存档数目最小为 1 ,请不要输入无效值,已修改为默认 5"), new Color(255, 0, 0)); } + config.SaveConfigFile(); } } \ No newline at end of file diff --git a/src/ZHIPlayerManager/ZHIPM.Utils.cs b/src/ZHIPlayerManager/ZHIPM.Utils.cs index 0887d216..c84f45d7 100644 --- a/src/ZHIPlayerManager/ZHIPM.Utils.cs +++ b/src/ZHIPlayerManager/ZHIPM.Utils.cs @@ -494,8 +494,7 @@ public bool UpdateTshockDBCharac(int accid, PlayerData pd) } catch (Exception ex) { - TShock.Log.Error("错误:UpdateTshockDBCharac " + ex.ToString()); - Console.WriteLine("错误:UpdateTshockDBCharac " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:UpdateTshockDBCharac ") + ex); return false; } } @@ -633,8 +632,7 @@ public bool ResetPlayer(TSPlayer p) } catch (Exception ex) { - TShock.Log.Error("错误 ResetPlayer :" + ex.ToString()); - Console.WriteLine("错误 ResetPlayer :" + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误 ResetPlayer :" )+ ex.ToString()); return false; } } @@ -801,7 +799,7 @@ public void MySSCBack2(CommandArgs args, int slot) var list = this.BestFindPlayerByNameOrIndex(args.Parameters[0]); if (list.Count > 1) { - var names = "检测到符合该条件的玩家数目不唯一,请重新输入\n包含:"; + var names = GetString("检测到符合该条件的玩家数目不唯一,请重新输入\n包含:"); foreach (var v in list) { names += v.Name + ", "; @@ -824,7 +822,7 @@ public void MySSCBack2(CommandArgs args, int slot) var playerData = TShock.CharacterDB.GetPlayerData(new TSPlayer(-1), user.ID); if (playerData == null || !playerData.exists) { - args.Player.SendInfoMessage("未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入"); + args.Player.SendInfoMessage(GetString("未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入")); } else { @@ -833,25 +831,23 @@ public void MySSCBack2(CommandArgs args, int slot) var playerData2 = ZPDataBase.ReadZPlayerDB(new TSPlayer(-1), user.ID, slot); if (playerData2 == null || !playerData2.exists) { - args.Player.SendMessage("回档失败!未找到 [" + user.ID + "-" + slot + "] 号该备份", new Color(255, 0, 0)); + args.Player.SendMessage(GetString($"回档失败!未找到 [{user.ID} - {slot}] 号该备份"), new Color(255, 0, 0)); } else { if (this.UpdateTshockDBCharac(user.ID, playerData2)) { - args.Player.SendMessage($"玩家 [{user.Name}] 回档成功!启用备份 [ {user.ID.ToString() + "-" + slot} ]", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{user.Name}] 回档成功!启用备份 [ {user.ID.ToString() + "-" + slot} ]"), new Color(0, 255, 0)); } else { - args.Player.SendMessage("回档失败!", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("回档失败!"), new Color(255, 0, 0)); } } } catch (Exception ex) { - TShock.Log.Error("错误:BackUp " + ex.ToString()); - args.Player.SendErrorMessage("错误:BackUp " + ex.ToString()); - Console.WriteLine("错误:BackUp " + ex.ToString()); + TShock.Log.ConsoleError(GetString("错误:BackUp ") + ex); } } } @@ -865,12 +861,12 @@ public void MySSCBack2(CommandArgs args, int slot) { if (args.Player.Index != list[0].Index) { - args.Player.SendMessage($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]", new Color(0, 255, 0)); - list[0].SendMessage("您已回档成功!", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]"), new Color(0, 255, 0)); + list[0].SendMessage(GetString("您已回档成功!"), new Color(0, 255, 0)); } else { - args.Player.SendMessage($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]"), new Color(0, 255, 0)); } } //如果他是管理,那就不用向原版数据写入了 @@ -878,17 +874,17 @@ public void MySSCBack2(CommandArgs args, int slot) { if (args.Player.Index != list[0].Index) { - args.Player.SendMessage($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]", new Color(0, 255, 0)); - list[0].SendMessage("您已回档成功!", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]"), new Color(0, 255, 0)); + list[0].SendMessage(GetString("您已回档成功!"), new Color(0, 255, 0)); } else { - args.Player.SendMessage($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]", new Color(0, 255, 0)); + args.Player.SendMessage(GetString($"玩家 [{list[0].Name}] 回档成功!启用备份 [ {list[0].Account.ID + "-" + slot} ]"), new Color(0, 255, 0)); } } else { - args.Player.SendMessage("回档失败!未备份数据或该玩家未登录", new Color(255, 0, 0)); + args.Player.SendMessage(GetString("回档失败!未备份数据或该玩家未登录"), new Color(255, 0, 0)); } } } @@ -909,7 +905,7 @@ public string timetostring(long t) h = min / 60L; min %= 60L; } - return $"{h}小时 {min}分钟 {s}秒"; + return GetString($"{h}小时 {min}分钟 {s}秒"); } @@ -929,8 +925,8 @@ public string cointostring(long coin, int Model = 0) coin /= 100; var platinum = coin; //74 return Model == 0 - ? $"{platinum}[i:74] {gold}[i:73] {silver}[i:72] {copper}[i:71]" - : $"{platinum}铂金币 {gold}金币 {silver}银币 {copper}铜币"; + ? GetString($"{platinum}[i:74] {gold}[i:73] {silver}[i:72] {copper}[i:71]") + : GetString($"{platinum}铂金币 {gold}金币 {silver}银币 {copper}铜币"); } @@ -998,10 +994,10 @@ public static string DictionaryToVSString(Dictionary keyValues, bool i switch (v.Key)//处理一下特殊npc { case 592: - sb.Append($"蹦跶{Lang.GetNPCNameValue(v.Key)}({v.Value}),"); + sb.Append(GetString($"蹦跶{Lang.GetNPCNameValue(v.Key)}({v.Value}),")); break; case 593: - sb.Append($"游雨{Lang.GetNPCNameValue(v.Key)}({v.Value}),"); + sb.Append(GetString($"游雨{Lang.GetNPCNameValue(v.Key)}({v.Value}),")); break; case 564: sb.Append($"T1{Lang.GetNPCNameValue(v.Key)}({v.Value}),"); @@ -1016,7 +1012,7 @@ public static string DictionaryToVSString(Dictionary keyValues, bool i sb.Append($"T3{Lang.GetNPCNameValue(v.Key)}({v.Value}),"); break; case 398: - sb.Append("月亮领主(" + v.Value + ")"); + sb.Append(GetString("月亮领主(" + v.Value + ")")); break; default: sb.Append($"{Lang.GetNPCNameValue(v.Key)}({v.Value}),"); @@ -1112,10 +1108,8 @@ public bool ExportPlayer(Player? player, long time = 0L) } catch (Exception ex) { - TShock.Log.Error("错误:ExportPlayer " + ex.ToString()); - TShock.Log.Error("路径:" + playerFileData.Path + " 名字:" + text); - Console.WriteLine("错误:ExportPlayer " + ex.ToString()); - Console.WriteLine("路径:" + playerFileData.Path + " 名字:" + text); + TShock.Log.ConsoleError(GetString("错误:ExportPlayer ") + ex.ToString()); + TShock.Log.ConsoleError(GetString("路径:") + playerFileData.Path + GetString(" 名字:") + text); return false; } } @@ -1534,8 +1528,7 @@ public bool ExportPlayer(Player? player, long time = 0L) } catch (Exception ex) { - TShock.Log.Info("正常的意外因玩家 [ " + name + " ] 数据残缺而导出人物失败 CreateAPlayer"); - Console.WriteLine("正常的意外因玩家 [ " + name + " ] 数据残缺而导出人物失败 CreateAPlayer"); + TShock.Log.ConsoleError(GetString($"正常的意外因玩家 [ {name} ] 数据残缺而导出人物失败 CreateAPlayer")); return null; } } @@ -1714,7 +1707,7 @@ public void SendKillBossMessage(string BossName, Dictionary playerAndD var sb = new StringBuilder(); var sortpairs = new Dictionary(); - sb.AppendLine($"共有 [c/74F3C9:{playerAndDamage.Count}] 位玩家击败了 [c/74F3C9:{BossName}]"); + sb.AppendLine(GetString($"共有 [c/74F3C9:{playerAndDamage.Count}] 位玩家击败了 [c/74F3C9:{BossName}]")); //简单的排个序 while (playerAndDamage.Count > 0) { @@ -1737,7 +1730,7 @@ public void SendKillBossMessage(string BossName, Dictionary playerAndD foreach (var v in sortpairs) { - sb.AppendLine($"{TShock.UserAccounts.GetUserAccountByID(v.Key).Name} 伤害: [c/74F3C9:{v.Value}] 比重: {v.Value * 1.0f / alldamage:0.00%} "); + sb.AppendLine(GetString($"{TShock.UserAccounts.GetUserAccountByID(v.Key).Name} 伤害: [c/74F3C9:{v.Value}] 比重: {v.Value * 1.0f / alldamage:0.00%} ")); } TSPlayer.All.SendMessage(sb.ToString(), Color.Bisque); } diff --git a/src/ZHIPlayerManager/ZHIPM.cs b/src/ZHIPlayerManager/ZHIPM.cs index 46da5847..cd7ca22e 100644 --- a/src/ZHIPlayerManager/ZHIPM.cs +++ b/src/ZHIPlayerManager/ZHIPM.cs @@ -15,7 +15,7 @@ public partial class ZHIPM : TerrariaPlugin public override string Name => "ZHIPlayerManager"; - public override Version Version => new Version(1, 0, 0, 6); + public override Version Version => new Version(1, 0, 0, 7); #region 字段或属性 /// @@ -59,9 +59,9 @@ public static long Timer /// public static List strikeNPC = new List(); - public readonly string noplayer = "该玩家不存在,请重新输入"; - public readonly string manyplayer = "该玩家不唯一,请重新输入"; - public readonly string offlineplayer = "该玩家不在线,正在查询离线数据"; + public readonly string noplayer = GetString("该玩家不存在,请重新输入"); + public readonly string manyplayer = GetString("该玩家不唯一,请重新输入"); + public readonly string offlineplayer = GetString("该玩家不在线,正在查询离线数据"); public static ZhipmConfig config = new ZhipmConfig(); @@ -86,7 +86,7 @@ public override void Initialize() { if (!TShock.ServerSideCharacterConfig.Settings.Enabled) { - Console.WriteLine("该插件需要开启SSC才能使用"); + Console.WriteLine(GetString("该插件需要开启SSC才能使用")); return; } Timer = 0L; diff --git a/src/ZHIPlayerManager/i18n/template.pot b/src/ZHIPlayerManager/i18n/template.pot new file mode 100644 index 00000000..2a9041cc --- /dev/null +++ b/src/ZHIPlayerManager/i18n/template.pot @@ -0,0 +1,1815 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZHIPlayerManager\n" +"POT-Creation-Date: 2024-09-01 11:28:09+0800\n" +"PO-Revision-Date: 2024-09-01 11:28:09+0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: GetText.NET Extractor\n" + +#: ..\..\ZHIPM.Initialize.cs:177 +#, csharp-format +msgid "修改成功,你的存档将每隔{0}分钟自动备份一次,请注意存档覆盖情况,这可能会覆盖你手动备份的部分" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2782 +#: ..\..\ZHIPM.Initialize.cs:2786 +#: ..\..\ZHIPM.Initialize.cs:2790 +#, csharp-format +msgid "用户 [{0}] 因数据错误导出失败" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3255 +msgid "" +"输入 /zsort kill [num] 来查看当前[num]个人物击杀生物数排行榜\n" +"输入 /zsort kill 来查看人物击杀生物数排行榜前十名\n" +"输入 /zsort kill all 来查看所有玩家击杀生物数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2617 +msgid "你的名字含有指令关键字: ip ,请更换" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1293 +msgid "背包:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2893 +msgid "" +"输入 /zsort time all 来查看所有玩家在线时常排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2304 +#: ..\..\ZHIPM.Initialize.cs:2351 +msgid "" +"输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n" +"输入 /zclear buff 来清理该玩家的所有Buff\n" +"输入 /zclear buff all 来清理所有玩家所有Buff" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2907 +msgid "" +"\n" +"输入 /zsort point [num] 来查看当前[num]个人物点数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:632 +msgid "输入 /zmodify [name] all [0或1] 来关闭或开启所有玩家增益" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:474 +#: ..\..\ZHIPM.Initialize.cs:556 +msgid "玩家1不存在" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3960 +#: ..\..\ZHIPM.Initialize.cs:3986 +#: ..\..\ZHIPM.Initialize.cs:4004 +#, csharp-format +msgid "玩家 [{0}] 已解冻" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:621 +msgid "" +"输入 /zmodify [name] manamax [num] 来修改玩家的魔力上限\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1101 +msgid "" +"输入 /zresetex all 来清理所有玩家的额外数据\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:53 +msgid "" +"输入 /zclear useless 来清理世界的掉落物品,非城镇或BossNPC,和无用射弹\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:517 +#: ..\..\ZHIPM.Initialize.cs:573 +msgid "玩家2不存在" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:951 +#: ..\..\ZHIPM.Initialize.cs:972 +#: ..\..\ZHIPM.Initialize.cs:994 +#: ..\..\ZHIPM.Initialize.cs:1031 +#: ..\..\ZHIPM.Initialize.cs:1054 +#: ..\..\ZHIPM.Initialize.cs:1076 +#: ..\..\ZHIPM.Initialize.cs:1176 +msgid "重置失败" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2892 +msgid "" +"输入 /zsort time [num] 来查看当前[num]个人物在线时间排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:40 +msgid "" +"输入 /vid 来查看该玩家的库存,不分类\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:740 +msgid "您的埃癸斯果增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:626 +msgid "" +"输入 /zmodify [name] heart [0或1] 来关闭或开启埃癸斯水晶增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1211 +#: ..\..\ZHIPM.Initialize.cs:1212 +msgid "清理失败 ZResetPlayerAll :" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:787 +msgid "您的所有永久增益均开启" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1804 +#: ..\..\ZHIPM.Initialize.cs:1970 +msgid "在线时长[i:3099]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1072 +#, csharp-format +msgid "已重置离线玩家 [ {0} ] 的额外数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1814 +#: ..\..\ZHIPM.Initialize.cs:1980 +#, csharp-format +msgid "已击杀生物数[i:3095]:{0} 个" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1345 +msgid "染料2:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1172 +msgid "您的人物数据已被重置" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2714 +msgid "未启用点数统计,该功能不可用" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5083 +#, csharp-format +msgid ",消耗点数 {0}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1049 +#, csharp-format +msgid "已重置玩家 [ {0} ] 的额外数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:36 +msgid "" +"输入 /zclone 将玩家1的人物数据复制给玩家2\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2913 +msgid "" +"输入 /zsort death 来查看人物死亡次数排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1050 +msgid "您的额外数据已重置" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1126 +#: ..\..\ZHIPM.Initialize.cs:1127 +#: ..\..\ZHIPM.Initialize.cs:1131 +msgid "所有玩家的人物数据均已重置" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2704 +#, csharp-format +msgid "修改成功,您现在已{0}点数提示" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:625 +msgid "" +"输入 /zmodify [name] bread [0或1] 来关闭或开启工匠面包增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3839 +msgid "" +"输入 /zban add [name] [reason] 来封禁无论是否在线的玩家,reason 可不填\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:4005 +msgid "您已被解冻" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1284 +#: ..\..\ZHIPM.Initialize.cs:1507 +#: ..\..\ZHIPM.Initialize.cs:1665 +#, csharp-format +msgid "玩家 【{0}】 的所有库存如下:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:967 +#, csharp-format +msgid "已重置玩家 [ {0} ] 的备份数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:439 +msgid "请不要对同一个人进行克隆" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:54 +msgid "" +"输入 /zclear buff 来清理该玩家的所有Buff\n" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:825 +msgid "未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:4315 +msgid "血肉墙" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2909 +msgid "输入 /zsort point all 来查看所有玩家点数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1733 +#, csharp-format +msgid "{0} 伤害: [c/74F3C9:{1}] 比重: {2:0.00%} " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:915 +#: ..\..\ZHIPM.Initialize.cs:916 +msgid "修改失败!错误:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:86 +#: ..\..\ZHIPM.Initialize.cs:216 +#: ..\..\ZHIPM.Initialize.cs:258 +#, csharp-format +msgid "玩家最多有 {0} 个备份存档,范围 1 ~ {1},请重新输入" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1112 +msgid " 名字:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2731 +msgid "" +"输入 /zout 来导出该玩家的人物存档\n" +"输入 /zout all 来导出所有人物的存档" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3287 +#: ..\..\ZHIPM.Initialize.cs:3312 +#: ..\..\ZHIPM.Initialize.cs:3323 +#, csharp-format +msgid "第 {0} 名:【{1}】 击杀Boss总数 {2} 个" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3211 +#: ..\..\ZHIPM.Initialize.cs:3236 +#: ..\..\ZHIPM.Initialize.cs:3247 +#, csharp-format +msgid "第 {0} 名:【{1}】 击杀生物总数 {2} 个" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:113 +#: ..\..\ZHIPM.Initialize.cs:155 +#: ..\..\ZHIPM.Initialize.cs:202 +#: ..\..\ZHIPM.Initialize.cs:363 +#: ..\..\ZHIPM.Initialize.cs:2682 +#: ..\..\ZHIPM.Initialize.cs:5065 +msgid "对象不正确,请检查您的状态,您是否为游戏内玩家?" +msgstr "" + +#: ..\..\ZHIPM.cs:89 +msgid "该插件需要开启SSC才能使用" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:170 +msgid "修改失败,请重进服务器重试" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2917 +msgid "" +"\n" +"输入 /zsort clumsy 来查看人物手残排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1898 +#: ..\..\ZHIPM.Initialize.cs:2025 +#: ..\..\ZHIPM.Initialize.cs:2195 +msgid "各种永久增益:" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:635 +msgid "错误 ResetPlayer :" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:559 +msgid "错误:WriteExtraDB 2 " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2589 +msgid "请不要起纯数字名字" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:394 +#: ..\..\ZHIPM.Initialize.cs:415 +#, csharp-format +msgid "克隆成功!您已将玩家[{0}]的数据克隆到你身上" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:534 +msgid "错误:WriteExtraDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:673 +msgid "您的生命上限已被修改为:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2947 +#: ..\..\ZHIPM.Initialize.cs:3023 +#: ..\..\ZHIPM.Initialize.cs:3123 +#: ..\..\ZHIPM.Initialize.cs:3198 +#: ..\..\ZHIPM.Initialize.cs:3271 +#: ..\..\ZHIPM.Initialize.cs:3347 +#: ..\..\ZHIPM.Initialize.cs:3423 +#: ..\..\ZHIPM.Initialize.cs:3498 +#: ..\..\ZHIPM.Initialize.cs:3573 +msgid "没有任何数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2005 +#: ..\..\ZHIPM.Initialize.cs:2193 +msgid "完成渔夫任务数:" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:997 +#, csharp-format +msgid "蹦跶{0}({1})," +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2593 +msgid "请不要在名字中使用特殊符号" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1326 +msgid "装备栏3:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2896 +msgid "" +"\n" +"输入 /zsort kill [num] 来查看当前[num]个人物击杀生物数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1687 +msgid "输入 /vs <玩家名> 来查看该玩家的状态" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2869 +#: ..\..\ZHIPM.Initialize.cs:2870 +msgid "导出失败,因输入错误" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:29 +msgid "" +"输入 /zsaveauto 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1591 +#, csharp-format +msgid "" +"玩家 【{0}】未携带任何东西\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:47 +msgid "" +"输入 /zout 来导出该玩家的人物存档\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:716 +msgid "您的火把神增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:685 +msgid "您的魔力上限已被修改为:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:628 +msgid "" +"输入 /zmodify [name] pearl [0或1] 来关闭或开启银河珍珠增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3990 +#: ..\..\ZHIPM.Initialize.cs:4009 +#, csharp-format +msgid "玩家 [{0}] 未被冻结" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:467 +msgid "玩家1不在线,正在查询离线数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:758 +msgid "您的粘性蠕虫增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:50 +msgid "" +"输入 /zban add 来封禁无论是否在线的玩家,reason 可不填\n" +msgstr "" + +#: ..\..\ZHIPM.cs:63 +msgid "该玩家不唯一,请重新输入" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1111 +msgid "错误:ExportPlayer " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:306 +msgid "该玩家还未备份" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:619 +msgid "" +"输入 /zmodify [name] lifemax [num] 来修改玩家的血量上限\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:764 +msgid "您的珍馐增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3182 +msgid "" +"输入 /zsort fish 来查看人物任务鱼数目排行榜前十名\n" +"输入 /zsort fish [num] 来查看当前[num]个人物任务鱼数目排行榜\n" +"输入 /zsort fish all 来查看所有玩家任务鱼数目排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2812 +#, csharp-format +msgid "" +"{0} 名用户因数据残缺导出失败\n" +"已全部打包为{1}/Zhipm/{2}.zip" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2710 +msgid "未启用击杀NPC统计,该功能不可用" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3855 +msgid "输入 /zfre [name] 来冻结该玩家" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:480 +#: ..\..\ZHIPM.Initialize.cs:562 +msgid "玩家1不唯一" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1000 +#, csharp-format +msgid "游雨{0}({1})," +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1402 +msgid "护卫熔炉:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3557 +msgid "" +"输入 /zsort death [num] 来查看当前[num]个人物死亡次数排行榜\n" +"输入 /zsort death 来查看人物死亡次数排行榜前十名\n" +"输入 /zsort death all 来查看所有玩家死亡次数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2919 +msgid "输入 /zsort clumsy all 来查看所有玩家手残排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2902 +msgid "" +"输入 /zsort rarenpc [num] 来查看当前[num]个人物击杀罕见生物总数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:746 +msgid "您的奥术水晶增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5076 +msgid "你没有上次死亡的地点" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:51 +msgid "" +"输入 /zban add uuid 来封禁uuid\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3795 +msgid "人数不唯一,为避免误封,请重新输入。若玩家名称带有空格可用英文引号将名称整个括起来" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:30 +msgid "" +"输入 /zvisa 来查看自己的人物备份\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1010 +msgid "" +"输入 /zresetex [name] 来清理该玩家的额外数据\n" +"输入 /zresetex all 来清理所有玩家的额外数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1727 +#: ..\..\ZHIPM.Initialize.cs:1796 +#: ..\..\ZHIPM.Initialize.cs:1962 +#: ..\..\ZHIPM.Initialize.cs:2020 +#: ..\..\ZHIPM.Initialize.cs:2089 +msgid "无" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:44 +msgid "" +"输入 /zunfre 来解冻该玩家\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:181 +msgid "修改成功,你的自动备份已关" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:39 +msgid "" +"输入 /vi 来查看该玩家的库存\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2897 +msgid "" +"输入 /zsort kill 来查看人物击杀生物数排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2898 +msgid "" +"输入 /zsort kill all 来查看所有玩家击杀生物数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2430 +#, csharp-format +msgid "玩家【{0}】的人物存档和额外数据已备份和保存" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:752 +msgid "您的银河珍珠增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1707 +#: ..\..\ZHIPM.Initialize.cs:1895 +msgid "最大魔力值[i:109]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1339 +msgid "染料1:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2924 +msgid "" +"输入 /zsort coin 来查看人物硬币数目排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3873 +#: ..\..\ZHIPM.Initialize.cs:3889 +#: ..\..\ZHIPM.Initialize.cs:3916 +#, csharp-format +msgid "玩家 [{0}] 冻结成功" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:56 +msgid "" +"输入 /zbpos 来返回上次死亡地点\n" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1531 +#, csharp-format +msgid "正常的意外因玩家 [ {0} ] 数据残缺而导出人物失败 CreateAPlayer" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1320 +msgid "装备栏2:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2004 +#: ..\..\ZHIPM.Initialize.cs:2192 +msgid " 当前魔力值:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2004 +#: ..\..\ZHIPM.Initialize.cs:2192 +msgid "最大魔力值:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1219 +#: ..\..\ZHIPM.Initialize.cs:1223 +msgid "所有玩家的所有数据均已全部初始化" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:534 +#: ..\..\ZHIPM.Initialize.cs:589 +#, csharp-format +msgid "克隆成功!您已将玩家 [{0}] 的数据克隆到玩家 [{1}] 身上" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:485 +msgid "错误:ReadExtraDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3931 +msgid "" +"输入 /zunfre [name] 来解冻该玩家\n" +"输入 /zunfre all 来解冻所有玩家" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:941 +#: ..\..\ZHIPM.Initialize.cs:942 +#: ..\..\ZHIPM.Initialize.cs:946 +msgid "所有玩家的备份数据均已重置" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3772 +#: ..\..\ZHIPM.Initialize.cs:3773 +#, csharp-format +msgid "用户 {0} 封禁失败,可能该玩家已被封禁或所在组被禁止封禁" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2601 +msgid "你的名字含有指令关键字: time ,请更换" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3407 +msgid "" +"输入 /zsort rarenpc [num] 来查看当前[num]个人物击杀罕见生物总数排行榜\n" +"输入 /zsort rarenpc 来查看人物击杀罕见生物总数排行榜前十名\n" +"输入 /zsort rarenpc all 来查看所有玩家击杀罕见生物总数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:38 +msgid "" +"输入 /zmodify help 查看修改玩家数据的指令帮助\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2891 +msgid "" +"输入 /zsort time 来查看人物在线时间排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1171 +#, csharp-format +msgid "已重置玩家 [ {0} ] 的数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3722 +#: ..\..\ZHIPM.Initialize.cs:3723 +#, csharp-format +msgid "uuid: {0} 已被 {1} 封禁" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3800 +msgid "。若玩家名称带有空格可用英文引号将名称整个括起来" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:107 +msgid "输入 /zsave 来备份自己的人物存档" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:80 +#: ..\..\ZHIPM.Initialize.cs:94 +msgid "" +"输入 /zback 来读取该玩家的最新人物存档\n" +"输入 /zback 来读取该玩家的第几个人物存档" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:840 +#: ..\..\ZHIPM.Utils.cs:864 +#: ..\..\ZHIPM.Utils.cs:869 +#: ..\..\ZHIPM.Utils.cs:877 +#: ..\..\ZHIPM.Utils.cs:882 +#, csharp-format +msgid "玩家 [{0}] 回档成功!启用备份 [ {1} ]" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1708 +#: ..\..\ZHIPM.Initialize.cs:1896 +msgid "完成渔夫任务数[i:3120]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1706 +#: ..\..\ZHIPM.Initialize.cs:1894 +msgid " 当前生命值[i:58]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3668 +msgid "" +"输入 /zsort clumsy 来查看人物手残排行榜前十名\n" +"输入 /zsort clumsy [num] 来查看当前[num]个人物手残排行榜\n" +"输入 /zsort clumsy all 来查看所有玩家手残排行榜" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:301 +msgid "错误:getZPlayerDBMaxSlot " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:35 +msgid "" +"输入 /zback 来读取该玩家的第几个人物存档\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:492 +#, csharp-format +msgid "克隆成功!您已将玩家 [{0}] 的数据克隆到玩家 [{1}]身上" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1100 +msgid "" +"输入 /zresetex 来清理该玩家的额外数据\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:31 +msgid "" +"输入 /zvisa name 来查看该玩家的第几个人物备份\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2536 +msgid "您已被冻结,详情请询问管理员" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1512 +#: ..\..\ZHIPM.Initialize.cs:1670 +#, csharp-format +msgid "" +"玩家 【{0}】 未携带任何东西\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:125 +msgid "您的备份保存成功!" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:453 +#: ..\..\ZHIPM.Initialize.cs:496 +msgid "克隆成功!已将玩家 [] 的数据克隆到你身上" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2929 +msgid "输入 /zsort fish all 来查看所有玩家任务鱼数目排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2097 +#: ..\..\ZHIPM.Initialize.cs:2267 +msgid "在线时长:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1705 +#: ..\..\ZHIPM.Initialize.cs:2002 +#: ..\..\ZHIPM.Initialize.cs:2184 +#, csharp-format +msgid "玩家 【{0}】 的状态如下:" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:268 +msgid "错误:WriteZPlayerDB 2 " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:48 +msgid "" +"输入 /zout all 来导出所有人物的存档并压缩打包\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2960 +#: ..\..\ZHIPM.Initialize.cs:2985 +#: ..\..\ZHIPM.Initialize.cs:2996 +#, csharp-format +msgid "第 {0} 名:【{1}】 在线时长 {2}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1099 +msgid "" +"输入 /zresetdb all 来清理所有玩家的备份数据\n" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:603 +msgid "错误:ClearZPlayerExtraDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3868 +#: ..\..\ZHIPM.Initialize.cs:3884 +#: ..\..\ZHIPM.Initialize.cs:3910 +#, csharp-format +msgid "玩家 [{0}] 已冻结过!" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3688 +msgid "" +"输入 /zban add uuid [reason] 来封禁uuid\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2903 +msgid "" +"输入 /zsort rarenpc 来查看人物击杀罕见生物总数排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5037 +#, csharp-format +msgid "您遗失了:{0} 点数,已扣完" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1370 +msgid "垃圾桶:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2904 +msgid "输入 /zsort rarenpc all 来查看所有玩家击杀罕见生物总数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1307 +msgid "盔甲 + 饰品 + 时装:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:630 +msgid "" +"输入 /zmodify [name] ambrosia [0或1] 来关闭或开启珍馐增益\n" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:580 +msgid "错误:ClearALLZPlayerExtraDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2914 +msgid "输入 /zsort death all 来查看所有玩家死亡次数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3463 +#: ..\..\ZHIPM.Initialize.cs:3474 +#, csharp-format +msgid "第 {0} 名:【{1}】 点数 {2}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2927 +msgid "" +"输入 /zsort fish 来查看人物任务鱼数目排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:850 +msgid "错误:BackUp " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:34 +msgid "" +"输入 /zback 来读取该玩家的人物存档\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:510 +msgid "玩家2不在线,正在查询离线数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2585 +msgid "请不要起空名字" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1710 +#, csharp-format +msgid "共有 [c/74F3C9:{0}] 位玩家击败了 [c/74F3C9:{1}]" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2693 +#, csharp-format +msgid "修改成功,您现在已{0}击杀数提示" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:349 +msgid "" +"输入 /zclone [name1] [name2] 将玩家1的人物数据复制给玩家2\n" +"输入 /zclone [name] 将该玩家的人物数据复制给自己" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:149 +#: ..\..\ZHIPM.Initialize.cs:186 +msgid "输入 /zsaveauto [minute] 来每隔 minute 分钟自动备份自己的人物存档,当 minute 为 0 时关闭该功能" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1091 +msgid "" +"输入 /zreset 来清理该玩家的人物数据\n" +"输入 /zreset all 来清理所有玩家的人物数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:33 +msgid "" +"输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:398 +#: ..\..\ZHIPM.Initialize.cs:419 +#: ..\..\ZHIPM.Initialize.cs:458 +#: ..\..\ZHIPM.Initialize.cs:501 +#: ..\..\ZHIPM.Initialize.cs:538 +#: ..\..\ZHIPM.Initialize.cs:593 +msgid "克隆失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1156 +#, csharp-format +msgid "已重置离线玩家 [ {0} ] 的数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1710 +msgid "各种buff[i:678]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:722 +msgid "您的恶魔心增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1308 +msgid "当前装备栏:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1809 +#: ..\..\ZHIPM.Initialize.cs:1975 +msgid "死亡次数[i:321]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:49 +msgid "" +"输入 /zreset help 来查看zreset系列指令帮助\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2006 +#: ..\..\ZHIPM.Initialize.cs:2194 +msgid "库存硬币数:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:547 +msgid "玩家都不在线,正在查询离线数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1288 +#, csharp-format +msgid "多个结果 玩家 【{0}】 的所有库存如下:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:627 +msgid "" +"输入 /zmodify [name] fruit [0或1] 来关闭或开启埃癸斯果增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1358 +msgid "宠物 + 矿车 + 坐骑 + 钩爪:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2972 +#: ..\..\ZHIPM.Initialize.cs:3058 +#: ..\..\ZHIPM.Initialize.cs:3150 +#: ..\..\ZHIPM.Initialize.cs:3223 +#: ..\..\ZHIPM.Initialize.cs:3299 +#: ..\..\ZHIPM.Initialize.cs:3375 +#: ..\..\ZHIPM.Initialize.cs:3450 +#: ..\..\ZHIPM.Initialize.cs:3525 +#: ..\..\ZHIPM.Initialize.cs:3622 +msgid "数字无效" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2752 +#: ..\..\ZHIPM.Initialize.cs:2753 +msgid "预计导出所有用户存档数目:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2693 +#: ..\..\ZHIPM.Initialize.cs:2704 +msgid "隐藏" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:990 +#, csharp-format +msgid "已重置离线玩家 [ {0} ] 的备份数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:608 +#: ..\..\ZHIPM.Initialize.cs:637 +msgid "输入 /zmodify help 查看修改玩家数据的指令帮助" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:728 +msgid "您的工匠面包增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2840 +#: ..\..\ZHIPM.Initialize.cs:2841 +#: ..\..\ZHIPM.Initialize.cs:2864 +#: ..\..\ZHIPM.Initialize.cs:2865 +#, csharp-format +msgid "导出成功!目录:tshock/Zhipm/{0}/{1}.plr" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1102 +msgid "" +"输入 /zreset 来清理该玩家的人物数据\n" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1112 +msgid "路径:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2003 +#: ..\..\ZHIPM.Initialize.cs:2191 +msgid " 当前生命值:" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:355 +msgid "错误:AddZPlayerDB 1 " +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:802 +msgid "" +"检测到符合该条件的玩家数目不唯一,请重新输入\n" +"包含:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:734 +msgid "您的埃癸斯水晶增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:691 +msgid "您的渔夫任务完成数已被修改为:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2928 +msgid "" +"输入 /zsort fish [num] 来查看当前[num]个人物任务鱼数目排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3687 +msgid "" +"输入 /zban add [reason] 来封禁无论是否在线的玩家,reason 可不填\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2900 +msgid "" +"输入 /zsort boss 来查看人物击杀Boss总数排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1218 +msgid "玩家已全部初始化" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:129 +msgid "您的备份保存失败!请尝试重进游戏重试" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:928 +#, csharp-format +msgid "{0}[i:74] {1}[i:73] {2}[i:72] {3}[i:71]" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2558 +msgid "不要耍小聪明" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:618 +msgid "" +"输入 /zmodify [name] life [num] 来修改玩家的血量\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3716 +#: ..\..\ZHIPM.Initialize.cs:3717 +#: ..\..\ZHIPM.Initialize.cs:3747 +#: ..\..\ZHIPM.Initialize.cs:3748 +#: ..\..\ZHIPM.Initialize.cs:3766 +#: ..\..\ZHIPM.Initialize.cs:3767 +#: ..\..\ZHIPM.Initialize.cs:3829 +#: ..\..\ZHIPM.Initialize.cs:3832 +#: ..\..\ZHIPM.Initialize.cs:3833 +#, csharp-format +msgid "用户 {0} 已被 {1} 封禁" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:844 +msgid "回档失败!" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3482 +msgid "" +"输入 /zsort point [num] 来查看当前[num]个人物点数排行榜\n" +"输入 /zsort point 来查看人物点数排行榜前十名\n" +"输入 /zsort point all 来查看所有玩家点数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2609 +msgid "你的名字含有指令关键字: me ,请更换" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:865 +#: ..\..\ZHIPM.Utils.cs:878 +msgid "您已回档成功!" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1816 +#: ..\..\ZHIPM.Initialize.cs:1982 +msgid "已击杀罕见生物[i:4274]:" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:929 +#, csharp-format +msgid "{0}铂金币 {1}金币 {2}银币 {3}铜币" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:834 +#, csharp-format +msgid "回档失败!未找到 [{0} - {1}] 号该备份" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3840 +msgid "" +"输入 /zban add uuid [uuid] [reason] 来封禁uuid\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2007 +msgid "各种buff:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:4199 +#: ..\..\ZHIPM.Initialize.cs:4281 +#: ..\..\ZHIPM.Initialize.cs:4376 +#: ..\..\ZHIPM.Initialize.cs:4482 +#: ..\..\ZHIPM.Initialize.cs:4559 +#: ..\..\ZHIPM.Initialize.cs:4657 +#: ..\..\ZHIPM.Initialize.cs:4756 +#: ..\..\ZHIPM.Initialize.cs:4853 +#: ..\..\ZHIPM.Initialize.cs:4919 +msgid "错误的点数:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2390 +#, csharp-format +msgid "玩家 {0} 已经在线了 {1}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3004 +msgid "" +"输入 /zsort time [num] 来查看当前[num]个人物在线时间排行榜\n" +"输入 /zsort time 来查看人物在线时间排行榜前十名\n" +"输入 /zsort time all 来查看所有玩家在线时常排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:523 +#: ..\..\ZHIPM.Initialize.cs:579 +msgid "玩家2不唯一" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:4593 +msgid "月亮领主" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:334 +msgid "错误:AddZPlayerDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2794 +#, csharp-format +msgid "{0} 名用户因数据错误导出失败" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:41 +msgid "" +"输入 /vs 来查看该玩家的状态\n" +msgstr "" + +#: ..\..\ZHIPM.cs:62 +msgid "该玩家不存在,请重新输入" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3605 +#: ..\..\ZHIPM.Initialize.cs:3609 +#: ..\..\ZHIPM.Initialize.cs:3637 +#: ..\..\ZHIPM.Initialize.cs:3641 +#: ..\..\ZHIPM.Initialize.cs:3655 +#: ..\..\ZHIPM.Initialize.cs:3659 +#, csharp-format +msgid "第 {0} 名:【{1}】 菜鸡值 {2:0.00}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2693 +#: ..\..\ZHIPM.Initialize.cs:2704 +msgid "启用" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1815 +#: ..\..\ZHIPM.Initialize.cs:1981 +msgid "已击杀Boss[i:3868]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2003 +#: ..\..\ZHIPM.Initialize.cs:2191 +msgid "最大生命值:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:968 +msgid "您的备份数据已重置" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1364 +msgid "宠物 矿车 坐骑 钩爪 染料:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3964 +#, csharp-format +msgid "玩家 [{0}] 未被冻结!" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5072 +msgid "数据异常,请重试" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:631 +msgid "" +"输入 /zmodify [name] cart [0或1] 来关闭或开启超级矿车增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3841 +msgid "输入 /zban add ip [ip] [reason] 来封禁ip" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:623 +msgid "" +"输入 /zmodify [name] torch [0或1] 来关闭或开启火把神增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:770 +msgid "您的超级矿车增益开启状态:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:46 +msgid "" +"输入 /zsort help 来查看排序系列指令帮助\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2313 +#: ..\..\ZHIPM.Initialize.cs:2316 +msgid "服务器将在20秒后清理世界内所有无用NPC,射弹和物品" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:699 +msgid "您的点数已被修改为:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:28 +msgid "" +"输入 /zsave 来备份自己的人物存档\n" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:887 +msgid "回档失败!未备份数据或该玩家未登录" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1709 +#: ..\..\ZHIPM.Initialize.cs:1897 +msgid "库存硬币数[i:855]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3787 +#: ..\..\ZHIPM.Initialize.cs:3878 +#: ..\..\ZHIPM.Initialize.cs:3969 +msgid "精准查找未找到,正在尝试模糊查找" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5148 +msgid "备份存档数目最小为 1 ,请不要输入无效值,已修改为默认 5" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2883 +#: ..\..\ZHIPM.Initialize.cs:3674 +msgid "输入 /zsort help 来查看排序系列指令帮助" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3753 +#: ..\..\ZHIPM.Initialize.cs:3754 +#, csharp-format +msgid "ip: {0} 已被 {1} 封禁" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:620 +msgid "" +"输入 /zmodify [name] mana [num] 来修改玩家的魔力\n" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:146 +msgid "错误:ReadZPlayerDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:329 +#, csharp-format +msgid "" +"玩家[{0}]备份 [{1} - {2}] 的内容为:\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2346 +#, csharp-format +msgid "玩家 [ {0} ] 的所有Buff均已消除" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2277 +msgid "已击杀生物数:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1707 +#: ..\..\ZHIPM.Initialize.cs:1895 +msgid " 当前魔力值[i:184]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3699 +#: ..\..\ZHIPM.Initialize.cs:3730 +msgid "参数过少" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1415 +msgid "虚空金库:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2605 +msgid "你的名字含有指令关键字: help ,请更换" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2817 +msgid "错误 ZhiExportPlayer :" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1236 +msgid "输入 /vi <玩家名> 来查看该玩家的库存" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1314 +msgid "装备栏1:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2925 +msgid "" +"输入 /zsort coin [num] 来查看当前[num]个人物硬币数目排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5057 +msgid "输入 /zbpos 来返回上次死亡地点" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3104 +msgid "" +"输入 /zsort coin 来查看人物硬币数目排行榜前十名\n" +"输入 /zsort coin [num] 来查看当前[num]个人物硬币数目排行榜\n" +"输入 /zsort coin all 来查看所有玩家硬币数目排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1333 +msgid "当前染料:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5087 +#, csharp-format +msgid "玩家 {0} 已传送到上次死亡地点" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2337 +msgid "该玩家不在线或不存在" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:143 +msgid "自动备份被禁用,请联系管理员询问详情" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:810 +#: ..\..\ZHIPM.Initialize.cs:911 +msgid "修改成功!" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1528 +msgid "输入 /vid <玩家名> 来查看该玩家的库存,不进行排列" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2845 +#: ..\..\ZHIPM.Initialize.cs:2846 +msgid "导出失败,因数据错误" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2114 +#: ..\..\ZHIPM.Initialize.cs:2284 +msgid "点数:" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:401 +msgid "错误:ClearZPlayerDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1582 +#, csharp-format +msgid "" +"玩家 【{0}】 的所有库存如下:\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5094 +msgid "点数不足,无法回溯上次死亡地点" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:802 +msgid "您的所有永久增益均关闭" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3538 +#: ..\..\ZHIPM.Initialize.cs:3549 +#, csharp-format +msgid "第 {0} 名:【{1}】 死亡次数 {2}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3438 +#, csharp-format +msgid "第 {0} 名:【{1}】 点数 {2} " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1098 +msgid "" +"输入 /zresetdb 来清理该玩家的备份数据\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5099 +msgid "未被允许死亡回调传送,请在配置文件中修改" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2102 +#: ..\..\ZHIPM.Initialize.cs:2272 +msgid "死亡次数:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2918 +msgid "" +"输入 /zsort clumsy [num] 来查看当前[num]个人物手残排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2676 +#: ..\..\ZHIPM.Initialize.cs:2718 +msgid "" +"输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n" +"输入 /zhide point 来取消 + 1 $ 的显示,再次使用启用显示" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1389 +msgid "保险箱:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:5032 +#, csharp-format +msgid "您遗失了:{0} 点数" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2979 +#: ..\..\ZHIPM.Initialize.cs:3065 +#: ..\..\ZHIPM.Initialize.cs:3157 +#: ..\..\ZHIPM.Initialize.cs:3230 +#: ..\..\ZHIPM.Initialize.cs:3306 +#: ..\..\ZHIPM.Initialize.cs:3457 +#: ..\..\ZHIPM.Initialize.cs:3532 +#: ..\..\ZHIPM.Initialize.cs:3629 +#, csharp-format +msgid "当前最多 {0} 人" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:677 +msgid "错误:ListAllExtraDB " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2926 +msgid "" +"输入 /zsort coin all 来查看所有玩家硬币数目排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2613 +msgid "你的名字含有指令关键字: uuid ,请更换" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:357 +msgid "克隆失败!请不要克隆自己" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:497 +msgid "错误:UpdateTshockDBCharac " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2901 +msgid "" +"输入 /zsort boss all 来查看所有玩家击杀Boss总数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1376 +msgid "猪猪储蓄罐:" +msgstr "" + +#: ..\..\ZHIPM.DB.cs:218 +msgid "错误:WriteZPlayerDB " +msgstr "" + +#: ..\..\ZHIPM.DB.cs:378 +msgid "错误:ClearALLZPlayerDB " +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:1015 +msgid "月亮领主()" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1160 +msgid "重置失败!未在原数据库中查到该玩家,请检查输入是否正确,该玩家是否避免SSC检测,再重新输入" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2107 +#, csharp-format +msgid "已击杀生物数:{0} 个" +msgstr "" + +#: ..\..\ZHIPM.cs:64 +msgid "该玩家不在线,正在查询离线数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3689 +msgid "输入 /zban add ip [reason] 来封禁ip" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2386 +msgid "点数奖励 + 1000" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:679 +msgid "您的魔力值已被修改为:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:648 +#: ..\..\ZHIPM.Initialize.cs:709 +#: ..\..\ZHIPM.Initialize.cs:806 +#: ..\..\ZHIPM.Initialize.cs:863 +msgid "格式错误!输入 /zmodify help 查看修改玩家数据的指令帮助" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2769 +#: ..\..\ZHIPM.Initialize.cs:2773 +#: ..\..\ZHIPM.Initialize.cs:2776 +#, csharp-format +msgid "用户 [{0}] 已导出,目录:tshock/Zhipm/{1}/{2}.plr" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:622 +msgid "" +"输入 /zmodify [name] fish [num] 来修改玩家的渔夫任务数\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2429 +msgid "已自动备份您的人物存档,自动保存您的额外数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:226 +msgid "您还未备份" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1891 +#: ..\..\ZHIPM.Initialize.cs:2188 +#, csharp-format +msgid "多个结果 玩家 【{0}】 的状态如下:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3703 +#: ..\..\ZHIPM.Initialize.cs:3734 +msgid "检测到违规行为,请联系管理员" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3382 +msgid "当前最多 人" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3363 +#: ..\..\ZHIPM.Initialize.cs:3388 +#: ..\..\ZHIPM.Initialize.cs:3399 +#, csharp-format +msgid "第 {0} 名:【{1}】 击杀罕见生物总数 {2} 个" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:336 +msgid "" +"输入 /zvisa [num] 来查看自己的第几个人物备份\n" +"输入 /zvisa name [num] 来查看该玩家的第几个人物备份" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1706 +#: ..\..\ZHIPM.Initialize.cs:1894 +msgid "最大生命值[i:29]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:703 +msgid "不可预料的错误,请重试或让该玩家重进游戏" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2597 +msgid "你的名字含有指令关键字: all ,请更换" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3041 +#: ..\..\ZHIPM.Initialize.cs:3045 +#: ..\..\ZHIPM.Initialize.cs:3073 +#: ..\..\ZHIPM.Initialize.cs:3077 +#: ..\..\ZHIPM.Initialize.cs:3091 +#: ..\..\ZHIPM.Initialize.cs:3095 +#, csharp-format +msgid "第 {0} 名:【{1}】 总硬币数 {2}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:43 +msgid "" +"输入 /zfre 来冻结该玩家\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1021 +#: ..\..\ZHIPM.Initialize.cs:1022 +#: ..\..\ZHIPM.Initialize.cs:1026 +msgid "所有玩家的额外数据均已重置" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:629 +msgid "" +"输入 /zmodify [name] worm [0或1] 来关闭或开启粘性蠕虫增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2109 +#: ..\..\ZHIPM.Initialize.cs:2279 +msgid "已击杀罕见生物:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:624 +msgid "" +"输入 /zmodify [name] demmon [0或1] 来关闭或开启恶魔心增益\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2805 +#, csharp-format +msgid "已打包为{0}/Zhipm/{1}.zip" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3138 +#: ..\..\ZHIPM.Initialize.cs:3163 +#: ..\..\ZHIPM.Initialize.cs:3174 +#, csharp-format +msgid "第 {0} 名:【{1}】 总完成任务鱼数 {2}" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:42 +msgid "" +"输入 /vs me 来查看自己的状态\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1104 +#: ..\..\ZHIPM.Initialize.cs:1190 +msgid "输入 /zresetallplayers 来清理所有玩家的所有数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:449 +#, csharp-format +msgid "克隆成功!您已将玩家 [{0}] 的数据克隆到 [{1}] 身上" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1503 +#: ..\..\ZHIPM.Initialize.cs:1586 +#, csharp-format +msgid "" +"多个结果 玩家 【{0}】 的所有库存如下:\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:163 +msgid "数字不合理" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1351 +msgid "染料3:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1432 +#, csharp-format +msgid "玩家 【{0}】 未携带任何东西" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:52 +msgid "" +"输入 /zban add ip 来封禁ip\n" +msgstr "" + +#: ..\..\ZHIPM.Utils.cs:908 +#, csharp-format +msgid "{0}小时 {1}分钟 {2}秒" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:37 +msgid "" +"输入 /zclone 将该玩家的人物数据复制给自己\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3331 +msgid "" +"输入 /zsort boss [num] 来查看当前[num]个人物击杀Boss总数排行榜\n" +"输入 /zsort boss 来查看人物击杀Boss总数排行榜前十名\n" +"输入 /zsort boss all 来查看所有玩家击杀Boss总数排行榜" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3513 +#, csharp-format +msgid "第 {0} 名:【{1}】 死亡次数 {2} " +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1103 +msgid "" +"输入 /zreset all 来清理所有玩家的人物数据\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:3946 +msgid "所有玩家均已解冻" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2899 +msgid "" +"输入 /zsort boss [num] 来查看当前[num]个人物击杀Boss总数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2108 +#: ..\..\ZHIPM.Initialize.cs:2278 +msgid "已击杀Boss:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:240 +#, csharp-format +msgid "" +"您的备份[{0} - {1}]的内容为:\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:931 +msgid "" +"输入 /zresetdb [name] 来清理该玩家的备份数据\n" +"输入 /zresetdb all 来清理所有玩家的备份数据" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:55 +msgid "" +"输入 /zclear buff all 来清理所有玩家所有Buff\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2330 +msgid "所有玩家的所有Buff均已消除" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:24 +msgid "输入 /zhelp 来查看指令帮助" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2908 +msgid "" +"输入 /zsort point 来查看人物点数排行榜前十名\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2537 +msgid "您已被冻结" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2483 +msgid "已清理所有射弹,物品,无用NPC" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1661 +#, csharp-format +msgid "多个结果 玩家 【{0}】 的所有库存如下:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:2912 +msgid "" +"\n" +"输入 /zsort death [num] 来查看当前[num]个人物死亡次数排行榜\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:45 +msgid "" +"输入 /zunfre all 来解冻所有玩家\n" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:1821 +#: ..\..\ZHIPM.Initialize.cs:1987 +msgid "点数[i:575]:" +msgstr "" + +#: ..\..\ZHIPM.Initialize.cs:32 +msgid "" +"输入 /zhide kill 来取消 kill + 1 的显示,再次使用启用显示\n" +msgstr "" +