diff --git a/.github/HOW_USE_DI.md b/.github/HOW_USE_TO_DI.md
similarity index 95%
rename from .github/HOW_USE_DI.md
rename to .github/HOW_USE_TO_DI.md
index 8b50f5537..99c46f168 100644
--- a/.github/HOW_USE_DI.md
+++ b/.github/HOW_USE_TO_DI.md
@@ -109,7 +109,7 @@ public class UserCommand {
#### 7. Subscriber
```java
@Controller // <- marks a class that will be registered as an event subscriber.
-public class UserSubscriber implements Subscriber {
+public class UserSubscriber {
private final UserService exampleService;
@@ -126,12 +126,12 @@ public class UserSubscriber implements Subscriber {
}
```
-#### 8. BeanSetup
-BeanSetup is a class that allows you to register beans in the bean container.
+#### 8. Setup
+Setup is an annotation that allows you to register beans in the bean container.
It is used to register dependencies that are cannot be registered in the bean container using annotations. e.g. MiniMessage, AdventureProvider, HikariDataSource, etc.
```java
-@BeanSetup // <- marks a class that will be registered as a bean holder.
+@Setup // <- marks a class that will be registered as a bean holder.
public class UserBeanSetup {
@Bean // <- marks a method that will be registered as a bean. (dependency)
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index c132c6e1f..b10b4a719 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -16,14 +16,14 @@ jobs:
fail-fast: false
steps:
- name: Checkout
- uses: actions/checkout@v4.2.1
+ uses: actions/checkout@v4.2.2
- name: 'Set up JDK ${{ matrix.java }}'
- uses: actions/setup-java@v4.4.0
+ uses: actions/setup-java@v4.6.0
with:
distribution: adopt
java-version: '${{ matrix.java }}'
- name: Cache Gradle
- uses: actions/cache@v4.1.1
+ uses: actions/cache@v4.2.0
with:
path: ~/.gradle/caches
key: >-
@@ -35,7 +35,7 @@ jobs:
- name: Build the Jar
run: './gradlew clean eternalcore-plugin:shadowJar'
- name: Upload a Build Artifact
- uses: actions/upload-artifact@v4.4.3
+ uses: actions/upload-artifact@v4.6.0
with:
name: 'EternalCore'
path: eternalcore-plugin/build/libs/EternalCore*.jar
\ No newline at end of file
diff --git a/README.md b/README.md
index e28868a8d..79244f4a2 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,8 @@ EternalCore is your ultimate companion for enhancing your Minecraft server exper
## :information_source: Information
-- EternalCore fully supports Minecraft's latest minor versions starting from each major version, starting from 1.17 onward, e.g. `1.17.1`, `1.18.2`, `1.19.4`, `1.20.6`, `1.21.1`.
-- Requires **Java 17 or later** to work properly. For older versions of Java, this may affect the functionality of the plugin.
+- EternalCore fully supports Minecraft's latest minor versions starting from each major version, starting from 1.17 onward, e.g. `1.17.1`, `1.18.2`, `1.19.4`, `1.20.6`, `1.21.4`.
+- Requires **Java 21 or later** to work properly. For older versions of Java, this may affect the functionality of the plugin.
- If you have any questions, perhaps you will find a solution to them in our [documentation](https://docs.eternalcode.pl/eternalcore/introduction.html), you can also ask us about it on [discord](https://discord.gg/FQ7jmGBd6c).
## :hammer_and_wrench: Development Builds
@@ -80,7 +80,7 @@ For Maven projects use:
For Gradle projects use:
```kts
-compileOnly("com.eternalcode:eternalcore-api:1.4.0")
+compileOnly("com.eternalcode:eternalcore-api:1.5.0")
```
For Maven projects use:
@@ -88,7 +88,7 @@ For Maven projects use:
com.eternalcode
eternalcore-api
- 1.4.0
+ 1.5.0
provided
```
@@ -97,7 +97,7 @@ For Maven projects use:
## :building_construction: Building
-To build EternalCore, follow these steps (Make sure you have **JDK 17 or higher**):
+To build EternalCore, follow these steps (Make sure you have **JDK 21 or higher**):
```shell
./gradlew clean eternalcore-plugin:shadowJar
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 9bcbb6698..69386a084 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -8,8 +8,8 @@ repositories {
dependencies {
implementation("net.kyori:blossom:1.3.1")
- implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.3")
- implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21")
+ implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.5")
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0")
implementation("net.minecrell:plugin-yml:0.6.0")
}
diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt
index 7680671f2..f4c729e27 100644
--- a/buildSrc/src/main/kotlin/Versions.kt
+++ b/buildSrc/src/main/kotlin/Versions.kt
@@ -1,42 +1,41 @@
object Versions {
- const val SPIGOT_API = "1.19.4-R0.1-SNAPSHOT"
- const val PAPER_API = "1.19.4-R0.1-SNAPSHOT"
+ const val SPIGOT_API = "1.21.3-R0.1-SNAPSHOT"
+ const val PAPER_API = "1.21.3-R0.1-SNAPSHOT"
const val ETERNALCODE_COMMONS = "1.1.5"
- const val MULTIFICATION = "1.1.4"
+ const val MULTIFICATION = "1.2.1"
const val JETBRAINS_ANNOTATIONS = "26.0.1"
const val PLACEHOLDER_API = "2.11.6"
- const val LOMBOK = "1.18.34"
+ const val LOMBOK = "1.18.36"
const val GIT_CHECK = "1.0.0"
const val PAPERLIB = "1.0.8"
const val ADVENTURE_PLATFORM = "4.3.4"
- const val ADVENTURE_TEXT_MINIMESSAGE = "4.18.0-SNAPSHOT"
+ const val ADVENTURE_TEXT_MINIMESSAGE = "4.18.0"
const val ADVENTURE_PLATFORM_FACET = "4.3.4"
const val CDN_CONFIGS = "1.14.5"
- const val MARIA_DB = "3.4.1"
+ const val MARIA_DB = "3.5.1"
const val POSTGRESQL = "42.7.4"
- const val H2 = "2.1.214"
+ const val H2 = "2.3.232"
const val ORMLITE = "6.1"
- const val HIKARI_CP = "6.0.0"
+ const val HIKARI_CP = "6.2.1"
- const val LITE_COMMANDS = "3.8.0"
+ const val LITE_COMMANDS = "3.9.7"
const val LITE_SKULL_API = "1.3.0"
- const val GUAVA = "33.3.1-jre"
+ const val GUAVA = "33.4.0-jre"
const val GSON = "2.11.0"
const val EXPRESSIBLE = "1.3.6"
const val PANDA_UTILITIES = "0.5.3-alpha"
- const val APACHE_COMMONS = "2.17.0"
+ const val APACHE_COMMONS = "2.18.0"
- const val TRIUMPH_GUI = "3.1.10"
+ const val TRIUMPH_GUI = "3.1.11"
const val BSTATS = "3.1.0"
- const val PIXEL_WIDTH = "1.1.0"
const val CAFFEINE = "3.1.8"
@@ -44,10 +43,10 @@ object Versions {
// tests
const val EXPRESSIBLE_JUNIT = "1.3.6"
- const val GROOVY_ALL = "3.0.22"
- const val JUNIT_JUPITER_API = "5.11.2"
- const val JUNIT_JUPITER_PARAMS = "5.11.2"
- const val JUNIT_JUPITER_ENGINE = "5.11.2"
- const val MOCKITO_CORE = "5.14.2"
+ const val GROOVY_ALL = "3.0.23"
+ const val JUNIT_JUPITER_API = "5.11.4"
+ const val JUNIT_JUPITER_PARAMS = "5.11.4"
+ const val JUNIT_JUPITER_ENGINE = "5.11.4"
+ const val MOCKITO_CORE = "5.15.2"
}
diff --git a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts
index e488cda2e..3594d9205 100644
--- a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts
+++ b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts
@@ -4,10 +4,10 @@ plugins {
}
group = "com.eternalcode"
-version = "1.4.0"
+version = "1.5.0"
checkstyle {
- toolVersion = "10.18.2"
+ toolVersion = "10.21.1"
configFile = file("${rootDir}/config/checkstyle/checkstyle.xml")
configProperties["checkstyle.suppressions.file"] = "${rootDir}/config/checkstyle/suppressions.xml"
@@ -21,7 +21,7 @@ configurations.named("checkstyle") {
resolutionStrategy {
capabilitiesResolution {
withCapability("com.google.collections:google-collections") {
- select("com.google.guava:guava:33.3.1-jre")
+ select("com.google.guava:guava:33.4.0-jre")
}
}
}
@@ -35,5 +35,5 @@ java {
tasks.withType() {
options.compilerArgs = listOf("-Xlint:deprecation", "-parameters")
options.encoding = "UTF-8"
- options.release = 17
+ options.release = 21
}
diff --git a/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts b/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts
index 20226c2a1..2f8e69127 100644
--- a/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts
+++ b/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts
@@ -4,7 +4,7 @@ plugins {
}
group = "com.eternalcode"
-version = "1.4.0"
+version = "1.5.0"
java {
withSourcesJar()
diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java
index 8122cf66d..880629c5c 100644
--- a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java
+++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java
@@ -100,7 +100,7 @@ void onHomeTeleport(HomeTeleportEvent event) {
player.sendMessage("Teleporting to home...");
- if (player.hasPotionEffect(PotionEffectType.SLOW)) {
+ if (player.hasPotionEffect(PotionEffectType.SLOWNESS)) {
player.sendMessage("You are slowed down!");
player.teleport(player.getWorld().getSpawnLocation());
}
diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java b/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java
index 9bc19e46b..8d30ad07c 100644
--- a/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java
+++ b/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java
@@ -13,11 +13,6 @@ public class Delay {
private final Supplier delaySettings;
- @Deprecated
- public Delay(DelaySettings delaySettings) {
- this((Supplier) () -> delaySettings.delay());
- }
-
public Delay(Supplier delayProvider) {
this.delaySettings = delayProvider;
diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java b/eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java
deleted file mode 100644
index 95c2241f6..000000000
--- a/eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.eternalcode.core.delay;
-
-import java.time.Duration;
-
-@Deprecated
-public interface DelaySettings {
-
- Duration delay();
-
-}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java
index 7b8c20fd8..c65ad7aeb 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java
@@ -1,27 +1,35 @@
package com.eternalcode.core;
-import com.eternalcode.core.configuration.ReloadableConfig;
+import com.eternalcode.core.compatibility.CompatibilityService;
import com.eternalcode.core.injector.DependencyInjector;
+import com.eternalcode.core.injector.annotations.component.Component;
+import com.eternalcode.core.injector.annotations.component.ConfigurationFile;
+import com.eternalcode.core.injector.annotations.component.Controller;
+import com.eternalcode.core.injector.annotations.component.Repository;
+import com.eternalcode.core.injector.annotations.component.Service;
+import com.eternalcode.core.injector.annotations.component.Setup;
+import com.eternalcode.core.injector.annotations.component.Task;
+import com.eternalcode.core.injector.annotations.lite.LiteArgument;
+import com.eternalcode.core.injector.annotations.lite.LiteCommandEditor;
+import com.eternalcode.core.injector.annotations.lite.LiteContextual;
+import com.eternalcode.core.injector.annotations.lite.LiteHandler;
import com.eternalcode.core.injector.bean.BeanCandidate;
import com.eternalcode.core.injector.bean.BeanFactory;
-import com.eternalcode.core.injector.bean.BeanHolder;
-import com.eternalcode.core.injector.bean.LazyFieldBeanCandidate;
+import com.eternalcode.core.injector.bean.BeanCandidatePriorityProvider;
import com.eternalcode.core.injector.bean.processor.BeanProcessor;
import com.eternalcode.core.injector.bean.processor.BeanProcessorFactory;
import com.eternalcode.core.injector.scan.DependencyScanner;
-import com.eternalcode.core.injector.scan.DependencyScannerFactory;
import com.eternalcode.core.publish.Publisher;
import com.eternalcode.core.publish.event.EternalInitializeEvent;
import com.eternalcode.core.publish.event.EternalShutdownEvent;
-import net.dzikoysk.cdn.entity.Contextual;
+import dev.rollczi.litecommands.annotations.command.Command;
+import dev.rollczi.litecommands.annotations.command.RootCommand;
import org.bukkit.Server;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import java.io.File;
-import java.lang.reflect.Field;
-import java.util.List;
import java.util.logging.Logger;
class EternalCore {
@@ -32,6 +40,7 @@ class EternalCore {
public EternalCore(Plugin plugin) {
this.eternalCoreEnvironment = new EternalCoreEnvironment(plugin.getLogger());
+ CompatibilityService compatibilityService = new CompatibilityService();
BeanProcessor beanProcessor = BeanProcessorFactory.defaultProcessors(plugin);
BeanFactory beanFactory = new BeanFactory(beanProcessor)
.withCandidateSelf()
@@ -40,19 +49,35 @@ public EternalCore(Plugin plugin) {
.addCandidate(Logger.class, () -> plugin.getLogger())
.addCandidate(PluginDescriptionFile.class, () -> plugin.getDescription())
.addCandidate(File.class, () -> plugin.getDataFolder())
- .addCandidate(PluginManager.class, () -> plugin.getServer().getPluginManager());
-
- DependencyInjector dependencyInjector = new DependencyInjector(beanFactory);
- DependencyScanner scanner = DependencyScannerFactory.createDefault(dependencyInjector);
-
- beanFactory.addCandidate(DependencyInjector.class, () -> dependencyInjector);
+ .addCandidate(PluginManager.class, () -> plugin.getServer().getPluginManager())
+ .priorityProvider(new BeanCandidatePriorityProvider());
+
+ DependencyInjector injector = new DependencyInjector(beanFactory);
+ DependencyScanner scanner = new DependencyScanner(injector)
+ .includeType(type -> compatibilityService.isCompatible(type))
+ .includeAnnotations(
+ Component.class,
+ Service.class,
+ Repository.class,
+ Task.class,
+ Controller.class,
+ ConfigurationFile.class,
+ Setup.class,
+
+ Command.class,
+ RootCommand.class,
+ LiteArgument.class,
+ LiteHandler.class,
+ LiteContextual.class,
+ LiteCommandEditor.class
+ );
+
+ beanFactory.addCandidate(DependencyInjector.class, () -> injector);
for (BeanCandidate beanCandidate : scanner.scan(EternalCore.class.getPackage())) {
beanFactory.addCandidate(beanCandidate);
}
- this.loadConfigContextual(beanFactory);
-
beanFactory.initializeCandidates();
this.publisher = beanFactory.getDependency(Publisher.class);
@@ -67,22 +92,4 @@ public void disable() {
EternalCoreApiProvider.deinitialize();
}
- private void loadConfigContextual(BeanFactory beanFactory) {
- List> beans = beanFactory
- .initializeCandidates(ReloadableConfig.class)
- .getBeans(ReloadableConfig.class);
-
- for (BeanHolder bean : beans) {
- ReloadableConfig config = bean.get();
-
- for (Field field : config.getClass().getDeclaredFields()) {
- if (!field.getType().isAnnotationPresent(Contextual.class)) {
- continue;
- }
-
- beanFactory.addCandidate(new LazyFieldBeanCandidate(config, field));
- }
- }
- }
-
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java
index eae498739..ff40dafae 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java
@@ -1,13 +1,13 @@
package com.eternalcode.core.bridge;
import com.eternalcode.core.injector.annotations.Bean;
-import com.eternalcode.core.injector.annotations.component.BeanSetup;
+import com.eternalcode.core.injector.annotations.component.Setup;
import com.eternalcode.core.placeholder.PlaceholderRegistry;
import java.util.logging.Logger;
import org.bukkit.Server;
import org.bukkit.plugin.PluginDescriptionFile;
-@BeanSetup
+@Setup
class BridgeManagerInitializer {
@Bean
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java
index 22257dd69..a8e241e0e 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java
@@ -4,13 +4,13 @@
import com.eternalcode.commons.adventure.AdventureLegacyColorPreProcessor;
import com.eternalcode.commons.adventure.AdventureUrlPostProcessor;
import com.eternalcode.core.injector.annotations.Bean;
-import com.eternalcode.core.injector.annotations.component.BeanSetup;
+import com.eternalcode.core.injector.annotations.component.Setup;
import net.kyori.adventure.platform.AudienceProvider;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.plugin.Plugin;
-@BeanSetup
+@Setup
class AdventureSetup {
@Bean
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java
index acaf81d73..547f01350 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java
@@ -1,11 +1,10 @@
package com.eternalcode.core.bridge.litecommand;
import com.eternalcode.core.injector.annotations.Bean;
-import com.eternalcode.core.injector.annotations.component.BeanSetup;
+import com.eternalcode.core.injector.annotations.component.Setup;
import com.eternalcode.core.injector.bean.BeanFactory;
import com.eternalcode.core.notice.NoticeService;
import com.eternalcode.core.publish.Subscribe;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalInitializeEvent;
import com.eternalcode.core.publish.event.EternalShutdownEvent;
import dev.rollczi.litecommands.LiteCommands;
@@ -20,8 +19,8 @@
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
-@BeanSetup
-class LiteCommandsSetup implements Subscriber {
+@Setup
+class LiteCommandsSetup {
@Bean
public LiteCommandsBuilder liteCommandsBuilder(
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/PlayerArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/PlayerArgument.java
index e43a971f4..45f052ffd 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/PlayerArgument.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/PlayerArgument.java
@@ -1,5 +1,7 @@
package com.eternalcode.core.bridge.litecommand.argument;
+import com.eternalcode.annotations.scan.feature.FeatureDocs;
+import com.eternalcode.core.feature.vanish.VanishPermissionConstant;
import com.eternalcode.core.feature.vanish.VanishService;
import com.eternalcode.core.injector.annotations.Inject;
import com.eternalcode.core.injector.annotations.lite.LiteArgument;
@@ -44,15 +46,25 @@ public ParseResult parse(Invocation invocation, String ar
return ParseResult.success(target);
}
+ @FeatureDocs(
+ name = "Vanish tabulation",
+ description = "EternalCore prevents non-admin players from seeing vanished players in the commands like /tpa."
+ + " To re-enable this feature for specific players, grant them the eternalcore.vanish.tabulation.see permission."
+ )
@Override
public SuggestionResult suggest(
Invocation invocation,
Argument argument,
SuggestionContext context
) {
+ CommandSender sender = invocation.sender();
return this.server.getOnlinePlayers().stream()
- .filter(player -> !this.vanishService.isVanished(player.getUniqueId()))
- .map(player -> player.getName())
+ .filter(player -> this.canSeeVanished(sender) || !this.vanishService.isVanished(player.getUniqueId()))
+ .map(Player::getName)
.collect(SuggestionResult.collector());
}
+
+ public boolean canSeeVanished(CommandSender sender) {
+ return sender.hasPermission(VanishPermissionConstant.VANISH_SEE_TABULATION_PERMISSION);
+ }
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java
index 157c54c99..e73cad8ac 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java
@@ -2,6 +2,7 @@
import com.eternalcode.core.configuration.ReloadableConfig;
import com.eternalcode.core.feature.essentials.gamemode.GameModeArgumentSettings;
+import com.eternalcode.core.injector.annotations.Bean;
import com.eternalcode.core.injector.annotations.component.ConfigurationFile;
import net.dzikoysk.cdn.entity.Contextual;
import net.dzikoysk.cdn.entity.Description;
@@ -19,6 +20,7 @@
@ConfigurationFile
public class CommandConfiguration implements ReloadableConfig {
+ @Bean
public Argument argument = new Argument();
@Contextual
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java
index ae52bf3b5..7ddb64574 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java
@@ -1,14 +1,13 @@
package com.eternalcode.core.bridge.metrics;
import com.eternalcode.core.injector.annotations.component.Controller;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalInitializeEvent;
import com.eternalcode.core.publish.Subscribe;
import org.bstats.bukkit.Metrics;
import org.bukkit.plugin.java.JavaPlugin;
@Controller
-class BStatsMetricsSetup implements Subscriber {
+class BStatsMetricsSetup {
@Subscribe(EternalInitializeEvent.class)
public void onInitialize(JavaPlugin javaPlugin) {
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java
index 64463e1e7..b3631b206 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java
@@ -1,16 +1,15 @@
package com.eternalcode.core.bridge.skullapi;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalShutdownEvent;
import com.eternalcode.core.injector.annotations.Bean;
-import com.eternalcode.core.injector.annotations.component.BeanSetup;
+import com.eternalcode.core.injector.annotations.component.Setup;
import com.eternalcode.core.publish.Subscribe;
import dev.rollczi.liteskullapi.LiteSkullFactory;
import dev.rollczi.liteskullapi.SkullAPI;
import org.bukkit.plugin.Plugin;
-@BeanSetup
-class SkullAPISetup implements Subscriber {
+@Setup
+class SkullAPISetup {
@Bean
public SkullAPI skullAPI(Plugin plugin) {
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java
new file mode 100644
index 000000000..95ff556b9
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java
@@ -0,0 +1,16 @@
+package com.eternalcode.core.compatibility;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Compatibility {
+
+ Version from() default @Version(minor = Integer.MIN_VALUE, patch = Integer.MIN_VALUE);
+
+ Version to() default @Version(minor = Integer.MAX_VALUE, patch = Integer.MAX_VALUE);
+
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java
new file mode 100644
index 000000000..9c3c63b26
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java
@@ -0,0 +1,31 @@
+package com.eternalcode.core.compatibility;
+
+import io.papermc.lib.PaperLib;
+
+public class CompatibilityService {
+
+ public boolean isCompatible(Class> type) {
+ Compatibility compatibility = type.getAnnotation(Compatibility.class);
+ if (compatibility == null) {
+ return true;
+ }
+
+ Version from = compatibility.from();
+ Version to = compatibility.to();
+
+ int minor = PaperLib.getMinecraftVersion();
+ int patch = PaperLib.getMinecraftPatchVersion();
+
+ return isCompatibleFrom(from, minor, patch) && isCompatibleTo(to, minor, patch);
+ }
+
+ private boolean isCompatibleTo(Version to, int minor, int patch) {
+ return minor < to.minor() || minor == to.minor() && patch <= to.patch();
+ }
+
+ private boolean isCompatibleFrom(Version from, int minor, int patch) {
+ return minor > from.minor() || minor == from.minor() && patch >= from.patch();
+ }
+
+}
+
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java
new file mode 100644
index 000000000..6a6d8429d
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java
@@ -0,0 +1,15 @@
+package com.eternalcode.core.compatibility;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Version {
+
+ int minor();
+ int patch();
+
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java
index ae974a502..c6919bbdb 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java
@@ -3,12 +3,12 @@
import com.eternalcode.commons.bukkit.position.Position;
import com.eternalcode.core.configuration.composer.DurationComposer;
import com.eternalcode.core.configuration.composer.LanguageComposer;
-import com.eternalcode.core.configuration.composer.MaterialComposer;
import com.eternalcode.core.configuration.composer.PositionComposer;
import com.eternalcode.core.configuration.composer.SetComposer;
import com.eternalcode.core.feature.language.Language;
import com.eternalcode.core.injector.annotations.Inject;
import com.eternalcode.core.injector.annotations.component.Service;
+import com.eternalcode.core.publish.Publisher;
import com.eternalcode.multification.cdn.MultificationNoticeCdnComposer;
import com.eternalcode.multification.notice.Notice;
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
@@ -19,8 +19,9 @@
import java.util.Set;
import net.dzikoysk.cdn.Cdn;
import net.dzikoysk.cdn.CdnFactory;
+import net.dzikoysk.cdn.CdnSettings;
import net.dzikoysk.cdn.reflect.Visibility;
-import org.bukkit.Material;
+import org.bukkit.Sound;
@Service
public class ConfigurationManager {
@@ -36,12 +37,16 @@ public class ConfigurationManager {
public ConfigurationManager(
ConfigurationBackupService configurationBackupService,
NoticeResolverRegistry resolverRegistry,
+ Publisher publisher,
File dataFolder
) {
this.configurationBackupService = configurationBackupService;
this.dataFolder = dataFolder;
+ this.cdn = createCdn(publisher, resolverRegistry);
+ }
- this.cdn = CdnFactory
+ private static Cdn createCdn(Publisher publisher, NoticeResolverRegistry resolverRegistry) {
+ CdnSettings cdnSettings = CdnFactory
.createYamlLike()
.getSettings()
.withComposer(Duration.class, new DurationComposer())
@@ -49,8 +54,11 @@ public ConfigurationManager(
.withComposer(Language.class, new LanguageComposer())
.withComposer(Position.class, new PositionComposer())
.withComposer(Notice.class, new MultificationNoticeCdnComposer(resolverRegistry))
- .withComposer(Material.class, new MaterialComposer())
- .withMemberResolver(Visibility.PACKAGE_PRIVATE)
+ .withMemberResolver(Visibility.PACKAGE_PRIVATE);
+
+ ConfigurationSettingsSetupEvent event = publisher.publish(new ConfigurationSettingsSetupEvent(cdnSettings));
+
+ return event.getSettings()
.build();
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java
new file mode 100644
index 000000000..714bd0668
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java
@@ -0,0 +1,22 @@
+package com.eternalcode.core.configuration;
+
+import com.eternalcode.core.publish.event.EternalCoreEvent;
+import net.dzikoysk.cdn.CdnSettings;
+
+public class ConfigurationSettingsSetupEvent implements EternalCoreEvent {
+
+ private CdnSettings cdnSettings;
+
+ public ConfigurationSettingsSetupEvent(CdnSettings cdnSettings) {
+ this.cdnSettings = cdnSettings;
+ }
+
+ public CdnSettings getSettings() {
+ return cdnSettings;
+ }
+
+ public void setSettings(CdnSettings cdnSettings) {
+ this.cdnSettings = cdnSettings;
+ }
+
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java
new file mode 100644
index 000000000..3bb32900d
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java
@@ -0,0 +1,20 @@
+package com.eternalcode.core.configuration.compatibility;
+
+import com.eternalcode.core.compatibility.Version;
+import com.eternalcode.core.configuration.ConfigurationSettingsSetupEvent;
+import com.eternalcode.core.configuration.composer.OldEnumComposer;
+import com.eternalcode.core.compatibility.Compatibility;
+import com.eternalcode.core.injector.annotations.component.Controller;
+import com.eternalcode.core.publish.Subscribe;
+
+@Controller
+@Compatibility(from = @Version(minor = 21, patch = 2))
+class ConfigurationCompatibilityV21_2 {
+
+ @Subscribe
+ void onConfigSettingsSetup(ConfigurationSettingsSetupEvent event) {
+ event.getSettings()
+ .withDynamicComposer(OldEnumComposer.IS_OLD_ENUM, new OldEnumComposer());
+ }
+
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java
index 326c34638..a6c417e0a 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java
@@ -1,5 +1,6 @@
package com.eternalcode.core.configuration.composer;
+import dev.rollczi.litecommands.time.DurationParser;
import panda.std.Result;
import java.time.Duration;
@@ -10,12 +11,12 @@ public class DurationComposer implements SimpleComposer {
@Override
public Result deserialize(String source) {
- return Result.supplyThrowing(DateTimeParseException.class, () -> Duration.parse("PT" + source.toUpperCase(Locale.ROOT)));
+ return Result.supplyThrowing(DateTimeParseException.class, () -> DurationParser.TIME_UNITS.parse(source));
}
@Override
public Result serialize(Duration entity) {
- return Result.ok(entity.toString().substring(2).toLowerCase(Locale.ROOT));
+ return Result.ok(DurationParser.TIME_UNITS.format(entity));
}
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java
deleted file mode 100644
index 48a56ceab..000000000
--- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.eternalcode.core.configuration.composer;
-
-import org.bukkit.Material;
-import panda.std.Result;
-
-public class MaterialComposer implements SimpleComposer {
-
- @Override
- public Result deserialize(String source) {
- return Result.supplyThrowing(IllegalArgumentException.class, () -> Material.valueOf(source.toUpperCase()));
- }
-
- @Override
- public Result serialize(Material entity) {
- return Result.ok(entity.name().toLowerCase());
- }
-
-}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java
new file mode 100644
index 000000000..93142f2a6
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java
@@ -0,0 +1,54 @@
+package com.eternalcode.core.configuration.composer;
+
+import dev.rollczi.litecommands.reflect.ReflectUtil;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+import net.dzikoysk.cdn.CdnSettings;
+import net.dzikoysk.cdn.model.Element;
+import net.dzikoysk.cdn.model.Entry;
+import net.dzikoysk.cdn.model.Piece;
+import net.dzikoysk.cdn.reflect.TargetType;
+import net.dzikoysk.cdn.serdes.Composer;
+import net.dzikoysk.cdn.serdes.SimpleDeserializer;
+import org.bukkit.util.OldEnum;
+import panda.std.Result;
+
+public class OldEnumComposer implements Composer>, SimpleDeserializer> {
+
+ public static final Predicate> IS_OLD_ENUM = type -> OldEnum.class.isAssignableFrom(type);
+
+ private static final Map, Method> VALUE_OF_METHODS = new HashMap<>();
+
+ @Override
+ public Result, Exception> deserialize(String source) {
+ throw new UnsupportedOperationException("Enum deserializer requires enum class");
+ }
+
+ @Override
+ public Result, Exception> deserialize(TargetType type, String source) {
+ try {
+ Method valueOfMethod = VALUE_OF_METHODS.computeIfAbsent(type.getType(), key -> findValueOfMethod(key));
+ OldEnum> oldEnum = ReflectUtil.invokeStaticMethod(valueOfMethod, source);
+
+ return Result.ok(oldEnum);
+ }
+ catch (IllegalArgumentException argumentException) {
+ return Result.error(argumentException);
+ }
+ }
+
+ private Method findValueOfMethod(Class> type) {
+ Method valueOfMethod = ReflectUtil.getMethod(type, "valueOf", String.class);
+ valueOfMethod.setAccessible(true);
+ return valueOfMethod;
+ }
+
+ @Override
+ public Result extends Element>, ? extends Exception> serialize(CdnSettings settings, List description, String key, TargetType type, OldEnum> oldEnum) {
+ return Result.ok(key.isEmpty() ? new Piece(oldEnum.name()) : new Entry(description, key, oldEnum.name()));
+ }
+
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java
index 0ab8e854c..2123c0ef6 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java
@@ -2,7 +2,6 @@
import com.eternalcode.core.configuration.ReloadableConfig;
import com.eternalcode.core.database.DatabaseType;
-import com.eternalcode.core.delay.DelaySettings;
import com.eternalcode.core.feature.afk.AfkSettings;
import com.eternalcode.core.feature.automessage.AutoMessageSettings;
import com.eternalcode.core.feature.chat.ChatSettings;
@@ -10,8 +9,9 @@
import com.eternalcode.core.feature.jail.JailSettings;
import com.eternalcode.core.feature.randomteleport.RandomTeleportSettingsImpl;
import com.eternalcode.core.feature.spawn.SpawnSettings;
-import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings;
+import com.eternalcode.core.injector.annotations.Bean;
import com.eternalcode.core.injector.annotations.component.ConfigurationFile;
+import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings;
import net.dzikoysk.cdn.entity.Contextual;
import net.dzikoysk.cdn.entity.Description;
import net.dzikoysk.cdn.entity.Exclude;
@@ -78,6 +78,8 @@ public static class Join {
}
+
+ @Bean
@Description({ " ", "# Teleport request section" })
public TeleportAsk teleportAsk = new TeleportAsk();
@@ -100,6 +102,7 @@ public Duration teleportTime() {
}
}
+ @Bean
@Description({ " ", "# Teleport section" })
public Teleport teleport = new Teleport();
@@ -123,9 +126,11 @@ public Duration teleportationTimeToSpawn() {
}
}
+ @Bean
@Description({ "", "# Random Teleport Section" })
public RandomTeleportSettingsImpl randomTeleport = new RandomTeleportSettingsImpl();
+ @Bean
@Description({ " ", "# Homes Section" })
public Homes homes = new Homes();
@@ -172,6 +177,7 @@ public static class Sounds {
}
+ @Bean
@Description({ " ", "# Chat Section" })
public Chat chat = new Chat();
@@ -240,13 +246,12 @@ public Duration getHelpOpDelay() {
public Repair repair = new Repair();
@Contextual
- public static class Repair implements DelaySettings {
+ public static class Repair {
@Description({ "# Repair command cooldown" })
public Duration repairDelay = Duration.ofSeconds(5);
- @Override
- public Duration delay() {
+ public Duration repairDelay() {
return this.repairDelay;
}
}
@@ -259,6 +264,7 @@ public static class Format {
public String separator = "&7, ";
}
+ @Bean
@Description({ " ", "# AFK Section" })
public Afk afk = new Afk();
@@ -357,6 +363,7 @@ public static class Butcher {
public int safeChunkNumber = 5;
}
+ @Bean
@Description({ " ", "# AutoMessage Section" })
public AutoMessage autoMessage = new AutoMessage();
@@ -390,6 +397,7 @@ public DrawMode drawMode() {
}
}
+ @Bean
@Description({ " ", "# Jail Section" })
public Jail jail = new Jail();
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java
index 67dbe8f3e..aac912cfa 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java
@@ -5,12 +5,11 @@
import com.eternalcode.core.injector.annotations.Inject;
import com.eternalcode.core.injector.annotations.component.Controller;
import com.eternalcode.core.publish.Subscribe;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalInitializeEvent;
import java.util.logging.Logger;
@Controller
-class MigrationController implements Subscriber {
+class MigrationController {
private final MigrationService migrationService;
private final ConfigurationManager configurationManager;
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java
index 3e77f542c..fd45bc32e 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java
@@ -1,18 +1,17 @@
package com.eternalcode.core.database;
import com.eternalcode.core.configuration.implementation.PluginConfiguration;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalShutdownEvent;
import com.eternalcode.core.injector.annotations.Bean;
-import com.eternalcode.core.injector.annotations.component.BeanSetup;
+import com.eternalcode.core.injector.annotations.component.Setup;
import com.eternalcode.core.publish.Subscribe;
import java.io.File;
import java.sql.SQLException;
import java.util.logging.Logger;
-@BeanSetup
-class DatabaseManagerSetup implements Subscriber {
+@Setup
+class DatabaseManagerSetup {
@Bean
DatabaseManager databaseManager(PluginConfiguration pluginConfiguration, Logger logger, File dataFolder) {
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java
index fc6d60dad..dad13df6d 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java
@@ -34,7 +34,7 @@ class AfkCommand {
this.noticeService = noticeService;
this.pluginConfiguration = pluginConfiguration;
this.afkService = afkService;
- this.delay = new Delay<>(this.pluginConfiguration.afk);
+ this.delay = new Delay<>(() -> this.pluginConfiguration.afk.getAfkDelay());
}
@Execute
@@ -61,6 +61,6 @@ void execute(@Context Player player) {
return;
}
- this.delay.markDelay(uuid, this.pluginConfiguration.afk.delay());
+ this.delay.markDelay(uuid, this.pluginConfiguration.afk.getAfkDelay());
}
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java
index f2c2817a8..caecd9250 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java
@@ -1,10 +1,8 @@
package com.eternalcode.core.feature.afk;
-import com.eternalcode.core.delay.DelaySettings;
-
import java.time.Duration;
-public interface AfkSettings extends DelaySettings {
+public interface AfkSettings {
boolean autoAfk();
@@ -14,9 +12,4 @@ public interface AfkSettings extends DelaySettings {
Duration getAfkInactivityTime();
- @Override
- default Duration delay() {
- return this.getAfkDelay();
- }
-
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java
index 1398d5647..c01fc695a 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java
@@ -5,7 +5,6 @@
import com.eternalcode.core.placeholder.PlaceholderRegistry;
import com.eternalcode.core.placeholder.PlaceholderReplacer;
import com.eternalcode.core.publish.Subscribe;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalInitializeEvent;
import com.eternalcode.core.translation.Translation;
import com.eternalcode.core.translation.TranslationManager;
@@ -16,7 +15,7 @@
import java.util.Optional;
@Controller
-class AftPlaceholderSetup implements Subscriber {
+class AftPlaceholderSetup {
private final TranslationManager translationManager;
private final ViewerService viewerService;
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java
index 41aee9785..253922a27 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java
@@ -12,8 +12,8 @@
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-import org.spigotmc.event.entity.EntityDismountEvent;
import java.time.Duration;
import java.util.Optional;
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java
index 691c920ca..78c4bac6c 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java
@@ -1,10 +1,8 @@
package com.eternalcode.core.feature.chat;
-import com.eternalcode.core.delay.DelaySettings;
-
import java.time.Duration;
-public interface ChatSettings extends DelaySettings {
+public interface ChatSettings {
boolean isChatEnabled();
@@ -16,9 +14,4 @@ public interface ChatSettings extends DelaySettings {
int linesToClear();
- @Override
- default Duration delay() {
- return this.getChatDelay();
- }
-
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java
index 8c94da25f..23812c6a5 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java
@@ -12,6 +12,7 @@
import dev.rollczi.litecommands.annotations.permission.Permission;
import java.time.Duration;
import java.util.UUID;
+import java.util.function.Supplier;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
@@ -30,7 +31,7 @@ class RepairCommand {
RepairCommand(NoticeService noticeService, PluginConfiguration config) {
this.noticeService = noticeService;
this.config = config;
- this.delay = new Delay<>(this.config.repair);
+ this.delay = new Delay<>(() -> this.config.repair.repairDelay());
}
@Execute
@@ -74,7 +75,7 @@ void repair(@Context Player player) {
.player(player.getUniqueId())
.send();
- this.delay.markDelay(uuid, this.config.repair.delay());
+ this.delay.markDelay(uuid, this.config.repair.repairDelay());
}
@Execute(name = "all")
@@ -100,8 +101,6 @@ void repairAll(@Context Player player) {
exists = true;
this.repairItem(itemStack);
-
- this.delay.markDelay(uuid, this.config.repair.delay());
}
if (!exists) {
@@ -120,7 +119,7 @@ void repairAll(@Context Player player) {
.player(player.getUniqueId())
.send();
- this.delay.markDelay(uuid, this.config.repair.delay());
+ this.delay.markDelay(uuid, this.config.repair.repairDelay());
}
@Execute(name = "armor")
@@ -164,7 +163,7 @@ void repairArmor(@Context Player player) {
.player(player.getUniqueId())
.send();
- this.delay.markDelay(uuid, this.config.repair.delay());
+ this.delay.markDelay(uuid, this.config.repair.repairDelay());
}
private boolean hasRepairDelay(UUID uuid) {
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java
index 3de4382a8..89d895292 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java
@@ -36,7 +36,7 @@ class HelpOpCommand {
this.config = config;
this.eventCaller = eventCaller;
this.server = server;
- this.delay = new Delay<>(this.config.helpOp);
+ this.delay = new Delay<>(() -> this.config.helpOp.getHelpOpDelay());
}
@Execute
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java
index f6309c17c..dcf8663f7 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java
@@ -1,15 +1,9 @@
package com.eternalcode.core.feature.helpop;
-import com.eternalcode.core.delay.DelaySettings;
import java.time.Duration;
-public interface HelpOpSettings extends DelaySettings {
+public interface HelpOpSettings {
Duration getHelpOpDelay();
- @Override
- default Duration delay() {
- return this.getHelpOpDelay();
- }
-
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java
index a0b70869d..599f11999 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java
@@ -6,7 +6,6 @@
import com.eternalcode.core.placeholder.PlaceholderRegistry;
import com.eternalcode.core.placeholder.PlaceholderReplacer;
import com.eternalcode.core.publish.Subscribe;
-import com.eternalcode.core.publish.Subscriber;
import com.eternalcode.core.publish.event.EternalInitializeEvent;
import com.eternalcode.core.translation.Translation;
import com.eternalcode.core.translation.TranslationManager;
@@ -18,7 +17,7 @@
import org.bukkit.entity.Player;
@Controller
-class HomePlaceholderSetup implements Subscriber {
+class HomePlaceholderSetup {
private final HomeService homeService;
private final UserManager userManager;
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java
index 6a0df9d5e..6a2f0fb67 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java
@@ -42,7 +42,7 @@ class RandomTeleportCommand {
this.randomTeleportService = randomTeleportService;
this.randomTeleportTaskService = randomTeleportTaskService;
this.config = config;
- this.cooldown = new Delay<>((Supplier) () -> this.config.randomTeleport.cooldown());
+ this.cooldown = new Delay<>(() -> this.config.randomTeleport.cooldown());
}
@Execute
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java
index df4e10eae..381aecf0d 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java
@@ -76,7 +76,7 @@ public class RandomTeleportSettingsImpl implements RandomTeleportSettings, Migra
public Set airBlocks = EnumSet.of(
Material.AIR,
Material.CAVE_AIR,
- Material.GRASS,
+ Material.SHORT_GRASS,
Material.TALL_GRASS,
Material.VINE,
Material.STRUCTURE_VOID,
@@ -98,6 +98,7 @@ public class RandomTeleportSettingsImpl implements RandomTeleportSettings, Migra
Material.ROSE_BUSH,
Material.PEONY,
Material.LARGE_FERN,
+ Material.LEGACY_GRASS,
Material.LEGACY_LONG_GRASS,
Material.LEGACY_DEAD_BUSH,
Material.RAIL,
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishPermissionConstant.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishPermissionConstant.java
new file mode 100644
index 000000000..4fe2976b8
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishPermissionConstant.java
@@ -0,0 +1,6 @@
+package com.eternalcode.core.feature.vanish;
+
+public class VanishPermissionConstant {
+
+ public static final String VANISH_SEE_TABULATION_PERMISSION = "eternalcore.vanish.tabulation.see";
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishService.java
index 1b9c9ab7f..4d9e15cbe 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishService.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishService.java
@@ -4,6 +4,7 @@
import com.eternalcode.core.injector.annotations.component.Service;
import java.util.UUID;
import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.metadata.MetadataValue;
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java
index 2ddad1e9f..c76774b25 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java
@@ -40,8 +40,8 @@ private void removeWarp(Player player, String name) {
if (!this.warpService.warpExists(name)) {
this.noticeService.create()
.player(player.getUniqueId())
- .placeholder("{WARP}", name)
.notice(translation -> translation.warp().notExist())
+ .placeholder("{WARP}", name)
.send();
return;
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java
index 3af1c4263..288f14b34 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java
@@ -47,8 +47,8 @@ private void createWarp(Player player, String warp, UUID uniqueId) {
if (this.warpService.warpExists(warp)) {
this.noticeService.create()
.player(uniqueId)
- .placeholder("{WARP}", warp)
.notice(translation -> translation.warp().warpAlreadyExists())
+ .placeholder("{WARP}", warp)
.send();
return;
@@ -79,7 +79,6 @@ private void createWarp(Player player, String warp, UUID uniqueId) {
.notice(translation -> translation.warp().itemLimit())
.placeholder("{LIMIT}", String.valueOf(MAX_WARPS_IN_GUI))
.send();
-
}
}
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java
index c10b2291b..5b5b6946b 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java
@@ -5,8 +5,11 @@
import com.eternalcode.core.feature.warp.WarpService;
import com.eternalcode.core.injector.annotations.Inject;
import com.eternalcode.core.injector.annotations.lite.LiteArgument;
+import com.eternalcode.core.notice.EternalCoreBroadcast;
+import com.eternalcode.core.notice.NoticeService;
import com.eternalcode.core.translation.Translation;
import com.eternalcode.core.translation.TranslationManager;
+import com.eternalcode.core.viewer.Viewer;
import com.eternalcode.core.viewer.ViewerService;
import dev.rollczi.litecommands.argument.Argument;
import dev.rollczi.litecommands.argument.parser.ParseResult;
@@ -20,11 +23,18 @@
class WarpArgument extends AbstractViewerArgument {
private final WarpService warpService;
+ private final NoticeService noticeService;
@Inject
- WarpArgument(WarpService warpService, TranslationManager translationManager, ViewerService viewerService) {
+ WarpArgument(
+ WarpService warpService,
+ TranslationManager translationManager,
+ ViewerService viewerService,
+ NoticeService noticeService
+ ) {
super(viewerService, translationManager);
this.warpService = warpService;
+ this.noticeService = noticeService;
}
@Override
@@ -32,7 +42,14 @@ public ParseResult parse(Invocation invocation, String argu
Optional warpOption = this.warpService.findWarp(argument);
return warpOption.map(ParseResult::success)
- .orElseGet(() -> ParseResult.failure(translation.warp().notExist()));
+ .orElseGet(() -> {
+ EternalCoreBroadcast warpNotExistNotice = this.noticeService.create()
+ .sender(invocation.sender())
+ .notice(translation.warp().notExist())
+ .placeholder("{WARP}", argument);
+
+ return ParseResult.failure(warpNotExistNotice);
+ });
}
@Override
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java
index ce33c24d2..b3f1bdf0a 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java
@@ -6,7 +6,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
+@Target({ElementType.METHOD, ElementType.FIELD})
public @interface Bean {
String value() default "";
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java
index d1770b0d8..d4c21152a 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java
@@ -14,7 +14,7 @@
* @see Task
* @see Controller
* @see ConfigurationFile
- * @see BeanSetup
+ * @see Setup
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java
index fb7064157..514182fb7 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java
@@ -14,7 +14,7 @@
* @see Repository
* @see Task
* @see Controller
- * @see BeanSetup
+ * @see Setup
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java
index 775503a64..c9e0d0e64 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java
@@ -14,7 +14,7 @@
* @see Repository
* @see Task
* @see ConfigurationFile
- * @see BeanSetup
+ * @see Setup
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java
index 8b9796a81..a9c7c581d 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java
@@ -14,7 +14,7 @@
* @see Task
* @see Controller
* @see ConfigurationFile
- * @see BeanSetup
+ * @see Setup
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java
index e3c8727f2..6a455d3d8 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java
@@ -14,7 +14,7 @@
* @see Task
* @see Controller
* @see ConfigurationFile
- * @see BeanSetup
+ * @see Setup
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/BeanSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Setup.java
similarity index 94%
rename from eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/BeanSetup.java
rename to eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Setup.java
index c6179403b..1311e5194 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/BeanSetup.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Setup.java
@@ -17,6 +17,6 @@
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
-public @interface BeanSetup {
+public @interface Setup {
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java
index 087aabcbe..c595d5cb5 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java
@@ -15,7 +15,7 @@
* @see Repository
* @see Controller
* @see ConfigurationFile
- * @see BeanSetup
+ * @see Setup
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java
index 8984d5995..284d0db33 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java
@@ -1,13 +1,22 @@
package com.eternalcode.core.injector.bean;
+import dev.rollczi.litecommands.priority.Prioritized;
+import dev.rollczi.litecommands.priority.PriorityLevel;
import java.util.function.Supplier;
-public interface BeanCandidate {
+public interface BeanCandidate extends Prioritized {
boolean isCandidate(Class> clazz);
+ Class> getType();
+
BeanHolder createBean(Class clazz);
+ @Override
+ default PriorityLevel getPriority() {
+ return PriorityLevel.NORMAL;
+ }
+
static BeanCandidate of(String name, Class type, Supplier instance) {
return new SimpleBeanCandidate(name, type, instance);
}
@@ -16,4 +25,8 @@ static BeanCandidate of(Class type, Supplier instance) {
return new SimpleBeanCandidate(BeanHolder.DEFAULT_NAME, type, instance);
}
+ static BeanCandidate prioritized(BeanCandidate candidate, PriorityLevel priorityLevel) {
+ return new PrioritizedBeanCandidate(candidate, priorityLevel);
+ }
+
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java
index 4e11d8d94..0ab8557b0 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java
@@ -1,17 +1,28 @@
package com.eternalcode.core.injector.bean;
+import dev.rollczi.litecommands.priority.MutablePrioritizedList;
+import dev.rollczi.litecommands.priority.Prioritized;
+import dev.rollczi.litecommands.priority.PrioritizedList;
+import dev.rollczi.litecommands.priority.PriorityLevel;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import java.util.function.Function;
import javax.annotation.Nullable;
class BeanCandidateContainer {
private final Object lock = new Object();
- private final Set candidates = new HashSet<>();
+ private final MutablePrioritizedList candidates = new MutablePrioritizedList<>();
+ private Function priorityProvider = beanCandidate -> PriorityLevel.NORMAL;
void addCandidate(BeanCandidate candidate) {
+ PriorityLevel priorityLevel = this.priorityProvider.apply(candidate);
+ if (!priorityLevel.equals(candidate.getPriority())) {
+ candidate = BeanCandidate.prioritized(candidate, priorityLevel);
+ }
+
synchronized (this.lock) {
this.candidates.add(candidate);
}
@@ -23,6 +34,10 @@ void removeCandidate(BeanCandidate candidate) {
}
}
+ void setPriorityProvider(Function priorityProvider) {
+ this.priorityProvider = priorityProvider;
+ }
+
@Nullable
BeanCandidate nextCandidate(Class> type) {
synchronized (this.lock) {
@@ -42,14 +57,12 @@ BeanCandidate nextCandidate(Class> type) {
@Nullable
BeanCandidate nextCandidate() {
synchronized (this.lock) {
- Iterator iterator = this.candidates.iterator();
-
- if (!iterator.hasNext()) {
+ if (this.candidates.isEmpty()) {
return null;
}
- BeanCandidate candidate = iterator.next();
- iterator.remove();
+ BeanCandidate candidate = this.candidates.first();
+ this.candidates.remove(candidate);
return candidate;
}
}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java
new file mode 100644
index 000000000..b7c9a9a32
--- /dev/null
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java
@@ -0,0 +1,16 @@
+package com.eternalcode.core.injector.bean;
+
+import com.eternalcode.core.publish.SubscriberUtil;
+import dev.rollczi.litecommands.priority.PriorityLevel;
+import java.util.function.Function;
+
+public class BeanCandidatePriorityProvider implements Function {
+ @Override
+ public PriorityLevel apply(BeanCandidate candidate) {
+ if (SubscriberUtil.isSubscriber(candidate.getType())) {
+ return PriorityLevel.HIGH;
+ }
+
+ return PriorityLevel.NORMAL;
+ }
+}
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java
index fbfaf0365..c3921387f 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java
@@ -3,9 +3,11 @@
import com.eternalcode.core.injector.DependencyProvider;
import com.eternalcode.core.injector.bean.processor.BeanProcessor;
+import dev.rollczi.litecommands.priority.PriorityLevel;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
+import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -26,6 +28,11 @@ public T getDependency(Class clazz) {
return this.getSingletonBean(clazz).get();
}
+ public BeanFactory priorityProvider(Function priorityProvider) {
+ this.candidateContainer.setPriorityProvider(priorityProvider);
+ return this;
+ }
+
private BeanHolder getSingletonBean(Class type) {
List> stacktrace = dependencyStacktrace.get();
diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java
index a5de3eb85..6ed6f1af0 100644
--- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java
+++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java
@@ -4,10 +4,12 @@
public class LazyBeanCandidate implements BeanCandidate {
+ private final String name;
private final Supplier