From 072b5e75b1e902ae3914a8caf775898e62eadcda Mon Sep 17 00:00:00 2001 From: Poy <75265787+NoltoxGit@users.noreply.github.com> Date: Sun, 13 Sep 2026 11:08:07 +0200 Subject: [PATCH 1/2] Update dependencies: Shadow 9.6.1, JUnit 6.1.3, Gradle 9.7.1 --- gradle/libs.versions.toml | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10badf24..7de3e6a9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] # Build / Plugins -shadow = "9.0.0" +shadow = "9.6.1" groupez = "1.0.0" paperweight = "2.0.0-beta.21" @@ -51,7 +51,7 @@ breweryx = "3.6.0" denizen = "1.3.1-SNAPSHOT" # Testing -junit-bom = "5.10.0" +junit-bom = "6.1.3" mockbukkit = "4.114.0" [libraries] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a792ae98..a1028c32 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,10 @@ -#Tue May 26 15:14:48 CEST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip +networkTimeout=10000 +retries=0 +retryBackOffMs=500 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -org.gradle.caching=true \ No newline at end of file +org.gradle.caching=true From 924413d6c0648008edf98068945776c5cfc22afc Mon Sep 17 00:00:00 2001 From: Poy <75265787+NoltoxGit@users.noreply.github.com> Date: Sun, 13 Sep 2026 11:39:25 +0200 Subject: [PATCH 2/2] Add support for Paper 26.2, implement SulfurCubeContent component, and update dependencies --- .../SulfurCubeContentComponent.java | 30 ++++++ Test/v26_1_2/build.gradle.kts | 6 +- Test/v26_2/build.gradle.kts | 23 ++++ .../fr/maxlego08/menu/DataComponentTest.java | 100 ++++++++++++++++++ gradle/libs.versions.toml | 61 ++++++----- ...rSulfurCubeContentItemComponentLoader.java | 33 ++++++ 6 files changed, 222 insertions(+), 31 deletions(-) create mode 100644 Hooks/Paper-26/src/main/java/fr/maxlego08/menu/api/itemstack/components/SulfurCubeContentComponent.java create mode 100644 Test/v26_2/build.gradle.kts create mode 100644 Test/v26_2/src/test/java/fr/maxlego08/menu/DataComponentTest.java create mode 100644 src/main/java/fr/maxlego08/menu/loader/components/PaperSulfurCubeContentItemComponentLoader.java diff --git a/Hooks/Paper-26/src/main/java/fr/maxlego08/menu/api/itemstack/components/SulfurCubeContentComponent.java b/Hooks/Paper-26/src/main/java/fr/maxlego08/menu/api/itemstack/components/SulfurCubeContentComponent.java new file mode 100644 index 00000000..394578f1 --- /dev/null +++ b/Hooks/Paper-26/src/main/java/fr/maxlego08/menu/api/itemstack/components/SulfurCubeContentComponent.java @@ -0,0 +1,30 @@ +package fr.maxlego08.menu.api.itemstack.components; + +import fr.maxlego08.menu.api.MenuItemStack; +import fr.maxlego08.menu.api.context.BuildContext; +import fr.maxlego08.menu.api.itemstack.ItemComponent; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.SulfurCubeContent; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SulfurCubeContentComponent extends ItemComponent { + + private final @NotNull MenuItemStack menuItemStack; + + public SulfurCubeContentComponent(@NotNull MenuItemStack menuItemStack) { + this.menuItemStack = menuItemStack; + } + + public @NotNull MenuItemStack getMenuItemStack() { + return this.menuItemStack; + } + + @Override + public void apply(@NotNull BuildContext context, @NotNull ItemStack itemStack, @Nullable Player player) { + SulfurCubeContent content = SulfurCubeContent.sulfurCubeContent(this.menuItemStack.build(player)); + itemStack.setData(DataComponentTypes.SULFUR_CUBE_CONTENT, content); + } +} diff --git a/Test/v26_1_2/build.gradle.kts b/Test/v26_1_2/build.gradle.kts index 1bf0295e..ab05da7e 100644 --- a/Test/v26_1_2/build.gradle.kts +++ b/Test/v26_1_2/build.gradle.kts @@ -6,10 +6,10 @@ dependencies { testImplementation(project(":Test:Base")) testImplementation(project(":")) testImplementation(project(":Hooks:Paper-26")) + testImplementation(libs.paperApi2612) + testImplementation(libs.mockbukkit2612) testRuntimeOnly(libs.reflections) paperweightDevelopmentBundle(libs.paperDevBundle2612) - testImplementation(libs.paper.api.latest) - testImplementation(libs.mockbukkit) } java { @@ -20,4 +20,4 @@ java { paperweight { addServerDependencyTo = configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME).map { setOf(it) } -} \ No newline at end of file +} diff --git a/Test/v26_2/build.gradle.kts b/Test/v26_2/build.gradle.kts new file mode 100644 index 00000000..c2a885e6 --- /dev/null +++ b/Test/v26_2/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + alias(libs.plugins.paperweight) +} + +dependencies { + testImplementation(project(":Test:Base")) + testImplementation(project(":")) + testImplementation(project(":Hooks:Paper-26")) + testImplementation(libs.paper.api.latest) + testImplementation(libs.mockbukkit262) + testRuntimeOnly(libs.reflections) + paperweightDevelopmentBundle(libs.paperDevBundle262) +} + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(25)) + targetCompatibility = JavaVersion.VERSION_25 + sourceCompatibility = JavaVersion.VERSION_25 +} + +paperweight { + addServerDependencyTo = configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME).map { setOf(it) } +} diff --git a/Test/v26_2/src/test/java/fr/maxlego08/menu/DataComponentTest.java b/Test/v26_2/src/test/java/fr/maxlego08/menu/DataComponentTest.java new file mode 100644 index 00000000..32b28cf1 --- /dev/null +++ b/Test/v26_2/src/test/java/fr/maxlego08/menu/DataComponentTest.java @@ -0,0 +1,100 @@ +package fr.maxlego08.menu; + +import fr.maxlego08.menu.api.MenuPlugin; +import fr.maxlego08.menu.api.context.MenuItemStackContext; +import fr.maxlego08.menu.api.exceptions.ItemComponentAlreadyRegisterException; +import fr.maxlego08.menu.api.itemstack.ItemComponent; +import fr.maxlego08.menu.api.loader.ItemComponentLoader; +import fr.maxlego08.menu.test.DataComponentTestBase; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class DataComponentTest extends DataComponentTestBase { + + private static MenuPlugin menuPlugin; + private ZComponentsManager componentsManager; + + @BeforeAll + static void init() { + MockBukkit.mock(); + menuPlugin = MockBukkit.load(ZMenuPlugin.class, true); // MockBukkit server + } + + @AfterAll + static void tearDown() { + MockBukkit.unmock(); + } + + + @BeforeEach + void setup() { + this.componentsManager = new ZComponentsManager(); + } + + @Test + void testAllKnownComponents() { + this.componentsManager.initializeDefaultComponents(menuPlugin); + + Set registered = new HashSet<>(this.componentsManager.getRegisteredComponentNames()); + + checkComponents(registered); + } + + @Test + void testRegistrationWithDuplicateNameThrowsException() { + ItemComponentLoader first = new ItemComponentLoader("duplicate-test") { + @Override + public @Nullable ItemComponent load(@NotNull MenuItemStackContext context, @NotNull File file, @NotNull YamlConfiguration configuration, @NotNull String path, @Nullable ConfigurationSection componentSection) { + return null; + } + }; + + this.componentsManager.registerComponent(first); + + ItemComponentLoader second = new ItemComponentLoader("duplicate-test") { + @Override + public @Nullable ItemComponent load(@NotNull MenuItemStackContext context, @NotNull File file, @NotNull YamlConfiguration configuration, @NotNull String path, @Nullable ConfigurationSection componentSection) { + return null; + } + }; + + assertThrows(ItemComponentAlreadyRegisterException.class, () -> this.componentsManager.registerComponent(second)); + } + + @Test + void testRegistrationWithDistinctNamesSucceeds() { + ItemComponentLoader first = new ItemComponentLoader("distinct-a") { + @Override + public @Nullable ItemComponent load(@NotNull MenuItemStackContext context, @NotNull File file, @NotNull YamlConfiguration configuration, @NotNull String path, @Nullable ConfigurationSection componentSection) { + return null; + } + }; + + ItemComponentLoader second = new ItemComponentLoader("distinct-b") { + @Override + public @Nullable ItemComponent load(@NotNull MenuItemStackContext context, @NotNull File file, @NotNull YamlConfiguration configuration, @NotNull String path, @Nullable ConfigurationSection componentSection) { + return null; + } + }; + + this.componentsManager.registerComponent(first); + this.componentsManager.registerComponent(second); + + assertSame(first, this.componentsManager.getLoader("distinct-a").orElseThrow()); + assertSame(second, this.componentsManager.getLoader("distinct-b").orElseThrow()); + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7de3e6a9..24981c68 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,66 +2,70 @@ # Build / Plugins shadow = "9.6.1" groupez = "1.0.0" -paperweight = "2.0.0-beta.21" +paperweight = "2.0.0-beta.23" # Platforms (Paper / Spigot / NMS) -spigot = "26.1-R0.1-SNAPSHOT" paper-api = "1.21.11-R0.1-SNAPSHOT" -paper-api-latest = "26.1.2.build.+" +paper-api-latest = "26.2.build.+" +paperApi2612 = "26.1.2.build.+" paperDevBundle120R3 = "1.20.4-R0.1-SNAPSHOT" paperDevBundle120R4 = "1.20.6-R0.1-SNAPSHOT" paperDevBundle121R1 = "1.21.1-R0.1-SNAPSHOT" paperDevBundle2612 = "26.1.2.build.+" -adventure-api = "4.25.0" -adventure-text-minimessage = "4.21.0" -item-nbt-api = "2.15.0" +paperDevBundle262 = "26.2.build.+" +adventure-api = "4.26.1" +adventure-text-minimessage = "4.26.1" +item-nbt-api = "2.16.0" # Utilities / Libraries -sarah = "1.22" +sarah = "1.25" currenciesapi = "1.0.15" folialib = "0.5.1" -xseries = "13.3.0" +xseries = "13.8.0" exp4j = "0.4.8" java-websocket = "1.6.0" paper-dispatch = "1.0.3" -faststats = "0.29.4" +faststats = "0.30.1" # Integration Hooks -placeholderapi = "2.11.6" +placeholderapi = "2.12.3" reflections = "0.10.2" -slimefun4 = "RC-34" -oraxen = "1.217.0" -packetevents = "2.12.1" -nova-api = "0.18" -nexo = "1.21.0" -mythicmobs = "5.6.1" -mmoitems = "6.9.5-SNAPSHOT" +slimefun4 = "RC-36" +oraxen = "1.218.0" +packetevents = "2.13.0" +nova-api = "0.22.3" +nexo = "1.28.0" +mythicmobs = "5.13.0" +mmoitems = "6.10.1-SNAPSHOT" mythiclib = "1.7.1-SNAPSHOT" -luckperms = "5.4" -magiccosmetics = "2.2.8" +luckperms = "5.5" +magiccosmetics = "2.2.9" itemsadder = "3.6.1" -hmccosmetics = "2.7.7" +hmccosmetics = "2.9.2" headdatabase = "1.3.2" -score = "5.25.6.9" -craft-engine = "26.7.3" -eco = "6.53.0" -floodgate = "2.2.4-SNAPSHOT" +score = "5.26.9.9" +craft-engine = "26.8.2" +eco = "2026.37" +floodgate = "2.2.5-SNAPSHOT" viaversion = "5.11.0" -breweryx = "3.6.0" -denizen = "1.3.1-SNAPSHOT" +breweryx = "3.7.0" +denizen = "1.3.3-SNAPSHOT" # Testing junit-bom = "6.1.3" -mockbukkit = "4.114.0" +mockbukkit2612 = "4.114.0" +mockbukkit262 = "4.116.1" [libraries] # Platforms (Paper / NMS) paper-api = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper-api" } paper-api-latest = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper-api-latest" } +paperApi2612 = { group = "io.papermc.paper", name = "paper-api", version.ref = "paperApi2612" } paperDevBundle120R3 = { group = "io.papermc.paper", name = "dev-bundle", version.ref = "paperDevBundle120R3" } paperDevBundle120R4 = { group = "io.papermc.paper", name = "dev-bundle", version.ref = "paperDevBundle120R4" } paperDevBundle121R1 = { group = "io.papermc.paper", name = "dev-bundle", version.ref = "paperDevBundle121R1" } paperDevBundle2612 = { group = "io.papermc.paper", name = "dev-bundle", version.ref = "paperDevBundle2612" } +paperDevBundle262 = { group = "io.papermc.paper", name = "dev-bundle", version.ref = "paperDevBundle262" } adventure-api = { group = "net.kyori", name = "adventure-api", version.ref = "adventure-api" } adventure-text-minimessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure-text-minimessage" } item-nbt-api = { group = "de.tr7zw", name = "item-nbt-api", version.ref = "item-nbt-api" } @@ -105,7 +109,8 @@ paperdispatch = { group = "com.github.1robie.paper-dispatch", name = "paper-disp junit-bom = { group = "org.junit", name = "junit-bom", version.ref = "junit-bom" } junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter" } junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher" } -mockbukkit = { group = "org.mockbukkit.mockbukkit", name = "mockbukkit-v26.1.2", version.ref = "mockbukkit" } +mockbukkit2612 = { group = "org.mockbukkit.mockbukkit", name = "mockbukkit-v26.1.2", version.ref = "mockbukkit2612" } +mockbukkit262 = { group = "org.mockbukkit.mockbukkit", name = "mockbukkit-v26.2", version.ref = "mockbukkit262" } [plugins] # Build Tools diff --git a/src/main/java/fr/maxlego08/menu/loader/components/PaperSulfurCubeContentItemComponentLoader.java b/src/main/java/fr/maxlego08/menu/loader/components/PaperSulfurCubeContentItemComponentLoader.java new file mode 100644 index 00000000..fa279c91 --- /dev/null +++ b/src/main/java/fr/maxlego08/menu/loader/components/PaperSulfurCubeContentItemComponentLoader.java @@ -0,0 +1,33 @@ +package fr.maxlego08.menu.loader.components; + +import fr.maxlego08.menu.api.MenuItemStack; +import fr.maxlego08.menu.api.MenuPlugin; +import fr.maxlego08.menu.api.annotations.AutoComponentLoader; +import fr.maxlego08.menu.api.annotations.SinceVersion; +import fr.maxlego08.menu.api.context.MenuItemStackContext; +import fr.maxlego08.menu.api.itemstack.ItemComponent; +import fr.maxlego08.menu.api.itemstack.components.SulfurCubeContentComponent; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.Map; + +@AutoComponentLoader +@SinceVersion("26.2") +public class PaperSulfurCubeContentItemComponentLoader extends AbstractMenuItemStackListComponentLoaderBase { + + public PaperSulfurCubeContentItemComponentLoader(MenuPlugin plugin) { + super("sulfur-cube-content", plugin); + } + + @Override + public @Nullable ItemComponent load(@NotNull MenuItemStackContext context, @NotNull File file, @NotNull YamlConfiguration configuration, @NotNull String path, @Nullable ConfigurationSection componentSection) { + if (componentSection == null) return null; + Map values = componentSection.getValues(true); + MenuItemStack menuItemStack = this.loadItemStack(values, file); + return menuItemStack == null ? null : new SulfurCubeContentComponent(menuItemStack); + } +}