快速上手
将 DominionAPI 接入附属插件,并完成第一次领地查询。
前置条件
- 服务器已经安装并启用 Dominion;
- 开发环境使用 Java 17 或更高版本;
- 编译时使用与目标 Dominion 兼容的 DominionAPI 版本;
- 插件运行在 Bukkit、Paper 或 Folia API 提供的服务端环境中。
DominionAPI 从 Dominion 2.9.0-beta 起提供。下面示例使用 Maven Central 的最新发布版本 x.x.x;页面打开后会自动查询并更新版本号。
如果版本号获取失败,页面会保留占位符;请点击版本号,或直接打开 Maven Central artifact 页面 查看最新发布版本。
1. 添加编译依赖
API 只应作为编译期依赖添加。不要把 DominionAPI 和 Dominion 的实现 JAR 一起打包进附属插件,否则可能造成类重复或版本冲突。
Maven
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>x.x.x</version>
<scope>provided</scope>
</dependency>
Gradle Groovy
repositories {
mavenCentral()
}
dependencies {
compileOnly 'cn.lunadeer:DominionAPI:x.x.x'
}
Gradle Kotlin DSL
repositories {
mavenCentral()
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:x.x.x")
}
如果你的目标服务器仍使用旧版 Dominion,请将依赖版本换成对应的兼容版本,并重新检查本文档中标记为版本敏感的 API。
2. 声明插件依赖
如果附属没有 Dominion 就无法工作,在 plugin.yml 中使用硬依赖:
name: MyDominionAddon
version: 1.0.0
main: com.example.mydominionaddon.MyDominionAddon
api-version: '1.20'
depend:
- Dominion
如果 Dominion 只是可选集成,使用 softdepend,并在 onEnable() 中检测插件是否启用;没有 Dominion 时只关闭集成功能,不要让插件的其他功能无法启动。
不要在 onLoad() 阶段依赖 DominionAPI.getInstance()。此时 Dominion 可能还没有完成初始化。
3. 获取 API 单例
下面的插件可以在玩家加入时查询其所在位置的领地:
package com.example.mydominionaddon;
import cn.lunadeer.dominion.api.DominionAPI;
import cn.lunadeer.dominion.api.dtos.DominionDTO;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
public final class MyDominionAddon extends JavaPlugin implements Listener {
private DominionAPI dominionAPI;
@Override
public void onEnable() {
if (!getServer().getPluginManager().isPluginEnabled("Dominion")) {
getLogger().severe("Dominion is not enabled; disabling addon.");
getServer().getPluginManager().disablePlugin(this);
return;
}
dominionAPI = DominionAPI.getInstance();
if (dominionAPI == null) {
getLogger().severe("DominionAPI is unavailable; disabling addon.");
getServer().getPluginManager().disablePlugin(this);
return;
}
getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
DominionDTO dominion = dominionAPI.getDominion(event.getPlayer().getLocation());
if (dominion == null) {
getLogger().info(event.getPlayer().getName() + " is not inside a dominion.");
return;
}
getLogger().info(event.getPlayer().getName() + " is in " + dominion.getName());
}
}
getDominion(Location) 是直接的空间查询。如果你需要让 Dominion 同时维护玩家的“当前领地”状态并触发进入/离开事件,可以改用 getPlayerCurrentDominion(Player),详见主 API。
4. 验证接入
在测试服务器中检查:
- 控制台显示附属在 Dominion 之后启用;
DominionAPI.getInstance()不为null;- 玩家在领地内和领地外各触发一次查询;
- 服务器没有重复打包
DominionAPI类; - Paper 与 Folia 目标环境都完成过实际测试。