Skip to content

开发者指南

本文档为希望扩展或修改 EsbpmPlugin 功能的开发者提供技术指导。

项目结构

了解 EsbpmPlugin 的项目结构是开发的第一步:

EsbpmPlugin/
├── src/main/java/com/starlake/esbpm/
│   ├── EsbpmPlugin.java         # 插件主类
│   ├── commands/                # 命令相关类
│   │   └── FlyCommand.java      # 飞行命令实现
│   ├── listeners/               # 事件监听器
│   │   ├── PlayerJoinListener.java    # 玩家加入事件
│   │   ├── PlayerInteractListener.java # 玩家交互事件
│   │   └── GamemodeListener.java      # 游戏模式相关事件
│   ├── utils/                   # 工具类
│   │   └── ConfigManager.java   # 配置管理
│   └── effects/                 # 效果相关类
│       └── SpeedEffectManager.java # 速度效果管理
├── src/main/resources/
│   ├── plugin.yml               # 插件元数据
│   └── config.yml               # 默认配置文件
└── pom.xml                      # Maven 项目配置

插件主类

EsbpmPlugin.java 是插件的入口点,负责初始化插件、注册事件监听器和命令等。

主要方法

onEnable()

  • 作用:插件启动时执行的初始化方法
  • 主要功能
    • 加载配置文件
    • 注册事件监听器
    • 注册命令
    • 初始化各功能模块
java
@Override
public void onEnable() {
    // 初始化配置
    configManager = new ConfigManager(this);
    configManager.loadConfig();
    
    // 初始化功能模块
    speedEffectManager = new SpeedEffectManager(this);
    
    // 注册事件监听器
    registerListeners();
    
    // 注册命令
    registerCommands();
    
    getLogger().info("EsbpmPlugin has been enabled!");
}

onDisable()

  • 作用:插件停用或服务器关闭时执行的清理方法
  • 主要功能
    • 保存配置更改
    • 执行必要的资源清理
java
@Override
public void onDisable() {
    // 保存配置(如果有更改)
    configManager.saveConfig();
    
    // 清理资源
    speedEffectManager.clearEffects();
    
    getLogger().info("EsbpmPlugin has been disabled!");
}

配置管理

ConfigManager 类负责处理配置文件的加载、保存和访问:

主要方法

loadConfig()

  • 作用:从文件加载配置
  • 功能:创建默认配置文件(如果不存在)并加载配置值

saveConfig()

  • 作用:保存当前配置到文件
  • 功能:将内存中的配置对象序列化为 YAML 并写入文件

getConfigValue()

  • 作用:获取指定配置项的值
  • 参数:配置路径(如 "speed-effect.level")
  • 返回值:配置项的值(可能为任何类型)

事件监听器

插件使用多个事件监听器来响应用户交互和游戏状态变化:

PlayerJoinListener

  • 监听事件PlayerJoinEvent
  • 功能:当玩家加入服务器时应用速度效果和强制游戏模式

PlayerInteractListener

  • 监听事件PlayerInteractEvent
  • 功能:阻止玩家使用危险物品

GamemodeListener

  • 监听事件PlayerGameModeChangeEvent, PlayerJoinEvent
  • 功能:强制执行游戏模式设置

命令实现

插件目前实现了 /fly 命令,位于 FlyCommand.java 中:

命令结构

java
public class FlyCommand implements CommandExecutor {
    private final EsbpmPlugin plugin;
    
    public FlyCommand(EsbpmPlugin plugin) {
        this.plugin = plugin;
    }
    
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        // 命令实现逻辑
        return true;
    }
}

命令注册

命令在插件主类的 registerCommands() 方法中注册:

java
private void registerCommands() {
    getCommand("fly").setExecutor(new FlyCommand(this));
}

添加新功能

要向插件添加新功能,请按照以下步骤操作:

1. 创建新的功能类

创建实现功能逻辑的新类,建议遵循现有的包结构。

2. 在插件主类中初始化

onEnable() 方法中初始化新功能类的实例。

3. 注册必要的事件监听器

如果新功能需要响应游戏事件,创建新的监听器类并在 registerListeners() 方法中注册。

4. 添加配置项

在默认配置文件 resources/config.yml 中添加新功能的配置项,并在 ConfigManager 中实现相应的访问方法。

5. 添加命令(如果需要)

如果新功能需要命令接口,创建新的命令类并在 registerCommands() 方法中注册。

6. 添加权限节点

plugin.yml 文件中添加新功能的权限节点。

代码风格指南

为了保持代码一致性,请遵循以下代码风格指南:

  1. 命名约定

    • 类名使用 PascalCase(如 PlayerJoinListener
    • 方法和变量名使用 camelCase(如 loadConfig()
    • 常量使用全大写加下划线(如 MAX_SPEED_LEVEL
  2. 代码格式

    • 使用 4 个空格进行缩进(不使用制表符)
    • 每行不超过 120 个字符
    • 大括号放在行尾(如 if (condition) {
  3. 注释

    • 为类和公共方法添加 JavaDoc 注释
    • 为复杂逻辑添加行内注释
    • 注释应清晰简洁,说明代码的目的而非实现细节
  4. 异常处理

    • 捕获具体的异常类型,而不是通用的 Exception
    • 提供有意义的错误消息
    • 记录异常日志而不是忽略

构建和测试

使用 Maven 构建插件

EsbpmPlugin 使用 Maven 进行项目管理和构建:

  1. 确保已安装 Java Development Kit (JDK) 和 Maven
  2. 在项目根目录执行以下命令:
bash
mvn clean package
  1. 构建成功后,插件的 JAR 文件将位于 target 目录中

测试插件

测试插件的推荐方法:

  1. 设置一个本地测试服务器
  2. 将构建的插件 JAR 文件复制到服务器的 plugins 目录
  3. 启动服务器并测试功能
  4. 查看服务器日志以识别任何错误或警告

扩展插件

除了直接修改插件代码外,还可以通过以下方式扩展插件功能:

编写兼容的附加插件

可以编写专门的附加插件,通过 Bukkit/Spigot API 与 EsbpmPlugin 交互。

使用事件系统

监听 EsbpmPlugin 触发的事件或让 EsbpmPlugin 监听您的插件触发的事件。

配置文件扩展

可以通过外部配置文件或数据库扩展插件的配置能力。

常见开发问题

插件之间的依赖

  • 问题:需要使用其他插件的功能
  • 解决方法
    1. plugin.yml 中声明依赖:depend: [OtherPlugin]
    2. 使用 PluginManager.getPlugin("OtherPlugin") 获取插件实例
    3. 确保在使用其他插件功能前检查插件是否已加载

版本兼容性

  • 问题:插件在不同的 Minecraft 版本上表现不一致
  • 解决方法
    1. 使用支持的 Bukkit API 版本
    2. 避免使用内部 API 或未记录的功能
    3. 在不同版本的服务器上测试插件

性能优化

  • 问题:插件导致服务器性能下降
  • 解决方法
    1. 减少事件监听器中的复杂操作
    2. 使用适当的数据结构提高查找效率
    3. 避免在主游戏线程中执行长时间运行的任务
    4. 使用异步任务处理不需要立即完成的操作

提交代码贡献

如果您希望贡献代码,请遵循 CONTRIBUTING.md 中的指南。