外观
事件与命令路线图
先从需求选择接口,不要让一个插件订阅所有事件。
常见需求映射
| 需求 | 接口或基类 | 注册入口 |
|---|---|---|
| 玩家进入与离开 | IPlayerEnterGameEventHandle | PlayerEnterGameEventManager |
| 玩家正式进入 Playing | IPlayerIntoPlayingHandle | PlayerIntoPlayingEventManager |
| 放置与破坏方块 | IPlayerBreakAndPlaceHandle | PlayerBreakAndPlaceBlockEventManager |
| 交互、使用与攻击 | IPlayerInteractEventHandle | PlayerInteractEventManager |
| 玩家移动 | IPlayerMoveHandle | PlayerMoveEventManager |
| 聊天与告示牌 | IMessageEventHandle | MessageEventManager |
| 自定义密码验证 | IPasswordValidationEventHandle | PasswordValidationEventManager |
| 生物受伤与治疗 | ICreatureHealthEventHandle | 对应健康事件管理器 |
| 方块内容变化 | IBlockChangeEventHandle | BlockChangeEventManager |
| 自定义命令 | AbstractProcessCmd | DLL 扫描时自动注册 |
准确签名、返回值约定和命名空间见完整接口参考。
bool 返回值
多数事件中的 false 表示阻止原行为。多个插件同时处理时,任何插件的拒绝都可能使最终结果失败,因此:
- 默认允许时显式返回
true; - 日志中记录阻止原因、玩家和位置;
- 不用异常代替权限拒绝;
- 确认插件卸载后不会留下永久锁定数据。
命令设计
命令类继承 AbstractProcessCmd。设计时至少考虑:
AuthLevel权限等级;DisplayType是否在帮助中可见;- 参数缺失和非法输入;
- 玩家上下文与控制台上下文;
- 是否支持
GetSuggestions自动补全; - 长耗时任务不能阻塞主循环。
注册与清理
事件通常在 Initialize() 注册。如果当前服务端支持卸载或热重载,应在对应阶段调用 RemoveObject(this)。配置读取放在 Load(),持久化写入放在 Save(),不要重复注册事件。
