From d23afb0441501bf70a69d6d350234c304a7f647d Mon Sep 17 00:00:00 2001 From: 1robie <97293924+1robie@users.noreply.github.com> Date: Sat, 14 Mar 2026 10:40:18 +0100 Subject: [PATCH 1/2] delete unused class --- .../utils/itemstack/MenuItemStackFormMap.java | 158 ------------------ 1 file changed, 158 deletions(-) delete mode 100644 Common/src/main/java/fr/maxlego08/menu/common/utils/itemstack/MenuItemStackFormMap.java diff --git a/Common/src/main/java/fr/maxlego08/menu/common/utils/itemstack/MenuItemStackFormMap.java b/Common/src/main/java/fr/maxlego08/menu/common/utils/itemstack/MenuItemStackFormMap.java deleted file mode 100644 index 0f7d4ce1..00000000 --- a/Common/src/main/java/fr/maxlego08/menu/common/utils/itemstack/MenuItemStackFormMap.java +++ /dev/null @@ -1,158 +0,0 @@ -package fr.maxlego08.menu.common.utils.itemstack; - -import fr.maxlego08.menu.ZMenuItemStack; -import fr.maxlego08.menu.api.InventoryManager; -import fr.maxlego08.menu.api.attribute.AttributeMergeStrategy; -import fr.maxlego08.menu.api.attribute.AttributeWrapper; -import fr.maxlego08.menu.api.enchantment.Enchantments; -import fr.maxlego08.menu.api.enchantment.MenuEnchantment; -import fr.maxlego08.menu.api.enums.MenuItemRarity; -import fr.maxlego08.menu.api.exceptions.ItemEnchantException; -import fr.maxlego08.menu.api.itemstack.TrimConfiguration; -import fr.maxlego08.menu.api.utils.TrimHelper; -import fr.maxlego08.menu.api.utils.TypedMapAccessor; -import fr.maxlego08.menu.common.utils.nms.NmsVersion; -import org.bukkit.Bukkit; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.meta.trim.TrimMaterial; -import org.bukkit.inventory.meta.trim.TrimPattern; - -import java.io.File; -import java.util.*; - -public class MenuItemStackFormMap { - - public static ZMenuItemStack fromMap(InventoryManager inventoryManager, File file, String path, Map map) { - TypedMapAccessor accessor = new TypedMapAccessor(map); - ZMenuItemStack menuItemStack = new ZMenuItemStack(inventoryManager, file.getPath(), path); - - menuItemStack.setData(accessor.getString("data", "0")); - menuItemStack.setDurability(accessor.getInt("durability", 0)); - menuItemStack.setAmount(accessor.getString("amount", "1")); - menuItemStack.setMaterial(accessor.getString("material", null)); - menuItemStack.setTargetPlayer(accessor.getString("target", null)); - menuItemStack.setUrl(accessor.getString("url", null)); - - List lore = accessor.getStringList("lore"); - if (lore.isEmpty()) { - Object object = accessor.getObject("lore", null); - if (object instanceof String loreString) { - lore = Arrays.asList(loreString.split("\n")); - } - } - menuItemStack.setLore(lore); - menuItemStack.setDisplayName(accessor.getString("name", accessor.getString("display_name", null))); - menuItemStack.setGlowing(accessor.getBoolean("glow")); - menuItemStack.setModelID(accessor.getString("modelID", accessor.getString("model-id", accessor.getString("modelId", accessor.getString("customModelId", accessor.getString("customModelData", accessor.getString("model_data", "0"))))))); - - Enchantments helperEnchantments = inventoryManager.getEnchantments(); - List enchants = accessor.getStringList("enchants"); - Map enchantments = new HashMap<>(); - - for (String enchantString : enchants) { - - try { - - String[] splitEnchant = enchantString.split(","); - - if (splitEnchant.length == 1) - throw new ItemEnchantException("an error occurred while loading the enchantment " + enchantString + " for file " + file.getAbsolutePath() + " with path " + path); - - int level; - String enchant = splitEnchant[0]; - try { - level = Integer.parseInt(splitEnchant[1]); - } catch (NumberFormatException e) { - throw new ItemEnchantException("an error occurred while loading the enchantment " + enchantString + " for file " + file.getAbsolutePath() + " with path " + path); - } - - Optional optional = helperEnchantments.getEnchantments(enchant); - if (optional.isEmpty()) { - throw new ItemEnchantException("an error occurred while loading the enchantment " + enchantString + " for file " + file.getAbsolutePath() + " with path " + path); - } - - enchantments.put(optional.get().enchantment(), level); - - } catch (ItemEnchantException e) { - e.printStackTrace(); - } - } - - List flagStrings = accessor.getStringList("flags"); - List flags = new ArrayList<>(flagStrings.size()); - for (String flagName : flagStrings) { - flags.add(menuItemStack.getFlag(flagName)); - } - - List attributeModifiers = new ArrayList<>(); - - if (accessor.contains("attributes")) { - List> attributesFromConfig = (List>) accessor.getList("attributes"); - if (attributesFromConfig != null) { - for (Map attributeMap : attributesFromConfig) { - attributeModifiers.add(AttributeWrapper.deserialize(attributeMap)); - } - } - } - - menuItemStack.setEnchantments(enchantments); - menuItemStack.setFlags(flags); - menuItemStack.setAttributeMergeStrategy(AttributeMergeStrategy.valueOf(accessor.getString("attribute-merge-strategy", "REPLACE").toUpperCase())); - menuItemStack.setAttributes(attributeModifiers); - - if (NmsVersion.getCurrentVersion().isNewItemStackAPI()) { - loadNewItemStacks(menuItemStack, accessor, path, file); - } - if (NmsVersion.getCurrentVersion().isNewHeadApi()){ - loadTrims(menuItemStack, accessor, path, file); - } - - return menuItemStack; - } - - private static void loadNewItemStacks(ZMenuItemStack menuItemStack, TypedMapAccessor accessor, String path, File file) { - menuItemStack.setMaxStackSize(accessor.getInt("max-stack-size", 0)); - menuItemStack.setMaxDamage(accessor.getInt("max-damage", 0)); - menuItemStack.setDamage(accessor.getInt("damage", 0)); - menuItemStack.setRepairCost(accessor.getInt("repair-cost", 0)); - menuItemStack.setUnbreakableEnabled(getOrNull(accessor.getObject("unbreakable", null))); - menuItemStack.setUnbreakableShowInTooltip(getOrNull(accessor.getObject("unbreakable-show-in-tooltip", null))); - menuItemStack.setFireResistant(getOrNull(accessor.getObject("fire-resistant", null))); - menuItemStack.setHideTooltip(getOrNull(accessor.getObject("hide-tooltip", null))); - menuItemStack.setHideAdditionalTooltip(getOrNull(accessor.getObject("hide-additional-tooltip", null))); - menuItemStack.setEnchantmentGlint(getOrNull(accessor.getObject("enchantment-glint", null))); - menuItemStack.setEnchantmentShowInTooltip(getOrNull(accessor.getObject("enchantment-show-in-tooltip", null))); - menuItemStack.setAttributeShowInTooltip(getOrNull(accessor.getObject("attribute-show-in-tooltip", null))); - - String rarityString = accessor.getString("item-rarity", null); - if (rarityString != null) { - menuItemStack.setItemRarity(MenuItemRarity.valueOf(rarityString.toUpperCase())); - } - - } - private static void loadTrims(ZMenuItemStack menuItemStack, TypedMapAccessor accessor, String path, File file) { - boolean enableTrim = accessor.getBoolean("trim.enable", false); - if (enableTrim) { - TrimHelper trimHelper = new TrimHelper(); - TrimPattern trimPattern = trimHelper.getTrimPatterns().get(accessor.getString("trim.pattern", "").toLowerCase()); - if (trimPattern == null) { - enableTrim = false; - Bukkit.getLogger().severe("Trim pattern " + accessor.getString("trim.pattern", "") + " was not found for item " + file.getAbsolutePath()); - } - TrimMaterial trimMaterial = trimHelper.getTrimMaterials().get(accessor.getString("trim.material", "").toLowerCase()); - if (trimMaterial == null) { - enableTrim = false; - Bukkit.getLogger().severe("Trim material " + accessor.getString("trim.material", "") + " was not found for item " + file.getAbsolutePath()); - } - menuItemStack.setTrimConfiguration(new TrimConfiguration(enableTrim, trimMaterial, trimPattern)); - } - } - private static Boolean getOrNull(Object o) { - if (o instanceof Boolean) { - return (Boolean) o; - } - return null; - } - -} From 437d0537267a859bb7b9549581e343148d6a2732 Mon Sep 17 00:00:00 2001 From: 1robie <97293924+1robie@users.noreply.github.com> Date: Tue, 17 Mar 2026 21:46:21 +0100 Subject: [PATCH 2/2] fix: refactor CustomModelDataComponent to remove Optional and improve data handling + now work on paper --- .../components/CustomModelDataComponent.java | 43 +++++++------ ...gotCustomModelDataItemComponentLoader.java | 61 ++++++++++--------- .../paper/PaperCustomModelDataComponent.java | 24 ++++++++ .../PaperCustomModelDataComponentLoader.java | 49 +++++++++++++++ .../fr/maxlego08/menu/ZComponentsManager.java | 2 +- 5 files changed, 132 insertions(+), 47 deletions(-) rename {src => Common/src}/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java (55%) create mode 100644 Hooks/Paper/src/main/java/fr/maxlego08/menu/itemstack/components/paper/PaperCustomModelDataComponent.java create mode 100644 Hooks/Paper/src/main/java/fr/maxlego08/menu/loader/components/paper/PaperCustomModelDataComponentLoader.java diff --git a/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/CustomModelDataComponent.java b/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/CustomModelDataComponent.java index 5cc76743..cb3c57d9 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/CustomModelDataComponent.java +++ b/API/src/main/java/fr/maxlego08/menu/api/itemstack/components/CustomModelDataComponent.java @@ -10,35 +10,34 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Optional; public class CustomModelDataComponent extends ItemComponent { - private final @NotNull Optional<@NotNull List<@NotNull Color>> colors; - private final @NotNull Optional<@NotNull List<@NotNull Boolean>> flags; - private final @NotNull Optional<@NotNull List<@NotNull Float>> floats; - private final @NotNull Optional<@NotNull List<@NotNull String>> string; + private final @NotNull List<@NotNull Color> colors; + private final @NotNull List<@NotNull Boolean> flags; + private final @NotNull List<@NotNull Float> floats; + private final @NotNull List<@NotNull String> strings; - public CustomModelDataComponent(@NotNull Optional<@NotNull List<@NotNull Color>> colors, @NotNull Optional<@NotNull List<@NotNull Boolean>> flags, @NotNull Optional<@NotNull List<@NotNull Float>> floats, @NotNull Optional<@NotNull List<@NotNull String>> string) { + public CustomModelDataComponent(@NotNull List<@NotNull Color> colors, @NotNull List<@NotNull Boolean> flags, @NotNull List<@NotNull Float> floats, @NotNull List<@NotNull String> strings) { this.colors = colors; this.flags = flags; this.floats = floats; - this.string = string; + this.strings = strings; } - public @NotNull Optional<@NotNull List<@NotNull Color>> getColors() { + public @NotNull List<@NotNull Color> getColors() { return colors; } - public @NotNull Optional<@NotNull List<@NotNull Boolean>> getFlags() { - return flags; + public @NotNull List<@NotNull Boolean> getFlags() { + return this.flags; } - public @NotNull Optional<@NotNull List<@NotNull Float>> getFloats() { - return floats; + public @NotNull List<@NotNull Float> getFloats() { + return this.floats; } - public @NotNull Optional<@NotNull List<@NotNull String>> getString() { - return string; + public @NotNull List<@NotNull String> getStrings() { + return this.strings; } @Override @@ -47,10 +46,18 @@ public void apply(@NotNull BuildContext context, @NotNull ItemStack itemStack, @ if (itemMeta != null) { org.bukkit.inventory.meta.components.CustomModelDataComponent customModelDataComponent = itemMeta.getCustomModelDataComponent(); - this.colors.ifPresent(customModelDataComponent::setColors); - this.flags.ifPresent(customModelDataComponent::setFlags); - this.floats.ifPresent(customModelDataComponent::setFloats); - this.string.ifPresent(customModelDataComponent::setStrings); + if (!this.colors.isEmpty()) { + customModelDataComponent.setColors(this.colors); + } + if (!this.flags.isEmpty()) { + customModelDataComponent.setFlags(this.flags); + } + if (!this.floats.isEmpty()) { + customModelDataComponent.setFloats(this.floats); + } + if (!this.strings.isEmpty()) { + customModelDataComponent.setStrings(this.strings); + } itemStack.setItemMeta(itemMeta); } diff --git a/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java b/Common/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java similarity index 55% rename from src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java rename to Common/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java index 92f31e52..58d99b64 100644 --- a/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java +++ b/Common/src/main/java/fr/maxlego08/menu/loader/components/spigot/SpigotCustomModelDataItemComponentLoader.java @@ -13,7 +13,6 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import java.util.Optional; public class SpigotCustomModelDataItemComponentLoader extends AbstractColorItemComponentLoader { @@ -24,44 +23,50 @@ public SpigotCustomModelDataItemComponentLoader(){ @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; - Optional> floatList; - List floats = componentSection.getFloatList("floats"); - floatList = floats.isEmpty() ? Optional.empty() : Optional.of(floats); + List floats = getFloats(componentSection); - Optional> booleanList; - List booleans = componentSection.getBooleanList("flags"); - booleanList = booleans.isEmpty() ? Optional.empty() : Optional.of(booleans); + List booleans = getBooleans(componentSection); - Optional> stringList; - List strings = componentSection.getStringList("strings"); - stringList = strings.isEmpty() ? Optional.empty() : Optional.of(strings); + List strings = getStrings(componentSection); - Optional> colorList; - List colorsList = componentSection.getList("colors"); - if (colorsList == null || colorsList.isEmpty()) { - colorList = Optional.empty(); - } else { - List colors = new ArrayList<>(); - for (Object obj : colorsList) { - Color color = parseColor(obj); - if (color != null) { - colors.add(color); - } - } - colorList = colors.isEmpty() ? Optional.empty() : Optional.of(colors); - } + List colorList = getColors(componentSection); - if (colorList.isEmpty() && booleanList.isEmpty() && floatList.isEmpty() && stringList.isEmpty()) { + if (colorList.isEmpty() && booleans.isEmpty() && floats.isEmpty() && strings.isEmpty()) { return null; } return new CustomModelDataComponent( colorList, - booleanList, - floatList, - stringList + booleans, + floats, + strings ); } + protected @NotNull List getFloats(@NotNull ConfigurationSection section) { + return section.getFloatList("floats"); + } + + protected @NotNull List getBooleans(@NotNull ConfigurationSection section) { + return section.getBooleanList("flags"); + } + + protected @NotNull List getStrings(@NotNull ConfigurationSection section) { + return section.getStringList("strings"); + } + + protected @NotNull List getColors(@NotNull ConfigurationSection section) { + List colors = new ArrayList<>(); + List colorsList = section.getList("colors"); + if (colorsList != null) { + for (Object obj : colorsList) { + Color color = parseColor(obj); + if (color != null) { + colors.add(color); + } + } + } + return colors; + } } diff --git a/Hooks/Paper/src/main/java/fr/maxlego08/menu/itemstack/components/paper/PaperCustomModelDataComponent.java b/Hooks/Paper/src/main/java/fr/maxlego08/menu/itemstack/components/paper/PaperCustomModelDataComponent.java new file mode 100644 index 00000000..f4b1ab6d --- /dev/null +++ b/Hooks/Paper/src/main/java/fr/maxlego08/menu/itemstack/components/paper/PaperCustomModelDataComponent.java @@ -0,0 +1,24 @@ +package fr.maxlego08.menu.itemstack.components.paper; + +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.CustomModelData; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PaperCustomModelDataComponent extends ItemComponent { + private final CustomModelData customModelData; + + public PaperCustomModelDataComponent(@NotNull CustomModelData customModelData) { + this.customModelData = customModelData; + } + + @Override + public void apply(@NotNull BuildContext context, @NotNull ItemStack itemStack, @Nullable Player player) { + + itemStack.setData(DataComponentTypes.CUSTOM_MODEL_DATA, this.customModelData); + } +} diff --git a/Hooks/Paper/src/main/java/fr/maxlego08/menu/loader/components/paper/PaperCustomModelDataComponentLoader.java b/Hooks/Paper/src/main/java/fr/maxlego08/menu/loader/components/paper/PaperCustomModelDataComponentLoader.java new file mode 100644 index 00000000..cf6d6234 --- /dev/null +++ b/Hooks/Paper/src/main/java/fr/maxlego08/menu/loader/components/paper/PaperCustomModelDataComponentLoader.java @@ -0,0 +1,49 @@ +package fr.maxlego08.menu.loader.components.paper; + +import fr.maxlego08.menu.api.context.MenuItemStackContext; +import fr.maxlego08.menu.api.itemstack.ItemComponent; +import fr.maxlego08.menu.itemstack.components.paper.PaperCustomModelDataComponent; +import fr.maxlego08.menu.loader.components.spigot.SpigotCustomModelDataItemComponentLoader; +import io.papermc.paper.datacomponent.item.CustomModelData; +import org.bukkit.Color; +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.List; + +public class PaperCustomModelDataComponentLoader extends SpigotCustomModelDataItemComponentLoader { + + @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; + List floats = getFloats(componentSection); + + List booleans = getBooleans(componentSection); + + List strings = getStrings(componentSection); + + List colorList = getColors(componentSection); + + if (colorList.isEmpty() && booleans.isEmpty() && floats.isEmpty() && strings.isEmpty()) { + return null; + } + + CustomModelData.Builder builder = CustomModelData.customModelData(); + if (!colorList.isEmpty()) { + builder.addColors(colorList); + } + if (!booleans.isEmpty()) { + builder.addFlags(booleans); + } + if (!floats.isEmpty()) { + builder.addFloats(floats); + } + if (!strings.isEmpty()) { + builder.addStrings(strings); + } + return new PaperCustomModelDataComponent(builder.build()); + } +} diff --git a/src/main/java/fr/maxlego08/menu/ZComponentsManager.java b/src/main/java/fr/maxlego08/menu/ZComponentsManager.java index 757c39ce..57cb8ff1 100644 --- a/src/main/java/fr/maxlego08/menu/ZComponentsManager.java +++ b/src/main/java/fr/maxlego08/menu/ZComponentsManager.java @@ -48,7 +48,7 @@ public void initializeDefaultComponents(MenuPlugin plugin) { this.registerComponent(new SpigotContainerItemComponentLoader(plugin)); this.registerComponent(new SpigotContainerLootItemComponentLoader()); this.registerComponent(new SpigotCustomDataItemComponentLoader()); - this.registerComponent(new SpigotCustomModelDataItemComponentLoader()); + this.registerComponent(plugin.isPaperOrFolia() ? new PaperCustomModelDataComponentLoader() : new SpigotCustomModelDataItemComponentLoader()); this.registerComponent(new SpigotDamageItemComponentLoader()); this.registerComponent(new SpigotDamageResistantItemComponentLoader()); this.registerComponent(new SpigotDyedColorItemComponentLoader());