• 欢迎!在发帖前请阅读每个板块置顶的版块须知。论坛 QQ 群:931748551
    鼓励大家多多发帖,这里有问必答。论坛左下角可切换明亮 / 黑暗模式哦。

Part 2.初步了解TShock插件模板

  • 查看 查看: 283
  • 最后更新 最后更新:
  • Part 2.初步了解TShock插件模板​

    本章你将学到:
    • TShock插件模板各部分的作用
    • TShock插件的初始化顺序

    插件模板​

    以下是一个常用的TShock插件模板
    C#:
    //代码来源:https://github.com/chi-rei-den/PluginTemplate/blob/master/src/PluginTemplate/Program.cs
    //恋恋的TShock插件模板,有改动(为了配合章节名)
    //来自棱镜的插件教程

    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 => "插件的作者";

    //插件的一句话描述
    public override string Description => "插件的描述";

    //插件的名称
    public override string Name => "插件的名字";

    //插件的版本
    public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;

    //插件的构造器
    public Plugin(Main game) : base(game)
    {
    }

    //插件加载时执行的代码
    public override void Initialize()
    {
    }

    //插件卸载时执行的代码
    protected override void Dispose(bool disposing)
    {
    if (disposing)
    {
    }
    base.Dispose(disposing);
    }

    }
    }

    插件基本信息​

    以下代码可以设置插件的一些基本信息,插件名建议按照功能命名,不要起奇怪名字(例如"炸裂")
    C#:
    //定义插件的作者名称
    public override string Author => "插件的作者";

    //插件的一句话描述
    public override string Description => "插件的描述";

    //插件的名称
    public override string Name => "插件的名字";

    //插件的版本
    public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
    • Author(插件作者)、Name(插件名字)、Version(插件版本)将会在插件初始化完成时显示
    1693020601153.png
    • 其中,Version可以通过new Version修改,如下:
    C#:
    //插件的版本
    public override Version Version => new Version(1, 0, 0, 0);
    //public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
    • 使用new Version()将会显示此方法参数为版本号(例如本例子中的"1.0.0.0")
    • 而使用Assembly.GetExecutingAssembly().GetName().Version获取的是程序集的版本号, 程序集版本号需要在项目属性中修改
    注: 如果你使用new Version()作为版本号,将会以你Version()的参数作为版本号,而不是程序集版本
    修改程序集版本

    1. 右键资源管理器中的项目(这里是Myfirstplugin),然后点击属性 img
    2. 修改程序集版本即可 img

    插件的构造器​

    插件的构造器,也叫构造函数。当TShock创造插件对象时,构造函数就会被调用,构造函数中的代码会比Initialize方法更先执行。服务端会先按照读取到插件的顺序(取决于插件的文件名)执行所有插件的构造函数,再按照Order由小到大执行插件的Initialize方法

    C#:
    //插件的构造器
    public Plugin(Main game) : base(game)
    {
    /*
    插件加载顺序,默认为1,数字越小越先加载
    其中int.MaxValue最晚加载, int.MinValue最先加载
    TShockAPI的Order为0, 所以Order < 0会比TShock更优先加载, Order > 0,则会比TShock更晚加载
    如果你不是指Order, 那么Order的默认值为1,会比TShock晚加载
    */
    base.Order = 1;
    }
    通常情况下,构造函数的执行会在TShock初始化之前如果在构造函数中编写代码(例如建表),可能会导致十分玄学的问题,所以没有特殊需要下一般插件的构造函数都会直接放空。如果没有特殊需要也不要修改Order

    插件的初始化方法​

    初始化函数是TShock插件中非常重要的部分,这个函数主要负责插件的初始化,可以用来注册钩子、添加命令、注册REST API命令、初始化配置文件、初始化数据库等
    C#:
    //插件加载时执行的代码
    public override void Initialize()
    {
    ServerApi.Hooks.ServerChat.Register(this, this.OnChat); //注册钩子
    Commands.ChatCommands.Add(new Command(permissions: new List<string> {""}, cmd: this.Fish, "钓鱼排行")); //添加命令
    TShock.RestApi.Register(new SecureRestCommand("/XSB/GetMap", GetMap, "rest.xsb.admin")); //注册REST API命令
    Config.GetConfig(); //初始化配置文件
    DB.Connect(); //初始化数据库
    }

    插件的卸载方法​

    插件的卸载方法在插件卸载(通常是TShock关闭时)被调用。如果你使用PluginLoader, 那么请你务必写好卸载方法, 否则会导致插件的功能卸载不完全, 重载出现异常。
    C#:
    //插件卸载时执行的代码
    protected override void Dispose(bool disposing)
    {
    if (disposing)
    {
    ServerApi.Hooks.ServerChat.Deregister(this, this.OnChat); //卸载钩子
    Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == Assembly.GetExecutingAssembly());
    //移除插件添加的命令
    }
    base.Dispose(disposing);
    }

    注册、注销有始有终

    C#:
    //注册 Initialize
    Commands.ChatCommands.Add(new Command("xsb.fishrank", Fish, "钓鱼排行"));
    ServerApi.Hooks.ServerChat.Register(this, this.OnChat);
    GetDataHandlers.KillMe.Register(OnKillMe);
    PlayerHooks.PlayerPermission+= PlayerHooksOnPlayerPermission;
    ...
    //注销 Dispose
    Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == Assembly.GetExecutingAssembly());
    ServerApi.Hooks.ServerChat.Deregister(this, this.OnChat);
    GetDataHandlers.KillMe.UnRegister(OnKillMe);
    PlayerHooks.PlayerPermission-= PlayerHooksOnPlayerPermission;
  • 正在加载……