diff --git a/platform/bukkit/base/src/main/java/cc/carm/lib/mineconfiguration/bukkit/builder/item/ItemConfigBuilder.java b/platform/bukkit/base/src/main/java/cc/carm/lib/mineconfiguration/bukkit/builder/item/ItemConfigBuilder.java index 6a37d90..dc6dc3d 100644 --- a/platform/bukkit/base/src/main/java/cc/carm/lib/mineconfiguration/bukkit/builder/item/ItemConfigBuilder.java +++ b/platform/bukkit/base/src/main/java/cc/carm/lib/mineconfiguration/bukkit/builder/item/ItemConfigBuilder.java @@ -5,13 +5,12 @@ import cc.carm.lib.mineconfiguration.bukkit.data.ItemConfig; import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredItem; import cc.carm.lib.mineconfiguration.common.utils.ParamsUtils; import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.function.Function; public class ItemConfigBuilder extends AbstractCraftBuilder { @@ -21,6 +20,9 @@ public class ItemConfigBuilder extends AbstractCraftBuilder lore = new ArrayList<>(); + protected Map enchants = new LinkedHashMap<>(); + protected Set flags = new LinkedHashSet<>(); + protected @NotNull String[] params = new String[0]; protected @NotNull Function<@NotNull String, @NotNull String> paramFormatter = ParamsUtils.DEFAULT_PARAM_FORMATTER; @@ -63,6 +65,24 @@ public class ItemConfigBuilder extends AbstractCraftBuilder enchants) { + this.enchants = new LinkedHashMap<>(enchants); + return this; + } + + public ItemConfigBuilder defaultEnchant(@NotNull Enchantment enchant, int level) { + return defaultEnchants(Collections.singletonMap(enchant, level)); + } + + public ItemConfigBuilder defaultFlags(@NotNull Set flags) { + this.flags = new LinkedHashSet<>(flags); + return this; + } + + public ItemConfigBuilder defaultFlags(@NotNull ItemFlag... flags) { + return defaultFlags(new LinkedHashSet<>(Arrays.asList(flags))); + } + public ItemConfigBuilder formatParam(@NotNull Function<@NotNull String, @NotNull String> paramFormatter) { this.paramFormatter = paramFormatter; return getThis(); @@ -85,7 +105,7 @@ public class ItemConfigBuilder extends AbstractCraftBuilder lore; + protected @NotNull Map enchants; + protected @NotNull Set flags; + public ItemConfig(@NotNull Material type, short damage, - @Nullable String name, @NotNull List lore) { + @Nullable String name, @NotNull List lore, + @NotNull Map enchants, + @NotNull Set flags) { this.type = type; this.data = damage; this.name = name; this.lore = lore; + this.enchants = enchants; + this.flags = flags; } public @NotNull Material getType() { @@ -75,6 +85,8 @@ public class ItemConfig { if (meta == null) return item; Optional.ofNullable(getName(player, placeholders)).ifPresent(meta::setDisplayName); Optional.ofNullable(getLore(player, placeholders)).ifPresent(meta::setLore); + enchants.forEach((enchant, level) -> meta.addEnchant(enchant, level, true)); + flags.forEach(meta::addItemFlags); item.setItemMeta(meta); return item; } @@ -86,6 +98,18 @@ public class ItemConfig { if (name != null) map.put("name", name); if (!lore.isEmpty()) map.put("lore", lore); + Map enchantments = new LinkedHashMap<>(); + enchants.forEach((enchant, level) -> { + if (level > 0) enchantments.put(enchant.getName(), level); + }); + + if (!enchantments.isEmpty()) { + map.put("enchants", enchantments); + } + + if (!flags.isEmpty()) { + map.put("flags", flags.stream().map(ItemFlag::name).collect(Collectors.toSet())); + } return map; } @@ -95,11 +119,41 @@ public class ItemConfig { Material type = Material.matchMaterial(typeName); if (type == null) throw new Exception("Invalid material name: " + typeName); - else return new ItemConfig( - type, section.getShort("data", (short) 0), - section.getString("name"), - section.getStringList("lore") - ); + + short data = section.getShort("data", (short) 0); + String name = section.getString("name"); + List lore = section.getStringList("lore"); + + Map enchantments = readEnchantments(section.getConfigurationSection("enchants")); + Set flags = readFlags(section.getStringList("flags")); + + return new ItemConfig(type, data, name, lore, enchantments, flags); + } + + private static ItemFlag parseFlag(String flagName) { + return Arrays.stream(ItemFlag.values()).filter(flag -> flag.name().equalsIgnoreCase(flagName)).findFirst().orElse(null); + } + + private static Set readFlags(List flagConfig) { + Set flags = new LinkedHashSet<>(); + for (String flagName : flagConfig) { + ItemFlag flag = parseFlag(flagName); + if (flag != null) flags.add(flag); + } + return flags; + } + + private static Map readEnchantments(ConfigurationWrapper section) { + Map enchantments = new LinkedHashMap<>(); + if (section == null) return enchantments; + section.getKeys(false).forEach(key -> { + Enchantment enchantment = Enchantment.getByName(key); + int level = section.getInt(key, 0); + if (enchantment != null && level > 0) { + enchantments.put(enchantment, level); + } + }); + return enchantments; } }