From 79f6ffc825efa67f5d0a88d9380fe09ab682fca1 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sat, 11 Jan 2025 23:17:37 +0100 Subject: [PATCH 01/18] GH-884 Add support for 1.21.3, refactor injector. (#884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Support new sound serdes after bukkit api update. Drop java 17 support (WiP) * Fix some issues * Create universal old enum composer * Fix local publisher * @Compatibility WiP * Use CompatibilityService * Fix * Improve dependency injector management * Update multification. * Prevent redundant delay marking when looping through items * Do not wrap Supplier in another Supplier Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fixes * Fix potion effect * Fix SHORT_GRASS * Add Material.LEGACY_GRASS, * Rename HOW_USE_DI.md to HOW_USE_TO_DI.md --------- Co-authored-by: Rollczi Co-authored-by: CitralFlo Co-authored-by: Jakub Kędziora <77227023+Jakubk15@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .github/{HOW_USE_DI.md => HOW_USE_TO_DI.md} | 8 +- buildSrc/src/main/kotlin/Versions.kt | 5 +- .../main/kotlin/eternalcode-java.gradle.kts | 2 +- .../example/feature/home/ApiHomeListener.java | 2 +- .../com/eternalcode/core/delay/Delay.java | 5 -- .../eternalcode/core/delay/DelaySettings.java | 10 --- .../com/eternalcode/core/EternalCore.java | 73 ++++++++++--------- .../core/bridge/BridgeManagerInitializer.java | 4 +- .../core/bridge/adventure/AdventureSetup.java | 4 +- .../bridge/litecommand/LiteCommandsSetup.java | 7 +- .../config/CommandConfiguration.java | 2 + .../bridge/metrics/BStatsMetricsSetup.java | 3 +- .../core/bridge/skullapi/SkullAPISetup.java | 7 +- .../core/compatibility/Compatibility.java | 16 ++++ .../compatibility/CompatibilityService.java | 31 ++++++++ .../core/compatibility/Version.java | 15 ++++ .../configuration/ConfigurationManager.java | 18 +++-- .../ConfigurationSettingsSetupEvent.java | 22 ++++++ .../ConfigurationCompatibilityV21_2.java | 20 +++++ .../composer/DurationComposer.java | 5 +- .../composer/MaterialComposer.java | 18 ----- .../composer/OldEnumComposer.java | 54 ++++++++++++++ .../implementation/PluginConfiguration.java | 16 +++- .../migration/MigrationController.java | 3 +- .../core/database/DatabaseManagerSetup.java | 7 +- .../core/feature/afk/AfkCommand.java | 4 +- .../core/feature/afk/AfkSettings.java | 9 +-- .../core/feature/afk/AftPlaceholderSetup.java | 3 +- .../core/feature/catboy/CatboyController.java | 2 +- .../core/feature/chat/ChatSettings.java | 9 +-- .../essentials/item/RepairCommand.java | 11 ++- .../core/feature/helpop/HelpOpCommand.java | 2 +- .../core/feature/helpop/HelpOpSettings.java | 8 +- .../feature/home/HomePlaceholderSetup.java | 3 +- .../randomteleport/RandomTeleportCommand.java | 2 +- .../RandomTeleportSettingsImpl.java | 3 +- .../core/injector/annotations/Bean.java | 2 +- .../annotations/component/Component.java | 2 +- .../component/ConfigurationFile.java | 2 +- .../annotations/component/Controller.java | 2 +- .../annotations/component/Repository.java | 2 +- .../annotations/component/Service.java | 2 +- .../component/{BeanSetup.java => Setup.java} | 2 +- .../injector/annotations/component/Task.java | 2 +- .../core/injector/bean/BeanCandidate.java | 15 +++- .../injector/bean/BeanCandidateContainer.java | 25 +++++-- .../bean/BeanCandidatePriorityProvider.java | 16 ++++ .../core/injector/bean/BeanFactory.java | 7 ++ .../core/injector/bean/LazyBeanCandidate.java | 11 ++- .../injector/bean/LazyFieldBeanCandidate.java | 24 ++++-- .../bean/PrioritizedBeanCandidate.java | 34 +++++++++ .../injector/bean/SimpleBeanCandidate.java | 5 ++ .../bean/processor/BeanProcessorFactory.java | 20 ++--- .../scan/ComponentBeanCandidateImpl.java | 5 ++ .../injector/scan/ComponentNameProvider.java | 2 +- .../core/injector/scan/DependencyScanner.java | 41 +++++++++-- .../scan/DependencyScannerFactory.java | 44 ----------- .../injector/scan/MethodBeanCandidate.java | 5 ++ .../EternalCoreNoticeBukkitResolver.java | 13 +--- .../core/placeholder/PlaceholdersSetup.java | 3 +- .../core/publish/LocalPublisher.java | 6 +- .../eternalcode/core/publish/Publisher.java | 2 +- .../eternalcode/core/publish/Subscriber.java | 4 - .../core/publish/SubscriberUtil.java | 24 ++++++ .../core/scheduler/SchedulerSetup.java | 7 +- .../translation/TranslationManagerSetup.java | 4 +- eternalcore-plugin/build.gradle.kts | 2 +- 67 files changed, 487 insertions(+), 261 deletions(-) rename .github/{HOW_USE_DI.md => HOW_USE_TO_DI.md} (95%) delete mode 100644 eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java rename eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/{BeanSetup.java => Setup.java} (94%) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java 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/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 307a2a83a..6369f9276 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,7 +1,7 @@ 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.2.1" @@ -36,7 +36,6 @@ object Versions { const val TRIUMPH_GUI = "3.1.10" const val BSTATS = "3.1.0" - const val PIXEL_WIDTH = "1.1.0" const val CAFFEINE = "3.1.8" diff --git a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts index 7fb2380ea..101a7aaab 100644 --- a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts @@ -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/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/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 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 11cf299f2..cce6e1b29 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,6 +9,7 @@ import com.eternalcode.core.feature.helpop.HelpOpSettings; import com.eternalcode.core.feature.randomteleport.RandomTeleportSettingsImpl; import com.eternalcode.core.feature.spawn.SpawnSettings; +import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; import java.util.LinkedHashMap; @@ -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(); @@ -358,6 +364,7 @@ public static class Butcher { public int safeChunkNumber = 5; } + @Bean @Description({ " ", "# AutoMessage Section" }) public AutoMessage autoMessage = new AutoMessage(); @@ -391,6 +398,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/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 instanceSupplier; private Object instance; - public LazyBeanCandidate(Supplier instanceSupplier) { + public LazyBeanCandidate(String name, Supplier instanceSupplier) { + this.name = name; this.instanceSupplier = instanceSupplier; } @@ -18,13 +20,18 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(type); } + @Override + public Class getType() { + return this.getInstance().getClass(); + } + @Override public BeanHolder createBean(Class clazz) { if (!this.isCandidate(clazz)) { throw new IllegalArgumentException("Class " + clazz.getName() + " is not a candidate for " + this.getInstance().getClass().getName()); } - return BeanHolder.of(clazz.cast(this.getInstance())); + return BeanHolder.of(name, clazz.cast(this.getInstance())); } private Object getInstance() { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java index 2db597b2e..dded5caef 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java @@ -1,25 +1,39 @@ package com.eternalcode.core.injector.bean; +import com.eternalcode.core.injector.DependencyInjector; +import com.eternalcode.core.injector.annotations.Bean; import java.lang.reflect.Field; +import java.util.function.Supplier; public class LazyFieldBeanCandidate extends LazyBeanCandidate { - private final Object instance; + private final Supplier instance; private final Field field; + private final Class instanceType; - public LazyFieldBeanCandidate(Object instance, Field field) { - super(() -> { + public LazyFieldBeanCandidate(Supplier instance, Field field, Bean bean) { + super(bean.value(), () -> { try { field.setAccessible(true); - return field.get(instance); + return field.get(instance.get()); } catch (IllegalAccessException exception) { - throw new BeanException("Cannot access field " + field.getName() + " of " + instance.getClass().getName(), exception, field.getType()); + throw new BeanException("Cannot access field " + field.getName() + " of " + field.getType().getName(), exception, field.getType()); } }); this.field = field; this.instance = instance; + this.instanceType = field.getType(); + } + + public LazyFieldBeanCandidate(DependencyInjector dependencyInjector, Class componentClass, Field field, Bean bean) { + this(() -> dependencyInjector.newInstance(componentClass), field, bean); + } + + @Override + public Class getType() { + return this.instanceType; } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java new file mode 100644 index 000000000..f35a5b435 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java @@ -0,0 +1,34 @@ +package com.eternalcode.core.injector.bean; + +import dev.rollczi.litecommands.priority.PriorityLevel; + +class PrioritizedBeanCandidate implements BeanCandidate { + + private final BeanCandidate candidate; + private final PriorityLevel priorityLevel; + + PrioritizedBeanCandidate(BeanCandidate candidate, PriorityLevel priorityLevel) { + this.candidate = candidate; + this.priorityLevel = priorityLevel; + } + + @Override + public boolean isCandidate(Class clazz) { + return this.candidate.isCandidate(clazz); + } + + @Override + public Class getType() { + return this.candidate.getType(); + } + + @Override + public BeanHolder createBean(Class clazz) { + return this.candidate.createBean(clazz); + } + + @Override + public PriorityLevel getPriority() { + return this.priorityLevel; + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java index c99afe88d..c6def21f1 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java @@ -19,6 +19,11 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(this.type); } + @Override + public Class getType() { + return this.type; + } + @Override public BeanHolder createBean(Class clazz) { if (!this.isCandidate(clazz)) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java index bc85f46c2..f09f4b525 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java @@ -9,13 +9,11 @@ import com.eternalcode.core.injector.annotations.lite.LiteContextual; import com.eternalcode.core.injector.annotations.lite.LiteHandler; import com.eternalcode.core.publish.Publisher; -import com.eternalcode.core.publish.Subscribe; -import com.eternalcode.core.publish.Subscriber; +import com.eternalcode.core.publish.SubscriberUtil; import dev.rollczi.litecommands.LiteCommandsBuilder; import dev.rollczi.litecommands.annotations.LiteCommandsAnnotations; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.command.RootCommand; -import java.lang.reflect.Method; import dev.rollczi.litecommands.argument.ArgumentKey; import dev.rollczi.litecommands.argument.resolver.MultipleArgumentResolver; @@ -58,20 +56,12 @@ public static BeanProcessor defaultProcessors(Plugin plugin) { .onProcess(Listener.class, (provider, listener, none) -> { pluginManager.registerEvents(listener, plugin); }) - .onProcess(Subscriber.class, (provider, potentialSubscriber, none) -> { - Publisher publisher = provider.getDependency(Publisher.class); - publisher.subscribe(potentialSubscriber); - }) - .onProcess(Object.class, (dependencyProvider, instance, none) -> { - if (instance instanceof Subscriber) { + .onProcess(Object.class, (provider, potentialSubscriber, none) -> { + if (!SubscriberUtil.isSubscriber(potentialSubscriber.getClass())) { return; } - - for (Method method : instance.getClass().getDeclaredMethods()) { - if (method.isAnnotationPresent(Subscribe.class)) { - throw new IllegalStateException("Missing 'implements Subscriber' in declaration of class " + instance.getClass()); - } - } + Publisher publisher = provider.getDependency(Publisher.class); + publisher.subscribe(potentialSubscriber); }) .onProcess(ReloadableConfig.class, (provider, config, configurationFile) -> { ConfigurationManager configurationManager = provider.getDependency(ConfigurationManager.class); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java index 67cd0228c..7dc4aab59 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java @@ -26,6 +26,11 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(this.componentClass); } + @Override + public Class getType() { + return this.componentClass; + } + @Override public BeanHolder createBean(Class clazz) { Class typed = this.toTypedCandidate(clazz); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java index 3e17dec1d..0f2703562 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java @@ -3,7 +3,7 @@ import java.lang.annotation.Annotation; @FunctionalInterface -interface ComponentNameProvider { +public interface ComponentNameProvider { String getName(COMPONENT component); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java index 002e5c89d..420e65acd 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java @@ -4,40 +4,50 @@ import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.bean.BeanCandidate; import com.eternalcode.core.injector.bean.BeanHolder; +import com.eternalcode.core.injector.bean.LazyFieldBeanCandidate; import com.eternalcode.core.util.ReflectUtil; import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Predicate; +import org.jetbrains.annotations.Nullable; public class DependencyScanner { private final DependencyInjector dependencyInjector; private final Map, ComponentNameProvider> annotations = new HashMap<>(); + private final List>> includedTypes = new ArrayList<>(); public DependencyScanner(DependencyInjector dependencyInjector) { this.dependencyInjector = dependencyInjector; } @SafeVarargs - final DependencyScanner onAnnotations(Class... annotationTypes) { + public final DependencyScanner includeAnnotations(Class... annotationTypes) { for (Class annotationType : annotationTypes) { - this.onAnnotation(annotationType); + this.includeAnnotation(annotationType); } return this; } - private DependencyScanner onAnnotation(Class annotationType) { + public DependencyScanner includeType(Predicate> predicate) { + this.includedTypes.add(predicate); + return this; + } + + private DependencyScanner includeAnnotation(Class annotationType) { this.annotations.put(annotationType, annotation -> BeanHolder.DEFAULT_NAME); return this; } - DependencyScanner onAnnotation(Class annotationType, ComponentNameProvider componentNameProvider) { + public DependencyScanner includeAnnotation(Class annotationType, ComponentNameProvider componentNameProvider) { this.annotations.put(annotationType, componentNameProvider); return this; } @@ -56,6 +66,11 @@ public List scan(String... packageNames) { List beanCandidates = new ArrayList<>(); for (Class clazz : classes) { + boolean isIncluded = this.includedTypes.stream().allMatch(filter -> filter.test(clazz)); + if (!isIncluded) { + continue; + } + beanCandidates.addAll(this.createBeanCandidates(clazz)); } @@ -69,8 +84,8 @@ private List createBeanCandidates(Class clazz) { if (beanCandidate != null) { beanCandidates.add(beanCandidate); - List methodBeanCandidates = this.getMethodBeanCandidates(clazz); - beanCandidates.addAll(methodBeanCandidates); + List otherCandidates = this.getFieldAndMethodCandidates(clazz); + beanCandidates.addAll(otherCandidates); } return beanCandidates; @@ -98,7 +113,7 @@ private BeanCandidate createBeanCandidate(Class clazz, return new ComponentBeanCandidateImpl<>(this.dependencyInjector, clazz, annotation, componentNameProvider); } - private List getMethodBeanCandidates(Class componentClass) { + private List getFieldAndMethodCandidates(Class componentClass) { List beanCandidates = new ArrayList<>(); for (Method method : componentClass.getDeclaredMethods()) { @@ -112,10 +127,22 @@ private List getMethodBeanCandidates(Class componentClass) { beanCandidates.add(beanCandidate); } + for (Field field : ReflectUtil.getAllSuperFields(componentClass)) { + if (!field.isAnnotationPresent(Bean.class)) { + continue; + } + + Bean bean = field.getAnnotation(Bean.class); + BeanCandidate beanCandidate = new LazyFieldBeanCandidate(this.dependencyInjector, componentClass, field, bean); + + beanCandidates.add(beanCandidate); + } + return beanCandidates; } @SuppressWarnings("unchecked") + @Nullable private ComponentNameProvider getComponentNameProvider(A annotation) { return (ComponentNameProvider) this.annotations.get(annotation.annotationType()); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java deleted file mode 100644 index 9efca0dd0..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.eternalcode.core.injector.scan; - -import com.eternalcode.core.injector.DependencyInjector; -import com.eternalcode.core.injector.annotations.component.BeanSetup; -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.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 dev.rollczi.litecommands.annotations.command.Command; -import dev.rollczi.litecommands.annotations.command.RootCommand; - -public final class DependencyScannerFactory { - - private DependencyScannerFactory() { - } - - public static DependencyScanner createDefault(DependencyInjector injector) { - return new DependencyScanner(injector) - .onAnnotations( - Component.class, - Service.class, - Repository.class, - Task.class, - Controller.class, - ConfigurationFile.class, - BeanSetup.class, - - Command.class, - RootCommand.class, - LiteArgument.class, - LiteHandler.class, - LiteContextual.class, - LiteCommandEditor.class - ); - } - - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java index 125ca060f..d4896ef23 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java @@ -28,6 +28,11 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(returnType); } + @Override + public Class getType() { + return this.method.getReturnType(); + } + @Override public BeanHolder createBean(Class clazz) { if (!this.isCandidate(clazz)) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java b/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java index 08ed5ad89..8f1eeeff9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java @@ -1,21 +1,12 @@ package com.eternalcode.core.notice; 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.multification.bukkit.notice.resolver.sound.SoundBukkitResolver; import com.eternalcode.multification.notice.resolver.NoticeResolverDefaults; import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry; -import com.eternalcode.multification.notice.resolver.actionbar.ActionbarResolver; -import com.eternalcode.multification.notice.resolver.chat.ChatResolver; -import com.eternalcode.multification.notice.resolver.sound.SoundAdventureResolver; -import com.eternalcode.multification.notice.resolver.title.SubtitleResolver; -import com.eternalcode.multification.notice.resolver.title.SubtitleWithEmptyTitleResolver; -import com.eternalcode.multification.notice.resolver.title.TimesResolver; -import com.eternalcode.multification.notice.resolver.title.TitleHideResolver; -import com.eternalcode.multification.notice.resolver.title.TitleResolver; -import com.eternalcode.multification.notice.resolver.title.TitleWithEmptySubtitleResolver; -@BeanSetup +@Setup public class EternalCoreNoticeBukkitResolver { @Bean diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java index 2159e816c..0ae46f863 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java @@ -2,13 +2,12 @@ import com.eternalcode.core.configuration.implementation.PlaceholdersConfiguration; 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.bukkit.Server; @Controller -class PlaceholdersSetup implements Subscriber { +class PlaceholdersSetup { @Subscribe(EternalInitializeEvent.class) void setUp(PlaceholderRegistry placeholderRegistry, PlaceholdersConfiguration placeholdersConfiguration) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java index ec7e1cfe9..f951987d5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java @@ -60,11 +60,11 @@ private Class getTypeOfEvent(Method method, Subscribe subscribe) { } @Override - public void publish(PublishEvent publishEvent) { + public E publish(E publishEvent) { Set nativeSubscribers = this.subscribersByType.get(publishEvent.getClass()); if (nativeSubscribers == null) { - return; + return publishEvent; } for (NativeSubscriber nativeSubscriber : nativeSubscribers) { @@ -73,6 +73,8 @@ public void publish(PublishEvent publishEvent) { this.dependencyInjector.invokeMethod(instance, method, publishEvent); } + + return publishEvent; } private record NativeSubscriber(Object subscriber, Method method) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java index 5b6550a21..ae229d859 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java @@ -4,6 +4,6 @@ public interface Publisher { void subscribe(Object subscriber); - void publish(PublishEvent publishEvent); + E publish(E publishEvent); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java deleted file mode 100644 index 3638eeb9d..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.eternalcode.core.publish; - -public interface Subscriber { -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java new file mode 100644 index 000000000..669ca252f --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java @@ -0,0 +1,24 @@ +package com.eternalcode.core.publish; + +import java.lang.reflect.Method; + +public final class SubscriberUtil { + + private SubscriberUtil() { + } + + public static boolean isSubscriber(Class subscriberCanditate) { + for (Method method : subscriberCanditate.getDeclaredMethods()) { + Subscribe subscribe = method.getAnnotation(Subscribe.class); + + if (subscribe == null) { + continue; + } + + return true; + } + + return false; + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java index e5a76e1f0..2089c5f68 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java @@ -3,12 +3,11 @@ import com.eternalcode.commons.bukkit.scheduler.BukkitSchedulerImpl; import com.eternalcode.commons.scheduler.Scheduler; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; -import com.eternalcode.core.publish.Subscriber; +import com.eternalcode.core.injector.annotations.component.Setup; import org.bukkit.plugin.Plugin; -@BeanSetup -public class SchedulerSetup implements Subscriber { +@Setup +public class SchedulerSetup { @Bean public Scheduler scheduler(Plugin plugin) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java index dea508bce..aa1e51182 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java @@ -2,13 +2,13 @@ import com.eternalcode.core.configuration.ConfigurationManager; 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.feature.language.config.LanguageConfiguration; import com.eternalcode.core.translation.implementation.TranslationFactory; import java.util.List; import panda.std.stream.PandaStream; -@BeanSetup +@Setup class TranslationManagerSetup { @Bean diff --git a/eternalcore-plugin/build.gradle.kts b/eternalcore-plugin/build.gradle.kts index d0368b708..9ac557482 100644 --- a/eternalcore-plugin/build.gradle.kts +++ b/eternalcore-plugin/build.gradle.kts @@ -38,6 +38,6 @@ dependencies { tasks { runServer { - minecraftVersion("1.21.1") + minecraftVersion("1.21.4") } } From 5ea93442cf31ca9f910b888cde66f0165e28d7dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 11 Jan 2025 23:18:28 +0100 Subject: [PATCH 02/18] dependency: Update patch (#881) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/gradle.yml | 2 +- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/Versions.kt | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index ab801de32..b10b4a719 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -16,7 +16,7 @@ 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.6.0 with: diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 74ad23518..69386a084 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -8,7 +8,7 @@ repositories { dependencies { implementation("net.kyori:blossom:1.3.1") - implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.3") + 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 6369f9276..f4c729e27 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -8,12 +8,12 @@ object Versions { 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" @@ -33,7 +33,7 @@ object Versions { const val PANDA_UTILITIES = "0.5.3-alpha" 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" @@ -43,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 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" } From 07c1118084c7a0b5f3976ba5484b7f1afe9c0505 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sat, 11 Jan 2025 23:42:54 +0100 Subject: [PATCH 03/18] Fix warp placeholder handling in warp-related messages --- .../feature/warp/command/DelWarpCommand.java | 2 +- .../feature/warp/command/SetWarpCommand.java | 5 +---- .../feature/warp/command/WarpArgument.java | 21 +++++++++++++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) 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 e5b2ecdef..a0f29e53b 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 @@ -46,8 +46,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; @@ -62,9 +62,7 @@ private void createWarp(Player player, String warp, UUID uniqueId) { .send(); if (this.config.warp.autoAddNewWarps) { - if (this.warpService.getNamesOfWarps().size() <= MAX_WARPS_IN_GUI) { - this.warpInventory.addWarp(createdWarp); this.noticeService.create() @@ -80,7 +78,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 From 8439bf028703fc226a25dbfb72dc03ed432db1e9 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sat, 11 Jan 2025 23:53:30 +0100 Subject: [PATCH 04/18] Release v1.5.0 --- README.md | 10 +-- .../main/kotlin/eternalcode-java.gradle.kts | 2 +- .../kotlin/eternalcore-publish.gradle.kts | 2 +- raw_commands_docs.json | 65 +++++++++++++++++++ raw_features_docs.json | 14 ++++ 5 files changed, 86 insertions(+), 7 deletions(-) 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/src/main/kotlin/eternalcode-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts index 101a7aaab..3594d9205 100644 --- a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "com.eternalcode" -version = "1.4.0" +version = "1.5.0" checkstyle { toolVersion = "10.21.1" 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/raw_commands_docs.json b/raw_commands_docs.json index b977b4d72..c45cfec75 100644 --- a/raw_commands_docs.json +++ b/raw_commands_docs.json @@ -38,6 +38,71 @@ "\u003ctype\u003e \u003cmessage\u003e" ] }, + { + "name": "alert-queue add", + "aliases": [], + "permissions": [ + "eternalcore.alert.queue" + ], + "descriptions": [ + "Adds alert to the queue with specified notice type and messages" + ], + "arguments": [ + "\u003ctype\u003e \u003cmessage\u003e" + ] + }, + { + "name": "alert-queue clear", + "aliases": [], + "permissions": [ + "eternalcore.alert.queue" + ], + "descriptions": [ + "Clears all alerts from the queue" + ], + "arguments": [ + "" + ] + }, + { + "name": "alert-queue remove", + "aliases": [], + "permissions": [ + "eternalcore.alert.queue" + ], + "descriptions": [ + "Removes all alerts of the given type from the queue" + ], + "arguments": [ + "\u003ctype\u003e all" + ] + }, + { + "name": "alert-queue remove", + "aliases": [], + "permissions": [ + "eternalcore.alert.queue" + ], + "descriptions": [ + "Removes a latest alert of the given type from the queue" + ], + "arguments": [ + "\u003ctype\u003e latest" + ] + }, + { + "name": "alert-queue send", + "aliases": [], + "permissions": [ + "eternalcore.alert.queue" + ], + "descriptions": [ + "Sends all alerts from the queue" + ], + "arguments": [ + "" + ] + }, { "name": "anvil ", "aliases": [], diff --git a/raw_features_docs.json b/raw_features_docs.json index 05d9cfa98..44af13da8 100644 --- a/raw_features_docs.json +++ b/raw_features_docs.json @@ -174,6 +174,20 @@ "Sends a message to the player when a new plugin update is available after joining the server." ] }, + { + "name": "Vanish tabulation", + "permissions": [], + "descriptions": [ + "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." + ] + }, + { + "name": "Vanish tabulation", + "permissions": [], + "descriptions": [ + "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." + ] + }, { "name": "Warp System", "permissions": [], From 015a8be8c6751a600ee83b7071aacb653b5101dc Mon Sep 17 00:00:00 2001 From: Karol Dronia <80169196+eripe14@users.noreply.github.com> Date: Sun, 12 Jan 2025 16:51:10 +0100 Subject: [PATCH 05/18] GH-835 Add permission-based access to warps (#856) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add possibility to manage warp permissions * Change warp permission feature * Add config description * Resolve CitralFlo suggestion Co-authored-by: Michał Wojtas <80779749+CitralFlo@users.noreply.github.com> * Refactor and enhance warp permission handling * Update eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataDataRepositoryImpl.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataDataRepositoryImpl.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fix repository name, check if permission already exist. * Follow mr. @Rollczi review. * Follow mr. @Rollczi review. v2 * Fix synchronized * Fix merge * Fix events life cycle * Fix gui permissions * Fix cdn * Fix cdn * Fix cdn. --------- Co-authored-by: Michał Wojtas <80779749+CitralFlo@users.noreply.github.com> Co-authored-by: Martin Sulikowski Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Rollczi --- .../eternalcode/core/feature/warp/Warp.java | 16 +++ .../core/feature/warp/WarpService.java | 13 +- .../warp/event/PreWarpTeleportEvent.java | 28 +++- .../feature/warp/event/WarpTeleportEvent.java | 10 +- .../LocationsConfiguration.java | 5 +- .../implementation/PluginConfiguration.java | 7 +- .../feature/warp/WarpConfigRepository.java | 61 --------- .../core/feature/warp/WarpImpl.java | 16 ++- .../core/feature/warp/WarpInventory.java | 37 +++--- .../core/feature/warp/WarpRepository.java | 16 --- .../core/feature/warp/WarpServiceImpl.java | 64 ++++++--- .../feature/warp/WarpTeleportService.java | 25 ++-- .../feature/warp/command/DelWarpCommand.java | 2 +- .../feature/warp/command/SetWarpCommand.java | 7 +- .../feature/warp/command/WarpArgument.java | 8 +- .../feature/warp/command/WarpCommand.java | 18 ++- .../permission/WarpAddPermissionCommand.java | 69 ++++++++++ .../WarpRemovePermissionCommand.java | 55 ++++++++ .../argument/WarpPermissionEntry.java | 6 + .../WarpPermissionMultiArgumentResolver.java | 123 ++++++++++++++++++ .../feature/warp/repository/WarpConfig.java | 40 ++++++ .../warp/repository/WarpRepository.java | 17 +++ .../warp/repository/WarpRepositoryImpl.java | 119 +++++++++++++++++ .../core/translation/Translation.java | 10 +- .../implementation/ENTranslation.java | 15 ++- .../implementation/PLTranslation.java | 26 +++- 26 files changed, 658 insertions(+), 155 deletions(-) delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionEntry.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepository.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java index 0888c4f7f..0287b1645 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java @@ -2,10 +2,26 @@ import org.bukkit.Location; +import java.util.List; +import org.bukkit.permissions.Permissible; + public interface Warp { Location getLocation(); String getName(); + List getPermissions(); + + default boolean hasPermissions(Permissible permissible) { + List permissions = this.getPermissions(); + if (permissions.isEmpty()) { + return true; + } + + return permissions + .stream() + .anyMatch(permission -> permissible.hasPermission(permission)); + } + } diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java index 7c3da0339..62aedd920 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.Optional; +import org.jetbrains.annotations.ApiStatus.Experimental; public interface WarpService { @@ -11,11 +12,15 @@ public interface WarpService { void removeWarp(String warp); - boolean warpExists(String name); + @Experimental + Warp addPermissions(String warp, String... permissions); - Optional findWarp(String name); + @Experimental + Warp removePermissions(String warp, String... permissions); + + boolean isExist(String name); - Collection getNamesOfWarps(); + Optional findWarp(String name); - boolean hasWarps(); + Collection getWarps(); } diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/PreWarpTeleportEvent.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/PreWarpTeleportEvent.java index ebdfe99e1..e8a37c916 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/PreWarpTeleportEvent.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/PreWarpTeleportEvent.java @@ -1,10 +1,14 @@ package com.eternalcode.core.feature.warp.event; import com.eternalcode.core.feature.warp.Warp; +import com.google.common.base.Preconditions; +import java.time.Duration; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.Nullable; /** * Called before teleportation to warp. @@ -16,12 +20,15 @@ public class PreWarpTeleportEvent extends Event implements Cancellable { private final Player player; private Warp warp; private boolean cancelled; + private Duration teleportTime; + private @Nullable Location destination; - public PreWarpTeleportEvent(Player player, Warp warp) { + public PreWarpTeleportEvent(Player player, Warp warp, Duration teleportTime) { super(false); this.player = player; this.warp = warp; + this.teleportTime = teleportTime; } public Player getPlayer() { @@ -33,9 +40,28 @@ public Warp getWarp() { } public void setWarp(Warp warp) { + Preconditions.checkNotNull(warp, "Warp cannot be null"); this.warp = warp; } + public Duration getTeleportTime() { + return this.teleportTime; + } + + public void setTeleportTime(Duration teleportTime) { + Preconditions.checkNotNull(teleportTime, "Teleport time cannot be null"); + this.teleportTime = teleportTime; + } + + public Location getDestination() { + return this.destination != null ? this.destination : this.warp.getLocation(); + } + + public void setDestination(Location destination) { + Preconditions.checkNotNull(destination, "Destination cannot be null"); + this.destination = destination; + } + @Override public boolean isCancelled() { return this.cancelled; diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/WarpTeleportEvent.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/WarpTeleportEvent.java index c323bc037..65fc77cda 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/WarpTeleportEvent.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/event/WarpTeleportEvent.java @@ -1,8 +1,8 @@ package com.eternalcode.core.feature.warp.event; import com.eternalcode.core.feature.warp.Warp; +import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -15,12 +15,14 @@ public class WarpTeleportEvent extends Event { private final Player player; private final Warp warp; + private final Location destination; - public WarpTeleportEvent(Player player, Warp warp) { + public WarpTeleportEvent(Player player, Warp warp, Location destination) { super(false); this.player = player; this.warp = warp; + this.destination = destination; } public Player getPlayer() { @@ -31,6 +33,10 @@ public Warp getWarp() { return this.warp; } + public Location getDestination() { + return this.destination; + } + @Override public HandlerList getHandlers() { return HANDLER_LIST; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java index 2f4801004..aa45fa011 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java @@ -1,8 +1,8 @@ package com.eternalcode.core.configuration.implementation; +import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.core.configuration.ReloadableConfig; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; -import com.eternalcode.commons.bukkit.position.Position; import net.dzikoysk.cdn.entity.Description; import net.dzikoysk.cdn.entity.Exclude; import net.dzikoysk.cdn.source.Resource; @@ -21,7 +21,8 @@ public class LocationsConfiguration implements ReloadableConfig { @Description("# This is spawn location, for your own safety, please don't touch it.") public Position spawn = EMPTY_POSITION; - @Description("# These are warp locations, for your own safety, please don't touch it.") + @Description("# Warps now are stored in warps.yml. This is deprecated.") + @Deprecated public Map warps = new HashMap<>(); @Description("# This is jail location, for your own safety, please don't touch it.") 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 cce6e1b29..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 @@ -5,15 +5,13 @@ import com.eternalcode.core.feature.afk.AfkSettings; import com.eternalcode.core.feature.automessage.AutoMessageSettings; import com.eternalcode.core.feature.chat.ChatSettings; -import com.eternalcode.core.feature.jail.JailSettings; import com.eternalcode.core.feature.helpop.HelpOpSettings; +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.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; -import java.util.LinkedHashMap; -import java.util.Set; import net.dzikoysk.cdn.entity.Contextual; import net.dzikoysk.cdn.entity.Description; import net.dzikoysk.cdn.entity.Exclude; @@ -24,7 +22,9 @@ import java.io.File; import java.time.Duration; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; @ConfigurationFile public class PluginConfiguration implements ReloadableConfig { @@ -352,7 +352,6 @@ public static class Warp { @Description("# Texture of the item (only for PLAYER_HEAD material)") public String itemTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzk4ODVlODIzZmYxNTkyNjdjYmU4MDkwOTNlMzNhNDc2ZTI3NDliNjU5OGNhNGEyYTgxZWU2OTczODAzZmI2NiJ9fX0="; - } @Description({ " ", "# Butcher" }) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java deleted file mode 100644 index fccf84828..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.eternalcode.core.feature.warp; - -import com.eternalcode.commons.bukkit.position.Position; -import com.eternalcode.commons.bukkit.position.PositionAdapter; -import com.eternalcode.core.configuration.ConfigurationManager; -import com.eternalcode.core.configuration.implementation.LocationsConfiguration; -import com.eternalcode.core.injector.annotations.Inject; -import com.eternalcode.core.injector.annotations.component.Service; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import panda.std.Option; - -@Service -class WarpConfigRepository implements WarpRepository { - - private final LocationsConfiguration locationsConfiguration; - private final ConfigurationManager configurationManager; - - @Inject - WarpConfigRepository(ConfigurationManager configurationManager, LocationsConfiguration locationsConfiguration) { - this.locationsConfiguration = locationsConfiguration; - this.configurationManager = configurationManager; - } - - @Override - public void addWarp(Warp warp) { - this.edit(warps -> warps.put(warp.getName(), PositionAdapter.convert(warp.getLocation()))); - } - - @Override - public void removeWarp(String warp) { - this.edit(warps -> warps.remove(warp)); - } - - private void edit(Consumer> editor) { - HashMap warps = new HashMap<>(this.locationsConfiguration.warps); - - editor.accept(warps); - - this.locationsConfiguration.warps = warps; - this.configurationManager.save(this.locationsConfiguration); - } - - @Override - public CompletableFuture> getWarp(String name) { - return CompletableFuture.completedFuture(Optional.of(this.locationsConfiguration.warps.get(name)) - .map(location -> new WarpImpl(name, location))); - } - - @Override - public CompletableFuture> getWarps() { - return CompletableFuture.completedFuture(this.locationsConfiguration.warps.entrySet().stream() - .map(entry -> new WarpImpl(entry.getKey(), entry.getValue())) - .collect(Collectors.toList())); - } -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java index a2e8e8236..425692291 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java @@ -2,16 +2,22 @@ import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.commons.bukkit.position.PositionAdapter; +import java.util.ArrayList; import org.bukkit.Location; -class WarpImpl implements Warp { +import java.util.Collections; +import java.util.List; + +public class WarpImpl implements Warp { private final String name; private final Position position; + private final List permissions; - WarpImpl(String name, Position position) { + public WarpImpl(String name, Position position, List permissions) { this.name = name; this.position = position; + this.permissions = new ArrayList<>(permissions); } @Override @@ -23,4 +29,10 @@ public String getName() { public Location getLocation() { return PositionAdapter.convert(this.position); } + + @Override + public List getPermissions() { + return Collections.unmodifiableList(this.permissions); + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java index 03f1b97eb..92a86423b 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java @@ -15,15 +15,16 @@ import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.Gui; import dev.triumphteam.gui.guis.GuiItem; -import java.util.Collections; -import java.util.List; -import java.util.Optional; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.entity.Player; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + @Service public class WarpInventory { @@ -62,7 +63,12 @@ public class WarpInventory { this.config = config; } - private Gui createInventory(Language language) { + public void openInventory(Player player, Language language) { + this.createInventory(player, language) + .open(player); + } + + private Gui createInventory(Player player, Language language) { Translation translation = this.translationManager.getMessages(language); Translation.WarpSection.WarpInventorySection warpSection = translation.warp().warpInventory(); @@ -80,14 +86,13 @@ private Gui createInventory(Language language) { } } - Gui gui = Gui.gui() .title(this.miniMessage.deserialize(warpSection.title())) .rows(rowsCount) .disableAllInteractions() .create(); - this.createWarpItems(warpSection, gui); + this.createWarpItems(player, warpSection, gui); this.createBorder(warpSection, gui); this.createDecorations(warpSection, gui); @@ -146,7 +151,7 @@ private void createDecorations(WarpInventorySection warpSection, Gui gui) { } } - private void createWarpItems(WarpInventorySection warpSection, Gui gui) { + private void createWarpItems(Player player, WarpInventorySection warpSection, Gui gui) { warpSection.items().values().forEach(item -> { Optional warpOptional = this.warpManager.findWarp(item.warpName()); @@ -157,11 +162,17 @@ private void createWarpItems(WarpInventorySection warpSection, Gui gui) { Warp warp = warpOptional.get(); ConfigItem warpItem = item.warpItem(); + if (!warp.hasPermissions(player)) { + return; + } + BaseItemBuilder baseItemBuilder = this.createItem(warpItem); GuiItem guiItem = baseItemBuilder.asGuiItem(); guiItem.setAction(event -> { - Player player = (Player) event.getWhoClicked(); + if (!warp.hasPermissions(player)) { + return; + } player.closeInventory(); this.warpTeleportService.teleport(player, warp); @@ -193,18 +204,12 @@ private BaseItemBuilder createItem(ConfigItem item) { .glow(item.glow()); } - public void openInventory(Player player, Language language) { - this.createInventory(language).open(player); - } - public void addWarp(Warp warp) { - - if (!this.warpManager.warpExists(warp.getName())) { + if (!this.warpManager.isExist(warp.getName())) { return; } for (Language language : this.translationManager.getAvailableLanguages()) { - AbstractTranslation translation = (AbstractTranslation) this.translationManager.getMessages(language); Translation.WarpSection.WarpInventorySection warpSection = translation.warp().warpInventory(); @@ -245,7 +250,7 @@ public void addWarp(Warp warp) { public boolean removeWarp(String warpName) { - if (!this.warpManager.warpExists(warpName)) { + if (!this.warpManager.isExist(warpName)) { return false; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java deleted file mode 100644 index f07b081d6..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.eternalcode.core.feature.warp; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -interface WarpRepository { - - void addWarp(Warp warp); - - void removeWarp(String warp); - - CompletableFuture> getWarp(String name); - - CompletableFuture> getWarps(); -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java index da85b8c3b..5011d6564 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java @@ -2,13 +2,17 @@ import com.eternalcode.annotations.scan.feature.FeatureDocs; import com.eternalcode.commons.bukkit.position.PositionAdapter; +import com.eternalcode.core.feature.warp.repository.WarpRepository; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; import org.bukkit.Location; @FeatureDocs( @@ -18,7 +22,7 @@ @Service class WarpServiceImpl implements WarpService { - private final Map warpMap = new HashMap<>(); + private final Map warps = new ConcurrentHashMap<>(); private final WarpRepository warpRepository; @Inject @@ -27,26 +31,24 @@ private WarpServiceImpl(WarpRepository warpRepository) { warpRepository.getWarps().thenAcceptAsync(warps -> { for (Warp warp : warps) { - this.warpMap.put(warp.getName(), warp); + this.warps.put(warp.getName(), warp); } }); } @Override public Warp createWarp(String name, Location location) { - Warp warp = new WarpImpl(name, PositionAdapter.convert(location)); + Warp warp = new WarpImpl(name, PositionAdapter.convert(location), new ArrayList<>()); - this.warpMap.put(name, warp); - - this.warpRepository.addWarp(warp); + this.warps.put(name, warp); + this.warpRepository.saveWarp(warp); return warp; } @Override public void removeWarp(String warp) { - Warp remove = this.warpMap.remove(warp); - + Warp remove = this.warps.remove(warp); if (remove == null) { return; } @@ -55,22 +57,50 @@ public void removeWarp(String warp) { } @Override - public boolean warpExists(String name) { - return this.warpMap.containsKey(name); + public Warp addPermissions(String warpName, String... permissions) { + Warp warp = this.modifyPermissions(warpName, perms -> perms.addAll(List.of(permissions))); + this.warpRepository.saveWarp(warp); + return warp; } @Override - public Optional findWarp(String name) { - return Optional.ofNullable(this.warpMap.get(name)); + public Warp removePermissions(String warpName, String... permissions) { + Warp warp = this.modifyPermissions(warpName, perms -> perms.removeAll(List.of(permissions))); + this.warpRepository.saveWarp(warp); + return warp; + } + + private Warp modifyPermissions(String warpName, Consumer> modifier) { + Warp warp = this.warps.get(warpName); + if (warp == null) { + throw new IllegalArgumentException("Warp " + warpName + " does not exist"); + } + + List updatedPermissions = new ArrayList<>(warp.getPermissions()); + modifier.accept(updatedPermissions); + + Warp updatedWarp = new WarpImpl( + warp.getName(), + PositionAdapter.convert(warp.getLocation()), + updatedPermissions + ); + + this.warps.put(warpName, updatedWarp); + return updatedWarp; } @Override - public Collection getNamesOfWarps() { - return Collections.unmodifiableCollection(this.warpMap.keySet()); + public boolean isExist(String name) { + return this.warps.containsKey(name); + } + + @Override + public Optional findWarp(String name) { + return Optional.ofNullable(this.warps.get(name)); } @Override - public boolean hasWarps() { - return !this.warpMap.isEmpty(); + public Collection getWarps() { + return Collections.unmodifiableCollection(this.warps.values()); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpTeleportService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpTeleportService.java index 5c388d4d7..080fdd947 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpTeleportService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpTeleportService.java @@ -12,6 +12,7 @@ import com.eternalcode.core.injector.annotations.component.Service; import java.time.Duration; import java.util.UUID; +import org.bukkit.Location; import org.bukkit.entity.Player; @Service @@ -35,29 +36,31 @@ public WarpTeleportService( } public void teleport(Player player, Warp warp) { - PreWarpTeleportEvent pre = this.eventCaller.callEvent(new PreWarpTeleportEvent(player, warp)); + Duration teleportTime = player.hasPermission(WARP_BYPASS) + ? Duration.ZERO + : this.pluginConfiguration.warp.teleportTimeToWarp; + + PreWarpTeleportEvent pre = this.eventCaller.callEvent(new PreWarpTeleportEvent(player, warp, teleportTime)); if (pre.isCancelled()) { return; } - Duration teleportTime = player.hasPermission(WARP_BYPASS) - ? Duration.ZERO - : this.pluginConfiguration.warp.teleportTimeToWarp; - Warp destinationWarp = pre.getWarp(); + Location destination = pre.getDestination(); + Position destinationLocation = PositionAdapter.convert(destination); Position playerLocation = PositionAdapter.convert(player.getLocation()); - Position warpLocation = PositionAdapter.convert(destinationWarp.getLocation()); UUID uniqueId = player.getUniqueId(); - WarpTeleportEvent post = new WarpTeleportEvent(player, destinationWarp); - Teleport teleport = this.teleportTaskService.createTeleport( uniqueId, playerLocation, - warpLocation, - teleportTime + destinationLocation, + pre.getTeleportTime() ); - teleport.getResult().whenComplete((result, throwable) -> this.eventCaller.callEvent(post)); + + teleport.getResult().whenComplete((result, throwable) -> { + this.eventCaller.callEvent(new WarpTeleportEvent(player, destinationWarp, destination)); + }); } } 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 c76774b25..d266bd9a0 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 @@ -37,7 +37,7 @@ void remove(@Context Player player, @Arg Warp warp) { } private void removeWarp(Player player, String name) { - if (!this.warpService.warpExists(name)) { + if (!this.warpService.isExist(name)) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.warp().notExist()) 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 a0f29e53b..1bf3171d7 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 @@ -12,9 +12,10 @@ import dev.rollczi.litecommands.annotations.context.Context; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; -import java.util.UUID; import org.bukkit.entity.Player; +import java.util.UUID; + @Command(name = "setwarp") @Permission("eternalcore.setwarp") class SetWarpCommand { @@ -43,7 +44,7 @@ void add(@Context Player player, @Arg String warpName) { } private void createWarp(Player player, String warp, UUID uniqueId) { - if (this.warpService.warpExists(warp)) { + if (this.warpService.isExist(warp)) { this.noticeService.create() .player(uniqueId) .notice(translation -> translation.warp().warpAlreadyExists()) @@ -62,7 +63,7 @@ private void createWarp(Player player, String warp, UUID uniqueId) { .send(); if (this.config.warp.autoAddNewWarps) { - if (this.warpService.getNamesOfWarps().size() <= MAX_WARPS_IN_GUI) { + if (this.warpService.getWarps().size() <= MAX_WARPS_IN_GUI) { this.warpInventory.addWarp(createdWarp); this.noticeService.create() 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 5b5b6946b..51fe1f3fd 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 @@ -17,6 +17,7 @@ import dev.rollczi.litecommands.suggestion.SuggestionContext; import dev.rollczi.litecommands.suggestion.SuggestionResult; import java.util.Optional; +import java.util.stream.Collectors; import org.bukkit.command.CommandSender; @LiteArgument(type = Warp.class) @@ -58,8 +59,11 @@ public SuggestionResult suggest( Argument argument, SuggestionContext context ) { - return this.warpService.getNamesOfWarps().stream() - .collect(SuggestionResult.collector()); + return SuggestionResult.of( + this.warpService.getWarps().stream() + .map(Warp::getName) + .collect(Collectors.toList()) + ); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java index ec5f12370..2b1e052d2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java @@ -14,6 +14,7 @@ import dev.rollczi.litecommands.annotations.context.Context; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; +import java.util.List; import org.bukkit.entity.Player; @RootCommand @@ -45,16 +46,18 @@ class WarpCommand { @DescriptionDocs(description = "Open warp inventory, optionally you can disable this feature in config, if feature is disabled eternalcore will show all available warps") void warp(@Context Player player, @Context User user) { if (!this.config.warp.inventoryEnabled) { + List list = this.warpService.getWarps().stream().map(Warp::getName).toList(); + this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.warp().available()) - .placeholder("{WARPS}", String.join(", ", this.warpService.getNamesOfWarps())) + .placeholder("{WARPS}", String.join(this.config.format.separator, list)) .send(); return; } - if (!this.warpService.hasWarps()) { + if (this.warpService.getWarps().isEmpty()) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.warp().noWarps()) @@ -69,6 +72,17 @@ void warp(@Context Player player, @Context User user) { @Execute(name = "warp") @DescriptionDocs(description = "Teleport to warp, if player has permission eternalcore.warp.bypass teleport will be instant", arguments = "") void warp(@Context Player player, @Arg Warp warp) { + if (!warp.hasPermissions(player)) { + this.noticeService.create() + .player(player.getUniqueId()) + .placeholder("{WARP}", warp.getName()) + .placeholder("{PERMISSIONS}", String.join(this.config.format.separator, warp.getPermissions())) + .notice(translation -> translation.warp().noPermission()) + .send(); + return; + } + this.warpTeleportService.teleport(player, warp); } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java new file mode 100644 index 000000000..86ff4159c --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java @@ -0,0 +1,69 @@ +package com.eternalcode.core.feature.warp.command.permission; + +import com.eternalcode.core.configuration.implementation.PluginConfiguration; +import com.eternalcode.core.feature.warp.Warp; +import com.eternalcode.core.feature.warp.WarpService; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.notice.NoticeService; +import dev.rollczi.litecommands.annotations.argument.Arg; +import dev.rollczi.litecommands.annotations.command.Command; +import dev.rollczi.litecommands.annotations.context.Context; +import dev.rollczi.litecommands.annotations.execute.Execute; +import dev.rollczi.litecommands.annotations.permission.Permission; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import org.bukkit.entity.Player; + +@Command(name = "warp-permission add") +@Permission("eternalcore.warp.changepermissions") +public class WarpAddPermissionCommand { + + private final PluginConfiguration config; + private final WarpService warpService; + private final NoticeService noticeService; + + @Inject + public WarpAddPermissionCommand(PluginConfiguration config, WarpService warpService, NoticeService noticeService) { + this.config = config; + this.warpService = warpService; + this.noticeService = noticeService; + } + + @Execute + void addPermission(@Context Player player, @Arg Warp warp, @Arg String... permissions) { + UUID uniqueId = player.getUniqueId(); + + if (permissions.length == 0) { + this.noticeService.create() + .player(uniqueId) + .notice(translation -> translation.warp().noPermissionsProvided()) + .send(); + return; + } + + Collection currentPermissions = warp.getPermissions(); + + List newPermissions = Arrays.stream(permissions) + .filter(permission -> !currentPermissions.contains(permission)) + .toList(); + + if (newPermissions.isEmpty()) { + this.noticeService.create() + .player(uniqueId) + .placeholder("{WARP}", warp.getName()) + .placeholder("{PERMISSION}", String.join(this.config.format.separator, permissions)) + .notice(translation -> translation.warp().permissionAlreadyExist()) + .send(); + return; + } + this.warpService.addPermissions(warp.getName(), newPermissions.toArray(new String[0])); + + this.noticeService.create() + .player(uniqueId) + .placeholder("{WARP}", warp.getName()) + .notice(translation -> translation.warp().addPermissions()) + .send(); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java new file mode 100644 index 000000000..3cddadb02 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java @@ -0,0 +1,55 @@ +package com.eternalcode.core.feature.warp.command.permission; + +import com.eternalcode.core.feature.warp.Warp; +import com.eternalcode.core.feature.warp.WarpService; +import com.eternalcode.core.feature.warp.command.permission.argument.WarpPermissionEntry; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.notice.NoticeService; +import dev.rollczi.litecommands.annotations.argument.Arg; +import dev.rollczi.litecommands.annotations.command.Command; +import dev.rollczi.litecommands.annotations.context.Context; +import dev.rollczi.litecommands.annotations.execute.Execute; +import dev.rollczi.litecommands.annotations.permission.Permission; +import org.bukkit.entity.Player; + +@Command(name = "warp-permission remove") +@Permission("eternalcore.warp.changepermissions") +public class WarpRemovePermissionCommand { + + private final WarpService warpService; + private final NoticeService noticeService; + + @Inject + public WarpRemovePermissionCommand(WarpService warpService, NoticeService noticeService) { + this.warpService = warpService; + this.noticeService = noticeService; + } + + @Execute + void removePermission( + @Context Player player, + @Arg WarpPermissionEntry entry + ) { + Warp warp = entry.warp(); + String permission = entry.permission(); + + if (!warp.getPermissions().contains(permission)) { + this.noticeService.create() + .placeholder("{WARP}", warp.getName()) + .placeholder("{PERMISSION}", permission) + .player(player.getUniqueId()) + .notice(translation -> translation.warp().permissionDoesNotExist()) + .send(); + return; + } + + this.warpService.removePermissions(warp.getName(), permission); + + this.noticeService.create() + .placeholder("{WARP}", warp.getName()) + .placeholder("{PERMISSION}", permission) + .player(player.getUniqueId()) + .notice(translation -> translation.warp().removePermission()) + .send(); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionEntry.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionEntry.java new file mode 100644 index 000000000..46e26fef8 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionEntry.java @@ -0,0 +1,6 @@ +package com.eternalcode.core.feature.warp.command.permission.argument; + +import com.eternalcode.core.feature.warp.Warp; + +public record WarpPermissionEntry(Warp warp, String permission) { +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java new file mode 100644 index 000000000..5d66b658f --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java @@ -0,0 +1,123 @@ +package com.eternalcode.core.feature.warp.command.permission.argument; + +import com.eternalcode.core.feature.warp.Warp; +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.NoticeService; +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; +import dev.rollczi.litecommands.argument.resolver.MultipleArgumentResolver; +import dev.rollczi.litecommands.input.raw.RawInput; +import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.range.Range; +import dev.rollczi.litecommands.suggestion.Suggestion; +import dev.rollczi.litecommands.suggestion.SuggestionContext; +import dev.rollczi.litecommands.suggestion.SuggestionResult; +import java.util.Collection; +import java.util.Optional; +import org.bukkit.command.CommandSender; + +@LiteArgument(type = WarpPermissionEntry.class) +public class WarpPermissionMultiArgumentResolver + implements MultipleArgumentResolver { + + private static final String WARP_PLACEHOLDER_PREFIX = "{WARP}"; + private final WarpService warpService; + private final NoticeService noticeService; + private final ViewerService viewerService; + + @Inject + public WarpPermissionMultiArgumentResolver( + WarpService warpService, + NoticeService noticeService, + ViewerService viewerService + ) { + this.warpService = warpService; + this.noticeService = noticeService; + this.viewerService = viewerService; + } + + @Override + public ParseResult parse( + Invocation invocation, + Argument argument, + RawInput rawInput + ) { + Viewer viewer = this.viewerService.any(invocation.sender()); + + if (!rawInput.hasNext()) { + return ParseResult.failure(this.noticeService.create() + .notice(translation -> translation.warp().missingWarpArgument()) + .viewer(viewer) + ); + } + + String warpName = rawInput.next(); + Optional warp = this.warpService.findWarp(warpName); + + if (warp.isEmpty()) { + return ParseResult.failure( + this.noticeService.create() + .notice(translation -> translation.warp().notExist()) + .placeholder(WARP_PLACEHOLDER_PREFIX, warpName) + .viewer(viewer) + ); + } + + if (!rawInput.hasNext()) { + return ParseResult.failure(this.noticeService.create() + .notice(translation -> translation.warp().missingPermissionArgument()) + .viewer(viewer) + ); + } + + String permission = rawInput.next(); + return ParseResult.success(new WarpPermissionEntry(warp.get(), permission)); + } + + @Override + public Range getRange(Argument argument) { + return Range.of(2); + } + + @Override + public SuggestionResult suggest( + Invocation invocation, + Argument argument, + SuggestionContext context + ) { + Suggestion current = context.getCurrent(); + int index = current.lengthMultilevel(); + + if (index == 1) { + return SuggestionResult.of( + this.warpService.getWarps().stream() + .map(Warp::getName) + .toList() + ); + } + + if (index == 2) { + String warpName = current.multilevelList().getFirst(); + Optional warpOptional = this.warpService.findWarp(warpName); + + if (warpOptional.isEmpty()) { + return SuggestionResult.empty(); + } + + Warp warp = warpOptional.get(); + Collection permissions = warp.getPermissions(); + + if (permissions.isEmpty()) { + return SuggestionResult.empty(); + } + + return SuggestionResult.of(permissions).appendLeft(warpName); + } + + return SuggestionResult.empty(); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java new file mode 100644 index 000000000..c6bf4a26c --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java @@ -0,0 +1,40 @@ +package com.eternalcode.core.feature.warp.repository; + +import com.eternalcode.commons.bukkit.position.Position; +import com.eternalcode.core.configuration.ReloadableConfig; +import com.eternalcode.core.injector.annotations.component.ConfigurationFile; +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.dzikoysk.cdn.entity.Contextual; +import net.dzikoysk.cdn.entity.Description; +import net.dzikoysk.cdn.entity.Exclude; +import net.dzikoysk.cdn.source.Resource; +import net.dzikoysk.cdn.source.Source; + +@ConfigurationFile +public class WarpConfig implements ReloadableConfig { + + @Description({"# Warps data", "# These are warp locations, for your own safety, please don't touch it."}) + public Map warps = new HashMap<>(); + + @Override + public Resource resource(File folder) { + return Source.of(folder, "data" + File.separator + "warps.yml"); + } + + @Contextual + public static class WarpConfigEntry { + public Position position; + public List permissions; + + public WarpConfigEntry() { + } + + public WarpConfigEntry(Position position, List permissions) { + this.position = position; + this.permissions = permissions; + } + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepository.java new file mode 100644 index 000000000..367136cc7 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepository.java @@ -0,0 +1,17 @@ +package com.eternalcode.core.feature.warp.repository; + +import com.eternalcode.core.feature.warp.Warp; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +public interface WarpRepository { + + CompletableFuture saveWarp(Warp warp); + + CompletableFuture removeWarp(String warp); + + CompletableFuture> getWarp(String name); + + CompletableFuture> getWarps(); +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java new file mode 100644 index 000000000..d3f19b7a4 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java @@ -0,0 +1,119 @@ +package com.eternalcode.core.feature.warp.repository; + +import com.eternalcode.commons.bukkit.position.PositionAdapter; +import com.eternalcode.commons.scheduler.Scheduler; +import com.eternalcode.core.configuration.ConfigurationManager; +import com.eternalcode.core.configuration.implementation.LocationsConfiguration; +import com.eternalcode.core.feature.warp.Warp; +import com.eternalcode.core.feature.warp.WarpImpl; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Repository; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Repository +class WarpRepositoryImpl implements WarpRepository { + + private static final Object READ_WRITE_LOCK = new Object(); + + private final LocationsConfiguration locationsConfiguration; + private final WarpConfig warpConfig; + private final ConfigurationManager configurationManager; + private final Scheduler scheduler; + + @Inject + WarpRepositoryImpl( + ConfigurationManager configurationManager, + LocationsConfiguration locationsConfiguration, + WarpConfig warpConfig, Scheduler scheduler + ) { + this.locationsConfiguration = locationsConfiguration; + this.configurationManager = configurationManager; + this.warpConfig = warpConfig; + this.scheduler = scheduler; + + this.migrateWarps(); + } + + @Override + public CompletableFuture saveWarp(Warp warp) { + WarpConfig.WarpConfigEntry warpConfigEntry = new WarpConfig.WarpConfigEntry( + PositionAdapter.convert(warp.getLocation()), + warp.getPermissions() + ); + + return this.transactionalRun(warps -> warps.put(warp.getName(), warpConfigEntry)); + } + + @Override + public CompletableFuture removeWarp(String warp) { + return this.transactionalRun(warps -> warps.remove(warp)); + } + + @Override + public CompletableFuture> getWarp(String name) { + return transactionalSupply(warps -> Optional.ofNullable(this.warpConfig.warps.get(name)) + .map(warpConfigEntry -> new WarpImpl( + name, + warpConfigEntry.position, + warpConfigEntry.permissions) + )); + } + + @Override + public CompletableFuture> getWarps() { + return transactionalSupply(warps -> warps.entrySet().stream() + .map(warpConfigEntry -> { + WarpConfig.WarpConfigEntry warpContextual = warpConfigEntry.getValue(); + return new WarpImpl(warpConfigEntry.getKey(), warpContextual.position, warpContextual.permissions); + }) + .collect(Collectors.toList())); + } + + private void migrateWarps() { + synchronized (READ_WRITE_LOCK) { + if (this.locationsConfiguration.warps.isEmpty()) { + return; + } + + this.transactionalRun(warps -> warps.putAll(this.locationsConfiguration.warps + .entrySet() + .stream() + .collect(Collectors.toMap( + entry -> entry.getKey(), + entry -> new WarpConfig.WarpConfigEntry(entry.getValue(), new ArrayList<>())) + ) + )); + + this.locationsConfiguration.warps.clear(); + this.configurationManager.save(this.locationsConfiguration); + } + } + + private CompletableFuture transactionalRun(Consumer> editor) { + return transactionalSupply(warps -> { + editor.accept(warps); + return null; + }); + } + + private CompletableFuture transactionalSupply(Function, T> editor) { + return scheduler.completeAsync(() -> { + synchronized (READ_WRITE_LOCK) { + Map warps = new HashMap<>(this.warpConfig.warps); + T result = editor.apply(warps); + this.warpConfig.warps.putAll(warps); + this.configurationManager.save(this.warpConfig); + return result; + } + }); + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java index 8b1ed970b..0fbd21922 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java @@ -1,8 +1,8 @@ package com.eternalcode.core.translation; import com.eternalcode.core.configuration.contextual.ConfigItem; -import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.core.feature.language.Language; +import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.multification.notice.Notice; import org.bukkit.Material; import org.bukkit.event.entity.EntityDamageEvent; @@ -152,6 +152,14 @@ interface WarpSection { Notice itemAdded(); Notice noWarps(); Notice itemLimit(); + Notice noPermission(); + Notice addPermissions(); + Notice removePermission(); + Notice permissionDoesNotExist(); + Notice permissionAlreadyExist(); + Notice noPermissionsProvided(); + Notice missingWarpArgument(); + Notice missingPermissionArgument(); WarpInventorySection warpInventory(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java index 0abcc395c..3a7446ce3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java @@ -1,12 +1,11 @@ package com.eternalcode.core.translation.implementation; import com.eternalcode.core.configuration.contextual.ConfigItem; -import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.core.feature.language.Language; +import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.core.translation.AbstractTranslation; import com.eternalcode.multification.bukkit.notice.BukkitNotice; import com.eternalcode.multification.notice.Notice; -import java.util.HashMap; import lombok.Getter; import lombok.experimental.Accessors; import net.dzikoysk.cdn.entity.Contextual; @@ -14,9 +13,11 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.event.entity.EntityDamageEvent; + import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -381,6 +382,15 @@ public static class ENWarpSection implements WarpSection { public Notice itemAdded = Notice.chat("Warp has been added to GUI!"); public Notice noWarps = Notice.chat("There are no warps!"); public Notice itemLimit = Notice.chat("You have reached the limit of warps! Your limit is {LIMIT}."); + public Notice noPermission = Notice.chat("You don't have permission to use this warp ({WARP})!"); + public Notice addPermissions = Notice.chat("Added permissions to warp {WARP}!"); + public Notice removePermission = Notice.chat("Removed permission {PERMISSION} from warp {WARP}!"); + public Notice noPermissionsProvided = Notice.chat("No permissions provided!"); + public Notice permissionDoesNotExist = Notice.chat("Permission {PERMISSION} doesn't exist!"); + public Notice permissionAlreadyExist = Notice.chat("Permission {PERMISSION} already exists!"); + public Notice noPermissionAssigned = Notice.chat("There are no permissions assigned to this warp!"); + public Notice missingWarpArgument = Notice.chat("You must provide a warp name!"); + public Notice missingPermissionArgument = Notice.chat("You must provide a permission!"); @Description({" ", "# {WARPS} - List of warps (separated by commas)"}) public Notice available = Notice.chat("Available warps: {WARPS}"); @@ -393,7 +403,6 @@ public static class ENWarpSection implements WarpSection { public static class ENWarpInventory implements WarpInventorySection { public String title = "» Available warps:"; - @Description({" ", "# Warps located inside GUI inventory can be customized here. More warps will be added on creation with /setwarp command. "}) public Map items = new HashMap<>(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java index d8fa66581..c1cfa5529 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java @@ -1,12 +1,11 @@ package com.eternalcode.core.translation.implementation; import com.eternalcode.core.configuration.contextual.ConfigItem; -import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.core.feature.language.Language; +import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.core.translation.AbstractTranslation; import com.eternalcode.multification.bukkit.notice.BukkitNotice; import com.eternalcode.multification.notice.Notice; -import java.util.HashMap; import lombok.Getter; import lombok.experimental.Accessors; import net.dzikoysk.cdn.entity.Contextual; @@ -14,9 +13,11 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.event.entity.EntityDamageEvent; + import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -105,7 +106,7 @@ public static class PLArgumentSection implements ArgumentSection { public Notice usageMessageEntry = Notice.chat("{USAGE}"); @Description(" ") - public Notice missingPlayerName = Notice.chat("Błąd: Musisz podać nazwę gracza!"); + public Notice missingPlayerName = Notice.chat("Musisz podać nazwę gracza!"); public Notice offlinePlayer = Notice.chat("Ten gracz jest obecnie offline!"); public Notice onlyPlayer = Notice.chat("Ta komenda jest dostępna tylko dla graczy!"); public Notice numberBiggerThanOrEqualZero = Notice.chat("Liczba musi być równa lub większa od 0!"); @@ -307,7 +308,7 @@ public static class PLChatSection implements ChatSection { public Notice alertQueueAdded = Notice.chat("Dodano wiadomość do kolejki!"); public Notice alertQueueRemoved = Notice.chat("Usunięto wiadomość z kolejki!"); public Notice alertQueueCleared = Notice.chat("Wyczyszczono kolejkę wiadomości!"); - public Notice alertQueueEmpty = Notice.chat("Błąd: Kolejka wiadomości jest pusta!"); + public Notice alertQueueEmpty = Notice.chat("Kolejka wiadomości jest pusta!"); public Notice alertQueueSent = Notice.chat("Wysłano wszystkie wiadomości z kolejki!"); } @@ -383,10 +384,21 @@ public static class PLWarpSection implements WarpSection { public Notice notExist = Notice.chat("Nie odnaleziono takiego warpu!"); public Notice itemAdded = Notice.chat("Dodano warp do GUI!"); public Notice noWarps = Notice.chat("Nie ma dostępnych warpów!"); - public Notice itemLimit = Notice.chat("Osiągnąłeś limit warpów w GUI! Limit to: {LIMIT}!"); + public Notice itemLimit = Notice.chat("Osiągnąłeś limit warpów w GUI! Limit to: {LIMIT}!"); + public Notice noPermission = Notice.chat("Nie masz uprawnień do skorzystania z tego warpa {WARP}!"); + public Notice addPermissions = Notice.chat("Dodano uprawnienia do warpa {WARP}!"); + public Notice removePermission = Notice.chat("Usunięto uprawnienie {PERMISSION} z warpa {WARP}!"); + public Notice noPermissionsProvided = Notice.chat("Nie podano żadnych uprawnień!"); + public Notice permissionDoesNotExist = Notice.chat("Podane uprawnienie nie istnieje ({PERMISSION})!"); + public Notice permissionAlreadyExist = Notice.chat("Podane uprawnienie już istnieje ({PERMISSION})!"); + public Notice noPermissionAssigned = Notice.chat("Ten warp nie ma przypisanych żadnych permisji"); + public Notice missingWarpArgument = Notice.chat("Musisz podać nazwę warpu!"); + public Notice missingPermissionArgument = Notice.chat("Musisz podać uprawnienie!"); + @Description({" ", "# {WARPS} - Lista dostępnych warpów"}) public Notice available = Notice.chat("Dostepne warpy: {WARPS}!"); + @Description({" ", "# Ustawienia gui listy dostępnych warpów"}) public PLWarpInventory warpInventory = new PLWarpInventory(); @@ -406,7 +418,6 @@ public void setItems(Map items) { this.items = items; } - public PLBorderSection border = new PLBorderSection(); public PLDecorationItemsSection decorationItems = new PLDecorationItemsSection(); @@ -463,7 +474,7 @@ public static class PLHomeSection implements HomeSection { "# {HOME} - Nazwa domu, {PLAYER} - Gracz, {HOMES} - Lista domów" }) public Notice overrideHomeLocationAsAdmin = Notice.chat("Nadpisałeś lokalizację domu {HOME} dla gracza {PLAYER}!"); - public Notice playerNoOwnedHomes = Notice.chat("Błąd: Gracz {PLAYER} nie posiada żadnego domu!"); + public Notice playerNoOwnedHomes = Notice.chat("Gracz {PLAYER} nie posiada żadnego domu!"); public Notice createAsAdmin = Notice.chat("Stworzono dom {HOME} dla gracza {PLAYER}!"); public Notice deleteAsAdmin = Notice.chat("Usunięto dom {HOME} dla gracza {PLAYER}!"); public Notice homeListAsAdmin = Notice.chat("Lista domów gracza {PLAYER}: {HOMES}!"); @@ -628,6 +639,7 @@ public static class PLInventorySection implements InventorySection { @Description({ " ", "# Ta sekcja odpowiada za interakcję z graczami za pomocą komend", + "# Ta sekcja odpowiada za interakcję z graczami za pomocą komend", }) public PLPlayerSection player = new PLPlayerSection(); From a0bf9f660cfbab46cd0c9d75a723b71085c828d5 Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:12:56 +0100 Subject: [PATCH 06/18] GH-879 Prevent counting online players with vanish in %eternalcore_online% (#887) --- .../core/placeholder/PlaceholdersSetup.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java index 0ae46f863..1ddc827ce 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java @@ -1,6 +1,7 @@ package com.eternalcode.core.placeholder; import com.eternalcode.core.configuration.implementation.PlaceholdersConfiguration; +import com.eternalcode.core.feature.vanish.VanishService; import com.eternalcode.core.injector.annotations.component.Controller; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.publish.Subscribe; @@ -16,10 +17,14 @@ void setUp(PlaceholderRegistry placeholderRegistry, PlaceholdersConfiguration pl }); } - @Subscribe(EternalInitializeEvent.class) - void setUpPlaceholders(PlaceholderRegistry placeholderRegistry, Server server) { - placeholderRegistry.registerPlaceholder(PlaceholderReplacer.of("online", player -> String.valueOf(server.getOnlinePlayers().size()))); + void setUpPlaceholders(PlaceholderRegistry placeholderRegistry, Server server, VanishService vanishService) { + placeholderRegistry.registerPlaceholder(PlaceholderReplacer.of("online", player -> String.valueOf( + server.getOnlinePlayers() + .stream() + .filter(onlinePlayer -> !vanishService.isVanished(onlinePlayer)) + .count()) + ) + ); } - } From 5185ab23c9cbde0c9e6f13d4b517c7d3784ffb73 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 12 Jan 2025 20:19:45 +0100 Subject: [PATCH 07/18] Update asm to 9.7.1. --- .../eternalcode/core/loader/relocation/RelocationHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/relocation/RelocationHandler.java b/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/relocation/RelocationHandler.java index aa4682b34..f23c6b1b5 100644 --- a/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/relocation/RelocationHandler.java +++ b/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/relocation/RelocationHandler.java @@ -52,12 +52,12 @@ public class RelocationHandler implements AutoCloseable { Dependency.of( "org.ow2.asm", "asm", - "9.2" + "9.7.1" ), Dependency.of( "org.ow2.asm", "asm-commons", - "9.2" + "9.7.1" ), Dependency.of( "me.lucko", From 62cf9500334fae8d1138f0e16194039d407b198b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:54:17 +0100 Subject: [PATCH 08/18] dependency: Update dependency net.dzikoysk:cdn to v1.14.6 (#888) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index f4c729e27..f6d9f963c 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -15,7 +15,7 @@ object Versions { const val ADVENTURE_PLATFORM = "4.3.4" 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 CDN_CONFIGS = "1.14.6" const val MARIA_DB = "3.5.1" const val POSTGRESQL = "42.7.4" From 7d84c5d434856e1a83e8078f1841863f6bb72d45 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Tue, 14 Jan 2025 16:45:54 +0100 Subject: [PATCH 09/18] Make warp-permission again package-private --- .../eternalcode/core/feature/warp/repository/WarpConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java index c6bf4a26c..28ca28b80 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpConfig.java @@ -14,7 +14,7 @@ import net.dzikoysk.cdn.source.Source; @ConfigurationFile -public class WarpConfig implements ReloadableConfig { +class WarpConfig implements ReloadableConfig { @Description({"# Warps data", "# These are warp locations, for your own safety, please don't touch it."}) public Map warps = new HashMap<>(); @@ -25,7 +25,7 @@ public Resource resource(File folder) { } @Contextual - public static class WarpConfigEntry { + static class WarpConfigEntry { public Position position; public List permissions; From f8d2801ff83c1066768316fea4523c9f5cf5440e Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Tue, 14 Jan 2025 19:54:00 +0100 Subject: [PATCH 10/18] Release v1.5.1 Signed-off-by: Martin Sulikowski --- README.md | 4 ++-- .../main/kotlin/eternalcode-java.gradle.kts | 2 +- .../main/kotlin/eternalcore-publish.gradle.kts | 2 +- raw_commands_docs.json | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 79244f4a2..45637d936 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ For Maven projects use: For Gradle projects use: ```kts -compileOnly("com.eternalcode:eternalcore-api:1.5.0") +compileOnly("com.eternalcode:eternalcore-api:1.5.1") ``` For Maven projects use: @@ -88,7 +88,7 @@ For Maven projects use: com.eternalcode eternalcore-api - 1.5.0 + 1.5.1 provided ``` diff --git a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts index 3594d9205..7d4f051bd 100644 --- a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "com.eternalcode" -version = "1.5.0" +version = "1.5.1" checkstyle { toolVersion = "10.21.1" diff --git a/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts b/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts index 2f8e69127..40008ce36 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.5.0" +version = "1.5.1" java { withSourcesJar() diff --git a/raw_commands_docs.json b/raw_commands_docs.json index c45cfec75..4bc3cb1df 100644 --- a/raw_commands_docs.json +++ b/raw_commands_docs.json @@ -2051,6 +2051,24 @@ "" ] }, + { + "name": "warp-permission add ", + "aliases": [], + "permissions": [ + "eternalcore.warp.changepermissions" + ], + "descriptions": [], + "arguments": [] + }, + { + "name": "warp-permission remove ", + "aliases": [], + "permissions": [ + "eternalcore.warp.changepermissions" + ], + "descriptions": [], + "arguments": [] + }, { "name": "whois ", "aliases": [], From d2409afa8b801dcec0aeda02279ac0cae9db76c4 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 17 Jan 2025 19:15:56 +0100 Subject: [PATCH 11/18] Replace the default separator format with MiniMessages format to ensure that the tag is properly closed. --- .../core/configuration/implementation/PluginConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2123c0ef6..30be682dd 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 @@ -261,7 +261,7 @@ public Duration repairDelay() { @Contextual public static class Format { - public String separator = "&7, "; + public String separator = ", "; } @Bean From 2a9546cfaa81190774da0d82b714fcbbe9550d89 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 17 Jan 2025 20:50:37 +0100 Subject: [PATCH 12/18] Mark deprecated methods with version and removal details. --- .../configuration/implementation/LocationsConfiguration.java | 2 +- .../core/feature/randomteleport/RandomTeleportSettingsImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java index aa45fa011..97e9e46c7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/LocationsConfiguration.java @@ -22,7 +22,7 @@ public class LocationsConfiguration implements ReloadableConfig { public Position spawn = EMPTY_POSITION; @Description("# Warps now are stored in warps.yml. This is deprecated.") - @Deprecated + @Deprecated(since = "1.5.1", forRemoval = true) public Map warps = new HashMap<>(); @Description("# This is jail location, for your own safety, please don't touch it.") 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 381aecf0d..b83b93407 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 @@ -169,6 +169,7 @@ public Duration cooldown() { } @Override + @Deprecated(since = "1.5.0", forRemoval = true) public boolean migrate() { boolean migrated = false; if (randomTeleportDelay != null) { From f53a0a1c416f4f2ced16bc71d0e6ca5135f922ba Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 17 Jan 2025 22:24:52 +0100 Subject: [PATCH 13/18] Fix warp deletion bug. --- .../core/feature/warp/repository/WarpRepositoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java index d3f19b7a4..3a5317433 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/repository/WarpRepositoryImpl.java @@ -109,7 +109,7 @@ private CompletableFuture transactionalSupply(Function warps = new HashMap<>(this.warpConfig.warps); T result = editor.apply(warps); - this.warpConfig.warps.putAll(warps); + this.warpConfig.warps = warps; this.configurationManager.save(this.warpConfig); return result; } From 4ce2e557be1890ab8aaa1328aabe8b8189365cac Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 17 Jan 2025 22:30:38 +0100 Subject: [PATCH 14/18] Release v1.5.2 --- README.md | 4 ++-- buildSrc/src/main/kotlin/eternalcode-java.gradle.kts | 2 +- buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 45637d936..0e2266f3e 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ For Maven projects use: For Gradle projects use: ```kts -compileOnly("com.eternalcode:eternalcore-api:1.5.1") +compileOnly("com.eternalcode:eternalcore-api:1.5.2") ``` For Maven projects use: @@ -88,7 +88,7 @@ For Maven projects use: com.eternalcode eternalcore-api - 1.5.1 + 1.5.2 provided ``` diff --git a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts index 7d4f051bd..355a326fd 100644 --- a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "com.eternalcode" -version = "1.5.1" +version = "1.5.2" checkstyle { toolVersion = "10.21.1" diff --git a/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts b/buildSrc/src/main/kotlin/eternalcore-publish.gradle.kts index 40008ce36..326ce38d8 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.5.1" +version = "1.5.2" java { withSourcesJar() From 8936fa3597ae5b37a3745caa896c9de2b62d5370 Mon Sep 17 00:00:00 2001 From: Norbert Dejlich Date: Fri, 17 Jan 2025 22:52:41 +0100 Subject: [PATCH 15/18] GH-579 Add repository for language. Remove user settings. (#890) --- .../core/feature/language/Language.java | 31 ++++---- .../feature/language/LanguageProvider.java | 9 +++ .../feature/language/LanguageService.java | 17 +++- .../argument/AbstractViewerArgument.java | 15 ++-- .../argument/EnchantmentArgument.java | 5 +- .../argument/GameModeArgument.java | 5 +- .../argument/NoticeTypeArgument.java | 5 +- .../litecommand/argument/PlayerArgument.java | 4 +- .../litecommand/argument/UserArgument.java | 5 +- .../core/feature/afk/AfkKickController.java | 2 +- .../core/feature/afk/AftPlaceholderSetup.java | 7 +- .../essentials/container/DisposalCommand.java | 12 +-- .../item/enchant/EnchantArgument.java | 5 +- .../essentials/item/give/GiveArgument.java | 5 +- .../item/lore/ItemLoreArgument.java | 5 +- .../essentials/mob/ButcherArgument.java | 6 +- .../essentials/mob/MobEntityArgument.java | 5 +- .../essentials/speed/SpeedArgument.java | 5 +- .../essentials/speed/SpeedTypeArgument.java | 5 +- .../feature/essentials/time/TimeArgument.java | 5 +- .../FullServerBypassController.java | 6 +- .../feature/home/HomePlaceholderSetup.java | 19 +---- .../feature/home/command/HomeArgument.java | 4 +- .../language/BukkitLanguageProvider.java | 48 ++++++++++++ .../feature/language/LanguageCommand.java | 4 +- .../feature/language/LanguageInventory.java | 52 ++++++++----- .../language/LanguageLoadController.java | 31 ++++++++ .../feature/language/LanguageRepository.java | 15 ++++ .../language/LanguageRepositoryImpl.java | 65 ++++++++++++++++ .../feature/language/LanguageServiceImpl.java | 77 ++++++++++++++----- .../feature/language/LanguageSettings.java | 19 ----- .../config/LanguageConfiguration.java | 12 +-- .../teleportrequest/RequesterArgument.java | 5 +- .../core/feature/warp/WarpInventory.java | 16 +++- .../feature/warp/command/WarpArgument.java | 4 +- .../feature/warp/command/WarpCommand.java | 4 +- .../core/notice/NoticeService.java | 15 +++- .../core/translation/TranslationManager.java | 28 +++---- .../translation/TranslationManagerSetup.java | 9 ++- .../java/com/eternalcode/core/user/User.java | 15 ---- .../core/user/UserClientBukkitSettings.java | 18 ++--- .../core/user/UserClientNoneSettings.java | 7 -- .../core/user/UserClientSettings.java | 4 - .../eternalcode/core/user/UserSettings.java | 14 ---- .../core/user/UserSettingsImpl.java | 28 ------- .../core/viewer/BukkitViewerImpl.java | 24 ++---- .../core/viewer/BukkitViewerProvider.java | 7 +- .../com/eternalcode/core/viewer/Viewer.java | 4 - .../com/eternalcode/core/test/MockServer.java | 4 +- .../com/eternalcode/core/test/MockViewer.java | 5 -- 50 files changed, 409 insertions(+), 312 deletions(-) rename {eternalcore-core => eternalcore-api}/src/main/java/com/eternalcode/core/feature/language/Language.java (69%) create mode 100644 eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageProvider.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/language/BukkitLanguageProvider.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageLoadController.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepository.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepositoryImpl.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageSettings.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettings.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettingsImpl.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/Language.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/Language.java similarity index 69% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/language/Language.java rename to eternalcore-api/src/main/java/com/eternalcode/core/feature/language/Language.java index 40a92dadf..175dcd9c8 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/Language.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/Language.java @@ -1,10 +1,11 @@ package com.eternalcode.core.feature.language; -import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.Set; public class Language { @@ -13,19 +14,19 @@ public class Language { public static final Language DEFAULT = Language.fromLocale(Locale.ROOT); private final String lang; - private final List aliases; + private final Set aliases; public Language(String lang, List aliases) { this.lang = lang; - this.aliases = new ArrayList<>(aliases); + this.aliases = new LinkedHashSet<>(aliases); } public String getLang() { return this.lang; } - public List getAliases() { - return Collections.unmodifiableList(this.aliases); + public Set getAliases() { + return Collections.unmodifiableSet(this.aliases); } public boolean isEquals(Language other) { @@ -33,15 +34,17 @@ public boolean isEquals(Language other) { return true; } - for (String alias : this.aliases) { - if (alias.equals(other.lang)) { - return true; - } + if (this.lang.startsWith(other.lang) || other.lang.startsWith(this.lang)) { + return true; + } - for (String otherAlias : other.aliases) { - if (alias.equals(otherAlias)) { - return true; - } + if (this.aliases.contains(other.lang)) { + return true; + } + + for (String otherAlias : other.aliases) { + if (this.aliases.contains(otherAlias)) { + return true; } } @@ -71,7 +74,7 @@ public static Language fromLocale(Locale locale) { } public Locale toLocale() { - return new Locale(this.lang); + return Locale.of(this.lang); } } diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageProvider.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageProvider.java new file mode 100644 index 000000000..d3e54b5c5 --- /dev/null +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageProvider.java @@ -0,0 +1,9 @@ +package com.eternalcode.core.feature.language; + +import java.util.UUID; + +public interface LanguageProvider { + + Language getDefaultLanguage(UUID player); + +} diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageService.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageService.java index c4f9e52c2..689bbcefe 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageService.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/language/LanguageService.java @@ -1,11 +1,20 @@ package com.eternalcode.core.feature.language; -import java.util.Locale; -import org.bukkit.entity.Player; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; public interface LanguageService { - Locale getPlayerLanguage(Player player); + void setDefaultProvider(LanguageProvider defaultProvider); + + LanguageProvider getDefaultProvider(); + + CompletableFuture getLanguage(UUID playerUniqueId); + + Language getLanguageNow(UUID playerUniqueId); + + CompletableFuture setLanguage(UUID playerUniqueId, Language language); + + CompletableFuture setDefaultLanguage(UUID playerUniqueId); - void setPlayerLanguage(Player player, Locale locale); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/AbstractViewerArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/AbstractViewerArgument.java index 1bb38eb28..d25f49079 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/AbstractViewerArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/AbstractViewerArgument.java @@ -1,30 +1,31 @@ package com.eternalcode.core.bridge.litecommand.argument; +import com.eternalcode.core.feature.language.Language; 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; import dev.rollczi.litecommands.argument.resolver.ArgumentResolver; import dev.rollczi.litecommands.invocation.Invocation; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public abstract class AbstractViewerArgument extends ArgumentResolver { - protected final ViewerService viewerService; protected final TranslationManager translationManager; - protected AbstractViewerArgument(ViewerService viewerService, TranslationManager translationManager) { - this.viewerService = viewerService; + protected AbstractViewerArgument(TranslationManager translationManager) { this.translationManager = translationManager; } @Override protected ParseResult parse(Invocation invocation, Argument context, String argument) { - Viewer viewer = this.viewerService.any(invocation.sender()); - Translation translation = this.translationManager.getMessages(viewer.getLanguage()); + if (invocation.sender() instanceof Player player) { + Translation translation = this.translationManager.getMessages(player.getUniqueId()); + return this.parse(invocation, argument, translation); + } + Translation translation = this.translationManager.getMessages(Language.DEFAULT); return this.parse(invocation, argument, translation); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/EnchantmentArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/EnchantmentArgument.java index 86d753e1f..0c230c4da 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/EnchantmentArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/EnchantmentArgument.java @@ -4,7 +4,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -21,8 +20,8 @@ class EnchantmentArgument extends AbstractViewerArgument { @Inject - EnchantmentArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + EnchantmentArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/GameModeArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/GameModeArgument.java index fe522a6a2..42d5ae476 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/GameModeArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/GameModeArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -23,8 +22,8 @@ class GameModeArgument extends AbstractViewerArgument { private final GameModeArgumentSettings gameModeArgumentSettings; @Inject - GameModeArgument(ViewerService viewerService, TranslationManager translationManager, GameModeArgumentSettings gameModeArgumentSettings) { - super(viewerService, translationManager); + GameModeArgument(TranslationManager translationManager, GameModeArgumentSettings gameModeArgumentSettings) { + super(translationManager); this.gameModeArgumentSettings = gameModeArgumentSettings; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/NoticeTypeArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/NoticeTypeArgument.java index 0371a6423..359774de0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/NoticeTypeArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/NoticeTypeArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.notice.NoticeTextType; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -19,8 +18,8 @@ class NoticeTypeArgument extends AbstractViewerArgument { @Inject - NoticeTypeArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + NoticeTypeArgument(TranslationManager translationManager) { + super(translationManager); } @Override 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 45f052ffd..3760173d4 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 @@ -7,7 +7,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -25,12 +24,11 @@ public class PlayerArgument extends AbstractViewerArgument { @Inject public PlayerArgument( - ViewerService viewerService, TranslationManager translationManager, Server server, VanishService vanishService ) { - super(viewerService, translationManager); + super(translationManager); this.server = server; this.vanishService = vanishService; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/UserArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/UserArgument.java index ead59db6e..1c74a2ba3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/UserArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/argument/UserArgument.java @@ -6,7 +6,6 @@ import com.eternalcode.core.translation.TranslationManager; import com.eternalcode.core.user.User; import com.eternalcode.core.user.UserManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -23,8 +22,8 @@ class UserArgument extends AbstractViewerArgument { private final UserManager userManager; @Inject - UserArgument(ViewerService viewerService, TranslationManager translationManager, Server server, UserManager userManager) { - super(viewerService, translationManager); + UserArgument(TranslationManager translationManager, Server server, UserManager userManager) { + super(translationManager); this.server = server; this.userManager = userManager; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkKickController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkKickController.java index e472a0c9c..ffd047e56 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkKickController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkKickController.java @@ -60,7 +60,7 @@ void onAfkSwitch(AfkSwitchEvent event) { } User user = this.userManager.getOrCreate(playerUUID, player.getName()); - Translation translation = this.translationManager.getMessages(user); + Translation translation = this.translationManager.getMessages(user.getUniqueId()); Component component = this.miniMessage.deserialize(translation.afk().afkKickReason()); player.kickPlayer(legacySection().serialize(component)); 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 c01fc695a..d5f167fb4 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 @@ -9,7 +9,6 @@ import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; import com.eternalcode.core.util.DurationUtil; -import com.eternalcode.core.viewer.ViewerService; import java.time.Duration; import java.time.Instant; import java.util.Optional; @@ -18,12 +17,10 @@ class AftPlaceholderSetup { private final TranslationManager translationManager; - private final ViewerService viewerService; @Inject - AftPlaceholderSetup(TranslationManager translationManager, ViewerService viewerService) { + AftPlaceholderSetup(TranslationManager translationManager) { this.translationManager = translationManager; - this.viewerService = viewerService; } @Subscribe(EternalInitializeEvent.class) @@ -34,7 +31,7 @@ void setUpPlaceholders(PlaceholderRegistry placeholderRegistry, AfkService afkSe placeholderRegistry.registerPlaceholder(PlaceholderReplacer.of( "afk_formatted", player -> { - Translation messages = this.translationManager.getMessages(this.viewerService.player(player.getUniqueId())); + Translation messages = this.translationManager.getMessages(player.getUniqueId()); return afkService.isAfk(player.getUniqueId()) ? messages.afk().afkEnabledPlaceholder() : messages.afk().afkDisabledPlaceholder(); })); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/container/DisposalCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/container/DisposalCommand.java index 9163e6621..f2d917565 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/container/DisposalCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/container/DisposalCommand.java @@ -2,11 +2,9 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; -import com.eternalcode.core.feature.language.Language; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.user.UserManager; import com.eternalcode.commons.adventure.AdventureUtil; import dev.rollczi.litecommands.annotations.context.Context; import dev.rollczi.litecommands.annotations.execute.Execute; @@ -24,14 +22,12 @@ class DisposalCommand { private final NoticeService noticeService; private final MiniMessage miniMessage; private final TranslationManager translationManager; - private final UserManager userManager; private final Server server; @Inject - DisposalCommand(MiniMessage miniMessage, TranslationManager translationManager, UserManager userManager, Server server, NoticeService noticeService) { + DisposalCommand(MiniMessage miniMessage, TranslationManager translationManager, Server server, NoticeService noticeService) { this.miniMessage = miniMessage; this.translationManager = translationManager; - this.userManager = userManager; this.server = server; this.noticeService = noticeService; } @@ -39,11 +35,7 @@ class DisposalCommand { @Execute @DescriptionDocs(description = "Opens a disposal") void execute(@Context Player player) { - Language language = this.userManager.getUser(player.getUniqueId()) - .map(user -> user.getSettings().getLanguage()) - .orElse(Language.DEFAULT); - - Translation translation = this.translationManager.getMessages(language); + Translation translation = this.translationManager.getMessages(player.getUniqueId()); Component component = this.miniMessage.deserialize(translation.inventory().disposalTitle()); String serialize = AdventureUtil.SECTION_SERIALIZER.serialize(component); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/enchant/EnchantArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/enchant/EnchantArgument.java index 290e4567a..b5dd51bae 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/enchant/EnchantArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/enchant/EnchantArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -22,8 +21,8 @@ public class EnchantArgument extends AbstractViewerArgument { public static final String KEY = "enchant-level"; @Inject - public EnchantArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + public EnchantArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveArgument.java index fbfe160a2..98c8b9c3c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -22,8 +21,8 @@ class GiveArgument extends AbstractViewerArgument { static final String KEY = "item-amount"; @Inject - public GiveArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + public GiveArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/lore/ItemLoreArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/lore/ItemLoreArgument.java index df14a7fb2..b561307da 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/lore/ItemLoreArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/lore/ItemLoreArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -22,8 +21,8 @@ class ItemLoreArgument extends AbstractViewerArgument { static final String KEY = "item-lore"; @Inject - public ItemLoreArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + public ItemLoreArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java index fd07a13a2..adf37ca18 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java @@ -25,12 +25,14 @@ class ButcherArgument extends AbstractViewerArgument { static final String KEY = "chunks"; private final PluginConfiguration pluginConfiguration; private final NoticeService noticeService; + private final ViewerService viewerService; @Inject - ButcherArgument(ViewerService viewerService, TranslationManager translationManager, PluginConfiguration pluginConfiguration, NoticeService noticeService) { - super(viewerService, translationManager); + ButcherArgument(TranslationManager translationManager, PluginConfiguration pluginConfiguration, NoticeService noticeService, ViewerService viewerService) { + super(translationManager); this.pluginConfiguration = pluginConfiguration; this.noticeService = noticeService; + this.viewerService = viewerService; } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java index 05889cf5d..ebdcb491b 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java @@ -6,7 +6,6 @@ import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; import com.eternalcode.core.util.EntityUtil; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -23,8 +22,8 @@ class MobEntityArgument extends AbstractViewerArgument { static final String KEY = "mobType"; @Inject - MobEntityArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + MobEntityArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedArgument.java index e049f5a34..44dc65353 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -21,8 +20,8 @@ class SpeedArgument extends AbstractViewerArgument { static final String KEY = "speed"; @Inject - SpeedArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + SpeedArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedTypeArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedTypeArgument.java index 81e72ee8e..d924305ac 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedTypeArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/speed/SpeedTypeArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -19,8 +18,8 @@ class SpeedTypeArgument extends AbstractViewerArgument { @Inject - SpeedTypeArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + SpeedTypeArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/time/TimeArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/time/TimeArgument.java index 310a5e71d..ba4c96168 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/time/TimeArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/time/TimeArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -22,8 +21,8 @@ class TimeArgument extends AbstractViewerArgument { static final String KEY = "time"; @Inject - public TimeArgument(ViewerService viewerService, TranslationManager translationManager) { - super(viewerService, translationManager); + public TimeArgument(TranslationManager translationManager) { + super(translationManager); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fullserverbypass/FullServerBypassController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fullserverbypass/FullServerBypassController.java index 6a8bc4032..fdcd5a252 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fullserverbypass/FullServerBypassController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fullserverbypass/FullServerBypassController.java @@ -47,14 +47,14 @@ void onLogin(PlayerLoginEvent event) { return; } - String serverFullMessage = this.extractServerFullMessage(player); + String serverFullMessage = this.getServerFullMessage(player); Component serverFullMessageComponent = this.miniMessage.deserialize(serverFullMessage); event.disallow(PlayerLoginEvent.Result.KICK_FULL, AdventureUtil.SECTION_SERIALIZER.serialize(serverFullMessageComponent)); } } - private String extractServerFullMessage(Player player) { + private String getServerFullMessage(Player player) { Optional userOption = this.userManager.getUser(player.getUniqueId()); if (userOption.isEmpty()) { @@ -66,7 +66,7 @@ private String extractServerFullMessage(Player player) { User user = userOption.get(); return Joiner.on("\n") - .join(this.translationManager.getMessages(user).player().fullServerSlots()) + .join(this.translationManager.getMessages(user.getUniqueId()).player().fullServerSlots()) .toString(); } } 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 599f11999..f4d695763 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 @@ -1,6 +1,5 @@ package com.eternalcode.core.feature.home; -import com.eternalcode.core.configuration.implementation.PluginConfiguration; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Controller; import com.eternalcode.core.placeholder.PlaceholderRegistry; @@ -9,8 +8,6 @@ import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.user.User; -import com.eternalcode.core.user.UserManager; import java.util.Collection; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -20,21 +17,12 @@ class HomePlaceholderSetup { private final HomeService homeService; - private final UserManager userManager; private final TranslationManager translationManager; - private final PluginConfiguration pluginConfiguration; @Inject - HomePlaceholderSetup( - HomeService homeService, - UserManager userManager, - TranslationManager translationManager, - PluginConfiguration pluginConfiguration - ) { + HomePlaceholderSetup(HomeService homeService, TranslationManager translationManager) { this.homeService = homeService; - this.userManager = userManager; this.translationManager = translationManager; - this.pluginConfiguration = pluginConfiguration; } @Subscribe(EternalInitializeEvent.class) @@ -66,10 +54,7 @@ static String homesLeft(int homesLimit, int amountOfHomes) { private String ownedHomes(Player targetPlayer) { Collection homes = this.homeService.getHomes(targetPlayer.getUniqueId()); - - User user = this.userManager.getOrCreate(targetPlayer.getUniqueId(), targetPlayer.getName()); - - Translation translation = this.translationManager.getMessages(user); + Translation translation = this.translationManager.getMessages(targetPlayer.getUniqueId()); if (homes.isEmpty()) { return translation.home().noHomesOwnedPlaceholder(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/command/HomeArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/command/HomeArgument.java index 2a95bdb6d..e8a4d52fd 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/command/HomeArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/command/HomeArgument.java @@ -26,6 +26,7 @@ class HomeArgument extends AbstractViewerArgument { private final HomeService homeService; private final NoticeService noticeService; + private final ViewerService viewerService; @Inject HomeArgument( @@ -34,9 +35,10 @@ class HomeArgument extends AbstractViewerArgument { HomeService homeService, NoticeService noticeService ) { - super(viewerService, translationManager); + super(translationManager); this.homeService = homeService; this.noticeService = noticeService; + this.viewerService = viewerService; } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/BukkitLanguageProvider.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/BukkitLanguageProvider.java new file mode 100644 index 000000000..dbfcb1d63 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/BukkitLanguageProvider.java @@ -0,0 +1,48 @@ +package com.eternalcode.core.feature.language; + +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Service; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Locale; +import java.util.UUID; +import org.bukkit.Server; +import org.bukkit.entity.Player; + +@Service +class BukkitLanguageProvider implements LanguageProvider { + + private static Method LOCALE_METHOD; + + private final Server server; + + @Inject + BukkitLanguageProvider(Server server) { + this.server = server; + } + + @Override + public Language getDefaultLanguage(UUID player) { + Player serverPlayer = server.getPlayer(player); + + if (serverPlayer == null) { + return Language.DEFAULT; + } + + return Language.fromLocale(getLocale(serverPlayer)); + } + + private Locale getLocale(Player player) { + try { + // Someday, when we use Paper API, we can remove this + if (LOCALE_METHOD == null) { + LOCALE_METHOD = Player.class.getMethod("locale"); + } + return (Locale) LOCALE_METHOD.invoke(player); + } + catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException exception) { + return Locale.of(player.getLocale()); + } + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageCommand.java index cbf6418ea..cd5699898 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageCommand.java @@ -22,8 +22,8 @@ class LanguageCommand { @Execute @DescriptionDocs(description = "Open language inventory") - void execute(@Context Player player, @Context User user) { - this.languageInventory.open(player, user.getLanguage()); + void execute(@Context Player player) { + this.languageInventory.open(player); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageInventory.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageInventory.java index 1ba3ca5fb..ab98774b3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageInventory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageInventory.java @@ -2,6 +2,7 @@ import com.eternalcode.annotations.scan.feature.FeatureDocs; import com.eternalcode.commons.adventure.AdventureUtil; +import com.eternalcode.commons.scheduler.Scheduler; import com.eternalcode.core.configuration.contextual.ConfigItem; import com.eternalcode.core.feature.language.config.LanguageConfiguration; import com.eternalcode.core.injector.annotations.Inject; @@ -10,8 +11,6 @@ import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.user.User; -import com.eternalcode.core.user.UserManager; import dev.triumphteam.gui.builder.item.BaseItemBuilder; import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.Gui; @@ -23,7 +22,6 @@ import org.bukkit.entity.Player; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @FeatureDocs( @@ -36,21 +34,41 @@ class LanguageInventory { private final LanguageConfiguration languageConfiguration; private final TranslationManager translationManager; private final NoticeService noticeService; - private final UserManager userManager; private final Server server; + private final Scheduler scheduler; private final MiniMessage miniMessage; + private final LanguageService languageService; @Inject - LanguageInventory(LanguageConfiguration languageConfiguration, TranslationManager translationManager, NoticeService noticeService, UserManager userManager, Server server, MiniMessage miniMessage) { + LanguageInventory( + LanguageConfiguration languageConfiguration, + TranslationManager translationManager, + NoticeService noticeService, + Server server, + Scheduler scheduler, + MiniMessage miniMessage, + LanguageService languageService + ) { this.languageConfiguration = languageConfiguration; this.translationManager = translationManager; this.noticeService = noticeService; - this.userManager = userManager; this.server = server; + this.scheduler = scheduler; this.miniMessage = miniMessage; + this.languageService = languageService; } - void open(Player player, Language language) { + void open(Player player) { + this.languageService.getLanguage(player.getUniqueId()).whenComplete((language, throwable) -> { + if (language == null) { + language = Language.DEFAULT; + } + + this.open(player, language); + }); + } + + private void open(Player player, Language language) { LanguageConfiguration.LanguageSelector languageSelector = this.languageConfiguration.languageSelector; Translation translation = this.translationManager.getMessages(language); Translation.LanguageSection languageSection = translation.language(); @@ -61,18 +79,10 @@ void open(Player player, Language language) { .disableAllInteractions() .create(); - Optional userOption = this.userManager.getUser(player.getUniqueId()); - - if (userOption.isEmpty()) { - return; - } - - User user = userOption.get(); - if (languageSelector.border.fill) { ItemBuilder borderItem = ItemBuilder.from(languageSelector.border.material); - if (!languageSelector.border.name.equals("")) { + if (!languageSelector.border.name.isEmpty()) { borderItem.name(AdventureUtil.resetItalic(this.miniMessage.deserialize(languageSelector.border.name))); } @@ -94,11 +104,11 @@ void open(Player player, Language language) { } for (LanguageConfigItem languageConfigItem : languageSelector.languageConfigItemMap) { - BaseItemBuilder baseItemBuilder = this.createItem(languageConfigItem); + BaseItemBuilder baseItemBuilder = this.createItem(languageConfigItem); GuiItem guiItem = baseItemBuilder.asGuiItem(); guiItem.setAction(event -> { - user.getSettings().setLanguage(languageConfigItem.language); + languageService.setLanguage(player.getUniqueId(), languageConfigItem.language); player.closeInventory(); @@ -112,7 +122,7 @@ void open(Player player, Language language) { } for (ConfigItem item : languageSection.decorationItems()) { - BaseItemBuilder baseItemBuilder = this.createItem(item); + BaseItemBuilder baseItemBuilder = this.createItem(item); GuiItem guiItem = baseItemBuilder.asGuiItem(); guiItem.setAction(event -> { @@ -130,10 +140,10 @@ void open(Player player, Language language) { gui.setItem(item.slot(), guiItem); } - gui.open(player); + scheduler.run(() -> gui.open(player)); } - private BaseItemBuilder createItem(ConfigItem item) { + private BaseItemBuilder createItem(ConfigItem item) { Component name = AdventureUtil.resetItalic(this.miniMessage.deserialize(item.name())); List lore = item.lore() .stream() diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageLoadController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageLoadController.java new file mode 100644 index 000000000..0808063a0 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageLoadController.java @@ -0,0 +1,31 @@ +package com.eternalcode.core.feature.language; + +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Controller; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +@Controller +class LanguageLoadController implements Listener { + + private final LanguageServiceImpl languageService; + + @Inject + LanguageLoadController(LanguageServiceImpl languageService) { + this.languageService = languageService; + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + void onJoin(AsyncPlayerPreLoginEvent event) { + this.languageService.loadLanguage(event.getUniqueId()); + } + + @EventHandler + void onQuit(PlayerQuitEvent event) { + this.languageService.unloadLanguage(event.getPlayer().getUniqueId()); + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepository.java new file mode 100644 index 000000000..efc9054dd --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepository.java @@ -0,0 +1,15 @@ +package com.eternalcode.core.feature.language; + +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +interface LanguageRepository { + + CompletableFuture> findLanguage(UUID player); + + CompletableFuture saveLanguage(UUID player, Language language); + + CompletableFuture deleteLanguage(UUID player); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepositoryImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepositoryImpl.java new file mode 100644 index 000000000..d7b2947bc --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageRepositoryImpl.java @@ -0,0 +1,65 @@ +package com.eternalcode.core.feature.language; + +import com.eternalcode.commons.scheduler.Scheduler; +import com.eternalcode.core.database.DatabaseManager; +import com.eternalcode.core.database.wrapper.AbstractRepositoryOrmLite; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Repository; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import com.j256.ormlite.table.TableUtils; +import java.sql.SQLException; +import java.util.Locale; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@Repository +class LanguageRepositoryImpl extends AbstractRepositoryOrmLite implements LanguageRepository { + + @Inject + LanguageRepositoryImpl(DatabaseManager databaseManager, Scheduler scheduler) throws SQLException { + super(databaseManager, scheduler); + TableUtils.createTableIfNotExists(databaseManager.connectionSource(), LanguageTable.class); + } + + @Override + public CompletableFuture> findLanguage(UUID player) { + return selectSafe(LanguageTable.class, player) + .thenApply(optional -> optional.map(table -> table.toLanguage())); + } + + @Override + public CompletableFuture saveLanguage(UUID player, Language language) { + return save(LanguageTable.class, new LanguageTable(player, language)) + .thenApply(status -> null); + } + + @Override + public CompletableFuture deleteLanguage(UUID player) { + return deleteById(LanguageTable.class, player) + .thenApply(result -> null); + } + + @DatabaseTable(tableName = "eternal_core_languages") + private static class LanguageTable { + + @DatabaseField(columnName = "id", id = true) + private UUID player; + + @DatabaseField + private String language; + + LanguageTable() {} + + LanguageTable(UUID player, Language language) { + this.player = player; + this.language = language.getLang(); + } + + Language toLanguage() { + return Language.fromLocale(Locale.of(language)); + } + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageServiceImpl.java index 0e7fa3ecf..d7ea3b6a6 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageServiceImpl.java @@ -2,38 +2,79 @@ import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import com.eternalcode.core.user.User; -import com.eternalcode.core.user.UserManager; -import java.util.Locale; -import java.util.Optional; -import org.bukkit.entity.Player; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; @Service -public class LanguageServiceImpl implements LanguageService { +class LanguageServiceImpl implements LanguageService { - private final UserManager userManager; + private final LanguageRepository languageRepository; + private final Map cachedLanguages = new ConcurrentHashMap<>(); + private LanguageProvider defaultProvider; @Inject - public LanguageServiceImpl(UserManager userManager) { - this.userManager = userManager; + LanguageServiceImpl(LanguageRepository languageRepository, LanguageProvider defaultProvider) { + this.languageRepository = languageRepository; + this.defaultProvider = defaultProvider; } @Override - public Locale getPlayerLanguage(Player player) { - Optional user = this.userManager.getUser(player.getUniqueId()); + public void setDefaultProvider(LanguageProvider defaultProvider) { + this.defaultProvider = defaultProvider; + } - if (user.isPresent()) { - Language language = user.get().getLanguage(); - return language.toLocale(); + @Override + public LanguageProvider getDefaultProvider() { + return defaultProvider; + } + + @Override + public Language getLanguageNow(UUID playerUniqueId) { + Language language = cachedLanguages.get(playerUniqueId); + if (language != null) { + return language; } - return Language.DEFAULT.toLocale(); + return defaultProvider.getDefaultLanguage(playerUniqueId); } @Override - public void setPlayerLanguage(Player player, Locale locale) { - Optional user = this.userManager.getUser(player.getUniqueId()); + public CompletableFuture getLanguage(UUID playerUniqueId) { + Language language = cachedLanguages.get(playerUniqueId); + if (language != null) { + return CompletableFuture.completedFuture(language); + } - user.ifPresent(value -> value.getSettings().setLanguage(Language.fromLocale(locale))); + return this.languageRepository.findLanguage(playerUniqueId) + .thenApply(optional -> optional.orElseGet(() -> this.defaultProvider.getDefaultLanguage(playerUniqueId))); } + + @Override + public CompletableFuture setLanguage(UUID playerUniqueId, Language language) { + if (language.equals(Language.DEFAULT)) { + return setDefaultLanguage(playerUniqueId); + } + + cachedLanguages.put(playerUniqueId, language); + return languageRepository.saveLanguage(playerUniqueId, language); + } + + @Override + public CompletableFuture setDefaultLanguage(UUID playerUniqueId) { + cachedLanguages.remove(playerUniqueId); + return languageRepository.deleteLanguage(playerUniqueId); + } + + CompletableFuture loadLanguage(UUID playerUniqueId) { + return languageRepository.findLanguage(playerUniqueId) + .thenAccept(language -> language.ifPresent(lang -> cachedLanguages.put(playerUniqueId, lang))); + } + + CompletableFuture unloadLanguage(UUID playerUniqueId) { + return languageRepository.findLanguage(playerUniqueId) + .thenAccept(language -> cachedLanguages.remove(playerUniqueId)); + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageSettings.java deleted file mode 100644 index fafb60aa0..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/LanguageSettings.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.eternalcode.core.feature.language; - -public interface LanguageSettings { - - Language getLanguage(); - - void setLanguage(Language language); - - LanguageSettings DEFAULT = new LanguageSettings() { - @Override - public Language getLanguage() { - return Language.DEFAULT; - } - - @Override - public void setLanguage(Language language) {} - }; - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/config/LanguageConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/config/LanguageConfiguration.java index 4bbbbbbb2..f7f7a8e36 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/config/LanguageConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/language/config/LanguageConfiguration.java @@ -67,8 +67,8 @@ public enum FillType { false, 20, Collections.emptyList(), - Language.EN) - ) + Language.EN + )) .add(new LanguageConfigItem( "&c&lAuto", Collections.singletonList("&7▪ Kliknij, aby pobierać język z ustawień klienta!"), @@ -77,8 +77,8 @@ public enum FillType { false, 22, Collections.emptyList(), - Language.DEFAULT) - ) + Language.DEFAULT + )) .add(new LanguageConfigItem( "&c&lPolish", Collections.singletonList("&7▪ Kliknij aby zmienić język!"), @@ -87,8 +87,8 @@ public enum FillType { false, 24, Collections.emptyList(), - Language.PL) - ) + Language.PL + )) .build(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/RequesterArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/RequesterArgument.java index b3aee061f..368378d5e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/RequesterArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/RequesterArgument.java @@ -5,7 +5,6 @@ import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; -import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -27,8 +26,8 @@ class RequesterArgument extends AbstractViewerArgument { private final Server server; @Inject - RequesterArgument(TeleportRequestService requestService, TranslationManager translationManager, ViewerService viewerService, Server server) { - super(viewerService, translationManager); + RequesterArgument(TeleportRequestService requestService, TranslationManager translationManager, Server server) { + super(translationManager); this.requestService = requestService; this.server = server; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java index 92a86423b..51c25795d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java @@ -5,6 +5,7 @@ import com.eternalcode.core.configuration.contextual.ConfigItem; import com.eternalcode.core.configuration.implementation.PluginConfiguration; import com.eternalcode.core.feature.language.Language; +import com.eternalcode.core.feature.language.LanguageService; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; import com.eternalcode.core.translation.AbstractTranslation; @@ -37,6 +38,7 @@ public class WarpInventory { private static final int GUI_ROW_SIZE_WITH_BORDER = 7; private final TranslationManager translationManager; + private final LanguageService languageService; private final WarpService warpManager; private final Server server; private final MiniMessage miniMessage; @@ -47,6 +49,7 @@ public class WarpInventory { @Inject WarpInventory( TranslationManager translationManager, + LanguageService languageService, WarpService warpManager, Server server, MiniMessage miniMessage, @@ -55,6 +58,7 @@ public class WarpInventory { PluginConfiguration config ) { this.translationManager = translationManager; + this.languageService = languageService; this.warpManager = warpManager; this.server = server; this.miniMessage = miniMessage; @@ -63,9 +67,15 @@ public class WarpInventory { this.config = config; } - public void openInventory(Player player, Language language) { - this.createInventory(player, language) - .open(player); + public void openInventory(Player player) { + this.languageService.getLanguage(player.getUniqueId()).whenComplete((language, throwable) -> { + if (language == null) { + language = Language.DEFAULT; + } + + this.createInventory(player, language) + .open(player); + }); } private Gui createInventory(Player player, Language language) { 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 51fe1f3fd..cfedaa0df 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 @@ -10,7 +10,6 @@ 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; import dev.rollczi.litecommands.invocation.Invocation; @@ -30,10 +29,9 @@ class WarpArgument extends AbstractViewerArgument { WarpArgument( WarpService warpService, TranslationManager translationManager, - ViewerService viewerService, NoticeService noticeService ) { - super(viewerService, translationManager); + super(translationManager); this.warpService = warpService; this.noticeService = noticeService; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java index 2b1e052d2..1c53f7236 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java @@ -44,7 +44,7 @@ class WarpCommand { @Execute(name = "warp") @DescriptionDocs(description = "Open warp inventory, optionally you can disable this feature in config, if feature is disabled eternalcore will show all available warps") - void warp(@Context Player player, @Context User user) { + void warp(@Context Player player) { if (!this.config.warp.inventoryEnabled) { List list = this.warpService.getWarps().stream().map(Warp::getName).toList(); @@ -66,7 +66,7 @@ void warp(@Context Player player, @Context User user) { return; } - this.warpInventory.openInventory(player, user.getLanguage()); + this.warpInventory.openInventory(player); } @Execute(name = "warp") diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/notice/NoticeService.java b/eternalcore-core/src/main/java/com/eternalcode/core/notice/NoticeService.java index 59efcd330..69ecdb76e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/notice/NoticeService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/notice/NoticeService.java @@ -1,6 +1,8 @@ package com.eternalcode.core.notice; import com.eternalcode.commons.scheduler.Scheduler; +import com.eternalcode.core.feature.language.Language; +import com.eternalcode.core.feature.language.LanguageService; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; import com.eternalcode.core.placeholder.PlaceholderRegistry; @@ -38,6 +40,7 @@ public class NoticeService extends Multification { private final MiniMessage miniMessage; private final NoticeResolverRegistry noticeRegistry; + private final LanguageService languageService; @Inject public NoticeService( @@ -48,7 +51,8 @@ public NoticeService( TranslationManager translationManager, PlaceholderRegistry registry, MiniMessage miniMessage, - NoticeResolverRegistry noticeRegistry + NoticeResolverRegistry noticeRegistry, + LanguageService languageService ) { this.userManager = userManager; this.scheduler = scheduler; @@ -58,6 +62,7 @@ public NoticeService( this.registry = registry; this.miniMessage = miniMessage; this.noticeRegistry = noticeRegistry; + this.languageService = languageService; } @Override @@ -83,7 +88,13 @@ public NoticeService( @Override public @NotNull LocaleProvider localeProvider() { - return viewer -> viewer.getLanguage().toLocale(); + return viewer -> { + if (viewer.isConsole()) { + return Language.DEFAULT.toLocale(); + } + + return languageService.getLanguageNow(viewer.getUniqueId()).toLocale(); + }; } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManager.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManager.java index de480d0d2..64988ebe9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManager.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManager.java @@ -2,12 +2,13 @@ import com.eternalcode.annotations.scan.feature.FeatureDocs; import com.eternalcode.core.feature.language.Language; -import com.eternalcode.core.feature.language.LanguageSettings; +import com.eternalcode.core.feature.language.LanguageService; import com.eternalcode.core.user.User; import com.eternalcode.core.viewer.Viewer; import com.eternalcode.multification.translation.TranslationProvider; import java.util.Collections; import java.util.Set; +import java.util.UUID; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -21,10 +22,13 @@ ) public class TranslationManager implements TranslationProvider { + private final LanguageService languageService; + private final Map translatedMessages = new HashMap<>(); private Translation defaultTranslation; - TranslationManager(Translation defaultTranslation) { + TranslationManager(LanguageService languageService, Translation defaultTranslation) { + this.languageService = languageService; this.defaultTranslation = defaultTranslation; } @@ -32,6 +36,10 @@ public void loadLanguage(Language language, Translation translated) { this.translatedMessages.put(language, translated); } + public Translation getMessages(UUID uniqueId) { + return getMessages(this.languageService.getLanguageNow(uniqueId)); + } + public Translation getMessages(Language language) { Translation translation = this.translatedMessages.get(language); @@ -48,13 +56,6 @@ public Translation getMessages(Language language) { return this.defaultTranslation; } - public Translation getMessages(User user) { - LanguageSettings settings = user.getSettings(); - Language language = settings.getLanguage(); - - return this.getMessages(language); - } - public Translation getDefaultMessages() { return this.defaultTranslation; } @@ -63,10 +64,6 @@ public void setDefaultMessages(Translation defaultTranslation) { this.defaultTranslation = defaultTranslation; } - public Translation getMessages(Viewer viewer) { - return this.getMessages(viewer.getLanguage()); - } - @NotNull @Override public Translation provide(Locale locale) { @@ -74,8 +71,7 @@ public Translation provide(Locale locale) { } public Set getAvailableLanguages() { - return Collections.unmodifiableSet( - this.translatedMessages.keySet() - ); + return Collections.unmodifiableSet(this.translatedMessages.keySet()); } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java index aa1e51182..7d6e9fba1 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java @@ -1,6 +1,7 @@ package com.eternalcode.core.translation; import com.eternalcode.core.configuration.ConfigurationManager; +import com.eternalcode.core.feature.language.LanguageService; import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.core.feature.language.config.LanguageConfiguration; @@ -12,7 +13,11 @@ class TranslationManagerSetup { @Bean - TranslationManager translationManager(ConfigurationManager configurationManager, LanguageConfiguration languageConfiguration) { + TranslationManager translationManager( + ConfigurationManager configurationManager, + LanguageService languageService, + LanguageConfiguration languageConfiguration + ) { List usedMessagesList = PandaStream.of(languageConfiguration.languages) .map(TranslationFactory::create) .toList(); @@ -21,7 +26,7 @@ TranslationManager translationManager(ConfigurationManager configurationManager, .find(usedMessages -> usedMessages.getLanguage().equals(languageConfiguration.defaultLanguage)) .orThrow(() -> new RuntimeException("Default language not found!")); - TranslationManager translationManager = new TranslationManager(defaultTranslation); + TranslationManager translationManager = new TranslationManager(languageService, defaultTranslation); for (ReloadableTranslation message : usedMessagesList) { configurationManager.load(message); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/user/User.java b/eternalcore-core/src/main/java/com/eternalcode/core/user/User.java index ad5affee7..0536b877a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/user/User.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/user/User.java @@ -1,6 +1,5 @@ package com.eternalcode.core.user; -import com.eternalcode.core.feature.language.Language; import com.eternalcode.core.viewer.Viewer; import java.util.Objects; @@ -8,7 +7,6 @@ public class User implements Viewer { - private UserSettings userSettings = new UserSettingsImpl(() -> this.userClientSettings); private UserClientSettings userClientSettings = UserClientSettings.NONE; private final String name; @@ -29,11 +27,6 @@ public UUID getUniqueId() { return this.uuid; } - @Override - public Language getLanguage() { - return this.userSettings.getLanguage(); - } - @Override public boolean isConsole() { return false; @@ -47,14 +40,6 @@ public void setClientSettings(UserClientSettings userClientSettings) { this.userClientSettings = userClientSettings; } - public UserSettings getSettings() { - return this.userSettings; - } - - public void setSettings(UserSettings userSettings) { - this.userSettings = userSettings; - } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientBukkitSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientBukkitSettings.java index ce82852d1..088e4698e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientBukkitSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientBukkitSettings.java @@ -20,6 +20,11 @@ class UserClientBukkitSettings implements UserClientSettings { this.playerReference = new WeakReference<>(server.getPlayer(uuid)); } + @Override + public boolean isOnline() { + return this.getPlayer().isPresent(); + } + private Option getPlayer() { Player player = this.playerReference.get(); @@ -37,17 +42,4 @@ private Option getPlayer() { return Option.of(player); } - private Player getPlayerOrThrow() { - return this.getPlayer().orThrow(() -> new IllegalStateException("Player is offline")); - } - - @Override - public Locale getLocate() { - return new Locale(this.getPlayerOrThrow().getLocale()); - } - - @Override - public boolean isOnline() { - return this.getPlayer().isPresent(); - } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientNoneSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientNoneSettings.java index 77701c398..62fdb60a0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientNoneSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientNoneSettings.java @@ -1,14 +1,7 @@ package com.eternalcode.core.user; -import java.util.Locale; - class UserClientNoneSettings implements UserClientSettings { - @Override - public Locale getLocate() { - return Locale.ENGLISH; - } - @Override public boolean isOnline() { return false; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientSettings.java index 6607e126a..7a0012bf3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserClientSettings.java @@ -1,11 +1,7 @@ package com.eternalcode.core.user; -import java.util.Locale; - public interface UserClientSettings { - Locale getLocate(); - UserClientSettings NONE = new UserClientNoneSettings(); boolean isOnline(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettings.java deleted file mode 100644 index c1c39d5b2..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettings.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.eternalcode.core.user; - -import com.eternalcode.core.feature.language.Language; -import com.eternalcode.core.feature.language.LanguageSettings; - -public interface UserSettings extends LanguageSettings { - - @Override - Language getLanguage(); - - @Override - void setLanguage(Language language); - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettingsImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettingsImpl.java deleted file mode 100644 index 38574c4ec..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/user/UserSettingsImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.eternalcode.core.user; - -import com.eternalcode.core.feature.language.Language; - -import java.util.function.Supplier; - -class UserSettingsImpl implements UserSettings { - - private final Supplier clientSettings; - private Language language = Language.DEFAULT; - - public UserSettingsImpl(Supplier clientSettings) { - this.clientSettings = clientSettings; - } - - @Override - public Language getLanguage() { - return this.language != Language.DEFAULT - ? this.language - : Language.fromLocale(this.clientSettings.get().getLocate()); - } - - @Override - public void setLanguage(Language language) { - this.language = language; - } - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerImpl.java index 6941e48da..535cf8c2f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerImpl.java @@ -1,37 +1,28 @@ package com.eternalcode.core.viewer; -import com.eternalcode.core.feature.language.Language; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.UUID; -import java.util.function.Supplier; class BukkitViewerImpl implements Viewer { - private static final BukkitViewerImpl CONSOLE = new BukkitViewerImpl(UUID.nameUUIDFromBytes("CONSOLE".getBytes()), true, Language.DEFAULT); + private static final BukkitViewerImpl CONSOLE = new BukkitViewerImpl(UUID.nameUUIDFromBytes("CONSOLE".getBytes()), true); private final UUID uuid; private final boolean console; - private final Supplier language; - - private BukkitViewerImpl(UUID uuid, boolean console, Language language) { - this(uuid, console, () -> language); - } - - private BukkitViewerImpl(UUID uuid, boolean console, Supplier language) { + private BukkitViewerImpl(UUID uuid, boolean console) { this.uuid = uuid; this.console = console; - this.language = language; } - public static BukkitViewerImpl console() { + static BukkitViewerImpl console() { return CONSOLE; } - public static BukkitViewerImpl player(UUID uuid, Language language) { - return new BukkitViewerImpl(uuid, false, language); + static BukkitViewerImpl player(UUID uuid) { + return new BukkitViewerImpl(uuid, false); } @Override @@ -59,9 +50,4 @@ public String getName() { return player.getName(); } - @Override - public Language getLanguage() { - return this.language.get(); - } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerProvider.java b/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerProvider.java index 1720c3455..45acecd12 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerProvider.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/viewer/BukkitViewerProvider.java @@ -1,6 +1,5 @@ package com.eternalcode.core.viewer; -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.user.User; @@ -61,12 +60,12 @@ public Viewer console() { public Viewer player(UUID uuid) { return this.userManager.getUser(uuid) .map(Viewer.class::cast) - .orElseGet(() -> BukkitViewerImpl.player(uuid, Language.DEFAULT)); + .orElseGet(() -> BukkitViewerImpl.player(uuid)); } @Override public Viewer user(User user) { - return BukkitViewerImpl.player(user.getUniqueId(), user.getSettings().getLanguage()); + return BukkitViewerImpl.player(user.getUniqueId()); } public Viewer sender(CommandSender commandSender) { @@ -82,7 +81,7 @@ public Viewer any(Object any) { return userOption.get(); } - return BukkitViewerImpl.player(player.getUniqueId(), Language.DEFAULT); + return BukkitViewerImpl.player(player.getUniqueId()); } if (any instanceof ConsoleCommandSender || any instanceof RemoteConsoleCommandSender || any instanceof BlockCommandSender) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/viewer/Viewer.java b/eternalcore-core/src/main/java/com/eternalcode/core/viewer/Viewer.java index b04d344be..14506e29b 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/viewer/Viewer.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/viewer/Viewer.java @@ -1,15 +1,11 @@ package com.eternalcode.core.viewer; -import com.eternalcode.core.feature.language.Language; - import java.util.UUID; public interface Viewer { UUID getUniqueId(); - Language getLanguage(); - boolean isConsole(); String getName(); diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/test/MockServer.java b/eternalcore-core/src/test/java/com/eternalcode/core/test/MockServer.java index d60003c01..4bd6764e3 100644 --- a/eternalcore-core/src/test/java/com/eternalcode/core/test/MockServer.java +++ b/eternalcore-core/src/test/java/com/eternalcode/core/test/MockServer.java @@ -62,13 +62,13 @@ public void quitPlayer(Player player) { } public void kickPlayer(Player player) { - this.onlinePlayers.remove(player.getUniqueId()); - PlayerKickEvent event = new PlayerKickEvent(player, "Player " + player.getName() + " has been kicked!", "Kicked!"); for (Consumer kickListener : this.kickListeners) { kickListener.accept(event); } + + this.quitPlayer(player); } public void listenJoin(Consumer joinListener) { diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/test/MockViewer.java b/eternalcore-core/src/test/java/com/eternalcode/core/test/MockViewer.java index bbba9cc8e..c25eef78c 100644 --- a/eternalcore-core/src/test/java/com/eternalcode/core/test/MockViewer.java +++ b/eternalcore-core/src/test/java/com/eternalcode/core/test/MockViewer.java @@ -30,11 +30,6 @@ public UUID getUniqueId() { return this.uuid; } - @Override - public Language getLanguage() { - return Language.EN; - } - @Override public String getName() { return this.name; From 1198dfc5be602b97247a7411e43fd83c37a4c733 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sat, 18 Jan 2025 14:27:28 +0100 Subject: [PATCH 16/18] GH-891 Fix removing catboy using butcher, remove catboy on server shutdown, add catboy config. (#891) * Fix removing catboy using butcher, remove catboy on server shutdown, add catboy config. Add catboy persistance. * GH-579 Add repository for language. Remove user settings. (#890) * Add repository for language. Remove user settings. * Simplify API * Provide catboy speed from config. * Create CatBoyEntityService --------- Co-authored-by: Norbert Dejlich --- .../butcher/ButcherEntityRemoveEvent.java | 41 +++++++++++++++++ .../implementation/PluginConfiguration.java | 19 ++++++++ .../mob => butcher}/ButcherArgument.java | 4 +- .../mob => butcher}/ButcherCommand.java | 17 ++++--- .../mob => butcher}/MobEntity.java | 2 +- .../mob => butcher}/MobEntityArgument.java | 2 +- .../mob => butcher}/MobFilter.java | 2 +- .../{essentials/mob => butcher}/MobType.java | 2 +- .../feature/catboy/CatBoyEntityService.java | 40 +++++++++++++++++ .../core/feature/catboy/CatBoySettings.java | 7 +++ .../core/feature/catboy/CatboyController.java | 45 ++++++++++++++++--- .../feature/catboy/CatboyServiceImpl.java | 31 +++++++------ 12 files changed, 182 insertions(+), 30 deletions(-) create mode 100644 eternalcore-api/src/main/java/com/eternalcode/core/feature/butcher/ButcherEntityRemoveEvent.java rename eternalcore-core/src/main/java/com/eternalcode/core/feature/{essentials/mob => butcher}/ButcherArgument.java (98%) rename eternalcore-core/src/main/java/com/eternalcode/core/feature/{essentials/mob => butcher}/ButcherCommand.java (86%) rename eternalcore-core/src/main/java/com/eternalcode/core/feature/{essentials/mob => butcher}/MobEntity.java (95%) rename eternalcore-core/src/main/java/com/eternalcode/core/feature/{essentials/mob => butcher}/MobEntityArgument.java (97%) rename eternalcore-core/src/main/java/com/eternalcode/core/feature/{essentials/mob => butcher}/MobFilter.java (69%) rename eternalcore-core/src/main/java/com/eternalcode/core/feature/{essentials/mob => butcher}/MobType.java (91%) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoyEntityService.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoySettings.java diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/butcher/ButcherEntityRemoveEvent.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/butcher/ButcherEntityRemoveEvent.java new file mode 100644 index 000000000..7fb661f75 --- /dev/null +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/butcher/ButcherEntityRemoveEvent.java @@ -0,0 +1,41 @@ +package com.eternalcode.core.feature.butcher; + +import org.bukkit.entity.Entity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ButcherEntityRemoveEvent extends Event implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private boolean cancelled; + private final Entity entity; + + public ButcherEntityRemoveEvent(Entity entity) { + this.entity = entity; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + public Entity getEntity() { + return entity; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} 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 30be682dd..778160135 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 @@ -4,6 +4,7 @@ import com.eternalcode.core.database.DatabaseType; import com.eternalcode.core.feature.afk.AfkSettings; import com.eternalcode.core.feature.automessage.AutoMessageSettings; +import com.eternalcode.core.feature.catboy.CatBoySettings; import com.eternalcode.core.feature.chat.ChatSettings; import com.eternalcode.core.feature.helpop.HelpOpSettings; import com.eternalcode.core.feature.jail.JailSettings; @@ -421,6 +422,24 @@ public Set allowedCommands() { } } + @Bean + @Description({ " ", "# 4fun Section" }) + FunSection fun = new FunSection(); + + @Contextual + public static class FunSection implements CatBoySettings { + @Description({ + "# Speed of player walk speed while using /catboy feature", + "# Default minecraft walk speed is 0.2" + }) + public float catboyWalkSpeed = 0.4F; + + @Override + public float getCatboyWalkSpeed() { + return this.catboyWalkSpeed; + } + } + @Override public Resource resource(File folder) { return Source.of(folder, "config.yml"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/ButcherArgument.java similarity index 98% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/ButcherArgument.java index adf37ca18..d32a11b46 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/ButcherArgument.java @@ -1,15 +1,15 @@ -package com.eternalcode.core.feature.essentials.mob; +package com.eternalcode.core.feature.butcher; import com.eternalcode.core.bridge.litecommand.argument.AbstractViewerArgument; import com.eternalcode.core.configuration.implementation.PluginConfiguration; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.lite.LiteArgument; +import com.eternalcode.core.viewer.ViewerService; import com.eternalcode.multification.notice.NoticeBroadcast; 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; import dev.rollczi.litecommands.invocation.Invocation; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/ButcherCommand.java similarity index 86% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherCommand.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/ButcherCommand.java index 0e64ff1f4..997837031 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/ButcherCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/ButcherCommand.java @@ -1,7 +1,7 @@ -package com.eternalcode.core.feature.essentials.mob; +package com.eternalcode.core.feature.butcher; import com.eternalcode.annotations.scan.command.DescriptionDocs; -import com.eternalcode.core.configuration.implementation.PluginConfiguration; +import com.eternalcode.core.event.EventCaller; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import dev.rollczi.litecommands.annotations.argument.Arg; @@ -25,10 +25,12 @@ class ButcherCommand { private final NoticeService noticeService; + private final EventCaller eventCaller; @Inject - ButcherCommand(NoticeService noticeService, PluginConfiguration pluginConfiguration) { + ButcherCommand(NoticeService noticeService, EventCaller eventCaller) { this.noticeService = noticeService; + this.eventCaller = eventCaller; } @Execute @@ -51,16 +53,21 @@ void execute(@Context Player player, @Arg(ButcherArgument.KEY) int chunks, @Arg( private void killMobs(Player player, int chunksNumber, MobFilter mobFilter) { Collection chunks = this.getChunksNearPlayer(player, chunksNumber); - int killedMobs = 0; for (Chunk chunk : chunks) { for (Entity entity : chunk.getEntities()) { - if (!mobFilter.filterMob(entity)) { continue; } + ButcherEntityRemoveEvent event = new ButcherEntityRemoveEvent(entity); + this.eventCaller.callEvent(event); + + if (event.isCancelled()) { + continue; + } + entity.remove(); killedMobs++; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntity.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobEntity.java similarity index 95% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntity.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobEntity.java index 5d437e92b..18689cca2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntity.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobEntity.java @@ -1,4 +1,4 @@ -package com.eternalcode.core.feature.essentials.mob; +package com.eternalcode.core.feature.butcher; import com.eternalcode.core.util.EntityUtil; import org.bukkit.entity.Animals; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobEntityArgument.java similarity index 97% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobEntityArgument.java index ebdcb491b..ef4228ebb 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobEntityArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobEntityArgument.java @@ -1,4 +1,4 @@ -package com.eternalcode.core.feature.essentials.mob; +package com.eternalcode.core.feature.butcher; import com.eternalcode.core.bridge.litecommand.argument.AbstractViewerArgument; import com.eternalcode.core.injector.annotations.Inject; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobFilter.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobFilter.java similarity index 69% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobFilter.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobFilter.java index 21a5c60aa..53f0bc76c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobFilter.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobFilter.java @@ -1,4 +1,4 @@ -package com.eternalcode.core.feature.essentials.mob; +package com.eternalcode.core.feature.butcher; import org.bukkit.entity.Entity; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobType.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobType.java similarity index 91% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobType.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobType.java index 1bc4ac2b7..1952d29c3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/mob/MobType.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/butcher/MobType.java @@ -1,4 +1,4 @@ -package com.eternalcode.core.feature.essentials.mob; +package com.eternalcode.core.feature.butcher; enum MobType { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoyEntityService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoyEntityService.java new file mode 100644 index 000000000..70c5a627e --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoyEntityService.java @@ -0,0 +1,40 @@ +package com.eternalcode.core.feature.catboy; + +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Service; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Cat; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.plugin.Plugin; + +@Service +class CatBoyEntityService { + + private final NamespacedKey catboyNamespacedKey; + + @Inject + CatBoyEntityService(Plugin plugin) { + this.catboyNamespacedKey = new NamespacedKey(plugin, "catboy"); + } + + Cat createCatboyEntity(Player player, Cat.Type type) { + Cat cat = (Cat) player.getWorld().spawnEntity(player.getLocation(), EntityType.CAT); + cat.setInvulnerable(true); + cat.setOwner(player); + cat.setAI(false); + cat.setCatType(type); + + PersistentDataContainer persistentDataContainer = cat.getPersistentDataContainer(); + persistentDataContainer.set(catboyNamespacedKey, PersistentDataType.BOOLEAN, true); + + return cat; + } + + boolean isCatboy(Cat cat) { + return cat.getPersistentDataContainer().has(catboyNamespacedKey, PersistentDataType.BOOLEAN); + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoySettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoySettings.java new file mode 100644 index 000000000..d11434300 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatBoySettings.java @@ -0,0 +1,7 @@ +package com.eternalcode.core.feature.catboy; + +public interface CatBoySettings { + + float getCatboyWalkSpeed(); + +} 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 253922a27..776aa418a 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 @@ -1,9 +1,15 @@ package com.eternalcode.core.feature.catboy; import com.eternalcode.commons.scheduler.Scheduler; +import com.eternalcode.core.feature.butcher.ButcherEntityRemoveEvent; import com.eternalcode.core.feature.teleport.event.EternalTeleportEvent; 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.event.EternalShutdownEvent; +import java.time.Duration; +import java.util.Optional; +import org.bukkit.Server; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.entity.Cat; @@ -15,21 +21,27 @@ import org.bukkit.event.entity.EntityDismountEvent; import org.bukkit.event.player.PlayerQuitEvent; -import java.time.Duration; -import java.util.Optional; - @Controller class CatboyController implements Listener { private static final Duration TICK = Duration.ofMillis(50L); private final CatboyService catboyService; + private final CatBoyEntityService catBoyEntityService; private final Scheduler scheduler; + private final Server server; @Inject - CatboyController(CatboyService catboyService, Scheduler scheduler) { + CatboyController( + CatboyService catboyService, + CatBoyEntityService catBoyEntityService, + Scheduler scheduler, + Server server + ) { this.catboyService = catboyService; + this.catBoyEntityService = catBoyEntityService; this.scheduler = scheduler; + this.server = server; } @EventHandler @@ -60,7 +72,9 @@ void onTeleport(EternalTeleportEvent event) { Catboy catboy = optionalCatboy.get(); this.catboyService.unmarkAsCatboy(event.getPlayer()); - this.scheduler.runLater(() -> this.catboyService.markAsCatboy(event.getPlayer(), catboy.selectedType()), TICK); + this.scheduler.runLater( + () -> this.catboyService.markAsCatboy(event.getPlayer(), catboy.selectedType()), + TICK); } } @@ -85,4 +99,25 @@ void onHit(EntityDamageByEntityEvent event) { } } + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + void onEntityRemoveFromWorld(ButcherEntityRemoveEvent event) { + if (!(event.getEntity() instanceof Cat cat)) { + return; + } + + if (this.catBoyEntityService.isCatboy(cat)) { + event.setCancelled(true); + } + } + + @Subscribe + void onServerShutdown(EternalShutdownEvent event) { + for (Player onlinePlayer : this.server.getOnlinePlayers()) { + boolean catboy = this.catboyService.isCatboy(onlinePlayer.getUniqueId()); + + if (catboy) { + this.catboyService.unmarkAsCatboy(onlinePlayer); + } + } + } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyServiceImpl.java index 92c6dcdb8..bbe9a0cf8 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyServiceImpl.java @@ -5,26 +5,34 @@ import com.eternalcode.core.feature.catboy.event.CatboySwitchEvent; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import org.bukkit.entity.Cat; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; - import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.UUID; +import org.bukkit.entity.Cat; +import org.bukkit.entity.Player; @Service class CatboyServiceImpl implements CatboyService { + private static final float DEFAULT_WALK_SPEED = 0.2F; private final Map catboys = new HashMap<>(); private final EventCaller eventCaller; + private final CatBoyEntityService catBoyEntityService; + private final CatBoySettings catBoySettings; + @Inject - CatboyServiceImpl(EventCaller eventCaller) { + CatboyServiceImpl( + EventCaller eventCaller, + CatBoyEntityService catBoyEntityService, + CatBoySettings catBoySettings + ) { this.eventCaller = eventCaller; + this.catBoyEntityService = catBoyEntityService; + this.catBoySettings = catBoySettings; } @Override @@ -32,13 +40,9 @@ public void markAsCatboy(Player player, Cat.Type type) { Catboy catboy = new Catboy(player.getUniqueId(), type); this.catboys.put(player.getUniqueId(), catboy); - Cat entity = (Cat) player.getWorld().spawnEntity(player.getLocation(), EntityType.CAT); - entity.setInvulnerable(true); - entity.setOwner(player); - entity.setCatType(type); - - player.addPassenger(entity); - player.setWalkSpeed(0.4F); + Cat cat = this.catBoyEntityService.createCatboyEntity(player, type); + player.addPassenger(cat); + player.setWalkSpeed(this.catBoySettings.getCatboyWalkSpeed()); this.eventCaller.callEvent(new CatboySwitchEvent(player, true)); } @@ -48,7 +52,7 @@ public void unmarkAsCatboy(Player player) { this.catboys.remove(player.getUniqueId()); player.getPassengers().forEach(entity -> entity.remove()); player.getPassengers().clear(); - player.setWalkSpeed(0.2F); + player.setWalkSpeed(DEFAULT_WALK_SPEED); this.eventCaller.callEvent(new CatboySwitchEvent(player, false)); } @@ -90,5 +94,4 @@ public Optional getCatboy(UUID uuid) { public Collection getCatboys() { return Collections.unmodifiableCollection(this.catboys.values()); } - } From af34b1ecdcc0a680e0daec436da97dde00655fab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:36:33 +0100 Subject: [PATCH 17/18] dependency: Update dependency com.github.ben-manes.caffeine:caffeine to v3.2.0 (#892) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index f6d9f963c..8661c704e 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -37,7 +37,7 @@ object Versions { const val BSTATS = "3.1.0" - const val CAFFEINE = "3.1.8" + const val CAFFEINE = "3.2.0" const val SPOTIFY_COMPLETABLE_FUTURES = "0.3.6" From 046c0dfbea0e52e89d44938dee3728a38b32dd1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:37:01 +0100 Subject: [PATCH 18/18] dependency: Update dependency org.postgresql:postgresql to v42.7.5 (#889) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 8661c704e..576e95508 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -18,7 +18,7 @@ object Versions { const val CDN_CONFIGS = "1.14.6" const val MARIA_DB = "3.5.1" - const val POSTGRESQL = "42.7.4" + const val POSTGRESQL = "42.7.5" const val H2 = "2.3.232" const val ORMLITE = "6.1" const val HIKARI_CP = "6.2.1"