快速上手
文档/dominion-api/快速上手

快速上手

将 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. 验证接入

在测试服务器中检查:

  1. 控制台显示附属在 Dominion 之后启用;
  2. DominionAPI.getInstance() 不为 null
  3. 玩家在领地内和领地外各触发一次查询;
  4. 服务器没有重复打包 DominionAPI 类;
  5. Paper 与 Folia 目标环境都完成过实际测试。

下一步