首先介绍使用的接口:Bukkit
Bukkit与Forge不同,Bukkit分为两个版本1.13及以上与1.13以下,他遵守java更新规范,不删除方法、不修改方法名、不更改方法最后功能,所以有很好的向上兼容特性,即1.13插件可以用在1.14服务端,但1.14插件不一定用在1.13服务端。
BukkitAPI文档https://bukkit.windit.net/javadoc/
准备开发:任意Bukkit相关服务器核心(外部库),服务端指定版本java,IntelliJ IDEA尽可能最新版,本次重置计划尽可能避免使用nms所以不需要确立具体服务端版本,但是使用1.17.1版本。

S1·插件入口
首先还是要创建项目包和主类,先用IDEA创建一个空的不用任何模板的java项目,在src文件夹内创建一个主包self,主包下创建一个CyanHoning,src/self/CyanHoning.java →:

//公开(插件加载器读取)主类名(自定义)extends JavaPlugin(继承JavaPlugin以便于加载器载入)
public class CyanHoning extends JavaPlugin {
    //插件静态化,讲到再解释
    private static CyanHoning ins;
    //对外静态化插件对象获取方法
    public static CyanHoning getIns() {return ins;}
    //日志过滤器,过滤一些不必要日志
    private static final CHFilter chf = new CHFilter();
    //服务器图标对象,还未载入,此处仅读入
    public static CachedServerIcon csi;
    //基本权限等级池引入,纳入自制权限管理插件讲解
    public static BasePerm bp;
    //登录信息池引入,纳入自制登陆插件讲解
    public static LoginInfo li;
    //功能需要变量池引入,纳入插件功能拓展讲解
    public static FunctionAll fa;
    //插件加载方法,读入主类时从此开始执行,执行完插件功能才会继续加载完备
    @Override
    public void onLoad() {
        //加载信息
        Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件正在加载......");
        //设置要过滤什么内容
        Bukkit.getPluginManager().getPlugin("CyanHoning").getLogger().setFilter(chf);
    }
    //插件启用方法,该方法结束后插件完全启动,参与游戏周期
    @Override
    public void onEnable() {
        //初始化插件静态化
        ins = this;
        //输出配置文件config.yml
        saveDefaultConfig();
        //输出资源文件,此处填写的是服务器图标,false意味着不覆盖输出
        saveResource("servericon.png", false);
        //实例化三池
        bp = new BasePerm();
        li = new LoginInfo();
        fa = new FunctionAll();
        //监听类注册,接下来讲
        Bukkit.getPluginManager().registerEvents(new ListenerAll(), this);
        //指令类注册,接下来讲
        //传统指令注册
        Bukkit.getPluginCommand("opc").setExecutor(new OPCmd());
        //反射式指令注册
        CommandMap map = null;
        final Class<?> c = Bukkit.getServer().getClass();
        for (final Method method : c.getDeclaredMethods()) {
            if (method.getName().equals("getCommandMap")) {
                try {
                    map = (CommandMap) method.invoke(Bukkit.getServer(), new Object[0]);
                } catch (IllegalAccessException | InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
        Remake rm = new Remake();
        map.register(this.getDescription().getName(), rm);
        //控制台日志输出示例
        Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件已经加载成功!");
        //加载服务器图标
        try {
            csi = Bukkit.loadServerIcon(new File("plugins/CyanHoning/servericon.png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //插件卸载时执行的方法,一般关闭插件一些常驻服务或者弹出一些提示,回收占用资源
    @Override
    public void onDisable() {
        ins = null;
        //卸载成功信息
        Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件已经卸载成功!");
    }
}

这是要重置的插件的主类,我们提取一下让他简明一下

//公开(插件加载器读取)主类名(自定义)extends JavaPlugin(继承JavaPlugin以便于加载器载入)
public class CyanHoning extends JavaPlugin {
    //插件静态化,讲到再解释
    private static CyanHoning ins;
    //对外静态化插件对象获取方法,为了封装性,实际上上面那行变成public这句就没必要了
    public static CyanHoning getIns() {return ins;}
    //插件加载方法,读入主类时从此开始执行,执行完插件功能才会继续加载完备
    @Override
    public void onLoad() {
        //加载信息
        Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件正在加载......");
    }
    //插件启用方法,该方法结束后插件完全启动,参与游戏周期
    @Override
    public void onEnable() {
        //初始化插件静态化
        ins = this;
        //输出配置文件config.yml,不用也还是输出好,创建个文件夹表明正常启动了
        saveDefaultConfig();
        //加载成功信息
        Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件已经加载成功!");
    }
    //插件卸载时执行的方法,一般关闭插件一些常驻服务或者弹出一些提示,回收占用资源
    @Override
    public void onDisable() {
        //释放指针
        ins = null;
        //卸载成功信息
        Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件已经卸载成功!");
    }
}

S2·具备上面这段,插件主类就是完整的了,写完主类就要写一个文件plugin.yml,插件加载器会首先找这个文件,获取一系列信息才能找到插件主类进行加载(要是复制,//注释记得删除):

name: CyanHoning//插件名
version: 1.0.3//插件版本
authors: [ootw,clyhe]//插件作者
api-version: 1.13//接口版本
main: self.CyanHoning//谁是主类

//这之后这些些后面讲,没有写插件也能正常加载
commands:
  opc:
    description: "OP指令"
    usage: "/opc"
    aliases:
      - opc
    permission: CH.all
    permission-message: "没有指令权限"

permissions:
  CH.all:
    description: "all perm"
    default: true

写完后按ctrl+shift+alt+s点击artifact(工件),点击+添加,点击JAR选择来自具有依赖项的模块...,选择提取到目标JAR点击确定,然后剔除外部库,点击+添加文件,找到plugin.yml添加进入,点击确定,IDEA顶部构建工件即可。
插件编译完后内部是这样的:
插件.png

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏