实现了 api 支持

This commit is contained in:
ZhangYuheng 2024-09-23 15:04:56 +08:00
parent 5bdd15f442
commit a350e01e4b
24 changed files with 523 additions and 39 deletions

View File

@ -36,6 +36,11 @@ For detail functions and features of Dominion, you can view [Introduction](intro
> Although this plugin supports Spigot, we strongly recommend that you upgrade your core to Paper or its forked (such as
> Purpur) for a better performance experience.
## For developer
Dominion provides some simple (for now) APIs for developers to build something amazing depends on Dominion. You can
take a look at [Developer](docs/en-us/developer.md) for more details.
## Help us improve
If you encounter any problems during use or have any suggestions, please feel free to open

View File

@ -42,6 +42,11 @@ Dominion 是一个完全开源、免费,专为高版本开发,面向未来
交流QQ群309428300
## 开发者指南
Dominion 提供了一些简单只是暂时后续会逐步增强api的 API 供开发者基于 Dominion
构建一些更有趣的东西。您可以查看 [开发者指南](docs/zh-cn/developer.md) 了解更多细节。
## 整个烂活儿
| | Dominion | R插件 | G插件 |

View File

@ -1,5 +1,6 @@
plugins {
id("java")
id("maven-publish")
}
java {
@ -14,3 +15,28 @@ tasks.withType<JavaCompile> {
dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
}
tasks.jar {
archiveClassifier.set("sources")
}
publishing {
publications {
create<MavenPublication>("mavenJava") {
groupId = "cn.lunadeer"
artifactId = "DominionAPI"
version = "1.5-SNAPSHOT"
from(components["java"])
}
}
repositories {
maven {
url = uri("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
credentials {
// from m2 settings.xml
username = project.findProperty("nexusUsername")?.toString()
password = project.findProperty("nexusPassword")?.toString()
}
}
}
}

View File

@ -1,9 +1,19 @@
package cn.lunadeer.dominion.api;
public interface Dominion {
import org.bukkit.Bukkit;
static Cache getInstance() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
// Cache.instance is a static field in the Cache class
return (Cache) Class.forName("cn.lunadeer.dominion.Cache").getDeclaredField("instance").get(null);
public class Dominion {
public static DominionAPI getInstance() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
// 通过反射获取 Cache 类中的 instance 字段
var instanceField = Class.forName("cn.lunadeer.dominion.Cache").getDeclaredField("instance");
// 设置可访问
instanceField.setAccessible(true);
// 返回 Cache 的实例
return (DominionAPI) instanceField.get(null);
}
public static boolean isDominionEnabled() {
return Bukkit.getPluginManager().isPluginEnabled("Dominion");
}
}

View File

@ -8,9 +8,18 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.UUID;
public interface Cache {
public interface DominionAPI {
/**
* 获取所有领地信息
*
* @return 所有领地信息
*/
@NotNull List<DominionDTO> getAllDominions();
/**
* 获取玩家当前所在领地
*

View File

@ -7,15 +7,39 @@ import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public interface DominionDTO {
// getters and setters
/**
* 获取领地 ID
*
* @return 领地 ID
*/
Integer getId();
/**
* 获取领地所有者 UUID
*
* @return 领地所有者 UUID
*/
UUID getOwner();
/**
* 获取领地名称
*
* @return 领地名称
*/
String getName();
/**
* 获取领地所在世界
*
* @return 领地所在世界 如果世界不存在则返回null
*/
@Nullable World getWorld();
/**
* 获取领地所在世界 UUID
*
* @return 领地所在世界 UUID
*/
UUID getWorldUid();
Integer getX1();
@ -30,25 +54,66 @@ public interface DominionDTO {
Integer getZ2();
/**
* 获取领地面积
*
* @return 领地面积
*/
Integer getSquare();
/**
* 获取领地体积
*
* @return 领地体积
*/
Integer getVolume();
/**
* 获取领地X轴向东西向宽度
*
* @return 领地X轴向东西向宽度
*/
Integer getWidthX();
/**
* 获取领地Y轴向上下向高度
*
* @return 领地Y轴向上下向高度
*/
Integer getHeight();
/**
* 获取领地Z轴向南北向宽度
*
* @return 领地Z轴向南北向宽度
*/
Integer getWidthZ();
/**
* 获取父领地 ID
*
* @return 父领地 ID 如果没有父领地则返回 -1
*/
Integer getParentDomId();
String getJoinMessage();
String getLeaveMessage();
/**
* 获取领地某个权限的值
*
* @param flag 权限
* @return 权限值
*/
Boolean getFlagValue(Flag flag);
Location getTpLocation();
/**
* 获取领地传送点坐标
*
* @return 领地传送点坐标 如果没有设置传送点则返回null
*/
@Nullable Location getTpLocation();
Location getLocation1();

View File

@ -1,13 +1,40 @@
package cn.lunadeer.dominion.api.dtos;
public interface Flag {
/**
* 权限名称英文
*
* @return 权限名称
*/
String getFlagName();
/**
* 权限显示名称中文
* 该名称从languages文件中加载
*
* @return 权限显示名称
*/
String getDisplayName();
/**
* 权限描述
* 该描述从languages文件中加载
*
* @return 权限描述
*/
String getDescription();
/**
* 获取权限默认值
*
* @return 权限默认值
*/
Boolean getDefaultValue();
/**
* 获取权限是否启用
*
* @return 权限是否启用
*/
Boolean getEnable();
}

View File

@ -3,17 +3,53 @@ package cn.lunadeer.dominion.api.dtos;
import net.kyori.adventure.text.Component;
public interface GroupDTO {
/**
* 获取权限组 ID
*
* @return 权限组 ID
*/
Integer getId();
/**
* 获取权限组所属领地 ID
*
* @return 权限组所属领地 ID
*/
Integer getDomID();
/**
* 获取权限组名称
*
* @return 权限组名称
*/
String getName();
/**
* 获取权限组名称带颜色 kyori.adventure.text.Component
*
* @return 权限组名称带颜色
*/
Component getNameColoredComponent();
/**
* 获取权限组名称带颜色 Bukkit
*
* @return 权限组名称带颜色
*/
String getNameColoredBukkit();
/**
* 获取权限组是否为管理员组
*
* @return 是否为管理员组
*/
Boolean getAdmin();
/**
* 获取权限组某个权限配置
*
* @param flag 权限
* @return 权限配置值
*/
Boolean getFlagValue(Flag flag);
}

View File

@ -3,15 +3,46 @@ package cn.lunadeer.dominion.api.dtos;
import java.util.UUID;
public interface MemberDTO {
/**
* 获取成员 ID
*
* @return 成员 ID
*/
Integer getId();
/**
* 获取成员 UUID
*
* @return 成员 UUID
*/
UUID getPlayerUUID();
/**
* 成员是否为管理员
*
* @return 是否为管理员
*/
Boolean getAdmin();
/**
* 获取成员所属领地 ID
*
* @return 领地 ID
*/
Integer getDomID();
/**
* 获取成员所属权限组 ID
*
* @return 权限组 ID 如果成员不属于任何权限组则返回-1
*/
Integer getGroupId();
/**
* 获取成员某个权限配置
*
* @param flag 权限
* @return 权限配置值
*/
Boolean getFlagValue(Flag flag);
}

View File

@ -1,15 +0,0 @@
package cn.lunadeer.dominion.api.dtos;
import java.util.UUID;
public interface PrivilegeTemplateDTO {
Integer getId();
UUID getCreator();
String getName();
Boolean getAdmin();
Boolean getFlagValue(Flag flag);
}

View File

@ -7,7 +7,7 @@ plugins {
}
group = "cn.lunadeer"
version = "2.8.2-beta"
version = "2.9.0-beta"
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion;
import cn.lunadeer.dominion.api.DominionAPI;
import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.utils.MessageDisplay;
import cn.lunadeer.dominion.utils.Particle;
@ -25,7 +26,7 @@ import java.util.concurrent.atomic.AtomicLong;
import static cn.lunadeer.dominion.DominionNode.getLocInDominionNode;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
public class Cache implements cn.lunadeer.dominion.api.Cache {
public class Cache implements DominionAPI {
public Cache() {
player_current_dominion_id = new HashMap<>();
@ -401,7 +402,8 @@ public class Cache implements cn.lunadeer.dominion.api.Cache {
return residence_data.get(player_uuid);
}
public List<DominionDTO> getDominions() {
@Override
public @NotNull List<cn.lunadeer.dominion.api.dtos.DominionDTO> getAllDominions() {
return new ArrayList<>(id_dominions.values());
}

View File

@ -19,7 +19,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.UUID;
public final class Dominion extends JavaPlugin implements cn.lunadeer.dominion.api.Dominion {
public final class Dominion extends JavaPlugin {
@Override
public void onEnable() {

View File

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.api.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.map.MapRender;
import cn.lunadeer.minecraftpluginutils.GiteaReleaseCheck;
@ -52,7 +52,7 @@ public class Operator {
Scheduler.runTaskAsync(() -> {
Notification.info(sender, Translation.Commands_Operator_ExportingMCAList);
Map<String, List<String>> mca_cords = new HashMap<>();
List<DominionDTO> doms = Cache.instance.getDominions();
List<DominionDTO> doms = Cache.instance.getAllDominions();
for (DominionDTO dom : doms) {
if (dom.getWorld() == null) {
continue;

View File

@ -9,7 +9,7 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet;
import java.util.*;
public class PrivilegeTemplateDTO implements cn.lunadeer.dominion.api.dtos.PrivilegeTemplateDTO {
public class PrivilegeTemplateDTO {
private static List<PrivilegeTemplateDTO> query(String sql, Object... params) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>();
@ -109,27 +109,22 @@ public class PrivilegeTemplateDTO implements cn.lunadeer.dominion.api.dtos.Privi
private final Map<Flag, Boolean> flags = new HashMap<>();
@Override
public Integer getId() {
return id;
}
@Override
public UUID getCreator() {
return creator;
}
@Override
public String getName() {
return name;
}
@Override
public Boolean getAdmin() {
return admin;
}
@Override
public Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag);

View File

@ -1,7 +1,7 @@
package cn.lunadeer.dominion.utils.map;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.api.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Scheduler;
@ -22,7 +22,7 @@ public class BlueMapConnect {
try {
BlueMapAPI.getInstance().ifPresent(api -> {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO dominion : Cache.instance.getDominions()) {
for (DominionDTO dominion : Cache.instance.getAllDominions()) {
if (dominion.getWorld() == null) {
continue;
}

View File

@ -1,6 +1,6 @@
package cn.lunadeer.dominion.utils.map;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.api.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Scheduler;

View File

@ -14,7 +14,7 @@ public class MapRender {
}
if (Dominion.config.getDynmap()) {
DynmapConnect.instance.setDominionMarkers(Cache.instance.getDominions());
DynmapConnect.instance.setDominionMarkers(Cache.instance.getAllDominions());
}
}

View File

@ -20,4 +20,5 @@
* [Configuration file reference](operator/config.md)
* [flags.yml](operator/flags.md)
* [Privileged Player Configuration](operator/privilege.md)
* [Cross-group teleportation (global-tp in testing)](operator/global-tp.md)
* [Cross-group teleportation (global-tp in testing)](operator/global-tp.md)
* [Developer](developer.md)

95
docs/en-us/developer.md Normal file
View File

@ -0,0 +1,95 @@
# 开发者文档
> DominionAPI 自 Dominion-2.9.0-beta 开始支持。
## 一、接入 DominionAPI
### 1. 引入依赖
If you are using gradle, you can add the following code to your `build.gradle` file:
```groovy
// build.gradle
repositories {
maven { url = "https://ssl.lunadeer.cn:14454/repository/maven-snapshots/" }
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
}
```
or if you are using gradle kotlin dsl:
```kotlin
// build.gradle.kts
repositories {
maven("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
}
```
or if you are using maven, you can add the following code to your `pom.xml` file:
```xml
<!-- pom.xml -->
<repositories>
<repository>
<id>lunadeer</id>
<url>https://ssl.lunadeer.cn:14454/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>1.4-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
### 2. plugin.yml 配置
在您的插件的 `plugin.yml` 文件中添加如下配置,以确保在 Dominion 准备完成后再加载您的插件:
```yaml
# plugin.yml
depend: [ Dominion ]
```
## 二、使用 DominionAPI
可以通过如下方法直接获取 DominionAPI 实例:
```java
import cn.lunadeer.dominion.api.Dominion;
import cn.lunadeer.dominion.api.DominionAPI;
DominionAPI dominionAPI = Dominion.getInstance();
```
例如,获取某个位置的领地信息:
```java
@Override
public void onEnable() {
// Plugin startup logic
try {
DominionAPI dominionAPI = Dominion.getInstance();
DominionDTO d = dominionAPI.getDominionByLoc(some_location);
if (d == null) {
this.getLogger().info("no dominion found");
return;
}
this.getLogger().info("name:" + d.getName());
} catch (Exception e) {
this.getLogger().info(e.getMessage());
}
}
```

View File

@ -22,4 +22,5 @@
* [特权玩家配置](operator/privilege.md)
* [Papi一览](operator/papi.md)
* [跨群组服传送global-tp 测试中)](operator/global-tp.md)
* [开发者文档](developer.md)

95
docs/zh-cn/developer.md Normal file
View File

@ -0,0 +1,95 @@
# 开发者文档
> DominionAPI 自 Dominion-2.9.0-beta 开始支持。
## 一、接入 DominionAPI
### 1. 引入依赖
如果您使用 gradle可以在您的 `build.gradle` 文件中添加如下代码:
```groovy
// build.gradle
repositories {
maven { url = "https://ssl.lunadeer.cn:14454/repository/maven-snapshots/" }
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
}
```
或者你使用的是 gradle kotlin dsl
```kotlin
// build.gradle.kts
repositories {
maven("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
}
```
再或者您使用 maven可以在您的 `pom.xml` 文件中添加如下代码:
```xml
<!-- pom.xml -->
<repositories>
<repository>
<id>lunadeer</id>
<url>https://ssl.lunadeer.cn:14454/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>1.4-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
### 2. plugin.yml 配置
在您的插件的 `plugin.yml` 文件中添加如下配置,以确保在 Dominion 准备完成后再加载您的插件:
```yaml
# plugin.yml
depend: [ Dominion ]
```
## 二、使用 DominionAPI
可以通过如下方法直接获取 DominionAPI 实例:
```java
import cn.lunadeer.dominion.api.Dominion;
import cn.lunadeer.dominion.api.DominionAPI;
DominionAPI dominionAPI = Dominion.getInstance();
```
例如,获取某个位置的领地信息:
```java
@Override
public void onEnable() {
// Plugin startup logic
try {
DominionAPI dominionAPI = Dominion.getInstance();
DominionDTO d = dominionAPI.getDominionByLoc(some_location);
if (d == null) {
this.getLogger().info("no dominion found");
return;
}
this.getLogger().info("name:" + d.getName());
} catch (Exception e) {
this.getLogger().info(e.getMessage());
}
}
```

View File

@ -21,4 +21,5 @@
* [flags.yml](operator/flags.md)
* [特權玩家配置](operator/privilege.md)
* [跨群組服傳送global-tp 測試中)](operator/global-tp.md)
* [开发者文档](developer.md)

95
docs/zh-hk/developer.md Normal file
View File

@ -0,0 +1,95 @@
# 开发者文档
> DominionAPI 自 Dominion-2.9.0-beta 开始支持。
## 一、接入 DominionAPI
### 1. 引入依赖
如果您使用 gradle可以在您的 `build.gradle` 文件中添加如下代码:
```groovy
// build.gradle
repositories {
maven { url = "https://ssl.lunadeer.cn:14454/repository/maven-snapshots/" }
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
}
```
或者你使用的是 gradle kotlin dsl
```kotlin
// build.gradle.kts
repositories {
maven("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
}
```
再或者您使用 maven可以在您的 `pom.xml` 文件中添加如下代码:
```xml
<!-- pom.xml -->
<repositories>
<repository>
<id>lunadeer</id>
<url>https://ssl.lunadeer.cn:14454/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>1.4-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
### 2. plugin.yml 配置
在您的插件的 `plugin.yml` 文件中添加如下配置,以确保在 Dominion 准备完成后再加载您的插件:
```yaml
# plugin.yml
depend: [ Dominion ]
```
## 二、使用 DominionAPI
可以通过如下方法直接获取 DominionAPI 实例:
```java
import cn.lunadeer.dominion.api.Dominion;
import cn.lunadeer.dominion.api.DominionAPI;
DominionAPI dominionAPI = Dominion.getInstance();
```
例如,获取某个位置的领地信息:
```java
@Override
public void onEnable() {
// Plugin startup logic
try {
DominionAPI dominionAPI = Dominion.getInstance();
DominionDTO d = dominionAPI.getDominionByLoc(some_location);
if (d == null) {
this.getLogger().info("no dominion found");
return;
}
this.getLogger().info("name:" + d.getName());
} catch (Exception e) {
this.getLogger().info(e.getMessage());
}
}
```