Skip to content

示例插件 ​

学习插件 API 最快的方式是读一个完整的插件。Empostor.Plugins.Example 随源码一同发布,刻意保持了极简结构。

先读这里

编写插件介绍环境搭建,本文档说明最终成品的形态。

它演示了什么 ​

概念所在位置
声明一个插件ExamplePlugin.cs
注册事件监听器ExamplePluginStartup.cs
以编程方式创建房间ExamplePlugin.cs 的 EnableAsync
处理客户端 / 玩家 / 会议 / 游戏事件Handlers/

插件类 ​

插件是继承 PluginBase 并标注 EmpostorPlugin 特性的类:

csharp
[EmpostorPlugin("gg.empostor.example")]
public class ExamplePlugin : PluginBase
{
    private readonly ILogger<ExamplePlugin> _logger;
    private readonly IGameManager _gameManager;

    public ExamplePlugin(ILogger<ExamplePlugin> logger, IGameManager gameManager)
    {
        _logger = logger;
        _gameManager = gameManager;
    }

    public override async ValueTask EnableAsync()
    {
        _logger.LogInformation("Example is being enabled.");

        var game = await _gameManager.CreateAsync(
            new NormalGameOptions(), GameFilterOptions.CreateDefault());

        if (game == null)
        {
            _logger.LogWarning("Example game creation was cancelled");
        }
        else
        {
            game.DisplayName = "Example game";
            await game.SetPrivacyAsync(true);
            _logger.LogInformation("Created game {0}.", game.Code.Code);
        }
    }

    public override ValueTask DisableAsync()
    {
        _logger.LogInformation("Example is being disabled.");
        return default;
    }
}

关键只有两个钩子:服务器加载插件时执行 EnableAsync,卸载时执行 DisableAsync,其余依赖均通过依赖注入获取。

把工作放进 EnableAsync

耗时的初始化请放在 EnableAsync,不要写在构造函数里。构造函数在服务注册阶段执行,此时依赖可能尚未就绪。

注册事件监听器 ​

监听器单独成文件,通过 IPluginStartup 统一注册:

csharp
public class ExamplePluginStartup : IPluginStartup
{
    public void ConfigureHost(IHostBuilder host) { }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IEventListener, GameEventListener>();
        services.AddSingleton<IEventListener, ClientEventListener>();
        services.AddSingleton<IEventListener, PlayerEventListener>();
        services.AddSingleton<IEventListener, MeetingEventListener>();
    }
}

每个监听器都以单例形式注册为 IEventListener,服务端会自动发现,无需额外清单列出它们。

示例按事件类别注册了四组:

监听器覆盖范围
GameEventListener房间创建、开始、结束
ClientEventListener客户端连接与断开
PlayerEventListener玩家加入、离开、聊天
MeetingEventListener会议开始与结束、投票

编译 ​

bash
dotnet build -c Release

把生成的 .dll 放入服务端的 plugins/ 目录后重启服务器。

下一步 ​

把 Empostor.Plugins.Example 复制到自己的解决方案中并改名 —— 这就是官方推荐的起点。之后可以翻阅插件列表,了解官方插件如何处理配置文件与数据持久化。