欢迎使用帮助中心

请从左侧选择一个文档开始阅读

正在加载文档,请稍候...

01-插件基础接口

插件基础

插件是什么?

插件是一个继承 ServerPlugin 类的 C# 程序,服务器启动时会自动加载 Plugins 文件夹中的插件。

最简单的插件

using Game.Server;

public class MyPlugin : ServerPlugin
{
    public override string Name => "我的插件";
    public override int Version => 1;
    public byte FirstLevel => 0;

    public override void Initialize()
    {
        Console.WriteLine("插件加载成功!");
    }

    public override void Load() { }
    public override void Save() { }
}

必须要写的成员

成员 类型 说明
Name string 插件名称,显示在日志中
Version int 版本号,整数
FirstLevel byte 优先级,填 0 就行
Initialize() 方法 插件加载时执行,用来注册事件
Load() 方法 读取数据时调用
Save() 方法 保存数据时调用

插件的生命周期

服务器启动
    ↓
Initialize() 被调用 ← 在这里注册事件监听
    ↓
Load() 被调用 ← 在这里读取配置文件
    ↓
插件运行中...
    ↓
Save() 被调用 ← 服务器关闭或自动保存时
    ↓
服务器关闭

注册事件

Initialize() 中注册你想监听的事件:

using Game.Server;
using Game.Server.PlayerEvent;

public class MyPlugin : ServerPlugin, IPlayerEnterGameEventHandle
{
    public override string Name => "MyPlugin";
    public override int Version => 1;
    public byte FirstLevel => 0;

    public override void Initialize()
    {
        // 注册玩家进入/离开事件
        PlayerEnterGameEventManager.AddObject(this);
    }

    // 玩家进入时调用
    void IPlayerEnterGameEventHandle.PlayerEnter(PlayerData player)
    {
        Console.WriteLine($"欢迎 {player.Name}!");
    }

    // 玩家离开时调用
    void IPlayerEnterGameEventHandle.PlayerLeave(PlayerData player)
    {
        Console.WriteLine($"{player.Name} 离开了");
    }

    public override void Load() { }
    public override void Save() { }
}

可用的事件接口

接口 说明
IPlayerEnterGameEventHandle 玩家进入/离开
IPlayerMoveHandle 玩家移动
IPlayerBreakAndPlaceHandle 方块破坏/放置
IPlayerInteractEventHandle 玩家交互(点击、攻击等)

项目配置文件

创建 .csproj 文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <OutputType>Library</OutputType>
    <AssemblyName>MyPlugin</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="Engine">
      <HintPath>游戏目录\Engine.dll</HintPath>
    </Reference>
    <Reference Include="GameEntitySystem">
      <HintPath>游戏目录\GameEntitySystem.dll</HintPath>
    </Reference>
    <Reference Include="LiteNetLib">
      <HintPath>游戏目录\LiteNetLib.dll</HintPath>
    </Reference>
    <Reference Include="Newtonsoft.Json">
      <HintPath>游戏目录\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

小贴士

  1. 一个插件一个文件:简单插件可以写在一个 .cs 文件里
  2. 命名要有意义:插件名最好能说明它的功能
  3. 版本号递增:每次更新后记得改版本号
  4. 测试再发布:先在本地测试没问题再放到服务器

常见问题

Q: 插件没加载?
A: 检查 .dll 是否在 Plugins 文件夹,检查是否有报错。

Q: 报错找不到类型?
A: 确认引用了正确的 dll 文件。

Q: 事件没触发?
A: 确认在 Initialize() 中调用了 EventManager.AddObject(this)

这篇文章对您有帮助吗?