//代码来源:https://github.com/chi-rei-den/PluginTemplate/blob/master/src/PluginTemplate/Program.cs //恋恋的TShock插件模板,有改动(为了配合章节名) //来自棱镜的插件教程 using Org.BouncyCastle.Crypto.Tls; using System; using System.Collections.Generic; using System.Reflection; using Terraria; using TerrariaApi.Server; using TShockAPI; namespace Plugin { [ApiVersion(2, 1)] public class Plugin : TerrariaPlugin { //定义插件的作者名称 public override string Author => "lyt"; //插件的一句话描述 public override string Description => "使用docmd,权限同名"; //插件的名称 public override string Name => "在服务端执行命令"; //插件的版本 public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; //插件的构造器 public Plugin(Main game) : base(game) { } //插件加载时执行的代码 public override void Initialize() { //恋恋给出的模板代码中展示了如何为TShock添加一个指令 Commands.ChatCommands.Add(new Command( permissions: new List { "plugin.permission1", "plugin.permission2", }, cmd: this.Cmd, "helloworld", "hw")); Commands.ChatCommands.Add(new Command("docmd", Cmd2, "docmd")); //Command()中第一个参数是权限名,第二个参数是回调函数,第三个参数是命令名 } //插件卸载时执行的代码 protected override void Dispose(bool disposing) { if (disposing) { //移除所有由本插件添加的所有指令 var asm = Assembly.GetExecutingAssembly(); Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); } base.Dispose(disposing); } //执行指令时对指令进行处理的方法 private void Cmd(CommandArgs args) { args.Player.SendSuccessMessage("Hello world!"); } private async void Cmd2(CommandArgs args) { if (args.Parameters.Count == 0) { args.Player.SendSuccessMessage("输入的命令为空"); return; } string str = args.Message.Substring(6); // "docmd "共7位 args.Player.SendSuccessMessage(str); // 创建一个新的任务来执行命令 Task task = Task.Run(async () => { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.WriteLine(str + "&exit"); p.StandardInput.AutoFlush = true; string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); p.Close(); System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); byte[] bytes = asciiEncoding.GetBytes(output); System.Text.Encoding utf8Encoding = System.Text.Encoding.UTF8; string utf8Output = utf8Encoding.GetString(bytes); //System.Text.Encoding utf8Encoding = System.Text.Encoding.UTF8; // 修改这里 //string utf8Output = utf8Encoding.GetString(System.Text.Encoding.ASCII.GetBytes(output)); // 修改这里 args.Player.SendSuccessMessage(utf8Output); }); // 等待任务完成 await task; } } }