From a1481d1786bc038fdfa264678ec4655ac184a7db Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 7 Jun 2026 19:54:51 +0200 Subject: [PATCH 1/8] Move to `paper-api`, remove `eternalcore-paper` module and all associated classes and update material handling to use `XMaterial`. --- buildSrc/src/main/kotlin/Versions.kt | 5 +- .../kotlin/eternalcode-java-test.gradle.kts | 3 +- eternalcore-api-example/build.gradle.kts | 4 +- eternalcore-api/build.gradle.kts | 2 +- eternalcore-core/build.gradle.kts | 15 ++- .../com/eternalcode/core/EternalCore.java | 4 +- .../core/adventure/AdventureSetup.java | 8 -- .../configuration/contextual/ConfigItem.java | 4 +- .../core/feature/container/AnvilCommand.java | 1 - .../container/CartographyTableCommand.java | 1 - .../feature/container/GrindstoneCommand.java | 1 - .../core/feature/container/LoomCommand.java | 1 - .../container/SmithingTableCommand.java | 1 - .../feature/container/StonecutterCommand.java | 1 - .../handler/PlayerKillMessageHandler.java | 7 +- .../fun/catboy/CatBoyEntityService.java | 4 +- .../elderguardian/ElderGuardianCommand.java | 2 +- .../fun/endscreen/EndScreenCommand.java | 2 +- .../feature/itemedit/ItemLoreCommand.java | 6 +- .../feature/itemedit/ItemNameCommand.java | 6 +- .../feature/powertool/PowertoolCommand.java | 7 +- .../powertool/PowertoolController.java | 14 ++- .../randomteleport/RandomTeleportConfig.java | 114 +++++++++-------- .../core/feature/skull/SkullCommand.java | 6 +- .../feature/sleep/PhantomSpawnController.java | 22 ++-- .../feature/spawn/SpawnRespawnController.java | 2 +- .../feature/vanish/VanishServiceImpl.java | 5 + .../controller/OpenSilentController.java | 17 ++- .../core/feature/warp/WarpConfig.java | 4 +- .../core/feature/warp/WarpInventoryItem.java | 7 +- .../feature/warp/inventory/WarpInventory.java | 8 +- .../warp/inventory/WarpInventoryConfig.java | 4 +- .../core/litecommand/LiteCommandsSetup.java | 8 -- .../argument/MaterialArgument.java | 14 +-- .../core/notice/NoticeService.java | 16 ++- .../eternalcode/core/util/MaterialUtil.java | 11 ++ .../core/test/MockAudienceProvider.java | 116 ------------------ eternalcore-docs-generate/build.gradle.kts | 4 +- eternalcore-paper/build.gradle.kts | 9 -- .../com/eternalcode/paper/PaperContainer.java | 26 ---- .../com/eternalcode/paper/PaperFeature.java | 34 ----- .../com/eternalcode/paper/PaperOverlay.java | 23 ---- .../phantom/PhantomEventInitializer.java | 17 --- .../paper/phantom/PhantomEventWrapper.java | 25 ---- .../phantom/PhantomSpawnAttemptEvent.java | 59 --------- eternalcore-plugin/build.gradle.kts | 13 +- .../dependency/DependencyCollector.java | 14 +++ gradle.properties | 2 +- settings.gradle.kts | 3 +- 49 files changed, 224 insertions(+), 458 deletions(-) delete mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/test/MockAudienceProvider.java delete mode 100644 eternalcore-paper/build.gradle.kts delete mode 100644 eternalcore-paper/src/main/java/com/eternalcode/paper/PaperContainer.java delete mode 100644 eternalcore-paper/src/main/java/com/eternalcode/paper/PaperFeature.java delete mode 100644 eternalcore-paper/src/main/java/com/eternalcode/paper/PaperOverlay.java delete mode 100644 eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventInitializer.java delete mode 100644 eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventWrapper.java delete mode 100644 eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomSpawnAttemptEvent.java diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index fef933348..1acf59a3a 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,6 +1,6 @@ object Versions { - const val SPIGOT_API = "1.21.3-R0.1-SNAPSHOT" + // Keep this version for Paper APIs used by modern EternalCore features. const val PAPER_API = "1.21.3-R0.1-SNAPSHOT" const val ETERNALCODE_COMMONS = "1.4.1" @@ -12,8 +12,7 @@ object Versions { const val LOMBOK = "1.18.46" const val PAPERLIB = "1.0.8" - const val ADVENTURE_TEXT_MINIMESSAGE = "5.1.1" - const val ADVENTURE_PLATFORM = "4.4.1" + const val ADVENTURE_TEXT_MINIMESSAGE = "4.26.1" const val OKAERI_CONFIGS = "6.0.0-beta.27" const val MARIA_DB = "3.5.8" diff --git a/buildSrc/src/main/kotlin/eternalcode-java-test.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java-test.gradle.kts index 96e7d8cd9..6452da120 100644 --- a/buildSrc/src/main/kotlin/eternalcode-java-test.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode-java-test.gradle.kts @@ -11,8 +11,7 @@ dependencies { testRuntimeOnly("org.junit.platform:junit-platform-launcher") testImplementation("org.mockito:mockito-core:${Versions.MOCKITO_CORE}") - testImplementation("net.kyori:adventure-platform-facet:${Versions.ADVENTURE_PLATFORM}") - testImplementation("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") + testImplementation("io.papermc.paper:paper-api:${Versions.PAPER_API}") } tasks.getByName("test") { diff --git a/eternalcore-api-example/build.gradle.kts b/eternalcore-api-example/build.gradle.kts index f89eab24a..649bdf7d0 100644 --- a/eternalcore-api-example/build.gradle.kts +++ b/eternalcore-api-example/build.gradle.kts @@ -12,7 +12,7 @@ version = "1.3.2" repositories { mavenCentral() - maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // spigot + maven("https://repo.papermc.io/repository/maven-public/") // paper maven("https://repo.panda-lang.org/releases/") // expressible // maven("https://repo.eternalcode.pl/releases/") // eternalcode @@ -22,7 +22,7 @@ repositories { dependencies { implementation("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") - compileOnly("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") + compileOnly("io.papermc.paper:paper-api:${Versions.PAPER_API}") compileOnly(project(":eternalcore-api")) // <-- This is the eternalcore-api module, // replace it with compileOnly("com.eternalcode:eternalcore-api:") } diff --git a/eternalcore-api/build.gradle.kts b/eternalcore-api/build.gradle.kts index d174dbe4c..482e7b722 100644 --- a/eternalcore-api/build.gradle.kts +++ b/eternalcore-api/build.gradle.kts @@ -5,6 +5,6 @@ plugins { } dependencies { - compileOnly("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") + compileOnlyApi("io.papermc.paper:paper-api:${Versions.PAPER_API}") api("org.jetbrains:annotations:${Versions.JETBRAINS_ANNOTATIONS}") } diff --git a/eternalcore-core/build.gradle.kts b/eternalcore-core/build.gradle.kts index aa7a88417..a862b94a6 100644 --- a/eternalcore-core/build.gradle.kts +++ b/eternalcore-core/build.gradle.kts @@ -8,14 +8,13 @@ plugins { dependencies { // modules implementation(project(":eternalcore-api")) - implementation(project(":eternalcore-paper")) api(project(":eternalcore-docs-api")) // Base libraries compileOnly("org.jetbrains:annotations:${Versions.JETBRAINS_ANNOTATIONS}") // Minecraft & Bridges API - compileOnlyApi("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") + compileOnlyApi("io.papermc.paper:paper-api:${Versions.PAPER_API}") compileOnly("me.clip:placeholderapi:${Versions.PLACEHOLDER_API}") compileOnly("us.dynmap:dynmap-api:${Versions.DYNMAP_API}") compileOnly("us.dynmap:DynmapCoreAPI:${Versions.DYNMAP_API}") @@ -29,14 +28,18 @@ dependencies { testImplementation("org.awaitility:awaitility:${Versions.AWAITILITY}") } +configurations.configureEach { + exclude(group = "net.kyori", module = "adventure-platform-api") + exclude(group = "net.kyori", module = "adventure-platform-bukkit") + exclude(group = "net.kyori", module = "adventure-platform-facet") + exclude(group = "net.kyori", module = "adventure-platform-viaversion") +} + eternalShadow { // Paper and Adventure libraries library("io.papermc:paperlib:${Versions.PAPERLIB}") - library("net.kyori:adventure-text-minimessage:${Versions.ADVENTURE_TEXT_MINIMESSAGE}") - library("net.kyori:adventure-platform-bukkit:${Versions.ADVENTURE_PLATFORM}") libraryRelocate( "io.papermc.lib", - "net.kyori", ) // configuration @@ -48,6 +51,7 @@ eternalShadow { ) // Multification + library("com.eternalcode:multification-paper:${Versions.MULTIFICATION}") library("com.eternalcode:multification-bukkit:${Versions.MULTIFICATION}") library("com.eternalcode:multification-okaeri:${Versions.MULTIFICATION}") libraryRelocate( @@ -88,7 +92,6 @@ eternalShadow { library("dev.rollczi:liteskullapi:${Versions.LITE_SKULL_API}") library("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") library("dev.rollczi:litecommands-folia:${Versions.LITE_COMMANDS}") - library("dev.rollczi:litecommands-adventure-platform:${Versions.LITE_COMMANDS}") libraryRelocate( "dev.rollczi.litecommands", "dev.rollczi.liteskullapi" 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 49be17f43..f9d3e226f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java @@ -80,7 +80,9 @@ public EternalCore(Plugin plugin) { } // TODO: Remove this when we resolve problem with DI - classes with @Subscribe annotation should be loaded first or when event is called - beanFactory.initializeCandidates(ConfigurationCompatibilityV21_2.class); + if (compatibilityService.isCompatible(ConfigurationCompatibilityV21_2.class)) { + beanFactory.initializeCandidates(ConfigurationCompatibilityV21_2.class); + } beanFactory.initializeCandidates(EternalConfigurationFile.class); beanFactory.initializeCandidates(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/adventure/AdventureSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/adventure/AdventureSetup.java index 74d81f662..c6b4e7537 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/adventure/AdventureSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/adventure/AdventureSetup.java @@ -5,19 +5,11 @@ import com.eternalcode.commons.adventure.AdventureUrlPostProcessor; import com.eternalcode.core.injector.annotations.Bean; 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; @Setup class AdventureSetup { - @Bean - AudienceProvider audienceProvider(Plugin plugin) { - return BukkitAudiences.builder(plugin).build(); - } - @Bean MiniMessage miniMessage() { return MiniMessage.builder() diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/contextual/ConfigItem.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/contextual/ConfigItem.java index 1e7f4ed72..d1c4b080c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/contextual/ConfigItem.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/contextual/ConfigItem.java @@ -1,5 +1,7 @@ package com.eternalcode.core.configuration.contextual; +import com.cryptomorin.xseries.XMaterial; +import com.eternalcode.core.util.MaterialUtil; import eu.okaeri.configs.OkaeriConfig; import org.bukkit.Material; @@ -11,7 +13,7 @@ public class ConfigItem extends OkaeriConfig { public String name = "&6Item"; public List lore = Collections.singletonList("&7Default lore"); - public Material material = Material.PLAYER_HEAD; + public Material material = MaterialUtil.parseRequired(XMaterial.PLAYER_HEAD); public String texture = "none"; public boolean glow = false; public int slot = 0; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/AnvilCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/AnvilCommand.java index f7bef3e37..e725719f8 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/AnvilCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/AnvilCommand.java @@ -3,7 +3,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperContainer; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/CartographyTableCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/CartographyTableCommand.java index dafb067d6..696d78fed 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/CartographyTableCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/CartographyTableCommand.java @@ -3,7 +3,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperContainer; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/GrindstoneCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/GrindstoneCommand.java index 91bcb47cf..285d62628 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/GrindstoneCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/GrindstoneCommand.java @@ -3,7 +3,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperContainer; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/LoomCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/LoomCommand.java index cd376cd67..47fc27bb7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/LoomCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/LoomCommand.java @@ -3,7 +3,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperContainer; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/SmithingTableCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/SmithingTableCommand.java index 79b50dddc..77b05b84b 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/SmithingTableCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/SmithingTableCommand.java @@ -3,7 +3,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperContainer; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/StonecutterCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/StonecutterCommand.java index cdad204ec..fc2f24fa0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/StonecutterCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/StonecutterCommand.java @@ -3,7 +3,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperContainer; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java index 66ed393db..279457765 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java @@ -1,5 +1,6 @@ package com.eternalcode.core.feature.deathmessage.handler; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.commons.RandomElementUtil; import com.eternalcode.core.feature.deathmessage.DeathContext; import com.eternalcode.core.injector.annotations.Inject; @@ -14,6 +15,8 @@ @Service public class PlayerKillMessageHandler { + private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); + private final NoticeService noticeService; private final TranslationManager translationManager; @@ -34,7 +37,7 @@ public void handle(DeathContext context) { String victimName = victim.getName(); String killerName = killer.getName(); - ItemStack weapon = killer.getInventory().getItemInMainHand().getType() != Material.AIR + ItemStack weapon = killer.getInventory().getItemInMainHand().getType() != AIR ? killer.getInventory().getItemInMainHand() : killer.getInventory().getItemInOffHand(); String weaponName = this.getWeaponName(weapon); @@ -50,7 +53,7 @@ public void handle(DeathContext context) { } private String getWeaponName(ItemStack weapon) { - if (weapon == null || weapon.getType() == Material.AIR) { + if (weapon == null || weapon.getType() == AIR) { return this.translationManager.getMessages().deathMessage().unarmedWeaponName(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java index 512706064..b755c64f4 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java @@ -28,13 +28,13 @@ Cat createCatboyEntity(Player player, Cat.Type type) { cat.setCatType(type); PersistentDataContainer persistentDataContainer = cat.getPersistentDataContainer(); - persistentDataContainer.set(catboyNamespacedKey, PersistentDataType.BOOLEAN, true); + persistentDataContainer.set(catboyNamespacedKey, PersistentDataType.BYTE, (byte) 1); return cat; } boolean isCatboy(Cat cat) { - return cat.getPersistentDataContainer().has(catboyNamespacedKey, PersistentDataType.BOOLEAN); + return cat.getPersistentDataContainer().has(catboyNamespacedKey, PersistentDataType.BYTE); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/elderguardian/ElderGuardianCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/elderguardian/ElderGuardianCommand.java index 2d83b075b..7897c4fb7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/elderguardian/ElderGuardianCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/elderguardian/ElderGuardianCommand.java @@ -5,7 +5,7 @@ import com.eternalcode.core.compatibility.Version; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperOverlay; +import com.eternalcode.core.feature.fun.PaperOverlay; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/endscreen/EndScreenCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/endscreen/EndScreenCommand.java index af1ceb739..7379493fb 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/endscreen/EndScreenCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/endscreen/EndScreenCommand.java @@ -5,7 +5,7 @@ import com.eternalcode.core.compatibility.Version; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.paper.PaperOverlay; +import com.eternalcode.core.feature.fun.PaperOverlay; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java index 1c2404d67..469df3c7e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java @@ -1,9 +1,11 @@ package com.eternalcode.core.feature.itemedit; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.commons.adventure.AdventureUtil; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; @@ -22,6 +24,8 @@ @Permission("eternalcore.itemlore") class ItemLoreCommand { + private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); + private final NoticeService noticeService; private final MiniMessage miniMessage; @@ -115,7 +119,7 @@ void clear(@Sender Player player) { private ItemStack validateItemFromMainHand(Player player) { ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == Material.AIR || itemStack.getItemMeta() == null) { + if (itemStack.getType() == AIR || itemStack.getItemMeta() == null) { return null; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java index 30b1188ce..d36d5a8f2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java @@ -1,9 +1,11 @@ package com.eternalcode.core.feature.itemedit; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.commons.adventure.AdventureUtil; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; @@ -19,6 +21,8 @@ @Permission("eternalcore.itemname") class ItemNameCommand { + private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); + private final NoticeService noticeService; private final MiniMessage miniMessage; @@ -71,7 +75,7 @@ void clear(@Sender Player player) { private ItemStack validateItemFromMainHand(Player player) { ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == Material.AIR || itemStack.getItemMeta() == null) { + if (itemStack.getType() == AIR || itemStack.getItemMeta() == null) { return null; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java index 44c4d9096..e46d5524f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java @@ -1,7 +1,9 @@ package com.eternalcode.core.feature.powertool; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.argument.Key; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; @@ -22,6 +24,7 @@ public class PowertoolCommand { public static final String KEY = "eternalcore_powertool"; + private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); private final NamespacedKey key; private final Plugin plugin; @@ -38,7 +41,7 @@ public class PowertoolCommand { void clear(@Sender Player player) { ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta meta = item.getItemMeta(); - if (item.getType() == Material.AIR || meta == null) { + if (item.getType() == AIR || meta == null) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.powertool().noItemInMainHand()) @@ -78,7 +81,7 @@ void assign(@Sender Player player, @Join @Key(PowertoolCommandArgument.KEY) Stri ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta meta = item.getItemMeta(); - if (item.getType() == Material.AIR || meta == null) { + if (item.getType() == AIR || meta == null) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.powertool().noItemInMainHand()) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java index 1ac3faddc..ab8c098f4 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java @@ -38,7 +38,7 @@ public class PowertoolController implements Listener { .with("{Z}", player -> Integer.toString(player.getLocation().getBlockZ())) .with("{YAW}", player -> Float.toString(player.getLocation().getYaw())) .with("{PITCH}", player -> Float.toString(player.getLocation().getPitch())) - .with("{ITEM}", player -> player.getInventory().getItemInMainHand().getItemMeta().getItemName()) + .with("{ITEM}", PowertoolController::getItemName) .with("{ITEM_TYPE}", player -> player.getInventory().getItemInMainHand().getType().name()) .build(); @@ -92,5 +92,17 @@ void onPlayerInteract(PlayerInteractEvent event) { .send(); } } + + private static String getItemName(Player player) { + ItemStack itemStack = player.getInventory().getItemInMainHand(); + ItemMeta itemMeta = itemStack.getItemMeta(); + + if (itemMeta != null && itemMeta.hasDisplayName()) { + return itemMeta.getDisplayName(); + } + + return itemStack.getType().name(); + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java index 1c175e6e5..e8738a8a7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java @@ -1,5 +1,7 @@ package com.eternalcode.core.feature.randomteleport; +import com.cryptomorin.xseries.XMaterial; +import com.eternalcode.core.util.MaterialUtil; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; import java.time.Duration; @@ -62,21 +64,21 @@ public class RandomTeleportConfig extends OkaeriConfig implements RandomTeleport "# Players will never be teleported directly onto these blocks", "# Add or remove materials as needed for your server" }) - public Set unsafeBlocks = EnumSet.of( - Material.LAVA, - Material.WATER, - Material.CACTUS, - Material.FIRE, - Material.COBWEB, - Material.SWEET_BERRY_BUSH, - Material.MAGMA_BLOCK, - Material.BEDROCK, - Material.TNT, - Material.SEAGRASS, - Material.TALL_SEAGRASS, - Material.BUBBLE_COLUMN, - Material.POWDER_SNOW, - Material.WITHER_ROSE + public Set unsafeBlocks = createMaterialSet( + XMaterial.LAVA, + XMaterial.WATER, + XMaterial.CACTUS, + XMaterial.FIRE, + XMaterial.COBWEB, + XMaterial.SWEET_BERRY_BUSH, + XMaterial.MAGMA_BLOCK, + XMaterial.BEDROCK, + XMaterial.TNT, + XMaterial.SEAGRASS, + XMaterial.TALL_SEAGRASS, + XMaterial.BUBBLE_COLUMN, + XMaterial.POWDER_SNOW, + XMaterial.WITHER_ROSE ); @Comment({ @@ -85,42 +87,42 @@ public class RandomTeleportConfig extends OkaeriConfig implements RandomTeleport "# Players can safely spawn in these blocks or pass through them", "# Includes air, grass, flowers, and other non-solid blocks" }) - public Set airBlocks = EnumSet.of( - Material.AIR, - Material.CAVE_AIR, - Material.SHORT_GRASS, - Material.TALL_GRASS, - Material.VINE, - Material.STRUCTURE_VOID, - Material.DEAD_BUSH, - Material.DANDELION, - Material.POPPY, - Material.BLUE_ORCHID, - Material.ALLIUM, - Material.AZURE_BLUET, - Material.RED_TULIP, - Material.ORANGE_TULIP, - Material.WHITE_TULIP, - Material.PINK_TULIP, - Material.OXEYE_DAISY, - Material.CORNFLOWER, - Material.LILY_OF_THE_VALLEY, - Material.SUNFLOWER, - Material.LILAC, - Material.ROSE_BUSH, - Material.PEONY, - Material.LARGE_FERN, - Material.RAIL, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.ACTIVATOR_RAIL, - Material.REDSTONE_WIRE, - Material.WALL_TORCH, - Material.COMPARATOR, - Material.REPEATER, - Material.LEVER, - Material.STRING, - Material.SNOW + public Set airBlocks = createMaterialSet( + XMaterial.AIR, + XMaterial.CAVE_AIR, + XMaterial.SHORT_GRASS, + XMaterial.TALL_GRASS, + XMaterial.VINE, + XMaterial.STRUCTURE_VOID, + XMaterial.DEAD_BUSH, + XMaterial.DANDELION, + XMaterial.POPPY, + XMaterial.BLUE_ORCHID, + XMaterial.ALLIUM, + XMaterial.AZURE_BLUET, + XMaterial.RED_TULIP, + XMaterial.ORANGE_TULIP, + XMaterial.WHITE_TULIP, + XMaterial.PINK_TULIP, + XMaterial.OXEYE_DAISY, + XMaterial.CORNFLOWER, + XMaterial.LILY_OF_THE_VALLEY, + XMaterial.SUNFLOWER, + XMaterial.LILAC, + XMaterial.ROSE_BUSH, + XMaterial.PEONY, + XMaterial.LARGE_FERN, + XMaterial.RAIL, + XMaterial.POWERED_RAIL, + XMaterial.DETECTOR_RAIL, + XMaterial.ACTIVATOR_RAIL, + XMaterial.REDSTONE_WIRE, + XMaterial.WALL_TORCH, + XMaterial.COMPARATOR, + XMaterial.REPEATER, + XMaterial.LEVER, + XMaterial.STRING, + XMaterial.SNOW ); @Comment({ @@ -132,4 +134,14 @@ public class RandomTeleportConfig extends OkaeriConfig implements RandomTeleport }) public RandomTeleportHeightRange heightRange = RandomTeleportHeightRange.of(60, 160); + private static Set createMaterialSet(XMaterial firstMaterial, XMaterial... otherMaterials) { + EnumSet materials = EnumSet.of(MaterialUtil.parseRequired(firstMaterial)); + + for (XMaterial material : otherMaterials) { + materials.add(MaterialUtil.parseRequired(material)); + } + + return materials; + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/skull/SkullCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/skull/SkullCommand.java index e0421043d..d22e6e908 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/skull/SkullCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/skull/SkullCommand.java @@ -1,8 +1,10 @@ package com.eternalcode.core.feature.skull; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; @@ -19,6 +21,8 @@ @Permission("eternalcore.skull") class SkullCommand { + private static final Material PLAYER_HEAD = MaterialUtil.parseRequired(XMaterial.PLAYER_HEAD); + private final NoticeService noticeService; private final SkullAPI skullAPI; @@ -39,7 +43,7 @@ void execute(@Sender Player sender, @Arg(SkullNicknameArgument.KEY) String name) ItemStack mainHand = sender.getInventory().getItemInMainHand(); - if (mainHand.getType() == Material.PLAYER_HEAD) { + if (mainHand.getType() == PLAYER_HEAD) { mainHand.setItemMeta(namedSkull.getItemMeta()); } else { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/sleep/PhantomSpawnController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/sleep/PhantomSpawnController.java index 118c76a21..02fa0d644 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/sleep/PhantomSpawnController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/sleep/PhantomSpawnController.java @@ -1,14 +1,11 @@ package com.eternalcode.core.feature.sleep; import com.eternalcode.annotations.scan.permission.PermissionDocs; -import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Controller; -import com.eternalcode.paper.phantom.PhantomEventInitializer; -import com.eternalcode.paper.phantom.PhantomSpawnAttemptEvent; +import com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; @Controller @PermissionDocs( @@ -18,17 +15,14 @@ ) class PhantomSpawnController implements Listener { - @Inject - PhantomSpawnController(Plugin plugin) { - new PhantomEventInitializer(plugin).initialize(); - } - @EventHandler - void onPhantomSpawnAttempt(PhantomSpawnAttemptEvent event) { - if (event.getEntity() instanceof Player player) { - if (player.hasPermission("eternalcore.sleep.noinsomnia")) { - event.setCancelled(true); - } + void onPhantomSpawnAttempt(PhantomPreSpawnEvent event) { + if (!(event.getSpawningEntity() instanceof Player player)) { + return; + } + + if (player.hasPermission("eternalcore.sleep.noinsomnia")) { + event.setCancelled(true); } } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java index 530fbf012..27cc9a0fa 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java @@ -47,6 +47,6 @@ void onPlayerRespawn(PlayerRespawnEvent event) { } private boolean hasRespawnPoint(Player player) { - return player.getRespawnLocation() != null; + return player.getBedSpawnLocation() != null; } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java index ec21920e9..f503e25fb 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java @@ -14,16 +14,19 @@ class VanishServiceImpl implements VanishService { private final VanishInvisibleService vanishInvisibleService; private final VanishMetaDataService vanishMetaDataService; + private final VanishCollisionService vanishCollisionService; private final EventCaller eventCaller; @Inject VanishServiceImpl( VanishInvisibleService vanishInvisibleService, VanishMetaDataService vanishMetaDataService, + VanishCollisionService vanishCollisionService, EventCaller eventCaller ) { this.vanishInvisibleService = vanishInvisibleService; this.vanishMetaDataService = vanishMetaDataService; + this.vanishCollisionService = vanishCollisionService; this.eventCaller = eventCaller; } @@ -37,6 +40,7 @@ public void enableVanish(Player player) { this.vanishInvisibleService.hidePlayer(player); this.vanishMetaDataService.addMetadata(player); + this.vanishCollisionService.disableCollision(player); } @Override @@ -49,6 +53,7 @@ public void disableVanish(Player player) { this.vanishInvisibleService.showPlayer(player); this.vanishMetaDataService.removeMetadata(player); + this.vanishCollisionService.restoreCollision(player); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/OpenSilentController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/OpenSilentController.java index 46dbe0ea6..9fdf150f2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/OpenSilentController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/OpenSilentController.java @@ -1,11 +1,13 @@ package com.eternalcode.core.feature.vanish.controller; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.commons.scheduler.Scheduler; import com.eternalcode.core.feature.vanish.VanishService; import com.eternalcode.core.feature.vanish.VanishSettings; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Controller; import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.util.MaterialUtil; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.RemovalCause; @@ -49,6 +51,10 @@ class OpenSilentController implements Listener { private static final Vector ZERO_VELOCITY = new Vector(0.0, 0.0, 0.0); private static final int TICK_DURATION_MILLIS = 50; private static final int CACHE_EXPIRE_SECONDS = 5; + private static final Material CHEST = MaterialUtil.parseRequired(XMaterial.CHEST); + private static final Material TRAPPED_CHEST = MaterialUtil.parseRequired(XMaterial.TRAPPED_CHEST); + private static final Material BARREL = MaterialUtil.parseRequired(XMaterial.BARREL); + private static final Material ENDER_CHEST = MaterialUtil.parseRequired(XMaterial.ENDER_CHEST); private final NoticeService noticeService; private final VanishService vanishService; @@ -103,7 +109,7 @@ void handlePlayerInteract(PlayerInteractEvent event) { Block clickedBlock = event.getClickedBlock(); Material type = clickedBlock.getType(); - if (type == Material.ENDER_CHEST) { + if (type == ENDER_CHEST) { event.setCancelled(true); player.openInventory(player.getEnderChest()); return; @@ -195,10 +201,11 @@ private void restorePlayer(UUID playerId) { } private boolean isContainerType(Material type) { - return switch (type) { - case CHEST, TRAPPED_CHEST, BARREL, ENDER_CHEST -> true; - default -> Tag.SHULKER_BOXES.isTagged(type); - }; + return type == CHEST + || type == TRAPPED_CHEST + || type == BARREL + || type == ENDER_CHEST + || Tag.SHULKER_BOXES.isTagged(type); } private record PlayerRestoreListener(Scheduler scheduler) implements RemovalListener { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfig.java index bd83d488a..07c4da47c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfig.java @@ -1,6 +1,8 @@ package com.eternalcode.core.feature.warp; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.commons.bukkit.position.Position; +import com.eternalcode.core.util.MaterialUtil; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; import lombok.AllArgsConstructor; @@ -33,7 +35,7 @@ public class WarpConfig extends OkaeriConfig implements WarpSettings { public String itemLore = "&7Click to teleport!"; - public Material itemMaterial = Material.PLAYER_HEAD; + public Material itemMaterial = MaterialUtil.parseRequired(XMaterial.PLAYER_HEAD); @Comment("# Texture of the item (only for PLAYER_HEAD material)") public String itemTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzk4ODVlODIzZmYxNTkyNjdjYmU4MDkwOTNlMzNhNDc2ZTI3NDliNjU5OGNhNGEyYTgxZWU2OTczODAzZmI2NiJ9fX0="; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventoryItem.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventoryItem.java index 17d6fd9f6..26903519c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventoryItem.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventoryItem.java @@ -1,9 +1,10 @@ package com.eternalcode.core.feature.warp; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.core.configuration.contextual.ConfigItem; +import com.eternalcode.core.util.MaterialUtil; import java.io.Serializable; import java.util.Collections; -import org.bukkit.Material; public class WarpInventoryItem implements Serializable { @@ -15,7 +16,7 @@ public WarpInventoryItem() { this.warpItem = ConfigItem.builder() .withName("&6Warp: &fdefault") .withLore(Collections.singletonList("&7Click to teleport to warp")) - .withMaterial(Material.PLAYER_HEAD) + .withMaterial(MaterialUtil.parseRequired(XMaterial.PLAYER_HEAD)) .withTexture( "ewogICJ0aW1lc3RhbXAiIDogMTY2NDAzNTM1MjUyNCwKICAicHJvZmlsZUlkIiA6ICJjYjIzZWZhOWY1N2U0ZTQyOGE0MDU2OTM4NDlhODAxZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJWMUdHTyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82MThhZjFiODNhZGZmNzM1MDA3ZmVkMjMwMTkxOWMwYjYzZWJmZTgwZTVkNjFiYTkzN2M5MmViMWVhY2Y2ZDI4IgogICAgfQogIH0KfQ==") .withSlot(10) @@ -55,7 +56,7 @@ public static class Builder { private ConfigItem warpItem = ConfigItem.builder() .withName("&6Warp: &fdefault") .withLore(Collections.singletonList("&7Click to teleport to warp")) - .withMaterial(Material.PLAYER_HEAD) + .withMaterial(MaterialUtil.parseRequired(XMaterial.PLAYER_HEAD)) .withTexture( "ewogICJ0aW1lc3RhbXAiIDogMTY2NDAzNTM1MjUyNCwKICAicHJvZmlsZUlkIiA6ICJjYjIzZWZhOWY1N2U0ZTQyOGE0MDU2OTM4NDlhODAxZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJWMUdHTyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82MThhZjFiODNhZGZmNzM1MDA3ZmVkMjMwMTkxOWMwYjYzZWJmZTgwZTVkNjFiYTkzN2M5MmViMWVhY2Y2ZDI4IgogICAgfQogIH0KfQ==") .withSlot(10) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventory.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventory.java index 7f19752fc..2ed8fe91b 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventory.java @@ -1,5 +1,6 @@ package com.eternalcode.core.feature.warp.inventory; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.commons.adventure.AdventureUtil; import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.commons.scheduler.Scheduler; @@ -11,6 +12,7 @@ import com.eternalcode.core.feature.warp.WarpTeleportService; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; +import com.eternalcode.core.util.MaterialUtil; import dev.triumphteam.gui.builder.item.BaseItemBuilder; import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.Gui; @@ -40,6 +42,7 @@ public class WarpInventory { private static final int BORDER_ROW_COUNT = 2; private static final int UGLY_BORDER_ROW_COUNT = 1; + private static final Material PLAYER_HEAD = MaterialUtil.parseRequired(XMaterial.PLAYER_HEAD); private final WarpService warpService; private final Server server; @@ -57,7 +60,8 @@ public WarpInventory( WarpTeleportService warpTeleportService, WarpSettings warpSettings, Scheduler scheduler, - WarpInventoryConfigService warpInventoryConfigService) { + WarpInventoryConfigService warpInventoryConfigService + ) { this.warpService = warpService; this.server = server; this.miniMessage = miniMessage; @@ -209,7 +213,7 @@ private BaseItemBuilder createItem(ConfigItem item) { .map(entry -> AdventureUtil.resetItalic(this.miniMessage.deserialize(entry))) .toList(); - if (item.material() == Material.PLAYER_HEAD && !item.texture().isEmpty()) { + if (item.material() == PLAYER_HEAD && !item.texture().isEmpty()) { return ItemBuilder.skull() .name(name) .lore(lore) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventoryConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventoryConfig.java index a0284a409..666d7ff92 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventoryConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/inventory/WarpInventoryConfig.java @@ -1,9 +1,11 @@ package com.eternalcode.core.feature.warp.inventory; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.core.configuration.AbstractConfigurationFile; import com.eternalcode.core.configuration.contextual.ConfigItem; import com.eternalcode.core.feature.warp.WarpInventoryItem; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; +import com.eternalcode.core.util.MaterialUtil; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; import java.io.File; @@ -68,7 +70,7 @@ public static class BorderSection extends OkaeriConfig { public boolean enabled = true; @Comment("# Material for border items") - public Material material = Material.GRAY_STAINED_GLASS_PANE; + public Material material = MaterialUtil.parseRequired(XMaterial.GRAY_STAINED_GLASS_PANE); @Comment("# How to fill the border") public FillType fillType = FillType.BORDER; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/LiteCommandsSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/LiteCommandsSetup.java index fd35d26ac..eeba69ed9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/LiteCommandsSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/LiteCommandsSetup.java @@ -9,13 +9,10 @@ import com.eternalcode.core.publish.event.EternalShutdownEvent; import dev.rollczi.litecommands.LiteCommands; import dev.rollczi.litecommands.LiteCommandsBuilder; -import dev.rollczi.litecommands.adventure.bukkit.platform.LiteAdventurePlatformExtension; import dev.rollczi.litecommands.annotations.LiteCommandsAnnotations; import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; import dev.rollczi.litecommands.folia.FoliaExtension; -import net.kyori.adventure.platform.AudienceProvider; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; @@ -27,8 +24,6 @@ class LiteCommandsSetup { public LiteCommandsBuilder liteCommandsBuilder( Plugin plugin, Server server, - AudienceProvider audiencesProvider, - MiniMessage miniMessage, NoticeService noticeService, LiteCommandsAnnotations liteCommandsAnnotations ) { @@ -44,9 +39,6 @@ class LiteCommandsSetup { .sender(invocation.sender()) .notice(translation -> translation.argument().incorrectLocation()) .placeholder("{LOCATION}", input) - ) - .extension(new LiteAdventurePlatformExtension(audiencesProvider), extension -> extension - .serializer(miniMessage) ); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/MaterialArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/MaterialArgument.java index b848223a6..16f27fa5f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/MaterialArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/MaterialArgument.java @@ -1,9 +1,11 @@ package com.eternalcode.core.litecommand.argument; +import com.cryptomorin.xseries.XMaterial; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.lite.LiteArgument; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; +import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.ParseResult; import dev.rollczi.litecommands.invocation.Invocation; @@ -16,8 +18,8 @@ @LiteArgument(type = Material.class) public class MaterialArgument extends AbstractViewerArgument { - private static final SuggestionResult CACHED_SUGGESTIONS = Arrays.stream(Material.values()) - .map(Material::name) + private static final SuggestionResult CACHED_SUGGESTIONS = Arrays.stream(XMaterial.values()) + .map(XMaterial::name) .map(String::toLowerCase) .collect(SuggestionResult.collector()); @@ -28,11 +30,9 @@ public class MaterialArgument extends AbstractViewerArgument { @Override public ParseResult parse(Invocation invocation, String argument, Translation translation) { - Material material = Material.matchMaterial(argument); - if (material == null) { - return ParseResult.failure(translation.argument().noMaterial()); - } - return ParseResult.success(material); + return MaterialUtil.parse(argument) + .map(ParseResult::success) + .orElseGet(() -> ParseResult.failure(translation.argument().noMaterial())); } @Override 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 fbb3e0f32..847ff7541 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 @@ -17,11 +17,12 @@ import com.eternalcode.multification.shared.Replacer; import com.eternalcode.multification.translation.TranslationProvider; import com.eternalcode.multification.viewer.ViewerProvider; -import net.kyori.adventure.platform.AudienceProvider; +import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.ComponentSerializer; import org.bukkit.Server; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @Service @@ -31,7 +32,6 @@ public class NoticeService extends Multification { private final Scheduler scheduler; private final Server server; - private final AudienceProvider audienceProvider; private final TranslationManager translationManager; private final PlaceholderRegistry registry; private final MiniMessage miniMessage; @@ -43,7 +43,6 @@ public NoticeService( UserManager userManager, Scheduler scheduler, Server server, - AudienceProvider audienceProvider, TranslationManager translationManager, PlaceholderRegistry registry, MiniMessage miniMessage, @@ -52,7 +51,6 @@ public NoticeService( this.userManager = userManager; this.scheduler = scheduler; this.server = server; - this.audienceProvider = audienceProvider; this.translationManager = translationManager; this.registry = registry; this.miniMessage = miniMessage; @@ -73,10 +71,16 @@ public NoticeService( public @NotNull AudienceConverter audienceConverter() { return viewer -> { if (viewer.isConsole()) { - return this.audienceProvider.console(); + return this.server.getConsoleSender(); } - return this.audienceProvider.player(viewer.getUniqueId()); + Player player = this.server.getPlayer(viewer.getUniqueId()); + + if (player == null) { + return Audience.empty(); + } + + return player; }; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java b/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java index 45aff6235..e5333c1ac 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java @@ -1,6 +1,9 @@ package com.eternalcode.core.util; +import com.cryptomorin.xseries.XMaterial; import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import org.bukkit.Material; @@ -18,6 +21,14 @@ public static String format(Material material) { return capitalize(formattedName); } + public static Material parseRequired(XMaterial material) { + return Objects.requireNonNull(material.get(), "Material " + material.name() + " is not supported by this server version"); + } + + public static Optional parse(String materialName) { + return XMaterial.matchXMaterial(materialName).map(XMaterial::get); + } + private static String capitalize(String text) { if (text == null || text.isEmpty()) { return text; diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/test/MockAudienceProvider.java b/eternalcore-core/src/test/java/com/eternalcode/core/test/MockAudienceProvider.java deleted file mode 100644 index 506021af3..000000000 --- a/eternalcore-core/src/test/java/com/eternalcode/core/test/MockAudienceProvider.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.eternalcode.core.test; - -import com.eternalcode.core.viewer.Viewer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Locale; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.platform.facet.Facet; -import net.kyori.adventure.platform.facet.FacetAudience; -import net.kyori.adventure.platform.facet.FacetAudienceProvider; -import net.kyori.adventure.platform.facet.FacetBase; -import net.kyori.adventure.platform.facet.FacetComponentFlattener; -import net.kyori.adventure.platform.facet.FacetPointers; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.flattener.ComponentFlattener; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.translation.GlobalTranslator; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import panda.std.Blank; - -public class MockAudienceProvider extends FacetAudienceProvider { - - private static final Collection> TRANSLATORS = Facet.of(); - private static final ComponentFlattener FLATTENER = FacetComponentFlattener.get(Blank.BLANK, TRANSLATORS); - - public MockAudienceProvider() { - super(GlobalTranslator.renderer().mapContext(ptr -> ptr.getOrDefault(Identity.LOCALE, Locale.US))); - } - - public MockAudience join(Viewer viewer) { - this.addViewer(viewer); - - return this.viewers.get(viewer); - } - - public void leave(Viewer viewer) { - this.removeViewer(viewer); - } - - @Override - protected @NotNull MockAudienceProvider.MockAudience createAudience(@NotNull Collection viewers) { - return new MockAudienceProvider.MockAudience(new MockAudienceProvider.Chat(), viewers); - } - - @Override - public @NotNull ComponentFlattener flattener() { - return FLATTENER; - } - - static final class ViewerPointers extends FacetBase implements Facet.Pointers { - ViewerPointers() { - super(Viewer.class); - } - - @Override - public void contributePointers(Viewer viewer, net.kyori.adventure.pointer.Pointers.Builder builder) { - if (viewer.isConsole()) { - builder.withStatic(FacetPointers.TYPE, FacetPointers.Type.CONSOLE); - } - else { - builder.withDynamic(Identity.UUID, viewer::getUniqueId); - builder.withStatic(FacetPointers.TYPE, FacetPointers.Type.PLAYER); - } - } - } - - static class Chat implements Facet.Chat { - - private final List messages = new ArrayList<>(); - - @Override - public void sendMessage( - @NotNull Viewer viewer, - @NotNull Identity source, - @NotNull String message, - @NotNull Object type) { - messages.add(message); - } - - @Override - public @Nullable String createMessage(@NotNull Viewer viewer, @NotNull Component message) { - return MiniMessage.miniMessage().serialize(message); - } - } - - public class MockAudience extends FacetAudience { - - private final Chat chat; - - private MockAudience(Chat chat, Collection viewers) { - super( - MockAudienceProvider.this, - viewers, - List.of(chat), - List.of(), - List.of(), - List.of(), - List.of(), - List.of(), - List.of(), - List.of(), - List.of(new ViewerPointers()) - ); - - this.chat = chat; - } - - public void assertMessage(String message) { - if (!this.chat.messages.contains(message)) { - throw new AssertionError("Expected message '" + message + "' but got " + this.chat.messages); - } - } - } -} diff --git a/eternalcore-docs-generate/build.gradle.kts b/eternalcore-docs-generate/build.gradle.kts index 5c3a76fb4..fa11292d2 100644 --- a/eternalcore-docs-generate/build.gradle.kts +++ b/eternalcore-docs-generate/build.gradle.kts @@ -11,10 +11,8 @@ dependencies { implementation("com.google.code.gson:gson:${Versions.GSON}") implementation("dev.rollczi:litecommands-framework:${Versions.LITE_COMMANDS}") implementation("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") - implementation("dev.rollczi:litecommands-adventure-platform:${Versions.LITE_COMMANDS}") - runtimeOnly("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") - runtimeOnly("net.kyori:adventure-platform-bukkit:${Versions.ADVENTURE_PLATFORM}") + runtimeOnly("io.papermc.paper:paper-api:${Versions.PAPER_API}") runtimeOnly("net.kyori:adventure-text-minimessage:${Versions.ADVENTURE_TEXT_MINIMESSAGE}") runtimeOnly("io.papermc:paperlib:${Versions.PAPERLIB}") runtimeOnly("com.j256.ormlite:ormlite-jdbc:${Versions.ORMLITE}") diff --git a/eternalcore-paper/build.gradle.kts b/eternalcore-paper/build.gradle.kts deleted file mode 100644 index 9be888d51..000000000 --- a/eternalcore-paper/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - `eternalcode-java` - `eternalcore-repositories` -} - -dependencies { - compileOnly("io.papermc.paper:paper-api:${Versions.PAPER_API}") - compileOnly("io.papermc:paperlib:${Versions.PAPERLIB}") -} diff --git a/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperContainer.java b/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperContainer.java deleted file mode 100644 index c5d99ff66..000000000 --- a/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperContainer.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.eternalcode.paper; - -import org.bukkit.entity.Player; - -import java.util.function.Consumer; - -public enum PaperContainer { - - ANVIL("Anvil", player -> player.openAnvil(null, true)), - STONE_CUTTER("Stone Cutter", player -> player.openStonecutter(null, true)), - GRINDSTONE("Grindstone", player -> player.openGrindstone(null, true)), - CARTOGRAPHY_TABLE("Cartography Table", player -> player.openCartographyTable(null, true)), - LOOM("Loom", player -> player.openLoom(null, true)), - SMITHING_TABLE("Smithing Table", player -> player.openSmithingTable(null, true)); - - private final PaperFeature feature; - - PaperContainer(String name, Consumer action) { - this.feature = new PaperFeature(action, name) { - }; - } - - public void open(Player player) { - feature.execute(player); - } -} diff --git a/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperFeature.java b/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperFeature.java deleted file mode 100644 index c14bd611c..000000000 --- a/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperFeature.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.eternalcode.paper; - -import io.papermc.lib.PaperLib; -import io.papermc.lib.environments.Environment; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - -import java.util.function.Consumer; -import java.util.logging.Logger; - -public abstract class PaperFeature { - - private static final Environment ENVIRONMENT = PaperLib.getEnvironment(); - private static final Logger LOGGER = Logger.getLogger("EternalCore-Paper"); - - protected final Consumer action; - protected final String featureName; - - protected PaperFeature(Consumer action, String featureName) { - this.action = action; - this.featureName = featureName; - } - - @SuppressWarnings("deprecation") - public final void execute(Player player) { - if (!ENVIRONMENT.isPaper()) { - player.sendMessage(ChatColor.RED + "This feature is not supported on this server. Please contact the server administrator and check console!"); - LOGGER.warning("Feature '" + featureName + "' is only available on Paper or its 1.17.x+ forks"); - return; - } - - this.action.accept(player); - } -} diff --git a/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperOverlay.java b/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperOverlay.java deleted file mode 100644 index 83b5ea2ee..000000000 --- a/eternalcore-paper/src/main/java/com/eternalcode/paper/PaperOverlay.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.eternalcode.paper; - -import org.bukkit.entity.Player; - -import java.util.function.Consumer; - -public enum PaperOverlay { - - ELDER_GUARDIAN("Elder Guardian", player -> player.showElderGuardian(false)), - ELDER_GUARDIAN_SILENT("Elder Guardian Silent", player -> player.showElderGuardian(true)), - END_SCREEN("End Screen", player -> player.showWinScreen()); - - private final PaperFeature feature; - - PaperOverlay(String name, Consumer action) { - this.feature = new PaperFeature(action, name) { - }; - } - - public void show(Player player) { - this.feature.execute(player); - } -} diff --git a/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventInitializer.java b/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventInitializer.java deleted file mode 100644 index af78a1680..000000000 --- a/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventInitializer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.eternalcode.paper.phantom; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -public class PhantomEventInitializer { - - private final Plugin plugin; - - public PhantomEventInitializer(Plugin plugin) { - this.plugin = plugin; - } - - public void initialize() { - Bukkit.getPluginManager().registerEvents(new PhantomEventWrapper(), this.plugin); - } -} diff --git a/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventWrapper.java b/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventWrapper.java deleted file mode 100644 index 78e957414..000000000 --- a/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomEventWrapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.eternalcode.paper.phantom; - -import com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; - -class PhantomEventWrapper implements Listener { - - @EventHandler(priority = EventPriority.HIGH) - void onPhantomSpawn(PhantomPreSpawnEvent event) { - PhantomSpawnAttemptEvent attemptEvent = new PhantomSpawnAttemptEvent( - event.getSpawningEntity(), - event.getSpawnLocation(), - event.getReason() - ); - - Bukkit.getPluginManager().callEvent(attemptEvent); - - if (attemptEvent.isCancelled()) { - event.setCancelled(true); - } - } -} diff --git a/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomSpawnAttemptEvent.java b/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomSpawnAttemptEvent.java deleted file mode 100644 index 30e5b17d4..000000000 --- a/eternalcore-paper/src/main/java/com/eternalcode/paper/phantom/PhantomSpawnAttemptEvent.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.eternalcode.paper.phantom; - -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -import org.jetbrains.annotations.NotNull; - -/** - * Internal event of {@link com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent} - */ -public class PhantomSpawnAttemptEvent extends Event implements Cancellable { - - private static final HandlerList HANDLER_LIST = new HandlerList(); - - private final Entity entity; - private final Location location; - private final SpawnReason spawnReason; - private boolean cancelled = false; - - public PhantomSpawnAttemptEvent(Entity entity, Location location, SpawnReason spawnReason) { - this.entity = entity; - this.location = location; - this.spawnReason = spawnReason; - } - - public Entity getEntity() { - return this.entity; - } - - public Location getLocation() { - return this.location; - } - - public SpawnReason getSpawnReason() { - return this.spawnReason; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancelled) { - this.cancelled = cancelled; - } - - @Override - public @NotNull HandlerList getHandlers() { - return HANDLER_LIST; - } - - public static HandlerList getHandlerList() { - return HANDLER_LIST; - } -} diff --git a/eternalcore-plugin/build.gradle.kts b/eternalcore-plugin/build.gradle.kts index eb9e70848..e1991e995 100644 --- a/eternalcore-plugin/build.gradle.kts +++ b/eternalcore-plugin/build.gradle.kts @@ -1,3 +1,6 @@ +import org.gradle.jvm.toolchain.JavaLanguageVersion +import org.gradle.jvm.toolchain.JavaToolchainService + plugins { `eternalcode-java` `eternalcore-repositories` @@ -28,7 +31,7 @@ eternalShadowCompiler { } shadowJar { - archiveFileName.set("EternalCore v${project.version} (MC 1.19.x-1.21.x).jar") + archiveFileName.set("EternalCore v${project.version}.jar") exclude( "META-INF/**", @@ -41,8 +44,14 @@ dependencies { } tasks { + val javaToolchains = extensions.getByType() + runServer { - minecraftVersion("1.21.11") + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(25)) + }) + + minecraftVersion("26.1.2") downloadPlugins.modrinth("luckperms", "v${Versions.LUCKPERMS}-bukkit") } } diff --git a/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java b/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java index 1a38db152..0dab85ac8 100644 --- a/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java +++ b/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java @@ -5,9 +5,15 @@ public class DependencyCollector { + private static final String ADVENTURE_GROUP_ID = "net.kyori"; + private final LinkedHashMap fullScannedDependencies = new LinkedHashMap<>(); public synchronized boolean hasScannedDependency(Dependency dependency) { + if (isAdventureDependency(dependency)) { + return true; + } + Dependency scanned = this.fullScannedDependencies.get(dependency.getGroupArtifactId()); if (scanned == null) { return false; @@ -21,6 +27,10 @@ public synchronized boolean hasScannedDependency(Dependency dependency) { } public synchronized Dependency addScannedDependency(Dependency dependency) { + if (isAdventureDependency(dependency)) { + return dependency; + } + Dependency current = this.fullScannedDependencies.get(dependency.getGroupArtifactId()); if (current == null) { @@ -50,4 +60,8 @@ public synchronized Collection getScannedDependencies() { .toList(); } + private static boolean isAdventureDependency(Dependency dependency) { + return ADVENTURE_GROUP_ID.equals(dependency.getGroupId()); + } + } diff --git a/gradle.properties b/gradle.properties index bfe65824f..65687237c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ org.gradle.configuration-cache=true org.gradle.configuration-cache.parallel=true # Platforms -paperVersion=1.19.4,1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11 +paperVersion=1.19.3,1.19.4,1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11 diff --git a/settings.gradle.kts b/settings.gradle.kts index 9969928a8..e14772028 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,8 +2,7 @@ rootProject.name = "EternalCore" include(":eternalcore-api") include(":eternalcore-core") -include(":eternalcore-paper") include(":eternalcore-plugin") include(":eternalcore-docs-api") include(":eternalcore-docs-generate") -include(":eternalcore-api-example") \ No newline at end of file +include(":eternalcore-api-example") From b8badeb210b41c4acabf4781fff4ce1f5a5fec94 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 7 Jun 2026 20:07:43 +0200 Subject: [PATCH 2/8] Remove PaperLib and replace its functionality with Bukkit API equivalents. --- buildSrc/src/main/kotlin/Versions.kt | 1 - eternalcore-core/build.gradle.kts | 6 --- .../core/EternalCoreEnvironment.java | 22 ++------- .../compatibility/CompatibilityService.java | 27 +++++++++-- .../feature/container/PaperContainer.java | 46 +++++++++++++++++++ .../core/feature/fun/PaperOverlay.java | 28 +++++++++++ .../home/homeadmin/HomeAdminCommand.java | 3 +- .../RandomTeleportSafeLocationService.java | 3 +- .../RandomTeleportServiceImpl.java | 5 +- .../core/feature/spawn/SpawnServiceImpl.java | 3 +- .../spawn/SpawnTeleportJoinController.java | 3 +- .../feature/teleport/TeleportServiceImpl.java | 3 +- .../TeleportToRandomPlayerCommand.java | 5 +- .../vanish/VanishCollisionService.java | 33 +++++++++++++ eternalcore-docs-generate/build.gradle.kts | 1 - 15 files changed, 143 insertions(+), 46 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/container/PaperContainer.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/PaperOverlay.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 1acf59a3a..b277e85f7 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -11,7 +11,6 @@ object Versions { const val DYNMAP_API = "3.7-beta-6" const val LOMBOK = "1.18.46" - const val PAPERLIB = "1.0.8" const val ADVENTURE_TEXT_MINIMESSAGE = "4.26.1" const val OKAERI_CONFIGS = "6.0.0-beta.27" diff --git a/eternalcore-core/build.gradle.kts b/eternalcore-core/build.gradle.kts index a862b94a6..d77a85442 100644 --- a/eternalcore-core/build.gradle.kts +++ b/eternalcore-core/build.gradle.kts @@ -36,12 +36,6 @@ configurations.configureEach { } eternalShadow { - // Paper and Adventure libraries - library("io.papermc:paperlib:${Versions.PAPERLIB}") - libraryRelocate( - "io.papermc.lib", - ) - // configuration library("eu.okaeri:okaeri-configs-core:${Versions.OKAERI_CONFIGS}") library("eu.okaeri:okaeri-configs-yaml-snakeyaml:${Versions.OKAERI_CONFIGS}") diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCoreEnvironment.java b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCoreEnvironment.java index f743f53e4..790c57b77 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCoreEnvironment.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCoreEnvironment.java @@ -1,11 +1,9 @@ package com.eternalcode.core; import com.google.common.base.Stopwatch; -import io.papermc.lib.PaperLib; -import io.papermc.lib.environments.Environment; - import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import org.bukkit.Bukkit; class EternalCoreEnvironment { @@ -23,22 +21,8 @@ void initialize() { } private void checkSoftware() { - Environment environment = PaperLib.getEnvironment(); - - if (!environment.isSpigot()) { - this.logger.warning("Your server is running on unsupported software, please use Spigot/Paper or their other 1.20+ forks"); - this.logger.warning("We recommend using Paper, download it from https://papermc.io/downloads"); - this.logger.warning("WARNING: Supported Minecraft versions are 1.17-1.20x"); - return; - } - - if (!environment.isVersion(17)) { - this.logger.warning("EternalCore no longer supports your version, be aware that there may be bugs!"); - return; - } - - this.logger.info("Your server is running on supported software, congratulations!"); - this.logger.info("Server version: " + environment.getMinecraftVersion()); + this.logger.info("Your server is running on supported Paper API software"); + this.logger.info("Server version: " + Bukkit.getBukkitVersion()); } } 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 index 9c3c63b26..5bbb66d25 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java @@ -1,9 +1,13 @@ package com.eternalcode.core.compatibility; -import io.papermc.lib.PaperLib; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.bukkit.Bukkit; public class CompatibilityService { + private static final Pattern MINECRAFT_VERSION_PATTERN = Pattern.compile("^1\\.(\\d+)(?:\\.(\\d+))?.*"); + public boolean isCompatible(Class type) { Compatibility compatibility = type.getAnnotation(Compatibility.class); if (compatibility == null) { @@ -13,12 +17,26 @@ public boolean isCompatible(Class type) { Version from = compatibility.from(); Version to = compatibility.to(); - int minor = PaperLib.getMinecraftVersion(); - int patch = PaperLib.getMinecraftPatchVersion(); + MinecraftVersion minecraftVersion = parseMinecraftVersion(Bukkit.getBukkitVersion()); + int minor = minecraftVersion.minor(); + int patch = minecraftVersion.patch(); return isCompatibleFrom(from, minor, patch) && isCompatibleTo(to, minor, patch); } + private static MinecraftVersion parseMinecraftVersion(String bukkitVersion) { + Matcher matcher = MINECRAFT_VERSION_PATTERN.matcher(bukkitVersion); + if (!matcher.matches()) { + return new MinecraftVersion(0, 0); + } + + int minor = Integer.parseInt(matcher.group(1)); + String patchGroup = matcher.group(2); + int patch = patchGroup == null ? 0 : Integer.parseInt(patchGroup); + + return new MinecraftVersion(minor, patch); + } + private boolean isCompatibleTo(Version to, int minor, int patch) { return minor < to.minor() || minor == to.minor() && patch <= to.patch(); } @@ -27,5 +45,8 @@ private boolean isCompatibleFrom(Version from, int minor, int patch) { return minor > from.minor() || minor == from.minor() && patch >= from.patch(); } + private record MinecraftVersion(int minor, int patch) { + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/PaperContainer.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/PaperContainer.java new file mode 100644 index 000000000..b90af0b28 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/container/PaperContainer.java @@ -0,0 +1,46 @@ +package com.eternalcode.core.feature.container; + +import org.bukkit.entity.Player; + +public enum PaperContainer { + + ANVIL { + @Override + public void open(Player player) { + player.openAnvil(null, true); + } + }, + STONE_CUTTER { + @Override + public void open(Player player) { + player.openStonecutter(null, true); + } + }, + GRINDSTONE { + @Override + public void open(Player player) { + player.openGrindstone(null, true); + } + }, + CARTOGRAPHY_TABLE { + @Override + public void open(Player player) { + player.openCartographyTable(null, true); + } + }, + LOOM { + @Override + public void open(Player player) { + player.openLoom(null, true); + } + }, + SMITHING_TABLE { + @Override + public void open(Player player) { + player.openSmithingTable(null, true); + } + }; + + public abstract void open(Player player); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/PaperOverlay.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/PaperOverlay.java new file mode 100644 index 000000000..b9b92886b --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/PaperOverlay.java @@ -0,0 +1,28 @@ +package com.eternalcode.core.feature.fun; + +import org.bukkit.entity.Player; + +public enum PaperOverlay { + + ELDER_GUARDIAN { + @Override + public void show(Player player) { + player.showElderGuardian(false); + } + }, + ELDER_GUARDIAN_SILENT { + @Override + public void show(Player player) { + player.showElderGuardian(true); + } + }, + END_SCREEN { + @Override + public void show(Player player) { + player.showWinScreen(); + } + }; + + public abstract void show(Player player); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java index a4aa5dc14..1e40edf40 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java @@ -13,7 +13,6 @@ import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; -import io.papermc.lib.PaperLib; import java.util.Collection; import java.util.Optional; import java.util.UUID; @@ -94,7 +93,7 @@ void home(@Sender Player player, @Arg("player home") PlayerHomeEntry playerHomeE Home home = playerHomeEntry.home(); OfflinePlayer targetPlayer = playerHomeEntry.offlinePlayer(); - PaperLib.teleportAsync(player, home.getLocation()); + player.teleportAsync(home.getLocation()); this.noticeService.create() .notice(translation -> translation.home().teleportedAsAdmin()) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSafeLocationService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSafeLocationService.java index 4f21e5b1b..e5df720ff 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSafeLocationService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSafeLocationService.java @@ -6,7 +6,6 @@ import com.eternalcode.core.feature.randomteleport.event.RandomSafeLocationCandidateEvent; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import io.papermc.lib.PaperLib; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; @@ -57,7 +56,7 @@ public CompletableFuture getSafeRandomLocation(World world, RandomTele int randomX = spawnX + this.random.nextInt(radius.maxX() - radius.minX() + 1) + radius.minX(); int randomZ = spawnZ + this.random.nextInt(radius.maxZ() - radius.minZ() + 1) + radius.minZ(); - return PaperLib.getChunkAtAsync(new Location(world, randomX, 100, randomZ)).thenCompose(chunk -> { + return world.getChunkAtAsync(new Location(world, randomX, 100, randomZ)).thenCompose(chunk -> { int randomY = chunk.getWorld().getHighestBlockYAt(randomX, randomZ); if (world.getEnvironment() == World.Environment.NETHER) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportServiceImpl.java index bb358a6b3..1824b54f7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportServiceImpl.java @@ -7,7 +7,6 @@ import com.eternalcode.core.feature.randomteleport.event.RandomTeleportEvent; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import io.papermc.lib.PaperLib; import java.util.Collection; import java.util.List; import java.util.Map; @@ -51,7 +50,7 @@ public CompletableFuture teleport(Player player, World wor } return this.getSafeRandomLocation(world, this.randomTeleportSettings.teleportAttempts()) - .thenCompose(location -> PaperLib.teleportAsync(player, location).thenApply(success -> { + .thenCompose(location -> player.teleportAsync(location).thenApply(success -> { RandomTeleportResult teleportResult = new RandomTeleportResult(success, location); RandomTeleportEvent event = new RandomTeleportEvent(player, location); @@ -102,7 +101,7 @@ public CompletableFuture> teleport( ); } - return PaperLib.teleportAsync(player, location).thenApply(success -> { + return player.teleportAsync(location).thenApply(success -> { RandomTeleportResult teleportResult = new RandomTeleportResult(success, location); this.eventCaller.callEvent(new RandomTeleportEvent(player, location)); return Map.entry(player, teleportResult); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnServiceImpl.java index d2e0a9916..e6b48b95d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnServiceImpl.java @@ -6,7 +6,6 @@ import com.eternalcode.core.injector.annotations.component.Service; import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.commons.bukkit.position.PositionAdapter; -import io.papermc.lib.PaperLib; import org.bukkit.Location; import org.bukkit.entity.Player; import java.util.logging.Logger; @@ -35,7 +34,7 @@ public void teleportToSpawn(Player player) { } Location spawnLocation = PositionAdapter.convert(this.locationsConfiguration.spawn); - PaperLib.teleportAsync(player, spawnLocation); + player.teleportAsync(spawnLocation); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnTeleportJoinController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnTeleportJoinController.java index 9c218d690..92751c030 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnTeleportJoinController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnTeleportJoinController.java @@ -5,7 +5,6 @@ import com.eternalcode.core.configuration.implementation.LocationsConfiguration; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Controller; -import io.papermc.lib.PaperLib; import java.util.logging.Logger; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -63,6 +62,6 @@ void teleportToSpawn(Player player) { } Location spawnLocation = PositionAdapter.convert(spawnPosition); - PaperLib.teleportAsync(player, spawnLocation); + player.teleportAsync(spawnLocation); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/TeleportServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/TeleportServiceImpl.java index 3e1cf4917..177b4e8ce 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/TeleportServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/TeleportServiceImpl.java @@ -6,7 +6,6 @@ import com.eternalcode.core.feature.teleport.event.EternalTeleportEvent; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import io.papermc.lib.PaperLib; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -36,7 +35,7 @@ public void teleport(Player player, Location location) { Location last = player.getLocation().clone(); - PaperLib.teleportAsync(player, event.getLocation()); + player.teleportAsync(event.getLocation()); this.markLastLocation(player.getUniqueId(), last); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrandomplayer/TeleportToRandomPlayerCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrandomplayer/TeleportToRandomPlayerCommand.java index bf519c510..0a6d194e9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrandomplayer/TeleportToRandomPlayerCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrandomplayer/TeleportToRandomPlayerCommand.java @@ -8,7 +8,6 @@ import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; -import io.papermc.lib.PaperLib; import org.bukkit.entity.Player; @Command(name = "teleportorandomplayer", aliases = {"tprp"}) @@ -41,7 +40,7 @@ void execute(@Sender Player player) { } this.randomPlayerService.updateTeleportationHistory(player, targetPlayer); - PaperLib.teleportAsync(player, targetPlayer.getLocation()); + player.teleportAsync(targetPlayer.getLocation()); this.noticeService.create() .player(player.getUniqueId()) @@ -77,7 +76,7 @@ void executeWithYRange(@Sender Player player, @Arg int minY, @Arg int maxY) { } this.randomPlayerService.updateTeleportationHistory(player, targetPlayer); - PaperLib.teleportAsync(player, targetPlayer.getLocation()); + player.teleportAsync(targetPlayer.getLocation()); this.noticeService.create() .player(player.getUniqueId()) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java new file mode 100644 index 000000000..d4ad177b8 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java @@ -0,0 +1,33 @@ +package com.eternalcode.core.feature.vanish; + +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Service; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import org.bukkit.entity.Player; + +@Service +class VanishCollisionService { + + private final Map previousCollidableStates = new ConcurrentHashMap<>(); + + @Inject + VanishCollisionService() { + } + + void disableCollision(Player player) { + this.previousCollidableStates.putIfAbsent(player.getUniqueId(), player.isCollidable()); + player.setCollidable(false); + } + + void restoreCollision(Player player) { + Boolean previousCollidableState = this.previousCollidableStates.remove(player.getUniqueId()); + + if (previousCollidableState == null) { + return; + } + + player.setCollidable(previousCollidableState); + } +} diff --git a/eternalcore-docs-generate/build.gradle.kts b/eternalcore-docs-generate/build.gradle.kts index fa11292d2..65ff9978f 100644 --- a/eternalcore-docs-generate/build.gradle.kts +++ b/eternalcore-docs-generate/build.gradle.kts @@ -14,7 +14,6 @@ dependencies { runtimeOnly("io.papermc.paper:paper-api:${Versions.PAPER_API}") runtimeOnly("net.kyori:adventure-text-minimessage:${Versions.ADVENTURE_TEXT_MINIMESSAGE}") - runtimeOnly("io.papermc:paperlib:${Versions.PAPERLIB}") runtimeOnly("com.j256.ormlite:ormlite-jdbc:${Versions.ORMLITE}") runtimeOnly("com.zaxxer:HikariCP:${Versions.HIKARI_CP}") runtimeOnly("dev.rollczi:liteskullapi:${Versions.LITE_SKULL_API}") From 9b07eca8ab23a674824bbbda265adc41a4cd4ad5 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 7 Jun 2026 20:10:12 +0200 Subject: [PATCH 3/8] Update `paperVersion` in `gradle.properties` to include new versions: `26.1`, `26.1.1`, and `26.1.2`. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 65687237c..654a99224 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ org.gradle.configuration-cache=true org.gradle.configuration-cache.parallel=true # Platforms -paperVersion=1.19.3,1.19.4,1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11 +paperVersion=1.19.3,1.19.4,1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11,26.1,26.1.1,26.1.2 From 041f9b5bed12805ff85d48c634bca8b2b5677020 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 7 Jun 2026 22:20:42 +0200 Subject: [PATCH 4/8] Remove `isAdventureDependency` check and simplify dependency handling in `DependencyCollector`. --- .../loader/dependency/DependencyCollector.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java b/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java index 0dab85ac8..1a38db152 100644 --- a/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java +++ b/eternalcore-plugin/src/main/java/com/eternalcode/core/loader/dependency/DependencyCollector.java @@ -5,15 +5,9 @@ public class DependencyCollector { - private static final String ADVENTURE_GROUP_ID = "net.kyori"; - private final LinkedHashMap fullScannedDependencies = new LinkedHashMap<>(); public synchronized boolean hasScannedDependency(Dependency dependency) { - if (isAdventureDependency(dependency)) { - return true; - } - Dependency scanned = this.fullScannedDependencies.get(dependency.getGroupArtifactId()); if (scanned == null) { return false; @@ -27,10 +21,6 @@ public synchronized boolean hasScannedDependency(Dependency dependency) { } public synchronized Dependency addScannedDependency(Dependency dependency) { - if (isAdventureDependency(dependency)) { - return dependency; - } - Dependency current = this.fullScannedDependencies.get(dependency.getGroupArtifactId()); if (current == null) { @@ -60,8 +50,4 @@ public synchronized Collection getScannedDependencies() { .toList(); } - private static boolean isAdventureDependency(Dependency dependency) { - return ADVENTURE_GROUP_ID.equals(dependency.getGroupId()); - } - } From 5efe7ffc04198aa9653b482bcbbb20299eafecb1 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sun, 7 Jun 2026 22:53:08 +0200 Subject: [PATCH 5/8] Refactor CompatibilityService to improve Minecraft version parsing and compatibility checks --- .../compatibility/CompatibilityService.java | 63 ++++++++++++----- .../core/compatibility/Version.java | 1 + .../CompatibilityServiceTest.java | 68 +++++++++++++++++++ 3 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/compatibility/CompatibilityServiceTest.java 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 index 5bbb66d25..25903f94e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java @@ -6,7 +6,7 @@ public class CompatibilityService { - private static final Pattern MINECRAFT_VERSION_PATTERN = Pattern.compile("^1\\.(\\d+)(?:\\.(\\d+))?.*"); + private static final Pattern MINECRAFT_VERSION_PATTERN = Pattern.compile("^(\\d+)\\.(\\d+)(?:\\.(\\d+))?"); public boolean isCompatible(Class type) { Compatibility compatibility = type.getAnnotation(Compatibility.class); @@ -17,35 +17,66 @@ public boolean isCompatible(Class type) { Version from = compatibility.from(); Version to = compatibility.to(); - MinecraftVersion minecraftVersion = parseMinecraftVersion(Bukkit.getBukkitVersion()); - int minor = minecraftVersion.minor(); - int patch = minecraftVersion.patch(); + MinecraftVersion minecraftVersion = parseMinecraftVersion(Bukkit.getMinecraftVersion()); - return isCompatibleFrom(from, minor, patch) && isCompatibleTo(to, minor, patch); + return isCompatibleFrom(from, minecraftVersion) && isCompatibleTo(to, minecraftVersion); } - private static MinecraftVersion parseMinecraftVersion(String bukkitVersion) { + static MinecraftVersion parseMinecraftVersion(String bukkitVersion) { Matcher matcher = MINECRAFT_VERSION_PATTERN.matcher(bukkitVersion); - if (!matcher.matches()) { - return new MinecraftVersion(0, 0); + if (!matcher.find()) { + return new MinecraftVersion(0, 0, 0); } - int minor = Integer.parseInt(matcher.group(1)); - String patchGroup = matcher.group(2); + int major = Integer.parseInt(matcher.group(1)); + int minor = Integer.parseInt(matcher.group(2)); + String patchGroup = matcher.group(3); int patch = patchGroup == null ? 0 : Integer.parseInt(patchGroup); - return new MinecraftVersion(minor, patch); + return new MinecraftVersion(major, minor, patch); } - private boolean isCompatibleTo(Version to, int minor, int patch) { - return minor < to.minor() || minor == to.minor() && patch <= to.patch(); + boolean isCompatibleTo(Version to, MinecraftVersion current) { + if (current.major() < to.major()) { + return true; + } + + if (current.major() > to.major()) { + return false; + } + + if (current.minor() < to.minor()) { + return true; + } + + if (current.minor() > to.minor()) { + return false; + } + + return current.patch() <= to.patch(); } - private boolean isCompatibleFrom(Version from, int minor, int patch) { - return minor > from.minor() || minor == from.minor() && patch >= from.patch(); + boolean isCompatibleFrom(Version from, MinecraftVersion current) { + if (current.major() > from.major()) { + return true; + } + + if (current.major() < from.major()) { + return false; + } + + if (current.minor() > from.minor()) { + return true; + } + + if (current.minor() < from.minor()) { + return false; + } + + return current.patch() >= from.patch(); } - private record MinecraftVersion(int minor, int patch) { + record MinecraftVersion(int major, int minor, int 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 index 6a6d8429d..5806a9453 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java @@ -9,6 +9,7 @@ @Target(ElementType.FIELD) public @interface Version { + int major() default 1; int minor(); int patch(); diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/compatibility/CompatibilityServiceTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/compatibility/CompatibilityServiceTest.java new file mode 100644 index 000000000..4e9eb3780 --- /dev/null +++ b/eternalcore-core/src/test/java/com/eternalcode/core/compatibility/CompatibilityServiceTest.java @@ -0,0 +1,68 @@ +package com.eternalcode.core.compatibility; + +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + +class CompatibilityServiceTest { + + private final CompatibilityService compatibilityService = new CompatibilityService(); + + @Test + void testParseClassicVersion() { + CompatibilityService.MinecraftVersion version = CompatibilityService.parseMinecraftVersion("1.21.1-R0.1-SNAPSHOT"); + assertThat(version.major()).isEqualTo(1); + assertThat(version.minor()).isEqualTo(21); + assertThat(version.patch()).isEqualTo(1); + } + + @Test + void testParseNewVersion() { + CompatibilityService.MinecraftVersion version = CompatibilityService.parseMinecraftVersion("2026.1.2-R0.1-SNAPSHOT"); + assertThat(version.major()).isEqualTo(2026); + assertThat(version.minor()).isEqualTo(1); + assertThat(version.patch()).isEqualTo(2); + } + + @Test + void testParseVersionWithoutPatch() { + CompatibilityService.MinecraftVersion version = CompatibilityService.parseMinecraftVersion("1.21-R0.1-SNAPSHOT"); + assertThat(version.major()).isEqualTo(1); + assertThat(version.minor()).isEqualTo(21); + assertThat(version.patch()).isEqualTo(0); + } + + @Test + void testIsCompatibleFrom() { + CompatibilityService.MinecraftVersion current = new CompatibilityService.MinecraftVersion(2026, 1, 0); + + assertThat(this.compatibilityService.isCompatibleFrom(createVersion(1, 21, 0), current)).isTrue(); + assertThat(this.compatibilityService.isCompatibleFrom(createVersion(2026, 0, 0), current)).isTrue(); + assertThat(this.compatibilityService.isCompatibleFrom(createVersion(2026, 1, 0), current)).isTrue(); + assertThat(this.compatibilityService.isCompatibleFrom(createVersion(2026, 2, 0), current)).isFalse(); + assertThat(this.compatibilityService.isCompatibleFrom(createVersion(2027, 0, 0), current)).isFalse(); + } + + @Test + void testIsCompatibleTo() { + CompatibilityService.MinecraftVersion current = new CompatibilityService.MinecraftVersion(1, 21, 1); + + assertThat(this.compatibilityService.isCompatibleTo(createVersion(1, 21, 2), current)).isTrue(); + assertThat(this.compatibilityService.isCompatibleTo(createVersion(1, 21, 1), current)).isTrue(); + assertThat(this.compatibilityService.isCompatibleTo(createVersion(1, 21, 0), current)).isFalse(); + assertThat(this.compatibilityService.isCompatibleTo(createVersion(2026, 1, 0), current)).isTrue(); + assertThat(this.compatibilityService.isCompatibleTo(createVersion(0, 0, 0), current)).isFalse(); + } + + private Version createVersion(int major, int minor, int patch) { + return new Version() { + @Override + public int major() { return major; } + @Override + public int minor() { return minor; } + @Override + public int patch() { return patch; } + @Override + public Class annotationType() { return Version.class; } + }; + } +} From 972ac94792782bd5aef9706df1e0faca0d1f414c Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 8 Jun 2026 01:25:56 +0200 Subject: [PATCH 6/8] Follow @Rollczi review. --- .../configuration/ConfigurationManager.java | 2 + .../transformer/MaterialTransformer.java | 27 +++++++++++++ .../handler/PlayerKillMessageHandler.java | 8 +--- .../feature/itemedit/ItemLoreCommand.java | 7 +--- .../feature/itemedit/ItemNameCommand.java | 7 +--- .../feature/powertool/PowertoolCommand.java | 8 +--- .../powertool/PowertoolController.java | 14 +------ .../vanish/VanishCollisionService.java | 33 ---------------- .../feature/vanish/VanishServiceImpl.java | 5 --- .../transformer/MaterialTransformerTest.java | 39 +++++++++++++++++++ 10 files changed, 75 insertions(+), 75 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java create mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java 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 ea0f154e5..83c7d3b61 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 @@ -2,6 +2,7 @@ import com.eternalcode.core.configuration.migrations.Migrations; import com.eternalcode.core.configuration.serializer.LanguageSerializer; +import com.eternalcode.core.configuration.transformer.MaterialTransformer; import com.eternalcode.core.configuration.transformer.PositionTransformer; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; @@ -51,6 +52,7 @@ public T load(T config) { migrator.runMigrations(file); OkaeriSerdesPack serdesPack = registry -> { + registry.register(new MaterialTransformer()); registry.register(new PositionTransformer()); registry.register(new LanguageSerializer()); registry.register(new MultificationNoticeSerializer(this.resolverRegistry)); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java new file mode 100644 index 000000000..2be8a6207 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java @@ -0,0 +1,27 @@ +package com.eternalcode.core.configuration.transformer; + +import com.eternalcode.core.util.MaterialUtil; +import eu.okaeri.configs.serdes.BidirectionalTransformer; +import eu.okaeri.configs.serdes.SerdesContext; +import eu.okaeri.configs.schema.GenericsPair; +import lombok.NonNull; +import org.bukkit.Material; + +public class MaterialTransformer extends BidirectionalTransformer { + + @Override + public GenericsPair getPair() { + return this.genericsPair(Material.class, String.class); + } + + @Override + public String leftToRight(@NonNull Material material, @NonNull SerdesContext context) { + return material.name(); + } + + @Override + public Material rightToLeft(@NonNull String materialName, @NonNull SerdesContext context) { + return MaterialUtil.parse(materialName) + .orElseThrow(() -> new IllegalArgumentException("Unsupported material: " + materialName)); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java index 279457765..08f4dd988 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/deathmessage/handler/PlayerKillMessageHandler.java @@ -1,6 +1,5 @@ package com.eternalcode.core.feature.deathmessage.handler; -import com.cryptomorin.xseries.XMaterial; import com.eternalcode.commons.RandomElementUtil; import com.eternalcode.core.feature.deathmessage.DeathContext; import com.eternalcode.core.injector.annotations.Inject; @@ -8,15 +7,12 @@ import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.translation.TranslationManager; import com.eternalcode.core.util.MaterialUtil; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @Service public class PlayerKillMessageHandler { - private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); - private final NoticeService noticeService; private final TranslationManager translationManager; @@ -37,7 +33,7 @@ public void handle(DeathContext context) { String victimName = victim.getName(); String killerName = killer.getName(); - ItemStack weapon = killer.getInventory().getItemInMainHand().getType() != AIR + ItemStack weapon = !killer.getInventory().getItemInMainHand().getType().isAir() ? killer.getInventory().getItemInMainHand() : killer.getInventory().getItemInOffHand(); String weaponName = this.getWeaponName(weapon); @@ -53,7 +49,7 @@ public void handle(DeathContext context) { } private String getWeaponName(ItemStack weapon) { - if (weapon == null || weapon.getType() == AIR) { + if (weapon == null || weapon.getType().isAir()) { return this.translationManager.getMessages().deathMessage().unarmedWeaponName(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java index 469df3c7e..7e88aa2da 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemLoreCommand.java @@ -1,11 +1,9 @@ package com.eternalcode.core.feature.itemedit; -import com.cryptomorin.xseries.XMaterial; import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.commons.adventure.AdventureUtil; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; @@ -15,7 +13,6 @@ import java.util.ArrayList; import java.util.List; import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -24,8 +21,6 @@ @Permission("eternalcore.itemlore") class ItemLoreCommand { - private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); - private final NoticeService noticeService; private final MiniMessage miniMessage; @@ -119,7 +114,7 @@ void clear(@Sender Player player) { private ItemStack validateItemFromMainHand(Player player) { ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == AIR || itemStack.getItemMeta() == null) { + if (itemStack.getType().isAir() || itemStack.getItemMeta() == null) { return null; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java index d36d5a8f2..dcdd42425 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/itemedit/ItemNameCommand.java @@ -1,18 +1,15 @@ package com.eternalcode.core.feature.itemedit; -import com.cryptomorin.xseries.XMaterial; import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.commons.adventure.AdventureUtil; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.join.Join; import dev.rollczi.litecommands.annotations.permission.Permission; import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -21,8 +18,6 @@ @Permission("eternalcore.itemname") class ItemNameCommand { - private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); - private final NoticeService noticeService; private final MiniMessage miniMessage; @@ -75,7 +70,7 @@ void clear(@Sender Player player) { private ItemStack validateItemFromMainHand(Player player) { ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == AIR || itemStack.getItemMeta() == null) { + if (itemStack.getType().isAir() || itemStack.getItemMeta() == null) { return null; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java index e46d5524f..6dbd2d945 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolCommand.java @@ -1,16 +1,13 @@ package com.eternalcode.core.feature.powertool; -import com.cryptomorin.xseries.XMaterial; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.core.util.MaterialUtil; import dev.rollczi.litecommands.annotations.argument.Key; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.join.Join; import dev.rollczi.litecommands.annotations.permission.Permission; -import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -24,7 +21,6 @@ public class PowertoolCommand { public static final String KEY = "eternalcore_powertool"; - private static final Material AIR = MaterialUtil.parseRequired(XMaterial.AIR); private final NamespacedKey key; private final Plugin plugin; @@ -41,7 +37,7 @@ public class PowertoolCommand { void clear(@Sender Player player) { ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta meta = item.getItemMeta(); - if (item.getType() == AIR || meta == null) { + if (item.getType().isAir() || meta == null) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.powertool().noItemInMainHand()) @@ -81,7 +77,7 @@ void assign(@Sender Player player, @Join @Key(PowertoolCommandArgument.KEY) Stri ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta meta = item.getItemMeta(); - if (item.getType() == AIR || meta == null) { + if (item.getType().isAir() || meta == null) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.powertool().noItemInMainHand()) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java index ab8c098f4..1ac3faddc 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java @@ -38,7 +38,7 @@ public class PowertoolController implements Listener { .with("{Z}", player -> Integer.toString(player.getLocation().getBlockZ())) .with("{YAW}", player -> Float.toString(player.getLocation().getYaw())) .with("{PITCH}", player -> Float.toString(player.getLocation().getPitch())) - .with("{ITEM}", PowertoolController::getItemName) + .with("{ITEM}", player -> player.getInventory().getItemInMainHand().getItemMeta().getItemName()) .with("{ITEM_TYPE}", player -> player.getInventory().getItemInMainHand().getType().name()) .build(); @@ -92,17 +92,5 @@ void onPlayerInteract(PlayerInteractEvent event) { .send(); } } - - private static String getItemName(Player player) { - ItemStack itemStack = player.getInventory().getItemInMainHand(); - ItemMeta itemMeta = itemStack.getItemMeta(); - - if (itemMeta != null && itemMeta.hasDisplayName()) { - return itemMeta.getDisplayName(); - } - - return itemStack.getType().name(); - } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java deleted file mode 100644 index d4ad177b8..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishCollisionService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.eternalcode.core.feature.vanish; - -import com.eternalcode.core.injector.annotations.Inject; -import com.eternalcode.core.injector.annotations.component.Service; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import org.bukkit.entity.Player; - -@Service -class VanishCollisionService { - - private final Map previousCollidableStates = new ConcurrentHashMap<>(); - - @Inject - VanishCollisionService() { - } - - void disableCollision(Player player) { - this.previousCollidableStates.putIfAbsent(player.getUniqueId(), player.isCollidable()); - player.setCollidable(false); - } - - void restoreCollision(Player player) { - Boolean previousCollidableState = this.previousCollidableStates.remove(player.getUniqueId()); - - if (previousCollidableState == null) { - return; - } - - player.setCollidable(previousCollidableState); - } -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java index f503e25fb..ec21920e9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishServiceImpl.java @@ -14,19 +14,16 @@ class VanishServiceImpl implements VanishService { private final VanishInvisibleService vanishInvisibleService; private final VanishMetaDataService vanishMetaDataService; - private final VanishCollisionService vanishCollisionService; private final EventCaller eventCaller; @Inject VanishServiceImpl( VanishInvisibleService vanishInvisibleService, VanishMetaDataService vanishMetaDataService, - VanishCollisionService vanishCollisionService, EventCaller eventCaller ) { this.vanishInvisibleService = vanishInvisibleService; this.vanishMetaDataService = vanishMetaDataService; - this.vanishCollisionService = vanishCollisionService; this.eventCaller = eventCaller; } @@ -40,7 +37,6 @@ public void enableVanish(Player player) { this.vanishInvisibleService.hidePlayer(player); this.vanishMetaDataService.addMetadata(player); - this.vanishCollisionService.disableCollision(player); } @Override @@ -53,7 +49,6 @@ public void disableVanish(Player player) { this.vanishInvisibleService.showPlayer(player); this.vanishMetaDataService.removeMetadata(player); - this.vanishCollisionService.restoreCollision(player); } @Override diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java new file mode 100644 index 000000000..3043279c6 --- /dev/null +++ b/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java @@ -0,0 +1,39 @@ +package com.eternalcode.core.configuration.transformer; + +import eu.okaeri.configs.configurer.Configurer; +import eu.okaeri.configs.serdes.SerdesContext; +import org.bukkit.Material; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; + +class MaterialTransformerTest { + + private final MaterialTransformer transformer = new MaterialTransformer(); + + @Test + void shouldSerializeMaterialToName() { + String serialized = this.transformer.leftToRight(Material.STONE, dummyContext()); + + assertEquals("STONE", serialized); + } + + @Test + void shouldDeserializeMaterialWithXSeriesAlias() { + Material material = this.transformer.rightToLeft("WEB", dummyContext()); + + assertEquals(Material.COBWEB, material); + } + + @Test + void shouldThrowWhenMaterialIsUnsupported() { + assertThrows(IllegalArgumentException.class, () -> this.transformer.rightToLeft("UNKNOWN_MATERIAL", dummyContext())); + } + + private static SerdesContext dummyContext() { + Configurer dummyConfigurer = mock(Configurer.class); + return SerdesContext.of(dummyConfigurer); + } +} From 9a2395c60e60b4f376714440fd2d8c2c891ffda9 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 8 Jun 2026 01:28:22 +0200 Subject: [PATCH 7/8] Follow @Rollczi review. --- .../src/main/java/com/eternalcode/core/EternalCore.java | 4 +--- .../core/feature/fun/catboy/CatBoyEntityService.java | 4 ++-- .../core/feature/spawn/SpawnRespawnController.java | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) 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 f9d3e226f..49be17f43 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java @@ -80,9 +80,7 @@ public EternalCore(Plugin plugin) { } // TODO: Remove this when we resolve problem with DI - classes with @Subscribe annotation should be loaded first or when event is called - if (compatibilityService.isCompatible(ConfigurationCompatibilityV21_2.class)) { - beanFactory.initializeCandidates(ConfigurationCompatibilityV21_2.class); - } + beanFactory.initializeCandidates(ConfigurationCompatibilityV21_2.class); beanFactory.initializeCandidates(EternalConfigurationFile.class); beanFactory.initializeCandidates(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java index b755c64f4..512706064 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/fun/catboy/CatBoyEntityService.java @@ -28,13 +28,13 @@ Cat createCatboyEntity(Player player, Cat.Type type) { cat.setCatType(type); PersistentDataContainer persistentDataContainer = cat.getPersistentDataContainer(); - persistentDataContainer.set(catboyNamespacedKey, PersistentDataType.BYTE, (byte) 1); + persistentDataContainer.set(catboyNamespacedKey, PersistentDataType.BOOLEAN, true); return cat; } boolean isCatboy(Cat cat) { - return cat.getPersistentDataContainer().has(catboyNamespacedKey, PersistentDataType.BYTE); + return cat.getPersistentDataContainer().has(catboyNamespacedKey, PersistentDataType.BOOLEAN); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java index 27cc9a0fa..530fbf012 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/spawn/SpawnRespawnController.java @@ -47,6 +47,6 @@ void onPlayerRespawn(PlayerRespawnEvent event) { } private boolean hasRespawnPoint(Player player) { - return player.getBedSpawnLocation() != null; + return player.getRespawnLocation() != null; } } From 92c61d2bd8e91223a7c8e0e0d234e5ba05cc093f Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 8 Jun 2026 01:42:50 +0200 Subject: [PATCH 8/8] Refactor material handling: add fallback logic for unsupported materials, improve logging, and clean up related tests and util methods. --- .../transformer/MaterialTransformer.java | 3 +- .../powertool/PowertoolController.java | 19 +++++++++-- .../randomteleport/RandomTeleportConfig.java | 12 +++++-- .../eternalcode/core/util/MaterialUtil.java | 34 +++++++++++++++++-- .../transformer/MaterialTransformerTest.java | 7 ++-- 5 files changed, 64 insertions(+), 11 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java index 2be8a6207..48e9105a0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/transformer/MaterialTransformer.java @@ -21,7 +21,6 @@ public String leftToRight(@NonNull Material material, @NonNull SerdesContext con @Override public Material rightToLeft(@NonNull String materialName, @NonNull SerdesContext context) { - return MaterialUtil.parse(materialName) - .orElseThrow(() -> new IllegalArgumentException("Unsupported material: " + materialName)); + return MaterialUtil.parseOrFallback(materialName); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java index 1ac3faddc..1b258298e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/powertool/PowertoolController.java @@ -38,8 +38,8 @@ public class PowertoolController implements Listener { .with("{Z}", player -> Integer.toString(player.getLocation().getBlockZ())) .with("{YAW}", player -> Float.toString(player.getLocation().getYaw())) .with("{PITCH}", player -> Float.toString(player.getLocation().getPitch())) - .with("{ITEM}", player -> player.getInventory().getItemInMainHand().getItemMeta().getItemName()) - .with("{ITEM_TYPE}", player -> player.getInventory().getItemInMainHand().getType().name()) + .with("{ITEM}", PowertoolController::getItemName) + .with("{ITEM_TYPE}", PowertoolController::getItemTypeName) .build(); private final Plugin plugin; @@ -92,5 +92,20 @@ void onPlayerInteract(PlayerInteractEvent event) { .send(); } } + + private static String getItemName(Player player) { + ItemStack itemStack = player.getInventory().getItemInMainHand(); + ItemMeta itemMeta = itemStack.getItemMeta(); + + if (itemMeta != null && itemMeta.hasDisplayName()) { + return itemMeta.getDisplayName(); + } + + return itemStack.getType().name(); + } + + private static String getItemTypeName(Player player) { + return player.getInventory().getItemInMainHand().getType().name(); + } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java index e8738a8a7..b6bb543e5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java @@ -135,13 +135,21 @@ public class RandomTeleportConfig extends OkaeriConfig implements RandomTeleport public RandomTeleportHeightRange heightRange = RandomTeleportHeightRange.of(60, 160); private static Set createMaterialSet(XMaterial firstMaterial, XMaterial... otherMaterials) { - EnumSet materials = EnumSet.of(MaterialUtil.parseRequired(firstMaterial)); + EnumSet materials = EnumSet.noneOf(Material.class); + addMaterial(materials, firstMaterial); for (XMaterial material : otherMaterials) { - materials.add(MaterialUtil.parseRequired(material)); + addMaterial(materials, material); } return materials; } + private static void addMaterial(Set materials, XMaterial material) { + MaterialUtil.parse(material).ifPresentOrElse( + materials::add, + () -> MaterialUtil.warnUnsupported(material.name()) + ); + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java b/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java index e5333c1ac..d4764657e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/util/MaterialUtil.java @@ -2,8 +2,10 @@ import com.cryptomorin.xseries.XMaterial; import java.util.Arrays; -import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; import java.util.stream.Collectors; import org.bukkit.Material; @@ -11,6 +13,9 @@ public final class MaterialUtil { private static final String UNDERSCORE = "_"; private static final String SPACE = " "; + private static final Material FALLBACK_MATERIAL = Material.STONE; + private static final Logger LOGGER = Logger.getLogger("EternalCore"); + private static final Set WARNED_MATERIALS = ConcurrentHashMap.newKeySet(); private MaterialUtil() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); @@ -22,13 +27,38 @@ public static String format(Material material) { } public static Material parseRequired(XMaterial material) { - return Objects.requireNonNull(material.get(), "Material " + material.name() + " is not supported by this server version"); + return parse(material).orElseGet(() -> fallback(material.name(), FALLBACK_MATERIAL)); + } + + public static Optional parse(XMaterial material) { + return Optional.ofNullable(material.get()); } public static Optional parse(String materialName) { return XMaterial.matchXMaterial(materialName).map(XMaterial::get); } + public static Material parseOrFallback(String materialName) { + return parse(materialName).orElseGet(() -> fallback(materialName, FALLBACK_MATERIAL)); + } + + public static void warnUnsupported(String materialName) { + warnUnsupported(materialName, "skipping it"); + } + + private static Material fallback(String materialName, Material fallbackMaterial) { + warnUnsupported(materialName, "using " + fallbackMaterial.name() + " instead"); + return fallbackMaterial; + } + + private static void warnUnsupported(String materialName, String action) { + if (!WARNED_MATERIALS.add(materialName)) { + return; + } + + LOGGER.warning("Material '" + materialName + "' is not supported by this server version, " + action + "."); + } + private static String capitalize(String text) { if (text == null || text.isEmpty()) { return text; diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java index 3043279c6..7d2ab0624 100644 --- a/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java +++ b/eternalcore-core/src/test/java/com/eternalcode/core/configuration/transformer/MaterialTransformerTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; class MaterialTransformerTest { @@ -28,8 +27,10 @@ void shouldDeserializeMaterialWithXSeriesAlias() { } @Test - void shouldThrowWhenMaterialIsUnsupported() { - assertThrows(IllegalArgumentException.class, () -> this.transformer.rightToLeft("UNKNOWN_MATERIAL", dummyContext())); + void shouldUseFallbackWhenMaterialIsUnsupported() { + Material material = this.transformer.rightToLeft("UNKNOWN_MATERIAL", dummyContext()); + + assertEquals(Material.STONE, material); } private static SerdesContext dummyContext() {