首先介绍使用的接口: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顶部构建工件即可。
插件编译完后内部是这样的: