From 9002ab792a6c66da623f637de1b2176dd2e19084 Mon Sep 17 00:00:00 2001 From: 1robie Date: Mon, 26 Jan 2026 21:48:42 +0100 Subject: [PATCH 1/4] refactor: update AttributeModifiersComponent to use AttributeWrapper and merge strategy --- .../AttributeModifiersComponent.java | 35 ++++++++++--------- ...AttributeModifiersItemComponentLoader.java | 25 +++++++++---- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/AttributeModifiersComponent.java b/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/AttributeModifiersComponent.java index 53594b11..36a31b5e 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/AttributeModifiersComponent.java +++ b/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/AttributeModifiersComponent.java @@ -1,13 +1,13 @@ package fr.maxlego08.menu.api.itemstack.components; +import fr.maxlego08.menu.api.MenuPlugin; +import fr.maxlego08.menu.api.attribute.AttributApplier; +import fr.maxlego08.menu.api.attribute.AttributeMergeStrategy; +import fr.maxlego08.menu.api.attribute.AttributeWrapper; import fr.maxlego08.menu.api.context.BuildContext; import fr.maxlego08.menu.api.itemstack.ItemComponent; -import fr.maxlego08.menu.api.utils.Tuples; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,25 +15,26 @@ @SuppressWarnings("unused") public class AttributeModifiersComponent extends ItemComponent { - - private final List> modifiers; - - public AttributeModifiersComponent(List> modifiers) { - this.modifiers = modifiers; + private final MenuPlugin plugin; + private final AttributApplier attributApplier; + private final List attributes; + private final AttributeMergeStrategy mergeStrategy; + + public AttributeModifiersComponent(MenuPlugin plugin, @NotNull List attributes, @Nullable AttributeMergeStrategy mergeStrategy) { + this.plugin = plugin; + this.attributApplier = plugin.getAttributApplier(); + this.attributes = attributes; + this.mergeStrategy = mergeStrategy; } - public List> getModifiers() { - return this.modifiers; + @NotNull + public List getAttributes() { + return attributes; } @Override public void apply(@NotNull BuildContext context, @NotNull ItemStack itemStack, @Nullable Player player) { - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta == null) return; - for (Tuples tuple : this.modifiers) { - itemMeta.addAttributeModifier(tuple.getFirst(), tuple.getSecond()); - } - itemStack.setItemMeta(itemMeta); + attributApplier.applyAttributesModern(itemStack, this.attributes, this.plugin, this.mergeStrategy); } } diff --git a/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotAttributeModifiersItemComponentLoader.java b/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotAttributeModifiersItemComponentLoader.java index 2ffa8746..a02d37e8 100644 --- a/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotAttributeModifiersItemComponentLoader.java +++ b/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotAttributeModifiersItemComponentLoader.java @@ -1,11 +1,13 @@ package fr.maxlego08.menu.loader.components.spigot; +import fr.maxlego08.menu.api.MenuPlugin; +import fr.maxlego08.menu.api.attribute.AttributeMergeStrategy; +import fr.maxlego08.menu.api.attribute.AttributeWrapper; import fr.maxlego08.menu.api.configuration.Configuration; import fr.maxlego08.menu.api.context.MenuItemStackContext; import fr.maxlego08.menu.api.itemstack.ItemComponent; import fr.maxlego08.menu.api.itemstack.components.AttributeModifiersComponent; import fr.maxlego08.menu.api.loader.ItemComponentLoader; -import fr.maxlego08.menu.api.utils.Tuples; import fr.maxlego08.menu.zcore.logger.Logger; import org.bukkit.NamespacedKey; import org.bukkit.Registry; @@ -22,16 +24,25 @@ import java.util.Map; public class SpigotAttributeModifiersItemComponentLoader extends ItemComponentLoader { + private final MenuPlugin plugin; - public SpigotAttributeModifiersItemComponentLoader(){ + public SpigotAttributeModifiersItemComponentLoader(MenuPlugin plugin){ super("attribute-modifiers"); + this.plugin = plugin; } @Override public @Nullable ItemComponent load(@NotNull MenuItemStackContext context, @NotNull File file, @NotNull YamlConfiguration configuration, @NotNull String path, @Nullable ConfigurationSection componentSection) { - path = normalizePath(path); - List> mapList = configuration.getMapList(path); - List> modifiers = new ArrayList<>(); + if (componentSection == null) return null; + String mergeStrategyStr = componentSection.getString("attribute-merge-strategy", ""); + AttributeMergeStrategy mergeStrategy; + try { + mergeStrategy = AttributeMergeStrategy.valueOf(mergeStrategyStr.toUpperCase()); + } catch (IllegalArgumentException e) { + mergeStrategy = AttributeMergeStrategy.ADD; + } + List> mapList = componentSection.getMapList("modifiers"); + List modifiersWrapper = new ArrayList<>(); for (Map rawMap : mapList) { @SuppressWarnings("unchecked") Map map = (Map) rawMap; @@ -48,7 +59,7 @@ public SpigotAttributeModifiersItemComponentLoader(){ if (attribute == null) continue; try { AttributeModifier deserialize = AttributeModifier.deserialize(map); - modifiers.add(new Tuples<>(attribute, deserialize)); + modifiersWrapper.add(new AttributeWrapper(attribute, deserialize.getOperation(), deserialize.getAmount(), deserialize.getSlotGroup())); } catch (IllegalArgumentException e) { if (Configuration.enableDebug){ Logger.info("Error deserializing attribute modifier for attribute " + attribute.name() + ": " + e.getMessage()); @@ -57,6 +68,6 @@ public SpigotAttributeModifiersItemComponentLoader(){ } } - return modifiers.isEmpty() ? null : new AttributeModifiersComponent(modifiers); + return modifiersWrapper.isEmpty() ? null : new AttributeModifiersComponent(this.plugin,modifiersWrapper, mergeStrategy); } } From 373f79592b91971ef9d085c586c374eb017ea13d Mon Sep 17 00:00:00 2001 From: 1robie Date: Mon, 26 Jan 2026 21:48:59 +0100 Subject: [PATCH 2/4] fix: ensure task runs when plugin is disabled in PacketAnimationListener --- .../packetevents/listener/PacketAnimationListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java b/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java index 7810cf00..2ae39e46 100644 --- a/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java +++ b/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java @@ -90,7 +90,7 @@ public void onPacketSend(PacketSendEvent event) { } }; - if (Bukkit.isPrimaryThread()) { + if (Bukkit.isPrimaryThread() || !this.plugin.isEnabled()) { task.run(); } else { this.plugin.getScheduler().runNextTick(w -> task.run()); @@ -110,7 +110,7 @@ public void onPacketSend(PacketSendEvent event) { } }; - if (Bukkit.isPrimaryThread()) { + if (Bukkit.isPrimaryThread() || !this.plugin.isEnabled()) { task.run(); } else { this.plugin.getScheduler().runNextTick(w -> task.run()); @@ -148,7 +148,7 @@ public void onPacketSend(PacketSendEvent event) { } }; - if (Bukkit.isPrimaryThread()) { + if (Bukkit.isPrimaryThread() || !this.plugin.isEnabled()) { task.run(); } else { this.plugin.getScheduler().runNextTick(w -> task.run()); From e234f1b10de814d26bde219fac66754beb24b7ec Mon Sep 17 00:00:00 2001 From: 1robie Date: Mon, 26 Jan 2026 21:49:39 +0100 Subject: [PATCH 3/4] fix: correct task execution condition in PacketAnimationListener --- .../hooks/packetevents/listener/PacketAnimationListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java b/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java index 2ae39e46..470f06fc 100644 --- a/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java +++ b/Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketAnimationListener.java @@ -90,7 +90,7 @@ public void onPacketSend(PacketSendEvent event) { } }; - if (Bukkit.isPrimaryThread() || !this.plugin.isEnabled()) { + if (Bukkit.isPrimaryThread() || this.plugin.isEnabled()) { task.run(); } else { this.plugin.getScheduler().runNextTick(w -> task.run()); @@ -110,7 +110,7 @@ public void onPacketSend(PacketSendEvent event) { } }; - if (Bukkit.isPrimaryThread() || !this.plugin.isEnabled()) { + if (Bukkit.isPrimaryThread() || this.plugin.isEnabled()) { task.run(); } else { this.plugin.getScheduler().runNextTick(w -> task.run()); From 206ecd94782eeea6b2693b10cad8b8ea14489b31 Mon Sep 17 00:00:00 2001 From: 1robie Date: Mon, 26 Jan 2026 21:49:58 +0100 Subject: [PATCH 4/4] fix: update SpigotAttributeModifiersItemComponentLoader to accept plugin parameter --- src/main/java/fr/maxlego08/menu/ZComponentsManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/fr/maxlego08/menu/ZComponentsManager.java b/src/main/java/fr/maxlego08/menu/ZComponentsManager.java index f8c13a5c..301cf44c 100644 --- a/src/main/java/fr/maxlego08/menu/ZComponentsManager.java +++ b/src/main/java/fr/maxlego08/menu/ZComponentsManager.java @@ -8,7 +8,6 @@ import fr.maxlego08.menu.common.utils.nms.NmsVersion; import fr.maxlego08.menu.itemstack.components.paper.PaperVariantComponent; import fr.maxlego08.menu.itemstack.components.spigot.SpigotVariantComponent; -import fr.maxlego08.menu.loader.components.spigot.SpigotPotionDurationScaleItemComponentLoader; import fr.maxlego08.menu.loader.components.paper.*; import fr.maxlego08.menu.loader.components.spigot.*; import org.jetbrains.annotations.NotNull; @@ -32,7 +31,7 @@ public void initializeDefaultComponents(MenuPlugin plugin) { this.initializeVariantComponents(plugin); this.registerComponent(new SpigotBlockStateItemComponentLoader()); - this.registerComponent(new SpigotAttributeModifiersItemComponentLoader()); + this.registerComponent(new SpigotAttributeModifiersItemComponentLoader(plugin)); this.registerComponent(new SpigotBannerPatternsItemComponentLoader()); this.registerComponent(new SpigotBaseColorItemComponentLoader()); this.registerComponent(new SpigotBundleContentsItemComponentLoader(plugin));