本章你将学到:
- 安装TShock插件模板
- 使用
Rider
创建插件项目 - 初步了解编写一个插件的流程
dotnet new install TShock.Plugin.ProjectTemplates
Note
一般来讲,项目名只由字母(A-Z,a-z),数字(0-9),下划线(_)组成,并且项目名具有实际意义
不要使用中文!不要使用中文!不要使用中文!(引自棱镜)
Tip
解决方案中可以包含多个插件项目。使用同一个解决方案存放多个插件项目可以方便管理多个插件代码,并且方便项目之间互相引用。
注: 如果提示没有按照目标框架,点击提示安装即可。
它是一个非常重要的工具窗口,它可以用来管理、操作你的项目中的各个文件。其中Plugin.cs就是你插件的源码文件,我们双击就可以打开它。
这里有个简单的TShock插件示例,你可以复制替换到Plugin.cs
using System.Reflection;
using Terraria;
using TerrariaApi.Server;
using TShockAPI;
namespace MyFirstPlugin;
[ApiVersion(2, 1)]
public class Plugin : TerrariaPlugin
{
//插件的名称
public override string Name => "MyFirstPlugin";
//插件作者名字
public override string Author => "You Name";
//插件功能的一句话描述
public override string Description => "Plugin Description";
//插件的版本, 可以采用日期来命名, eg: 2024年1月4日第1个版本 -> new(2024, 1,4,1)
public override Version Version => new(2024, 1,4,1);
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
/*
添加一个TShock命令,下面这句的意思是: (看不懂没关系,下面有专门的章节讲解命令)
添加一个命令: 权限为`plugin.perm`,执行这条命令时调用`HelloWorldCommand`方法,命令的名字是`helloworld`,别名是`hw`
*/
Commands.ChatCommands.Add(new Command("plugin.perm" , HelloWorldCommand, "helloworld", "hw"));
}
//插件卸载时执行的代码
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 HelloWorldCommand(CommandArgs args)
{
//向触发事件的玩家发送一条绿色的消息 "Hello world!"
args.Player.SendSuccessMessage("Hello world!");
}
}
粘贴代码后,左下角的错误数是0
,恭喜你可以开始构建插件了
Note
如果有错误存在,可能是你复制漏了某些地方 也可能是你的环境有问题
Note
文件的作用:
.dll: 插件的本体
.pdb: 调试文件, 放在ServerPlugins
文件夹和插件一起加载, 报错时会显示报错方法对应源代码的具体位置
- 然后把插件的
.dll
文件和.pdb
文件复制到TShock的ServerPlugins
文件夹就可以开始调试啦~
- 为什么要安装PDB (看不懂可以先忽略)
我们下面有段代码,会在插件加载时报错
29 public void KoKoLoveYou()
30 {
//抛出错误,模拟报错 :(
31 throw new Exception("别做梦了Cai");
32 }
33
34 //插件加载时执行的代码
35 public override void Initialize()
36 {
37 if ("Cai"=="SB") //Cai不是SB, 所以KoKoLoveYou不会在这里被执行
38 {
39 KoKoLoveYou();
40 }
41
42 if (1 + 1 == 2) //1+1=2 所以KoKoLoveYou在这里被执行
43 {
44 KoKoLoveYou();
45 }
46 }
-
从报错我们可以知道,在调用插件的
Initialize
方法时,KoKoLoveYou
方法报错。此时我们回到源代码,发现Initialize
方法中有两个KoKoLoveYou
,所以就会出现找不到具体报错位置的情况(实际情况肯定不是向上面例子一样你一眼就能看出来哪里有问题的) -
如果我们安装了PDB 此时,报错的调用栈就会告诉我们报错方法对应代码的具体位置,这里我们看到
Initialize
在第44行
报错,对应我们代码的第二个KoKoLoveYou
方法,这样报错的位置就被轻松找到了
当我们修改代码后,我们需要把新构建的插件丢进ServerPlugins
里,同时还需要重启TShock来重新加载我们的插件,TShock重启的速度很慢,这样很浪费时间,所以我们就可以使用VBY.PluginLoader
热重载插件
命令 | 作用 |
---|---|
/load load | 加载所有PluginLoader所管理的插件 |
/load unload | 卸载PluginLoader所管理的插件 |
/load reload | 重载PluginLoader所管理的插件 |
/load plugins | 显示PluginLoader已加载的插件 |
- 使用前你必须删除
ServerPlugins
中你需要热重载的插件
- 安装
VBY.PluginLoader
,你可以在TShock中文插件库找到这个插件
- 安装并加载后你的
TShock
根目录下会多出一个PluginLoader
文件夹, 我们把插件丢进去
- 此时使用命令
/hw
,发现插件已经被VBY.PluginLoader
加载。如果弹出两个, 说明你没有删除原插件文件夹的插件
- 我们这时候修改一下我们的代码,然后重新构建
//执行指令时对指令进行处理的方法 private void HelloWorldCommand(CommandArgs args) { //显示 “Hello 玩家的名字!” args.Player.SendSuccessMessage($"Hello {args.Player.Name}!"); }
- 把文件替换到
PluginLoader
文件夹
- 执行命令
/load reload
- 此时我们再执行
/hw
,就会出现我们修改过的结果啦~
Note
控制台也算是玩家(TSPlayer.Server)
,它的名字是Server