From 24ef0b6dcda0c4b49c4f3dabd61bc63939862c0f Mon Sep 17 00:00:00 2001 From: carm Date: Thu, 7 Sep 2023 03:49:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(send):=20=E6=8F=90=E4=BE=9B=E7=89=A9?= =?UTF-8?q?=E5=93=81=E9=A2=84=E5=A4=87=E6=96=B9=E6=B3=95=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E6=8F=92=E5=85=A5lore=E3=80=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=99=84=E9=AD=94=E3=80=81flags=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/pom.xml | 2 +- platform/bukkit/pom.xml | 2 +- .../bukkit/value/ConfiguredItem.java | 147 +++++++++++++++++- platform/bungee/pom.xml | 2 +- pom.xml | 2 +- 5 files changed, 148 insertions(+), 7 deletions(-) diff --git a/common/pom.xml b/common/pom.xml index 1c7cfa9..58be9f4 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -5,7 +5,7 @@ mineconfiguration-parent cc.carm.lib - 2.8.1 + 2.8.2 4.0.0 diff --git a/platform/bukkit/pom.xml b/platform/bukkit/pom.xml index 6775a69..39576e8 100644 --- a/platform/bukkit/pom.xml +++ b/platform/bukkit/pom.xml @@ -5,7 +5,7 @@ mineconfiguration-parent cc.carm.lib - 2.8.1 + 2.8.2 ../../pom.xml 4.0.0 diff --git a/platform/bukkit/src/main/java/cc/carm/lib/mineconfiguration/bukkit/value/ConfiguredItem.java b/platform/bukkit/src/main/java/cc/carm/lib/mineconfiguration/bukkit/value/ConfiguredItem.java index d550b00..1f2da63 100644 --- a/platform/bukkit/src/main/java/cc/carm/lib/mineconfiguration/bukkit/value/ConfiguredItem.java +++ b/platform/bukkit/src/main/java/cc/carm/lib/mineconfiguration/bukkit/value/ConfiguredItem.java @@ -1,23 +1,31 @@ package cc.carm.lib.mineconfiguration.bukkit.value; import cc.carm.lib.configuration.core.value.ValueManifest; +import cc.carm.lib.configuration.core.value.type.ConfiguredList; import cc.carm.lib.configuration.core.value.type.ConfiguredSection; import cc.carm.lib.mineconfiguration.bukkit.builder.item.ItemConfigBuilder; import cc.carm.lib.mineconfiguration.bukkit.utils.TextParser; import cc.carm.lib.mineconfiguration.common.utils.ParamsUtils; import com.cryptomorin.xseries.XItemStack; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class ConfiguredItem extends ConfiguredSection { + public static final @NotNull Pattern LORE_INSERT_PATTERN = Pattern.compile("^#(.*)#$"); + public static ItemConfigBuilder create() { return new ItemConfigBuilder(); } @@ -70,6 +78,10 @@ public class ConfiguredItem extends ConfiguredSection { else setLore(Arrays.asList(lore)); } + public @NotNull PreparedItem prepare(@NotNull Object... values) { + return new PreparedItem(this, values); + } + public @Nullable ItemStack get(@Nullable Player player) { return get(player, new HashMap<>()); } @@ -78,17 +90,31 @@ public class ConfiguredItem extends ConfiguredSection { return get(player, ParamsUtils.buildParams(params, values)); } + public @Nullable ItemStack get(@Nullable Player player, + @NotNull Object[] values, + @NotNull Map> inserted) { + return get(player, ParamsUtils.buildParams(params, values), inserted); + } + + public @Nullable ItemStack get(@Nullable Player player, @NotNull String[] params, @NotNull Object[] values) { return get(player, ParamsUtils.buildParams(params, values)); } - public @Nullable ItemStack get(@Nullable Player player, @NotNull Map placeholders) { + public @Nullable ItemStack get(@Nullable Player player, + @NotNull Map placeholders) { + return get(player, placeholders, new HashMap<>()); + } + + public @Nullable ItemStack get(@Nullable Player player, + @NotNull Map placeholders, + @NotNull Map> inserted) { return get(item -> { ItemMeta meta = item.getItemMeta(); if (meta == null) return; - List lore = meta.getLore(); - if (lore != null && !lore.isEmpty()) { + List lore = insertLore(meta.getLore(), inserted); + if (!lore.isEmpty()) { meta.setLore(TextParser.parseList(player, lore, placeholders)); } @@ -108,4 +134,119 @@ public class ConfiguredItem extends ConfiguredSection { }).orElse(null); } + protected static List insertLore(List original, Map> inserted) { + if (original == null) return Collections.emptyList(); + + List finalLore = new ArrayList<>(); + for (String line : original) { + if (line == null) continue; + + Matcher matcher = LORE_INSERT_PATTERN.matcher(line); + if (!matcher.matches()) { + finalLore.add(line); + } else { + String path = matcher.group(1); + Optional.ofNullable(inserted.get(path)).ifPresent(finalLore::addAll); + } + } + + return finalLore; + } + + + public static class PreparedItem { + + protected final @NotNull ConfiguredItem itemConfig; + protected final @NotNull Map> insertLore = new HashMap<>(); + + protected @NotNull Object[] values; + + protected @NotNull BiConsumer itemModifier; + protected @NotNull BiConsumer metaModifier; + + protected PreparedItem(@NotNull ConfiguredItem itemConfig, @NotNull Object[] values) { + this.itemConfig = itemConfig; + this.values = values; + itemModifier = (item, player) -> { + }; + metaModifier = (meta, player) -> { + }; + } + + public PreparedItem modifyMeta(@NotNull BiConsumer modifier) { + this.metaModifier = this.metaModifier.andThen(modifier); + return this; + } + + public PreparedItem modifyItem(@NotNull BiConsumer modifier) { + this.itemModifier = this.itemModifier.andThen(modifier); + return this; + } + + public PreparedItem insertLore(String path, List content) { + insertLore.put(path, content); + return this; + } + + public PreparedItem insertLore(String path, String... content) { + return insertLore(path, Arrays.asList(content)); + } + + public PreparedItem insertLore(String path, ConfiguredList content) { + return insertLore(path, content.copy()); + } + + public PreparedItem insertLore(String path, ConfiguredMessage content, Object... params) { + return insertLore(path, content.parse(null, params)); + } + + public PreparedItem insertLore(String path, ConfiguredMessageList content, Object... params) { + return insertLore(path, content.parse(null, params)); + } + + public PreparedItem values(Object... values) { + this.values = values; + return this; + } + + public PreparedItem amount(int amount) { + return modifyItem((item, player) -> item.setAmount(amount)); + } + + public PreparedItem addEnchantment(Enchantment e) { + return addEnchantment(e, 1); + } + + public PreparedItem addEnchantment(Enchantment e, int level) { + return addEnchantment(e, level, true); + } + + public PreparedItem addEnchantment(Enchantment e, int level, boolean ignoreLevelRestriction) { + return modifyMeta((meta, player) -> meta.addEnchant(e, level, ignoreLevelRestriction)); + } + + public PreparedItem addItemFlags(ItemFlag... flags) { + return modifyMeta((meta, player) -> meta.addItemFlags(flags)); + } + + public PreparedItem glow() { + return addItemFlags(ItemFlag.HIDE_ENCHANTS).addEnchantment(Enchantment.DURABILITY); + } + + + public @Nullable ItemStack get(Player player) { + return Optional.ofNullable(itemConfig.get(player, values, insertLore)).map(item -> { + itemModifier.accept(item, player); + + ItemMeta meta = item.getItemMeta(); + if (meta == null) return item; + + metaModifier.accept(meta, player); + item.setItemMeta(meta); + + return item; + }).orElse(null); + } + + } } diff --git a/platform/bungee/pom.xml b/platform/bungee/pom.xml index 0804a69..cad91bc 100644 --- a/platform/bungee/pom.xml +++ b/platform/bungee/pom.xml @@ -5,7 +5,7 @@ mineconfiguration-parent cc.carm.lib - 2.8.1 + 2.8.2 ../../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index a367004..63569d4 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ cc.carm.lib mineconfiguration-parent - 2.8.1 + 2.8.2 pom common