From b63625ba2009342889466a9ea98f409e5ac561c0 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 13 Apr 2025 17:34:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitCustomItem.java | 42 ++++++++++++------- .../item/factory/ComponentItemFactory.java | 8 ++++ .../item/factory/UniversalItemFactory.java | 8 ++++ .../craftengine/core/item/CustomItem.java | 8 ++-- .../core/item/NetworkItemDataProcessor.java | 27 ++++++++++++ .../core/item/modifier/ComponentModifier.java | 24 ++++++++--- .../modifier/CustomModelDataModifier.java | 5 +++ .../item/modifier/DisplayNameModifier.java | 5 +++ .../item/modifier/EnchantmentModifier.java | 6 +++ .../item/modifier/EquippableModifier.java | 5 +++ .../core/item/modifier/ExternalModifier.java | 5 +++ .../core/item/modifier/IdModifier.java | 5 +++ .../core/item/modifier/ItemDataModifier.java | 2 + .../core/item/modifier/ItemModelModifier.java | 7 +++- .../core/item/modifier/ItemNameModifier.java | 5 +++ .../item/modifier/JukeboxSongModifier.java | 5 +++ .../core/item/modifier/LoreModifier.java | 5 +++ .../core/item/modifier/TagsModifier.java | 7 ++++ .../item/modifier/TooltipStyleModifier.java | 5 +++ .../core/item/modifier/TrimModifier.java | 9 ++++ .../item/modifier/UnbreakableModifier.java | 9 +++- .../craftengine/core/util/ArrayUtils.java | 11 +++++ 22 files changed, 187 insertions(+), 26 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemDataProcessor.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java index 0ccf7e0fb..9b295cc80 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java @@ -3,10 +3,7 @@ package net.momirealms.craftengine.bukkit.item; import com.google.common.collect.ImmutableMap; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.MaterialUtils; -import net.momirealms.craftengine.core.item.CustomItem; -import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.item.ItemSettings; +import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.util.Key; @@ -22,13 +19,15 @@ public class BukkitCustomItem implements CustomItem { private final Key id; private final Key materialKey; private final Material material; - private final List> modifiers; + private final ItemDataModifier[] modifiers; private final Map> modifierMap; - private final List> clientBoundModifiers; + private final ItemDataModifier[] clientBoundModifiers; private final Map> clientBoundModifierMap; + private final NetworkItemDataProcessor[] networkItemDataProcessors; private final List behaviors; private final ItemSettings settings; + @SuppressWarnings("unchecked") public BukkitCustomItem(Key id, Key materialKey, Material material, @@ -39,8 +38,10 @@ public class BukkitCustomItem implements CustomItem { this.id = id; this.material = material; this.materialKey = materialKey; - this.modifiers = List.copyOf(modifiers); - this.clientBoundModifiers = List.copyOf(clientBoundModifiers); + // unchecked cast + this.modifiers = modifiers.toArray(new ItemDataModifier[0]); + // unchecked cast + this.clientBoundModifiers = clientBoundModifiers.toArray(new ItemDataModifier[0]); this.behaviors = List.copyOf(behaviors); this.settings = settings; ImmutableMap.Builder> modifierMapBuilder = ImmutableMap.builder(); @@ -49,10 +50,19 @@ public class BukkitCustomItem implements CustomItem { } this.modifierMap = modifierMapBuilder.build(); ImmutableMap.Builder> clientSideModifierMapBuilder = ImmutableMap.builder(); + List> networkItemDataProcessors = new ArrayList<>(); for (ItemDataModifier modifier : clientBoundModifiers) { - clientSideModifierMapBuilder.put(modifier.name(), modifier); + String name = modifier.name(); + clientSideModifierMapBuilder.put(name, modifier); + if (this.modifierMap.containsKey(name)) { + networkItemDataProcessors.add(NetworkItemDataProcessor.both(this.modifierMap.get(name), modifier)); + } else { + networkItemDataProcessors.add(NetworkItemDataProcessor.clientOnly(modifier)); + } } this.clientBoundModifierMap = clientSideModifierMapBuilder.build(); + // unchecked cast + this.networkItemDataProcessors = networkItemDataProcessors.toArray(new NetworkItemDataProcessor[0]); } @Override @@ -66,7 +76,12 @@ public class BukkitCustomItem implements CustomItem { } @Override - public List> dataModifiers() { + public NetworkItemDataProcessor[] networkItemDataProcessors() { + return this.networkItemDataProcessors; + } + + @Override + public ItemDataModifier[] dataModifiers() { return this.modifiers; } @@ -77,11 +92,11 @@ public class BukkitCustomItem implements CustomItem { @Override public boolean hasClientBoundDataModifier() { - return !this.clientBoundModifiers.isEmpty(); + return this.clientBoundModifiers.length != 0; } @Override - public List> clientBoundDataModifiers() { + public ItemDataModifier[] clientBoundDataModifiers() { return this.clientBoundModifiers; } @@ -93,9 +108,6 @@ public class BukkitCustomItem implements CustomItem { @Override public ItemStack buildItemStack(ItemBuildContext context, int count) { ItemStack item = new ItemStack(this.material); - if (this.modifiers.isEmpty()) { - return item; - } Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); wrapped.count(count); for (ItemDataModifier modifier : this.modifiers) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java index 07ca4d7c7..09aaacb85 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java @@ -201,6 +201,10 @@ public class ComponentItemFactory extends BukkitItemFactory { @Override protected void enchantments(ItemWrapper item, List enchantments) { + if (enchantments == null || enchantments.isEmpty()) { + item.removeComponent(ComponentKeys.ENCHANTMENTS); + return; + } Map enchants = new HashMap<>(); for (Enchantment enchantment : enchantments) { enchants.put(enchantment.id().toString(), enchantment.level()); @@ -210,6 +214,10 @@ public class ComponentItemFactory extends BukkitItemFactory { @Override protected void storedEnchantments(ItemWrapper item, List enchantments) { + if (enchantments == null || enchantments.isEmpty()) { + item.removeComponent(ComponentKeys.STORED_ENCHANTMENTS); + return; + } Map enchants = new HashMap<>(); for (Enchantment enchantment : enchantments) { enchants.put(enchantment.id().toString(), enchantment.level()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index 085c997e8..a592e3b7c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -142,6 +142,10 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected void enchantments(ItemWrapper item, List enchantments) { + if (enchantments == null || enchantments.isEmpty()) { + item.remove("Enchantments"); + return; + } ArrayList tags = new ArrayList<>(); for (Enchantment enchantment : enchantments) { tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()))); @@ -151,6 +155,10 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected void storedEnchantments(ItemWrapper item, List enchantments) { + if (enchantments == null || enchantments.isEmpty()) { + item.remove("StoredEnchantments"); + return; + } ArrayList tags = new ArrayList<>(); for (Enchantment enchantment : enchantments) { tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()))); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java index 9bdde3010..6d72163f1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -16,13 +16,15 @@ public interface CustomItem extends BuildableItem { Key material(); - List> dataModifiers(); + NetworkItemDataProcessor[] networkItemDataProcessors(); + + ItemDataModifier[] dataModifiers(); Map> dataModifierMap(); boolean hasClientBoundDataModifier(); - List> clientBoundDataModifiers(); + ItemDataModifier[] clientBoundDataModifiers(); Map> clientBoundDataModifierMap(); @@ -33,7 +35,7 @@ public interface CustomItem extends BuildableItem { } default Item buildItem(Player player) { - return buildItem(new ItemBuildContext(player, ContextHolder.EMPTY)); + return buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY)); } Item buildItem(ItemBuildContext context); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemDataProcessor.java b/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemDataProcessor.java new file mode 100644 index 000000000..c2edb48a9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemDataProcessor.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public record NetworkItemDataProcessor(@Nullable ItemDataModifier server, @NotNull ItemDataModifier client) { + + public static NetworkItemDataProcessor clientOnly(ItemDataModifier client) { + return new NetworkItemDataProcessor(null, client); + } + + public static NetworkItemDataProcessor both(ItemDataModifier server, ItemDataModifier client) { + return new NetworkItemDataProcessor(server, client); + } + + public void toClient(Item item, ItemBuildContext context) { + this.client.apply(item, context); + } + + public void toServer(Item item, ItemBuildContext context) { + this.client.remove(item); + if (this.server != null) { + this.server.apply(item, context); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java index 384cc34b6..2025d332f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java @@ -2,14 +2,21 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Pair; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class ComponentModifier implements ItemDataModifier { - private final Map arguments; + private final List> arguments; public ComponentModifier(Map arguments) { - this.arguments = arguments; + List> pairs = new ArrayList<>(arguments.size()); + for (Map.Entry entry : arguments.entrySet()) { + pairs.add(new Pair<>(entry.getKey(), entry.getValue())); + } + this.arguments = pairs; } @Override @@ -19,10 +26,15 @@ public class ComponentModifier implements ItemDataModifier { @Override public void apply(Item item, ItemBuildContext context) { - for (Map.Entry entry : arguments.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - item.setComponent(key, value); + for (Pair entry : this.arguments) { + item.setComponent(entry.left(), entry.right()); + } + } + + @Override + public void remove(Item item) { + for (Pair entry : this.arguments) { + item.removeComponent(entry.left()); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java index 31a0b3d0b..68a71ed3d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java @@ -19,4 +19,9 @@ public class CustomModelDataModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.customModelData(argument); } + + @Override + public void remove(Item item) { + item.customModelData(null); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java index 8aa5d2c20..cf468756c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java @@ -21,4 +21,9 @@ public class DisplayNameModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()))); } + + @Override + public void remove(Item item) { + item.customName(null); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java index f33382b3b..15c2137b6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java @@ -24,4 +24,10 @@ public class EnchantmentModifier implements ItemDataModifier { if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) item.setStoredEnchantments(enchantments); else item.setEnchantments(enchantments); } + + @Override + public void remove(Item item) { + if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) item.setStoredEnchantments(null); + else item.setEnchantments(null); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java index ddc3aafff..331fd6942 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java @@ -21,4 +21,9 @@ public class EquippableModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.setComponent(ComponentKeys.EQUIPPABLE, this.data.toMap()); } + + @Override + public void remove(Item item) { + item.removeComponent(ComponentKeys.EQUIPPABLE); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java index 0cf95a6e1..76219096e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java @@ -30,4 +30,9 @@ public class ExternalModifier implements ItemDataModifier { Item anotherWrapped = (Item) CraftEngine.instance().itemManager().wrap(another); item.merge(anotherWrapped); } + + @Override + public void remove(Item item) { + // cannot remove + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java index 1a2e35715..c08187ee2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java @@ -21,4 +21,9 @@ public class IdModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.setTag(argument.toString(), CRAFT_ENGINE_ID); } + + @Override + public void remove(Item item) { + item.removeTag(CRAFT_ENGINE_ID); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java index c9ce5259f..46258a96f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java @@ -8,4 +8,6 @@ public interface ItemDataModifier { String name(); void apply(Item item, ItemBuildContext context); + + void remove(Item item); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java index 5fb400aa1..7d857de0b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java @@ -19,6 +19,11 @@ public class ItemModelModifier implements ItemDataModifier { @Override public void apply(Item item, ItemBuildContext context) { - item.setComponent(ComponentKeys.ITEM_MODEL, this.data.toString()); + item.setComponent(ComponentKeys.ITEM_MODEL, this.data.toString()); + } + + @Override + public void remove(Item item) { + item.removeComponent(ComponentKeys.ITEM_MODEL); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java index ba438cc9f..8ba7e0967 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java @@ -21,4 +21,9 @@ public class ItemNameModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.itemName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()))); } + + @Override + public void remove(Item item) { + item.itemName(null); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java index 04ebde7e7..158ff690e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java @@ -31,4 +31,9 @@ public class JukeboxSongModifier implements ItemDataModifier { )); } } + + @Override + public void remove(Item item) { + item.removeComponent(ComponentKeys.JUKEBOX_PLAYABLE); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java index 356b09c83..40ef6c2c5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java @@ -24,4 +24,9 @@ public class LoreModifier implements ItemDataModifier { item.lore(argument.stream().map(it -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize( it, context.tagResolvers()))).toList()); } + + @Override + public void remove(Item item) { + item.lore(null); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java index f3744d975..7e3f33b4b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java @@ -29,6 +29,13 @@ public class TagsModifier implements ItemDataModifier { } } + @Override + public void remove(Item item) { + for (Map.Entry entry : arguments.entrySet()) { + item.removeTag(entry.getKey()); + } + } + private static Map mapToMap(final Map source) { Map resultMap = new LinkedHashMap<>(); recursiveMapProcessing(source, resultMap); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java index 9bf55c19e..753b8ae8e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java @@ -21,4 +21,9 @@ public class TooltipStyleModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.setComponent(ComponentKeys.TOOLTIP_STYLE, argument.toString()); } + + @Override + public void remove(Item item) { + item.removeComponent(ComponentKeys.TOOLTIP_STYLE); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java index ed560d4af..fd09e17b8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java @@ -33,4 +33,13 @@ public class TrimModifier implements ItemDataModifier { item.setTag(this.pattern, "Trim", "pattern"); } } + + @Override + public void remove(Item item) { + if (VersionHelper.isVersionNewerThan1_20_5()) { + item.removeComponent(ComponentKeys.TRIM); + } else { + item.removeTag("Trim"); + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java index 20c998cd4..c673c82a4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java @@ -17,6 +17,13 @@ public class UnbreakableModifier implements ItemDataModifier { @Override public void apply(Item item, ItemBuildContext context) { - item.unbreakable(argument); + item.unbreakable(this.argument); + } + + @Override + public void remove(Item item) { + if (this.argument) { + item.unbreakable(false); + } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java index e5bf13550..85e8beddd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.util; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; public class ArrayUtils { @@ -59,4 +60,14 @@ public class ArrayUtils { public static boolean isEmpty(Object[] array) { return array == null || array.length == 0; } + + public static T[] collectionToArray(Collection array, Class clazz) { + @SuppressWarnings("unchecked") + T[] res = (T[]) Array.newInstance(clazz, array.size()); + int i = 0; + for (T item : array) { + res[i++] = item; + } + return res; + } }