更新了API实现方案以支持扩展更多功能

This commit is contained in:
zhangyuheng 2024-10-04 15:23:36 +08:00
parent e0e713c097
commit 086e468f03
10 changed files with 118 additions and 37 deletions

View File

@ -25,7 +25,7 @@ publishing {
create<MavenPublication>("mavenJava") {
groupId = "cn.lunadeer"
artifactId = "DominionAPI"
version = "1.5-SNAPSHOT"
version = "2.0-SNAPSHOT"
from(components["java"])
}
}

View File

@ -4,9 +4,18 @@ import org.bukkit.Bukkit;
public class Dominion {
private final static int[] requiredDominionVersion = new int[]{2, 12, 0};
public static DominionAPI getInstance() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
if (!isDominionEnabled()) {
throw new IllegalStateException("Dominion is not installed.");
}
if (!isVersionCompatible(requiredDominionVersion)) {
throw new IllegalStateException("DominionAPI is not compatible with the current version of Dominion."
+ " Required Dominion version: " + requiredDominionVersion[0] + "." + requiredDominionVersion[1] + "." + requiredDominionVersion[2]);
}
// 通过反射获取 Cache 类中的 instance 字段
var instanceField = Class.forName("cn.lunadeer.dominion.Cache").getDeclaredField("instance");
var instanceField = Class.forName("cn.lunadeer.dominion.DominionInterface").getDeclaredField("instance");
// 设置可访问
instanceField.setAccessible(true);
// 返回 Cache 的实例
@ -16,4 +25,28 @@ public class Dominion {
public static boolean isDominionEnabled() {
return Bukkit.getPluginManager().isPluginEnabled("Dominion");
}
private static int[] getDominionVersion() {
var plugin = Bukkit.getPluginManager().getPlugin("Dominion");
if (plugin == null) {
return new int[]{0, 0, 0};
}
var version = plugin.getDescription().getVersion().replaceAll("[^0-9.]", "");
var versionSplit = version.split("\\.");
var versionInt = new int[versionSplit.length];
for (int i = 0; i < versionSplit.length; i++) {
versionInt[i] = Integer.parseInt(versionSplit[i]);
}
return versionInt;
}
private static boolean isVersionCompatible(int[] requiredVersion) {
var version = getDominionVersion();
for (int i = 0; i < requiredVersion.length; i++) {
if (version[i] < requiredVersion[i]) {
return false;
}
}
return true;
}
}

View File

@ -14,14 +14,14 @@ import java.util.UUID;
public interface DominionAPI {
/**
* 获取所有领地信息
* 从缓存获取所有领地信息
*
* @return 所有领地信息
*/
@NotNull List<DominionDTO> getAllDominions();
/**
* 获取玩家当前所在领地
* 从缓存获取玩家当前所在领地
*
* @param player 玩家
* @return 玩家当前所在领地 如果玩家不在任何领地内则返回null
@ -29,7 +29,7 @@ public interface DominionAPI {
@Nullable DominionDTO getPlayerCurrentDominion(@NotNull Player player);
/**
* 获取指定位置的领地信息
* 从缓存获取指定位置的领地信息
*
* @param loc 位置
* @return 领地信息 如果位置不在任何领地内则返回null
@ -37,7 +37,7 @@ public interface DominionAPI {
@Nullable DominionDTO getDominionByLoc(@NotNull Location loc);
/**
* 根据 ID 获取权限组对象
* 从缓存根据 ID 获取权限组对象
*
* @param id 权限组 ID
* @return 权限组对象 如果权限组不存在则返回null
@ -45,7 +45,7 @@ public interface DominionAPI {
@Nullable GroupDTO getGroup(@NotNull Integer id);
/**
* 获取玩家在指定领地的成员信息
* 从缓存获取玩家在指定领地的成员信息
*
* @param player 玩家
* @param dominion 领地
@ -54,7 +54,7 @@ public interface DominionAPI {
@Nullable MemberDTO getMember(@NotNull Player player, @NotNull DominionDTO dominion);
/**
* 获取玩家在指定领地的成员信息
* 从缓存获取玩家在指定领地的成员信息
*
* @param player_uuid 玩家 UUID
* @param dominion 领地
@ -63,7 +63,7 @@ public interface DominionAPI {
@Nullable MemberDTO getMember(@NotNull UUID player_uuid, @NotNull DominionDTO dominion);
/**
* 获取指定 ID 的领地信息
* 从缓存获取指定 ID 的领地信息
*
* @param id 领地 ID
* @return 领地信息 如果领地不存在则返回null
@ -71,7 +71,7 @@ public interface DominionAPI {
@Nullable DominionDTO getDominion(@NotNull Integer id);
/**
* 获取玩家当前正在使用的权限组称号
* 从缓存获取玩家当前正在使用的权限组称号
*
* @param uuid 玩家 UUID
* @return 权限组对象 如果玩家没有使用任何权限组则返回null

View File

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

View File

@ -26,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 DominionAPI {
public class Cache {
public Cache() {
player_current_dominion_id = new HashMap<>();
@ -206,7 +206,6 @@ public class Cache implements DominionAPI {
});
}
@Override
public DominionDTO getPlayerCurrentDominion(@NotNull Player player) {
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId());
@ -261,7 +260,6 @@ public class Cache implements DominionAPI {
}
}
@Override
public DominionDTO getDominionByLoc(@NotNull Location loc) {
return dominion_trees.getLocInDominionDTO(loc);
}
@ -345,18 +343,15 @@ public class Cache implements DominionAPI {
}
}
@Override
public GroupDTO getGroup(@NotNull Integer id) {
return id_groups.get(id);
}
@Override
public MemberDTO getMember(@NotNull Player player, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null;
return player_uuid_to_member.get(player.getUniqueId()).get(dominion.getId());
}
@Override
public MemberDTO getMember(@NotNull UUID player_uuid, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player_uuid)) return null;
return player_uuid_to_member.get(player_uuid).get(dominion.getId());
@ -376,7 +371,6 @@ public class Cache implements DominionAPI {
return groups;
}
@Override
public DominionDTO getDominion(@NotNull Integer id) {
return id_dominions.get(id);
}
@ -420,7 +414,6 @@ public class Cache implements DominionAPI {
return residence_data.get(player_uuid);
}
@Override
public @NotNull List<cn.lunadeer.dominion.api.dtos.DominionDTO> getAllDominions() {
return new ArrayList<>(id_dominions.values());
}
@ -601,7 +594,6 @@ public class Cache implements DominionAPI {
}
}
@Override
public @Nullable GroupDTO getPlayerUsingGroupTitle(@NotNull UUID uuid) {
if (!Dominion.config.getGroupTitleEnable()) {
return null;

View File

@ -39,6 +39,7 @@ public final class Dominion extends JavaPlugin {
new Scheduler(this);
AutoClean.run();
Cache.instance = new Cache();
DominionInterface.instance = new DominionInterface();
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
new PlaceHolderApi(this);

View File

@ -0,0 +1,55 @@
package cn.lunadeer.dominion;
import cn.lunadeer.dominion.api.DominionAPI;
import cn.lunadeer.dominion.dtos.*;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
public class DominionInterface implements DominionAPI {
public static DominionInterface instance;
@Override
public DominionDTO getPlayerCurrentDominion(@NotNull Player player) {
return Cache.instance.getPlayerCurrentDominion(player);
}
@Override
public DominionDTO getDominionByLoc(@NotNull Location loc) {
return Cache.instance.getDominionByLoc(loc);
}
@Override
public GroupDTO getGroup(@NotNull Integer id) {
return Cache.instance.getGroup(id);
}
@Override
public MemberDTO getMember(@NotNull Player player, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
return Cache.instance.getMember(player.getUniqueId(), dominion);
}
@Override
public MemberDTO getMember(@NotNull UUID player_uuid, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
return Cache.instance.getMember(player_uuid, dominion);
}
@Override
public DominionDTO getDominion(@NotNull Integer id) {
return Cache.instance.getDominion(id);
}
@Override
public @NotNull List<cn.lunadeer.dominion.api.dtos.DominionDTO> getAllDominions() {
return Cache.instance.getAllDominions();
}
@Override
public @Nullable GroupDTO getPlayerUsingGroupTitle(@NotNull UUID uuid) {
return Cache.instance.getPlayerUsingGroupTitle(uuid);
}
}

View File

@ -6,7 +6,7 @@
### 1. 引入依赖
If you are using gradle, you can add the following code to your `build.gradle` file:
如果您使用 gradle可以在您的 `build.gradle` 文件中添加如下代码:
```groovy
// build.gradle
@ -15,11 +15,11 @@ repositories {
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
compileOnly("cn.lunadeer:DominionAPI:2.0-SNAPSHOT")
}
```
or if you are using gradle kotlin dsl:
或者你使用的是 gradle kotlin dsl
```kotlin
// build.gradle.kts
@ -28,11 +28,11 @@ repositories {
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
compileOnly("cn.lunadeer:DominionAPI:2.0-SNAPSHOT")
}
```
or if you are using maven, you can add the following code to your `pom.xml` file:
再或者您使用 maven可以在您的 `pom.xml` 文件中添加如下代码:
```xml
<!-- pom.xml -->
@ -47,7 +47,7 @@ or if you are using maven, you can add the following code to your `pom.xml` file
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>1.4-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>

View File

@ -15,7 +15,7 @@ repositories {
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
compileOnly("cn.lunadeer:DominionAPI:2.0-SNAPSHOT")
}
```
@ -28,7 +28,7 @@ repositories {
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
compileOnly("cn.lunadeer:DominionAPI:2.0-SNAPSHOT")
}
```
@ -44,12 +44,12 @@ dependencies {
</repositories>
<dependencies>
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>1.4-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
```

View File

@ -15,7 +15,7 @@ repositories {
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
compileOnly("cn.lunadeer:DominionAPI:2.0-SNAPSHOT")
}
```
@ -28,7 +28,7 @@ repositories {
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:1.4-SNAPSHOT")
compileOnly("cn.lunadeer:DominionAPI:2.0-SNAPSHOT")
}
```
@ -47,7 +47,7 @@ dependencies {
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>1.4-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>