diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 60d9e2167..0b51af970 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -24,6 +24,7 @@ import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -48,7 +49,7 @@ public class BukkitItemManager extends AbstractItemManager { private final ItemEventListener itemEventListener; private final DebugStickListener debugStickListener; private final ArmorEventListener armorEventListener; - private final NetworkItemHandler networkItemHandler; + private final NetworkItemHandler networkItemHandler; public BukkitItemManager(BukkitCraftEngine plugin) { super(plugin); @@ -58,7 +59,7 @@ public class BukkitItemManager extends AbstractItemManager { this.itemEventListener = new ItemEventListener(plugin); this.debugStickListener = new DebugStickListener(plugin); this.armorEventListener = new ArmorEventListener(); - this.networkItemHandler = new ModernNetworkItemHandler(this); + this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler(this) : new LegacyNetworkItemHandler(this); this.registerAllVanillaItems(); } @@ -75,7 +76,9 @@ public class BukkitItemManager extends AbstractItemManager { public Optional s2c(ItemStack itemStack, ItemBuildContext context) { try { - return this.networkItemHandler.s2c(itemStack, context); + Item wrapped = wrap(itemStack); + if (wrapped == null) return Optional.empty(); + return this.networkItemHandler.s2c(wrapped, context).map(Item::load); } catch (Throwable e) { if (Config.debug()) { this.plugin.logger().warn("Failed to handle s2c items.", e); @@ -86,7 +89,9 @@ public class BukkitItemManager extends AbstractItemManager { public Optional c2s(ItemStack itemStack, ItemBuildContext context) { try { - return this.networkItemHandler.c2s(itemStack, context); + Item wrapped = wrap(itemStack); + if (wrapped == null) return Optional.empty(); + return this.networkItemHandler.c2s(wrapped, context).map(Item::load); } catch (Throwable e) { if (Config.debug()) { this.plugin.logger().warn("Failed to handle c2s items.", e); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java new file mode 100644 index 000000000..b09bf7b5c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; +import org.bukkit.inventory.ItemStack; + +import java.util.Optional; + +public class LegacyNetworkItemHandler implements NetworkItemHandler { + private final BukkitItemManager itemManager; + + public LegacyNetworkItemHandler(BukkitItemManager itemManager) { + this.itemManager = itemManager; + } + + @Override + public Optional> c2s(Item itemStack, ItemBuildContext context) { + return Optional.empty(); + } + + @Override + public Optional> s2c(Item itemStack, ItemBuildContext context) { + return Optional.empty(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java index f6f3197a1..ab90e1751 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java @@ -1,10 +1,8 @@ package net.momirealms.craftengine.bukkit.item; import net.kyori.adventure.text.Component; -import net.momirealms.craftengine.core.item.ComponentKeys; -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.*; +import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; @@ -20,7 +18,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class ModernNetworkItemHandler implements NetworkItemHandler { +public class ModernNetworkItemHandler implements NetworkItemHandler { private final BukkitItemManager itemManager; public ModernNetworkItemHandler(BukkitItemManager itemManager) { @@ -28,9 +26,7 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { } @Override - public Optional c2s(ItemStack itemStack, ItemBuildContext context) { - Item wrapped = this.itemManager.wrap(itemStack); - if (wrapped == null) return Optional.empty(); + public Optional> c2s(Item wrapped, ItemBuildContext context) { Tag customData = wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA); if (!(customData instanceof CompoundTag compoundTag)) return Optional.empty(); CompoundTag networkData = compoundTag.getCompound(NETWORK_ITEM_TAG); @@ -41,24 +37,31 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { NetworkItemHandler.apply(entry.getKey(), tag, wrapped); } } - if (compoundTag.isEmpty()) { - wrapped.resetComponent(ComponentTypes.CUSTOM_DATA); - } else { - wrapped.setNBTComponent(ComponentTypes.CUSTOM_DATA, compoundTag); - } - return Optional.of(wrapped.load()); + // todo 可能会是 !custom_data吗,不可能,绝对不可能! + if (compoundTag.isEmpty()) wrapped.resetComponent(ComponentTypes.CUSTOM_DATA); + else wrapped.setNBTComponent(ComponentTypes.CUSTOM_DATA, compoundTag); + return Optional.of(wrapped); } @Override - public Optional s2c(ItemStack itemStack, ItemBuildContext context) { - Item wrapped = this.itemManager.wrap(itemStack); - if (wrapped == null) return Optional.empty(); + public Optional> s2c(Item wrapped, ItemBuildContext context) { Optional> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isEmpty()) { if (!Config.interceptItem()) return Optional.empty(); return new OtherItem(wrapped).process(); } else { - return Optional.empty(); + CustomItem customItem = optionalCustomItem.get(); + if (!customItem.hasClientBoundDataModifier()) return Optional.empty(); + CompoundTag customData = Optional.ofNullable(wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag()); + CompoundTag tag = new CompoundTag(); + for (ItemDataModifier modifier : customItem.clientBoundDataModifiers()) { + modifier.prepareNetworkItem(wrapped, context, tag); + modifier.apply(wrapped, context); + } + if (tag.isEmpty()) return Optional.empty(); + customData.put(NETWORK_ITEM_TAG, tag); + wrapped.setNBTComponent(ComponentTypes.CUSTOM_DATA, customData); + return Optional.of(wrapped); } } @@ -71,7 +74,7 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { this.item = item; } - public Optional process() { + public Optional> process() { if (VersionHelper.isOrAbove1_21_5()) { processModernLore(); processModernCustomName(); @@ -85,7 +88,7 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { CompoundTag customData = Optional.ofNullable(this.item.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag()); customData.put(NETWORK_ITEM_TAG, getOrCreateTag()); this.item.setNBTComponent(ComponentKeys.CUSTOM_DATA, customData); - return Optional.of(this.item.load()); + return Optional.of(this.item); } else { return Optional.empty(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java index ddbf3d8ec..60b254bf7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java @@ -20,11 +20,9 @@ public abstract class AbstractCustomItem implements CustomItem { protected final Map> modifierMap; protected final ItemDataModifier[] clientBoundModifiers; protected final Map> clientBoundModifierMap; - protected final NetworkItemDataProcessor[] networkItemDataProcessors; protected final List behaviors; protected final ItemSettings settings; protected final Map>> events; - protected final Item base; @SuppressWarnings("unchecked") public AbstractCustomItem(Holder id, Key material, @@ -48,20 +46,8 @@ public abstract class AbstractCustomItem implements CustomItem { } this.modifierMap = modifierMapBuilder.build(); ImmutableMap.Builder> clientSideModifierMapBuilder = ImmutableMap.builder(); - List> networkItemDataProcessors = new ArrayList<>(); - for (ItemDataModifier modifier : clientBoundModifiers) { - 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]); - this.base = (Item) CraftEngine.instance().itemManager().wrap(CraftEngine.instance().itemManager().getVanillaItem(material).get().buildItemStack()); + } @Override @@ -86,11 +72,6 @@ public abstract class AbstractCustomItem implements CustomItem { return this.material; } - @Override - public NetworkItemDataProcessor[] networkItemDataProcessors() { - return this.networkItemDataProcessors; - } - @Override public ItemDataModifier[] dataModifiers() { return this.modifiers; 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 5d8639a8d..89078fb27 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 @@ -21,8 +21,6 @@ public interface CustomItem extends BuildableItem { Key material(); - NetworkItemDataProcessor[] networkItemDataProcessors(); - ItemDataModifier[] dataModifiers(); Map> dataModifierMap(); 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 deleted file mode 100644 index 352559f86..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemDataProcessor.java +++ /dev/null @@ -1,27 +0,0 @@ -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/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java b/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java similarity index 58% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java rename to core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java index aa2b6862f..c6d9a0138 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java @@ -1,31 +1,37 @@ -package net.momirealms.craftengine.bukkit.item; +package net.momirealms.craftengine.core.item; -import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.util.TriConsumer; import net.momirealms.sparrow.nbt.ByteTag; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; -import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.Optional; -public interface NetworkItemHandler { +public interface NetworkItemHandler { Operation[] BY_INDEX = new Operation[] {Operation.ADD, Operation.REMOVE, Operation.RESET}; String NETWORK_ITEM_TAG = "craftengine:network"; String NETWORK_OPERATION = "type"; String NETWORK_VALUE = "value"; - Optional s2c(ItemStack itemStack, ItemBuildContext context); + Optional> s2c(Item itemStack, ItemBuildContext context); - Optional c2s(ItemStack itemStack, ItemBuildContext context); + Optional> c2s(Item itemStack, ItemBuildContext context); - static CompoundTag pack(Operation operation, Tag value) { - return new CompoundTag(Map.of(NETWORK_OPERATION, operation.tag(), NETWORK_VALUE, value)); + static CompoundTag pack(Operation operation, @Nullable Tag value) { + if (value == null) { + return new CompoundTag(Map.of(NETWORK_OPERATION, operation.tag())); + } else { + return new CompoundTag(Map.of(NETWORK_OPERATION, operation.tag(), NETWORK_VALUE, value)); + } } - static void apply(String componentType, CompoundTag networkData, Item item) { + static CompoundTag pack(Operation operation) { + return new CompoundTag(Map.of(NETWORK_OPERATION, operation.tag())); + } + + static void apply(String componentType, CompoundTag networkData, Item item) { byte index = networkData.getByte(NETWORK_OPERATION); Operation operation = BY_INDEX[index]; operation.consumer.accept(item, componentType, operation == Operation.ADD ? networkData.get(NETWORK_VALUE) : null); @@ -38,9 +44,9 @@ public interface NetworkItemHandler { private final int id; private final ByteTag tag; - private final TriConsumer, String, Tag> consumer; + private final TriConsumer, String, Tag> consumer; - Operation(int id, TriConsumer, String, Tag> consumer) { + Operation(int id, TriConsumer, String, Tag> consumer) { this.id = id; this.tag = new ByteTag((byte) id); this.consumer = consumer; 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 d13e28e4b..5c769b2bc 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 @@ -5,9 +5,12 @@ import com.google.gson.JsonObject; import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Pair; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; import java.util.ArrayList; import java.util.List; @@ -75,18 +78,13 @@ public class ComponentModifier implements ItemDataModifier { } @Override - public void remove(Item item) { + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { for (Pair entry : this.arguments) { - item.resetComponent(entry.left()); - } - if (this.customData != null) { - JsonObject tag = (JsonObject) item.getJavaComponent(ComponentKeys.CUSTOM_DATA); - if (tag != null) { - // crude method - for (String key : this.customData.keySet()) { - tag.remove(key); - } - item.setComponent(ComponentKeys.CUSTOM_DATA, tag); + Tag previous = item.getNBTComponent(entry.left()); + if (previous != null) { + networkData.put(entry.left().asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(entry.left().asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } } 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 68a71ed3d..359b7b50d 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 @@ -1,7 +1,12 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; public class CustomModelDataModifier implements ItemDataModifier { private final int argument; @@ -21,7 +26,14 @@ public class CustomModelDataModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - item.customModelData(null); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + if (VersionHelper.isOrAbove1_20_5()) { + Tag previous = item.getNBTComponent(ComponentKeys.CUSTOM_MODEL_DATA); + if (previous != null) { + networkData.put(ComponentKeys.CUSTOM_MODEL_DATA.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.CUSTOM_MODEL_DATA.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java index 6814092ce..aca62cdcd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java @@ -1,9 +1,14 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; public class CustomNameModifier implements ItemDataModifier { private final String argument; @@ -23,7 +28,14 @@ public class CustomNameModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - item.customNameJson(null); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + if (VersionHelper.isOrAbove1_20_5()) { + Tag previous = item.getNBTComponent(ComponentKeys.CUSTOM_NAME); + if (previous != null) { + networkData.put(ComponentKeys.CUSTOM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.CUSTOM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } } } 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 15c2137b6..54c5ad10f 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 @@ -21,13 +21,10 @@ public class EnchantmentModifier implements ItemDataModifier { @Override public void apply(Item item, ItemBuildContext context) { - 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); + if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) { + item.setStoredEnchantments(this.enchantments); + } else { + item.setEnchantments(this.enchantments); + } } } 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 1f470455d..52845cb07 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 @@ -20,9 +20,4 @@ public class EquippableModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.equippable(this.data); } - - @Override - public void remove(Item item) { - item.equippable(null); - } } 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 76219096e..0cf95a6e1 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,9 +30,4 @@ 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 4ed13c5a0..e82c960dc 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,9 +21,4 @@ public class IdModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.customId(this.argument); } - - @Override - public void remove(Item item) { - // WHY DO YOU WANT TO REMOVE CRAFTENGINE 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 46258a96f..73720c53a 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 @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.sparrow.nbt.CompoundTag; public interface ItemDataModifier { @@ -9,5 +10,6 @@ public interface ItemDataModifier { void apply(Item item, ItemBuildContext context); - void remove(Item item); + default void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + } } 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 b2e1b031b..50cb28f68 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 @@ -1,8 +1,13 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; public class ItemModelModifier implements ItemDataModifier { private final Key data; @@ -22,7 +27,12 @@ public class ItemModelModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - item.itemModel(null); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + Tag previous = item.getNBTComponent(ComponentKeys.ITEM_MODEL); + if (previous != null) { + networkData.put(ComponentKeys.ITEM_MODEL.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.ITEM_MODEL.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } } } 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 b575874f0..1655179e4 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 @@ -1,9 +1,14 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; public class ItemNameModifier implements ItemDataModifier { private final String argument; @@ -23,7 +28,14 @@ public class ItemNameModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - item.itemNameJson(null); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + if (VersionHelper.isOrAbove1_20_5()) { + Tag previous = item.getNBTComponent(ComponentKeys.ITEM_NAME); + if (previous != null) { + networkData.put(ComponentKeys.ITEM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.ITEM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } } } 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 6f323c087..b8523edd2 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 @@ -20,9 +20,4 @@ public class JukeboxSongModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.jukeboxSong(this.song); } - - @Override - public void remove(Item item) { - item.jukeboxSong(null); - } } 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 5bda4c5d5..0b2a8e412 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 @@ -1,9 +1,14 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; import java.util.List; @@ -26,7 +31,14 @@ public class LoreModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - item.loreJson(null); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + if (VersionHelper.isOrAbove1_20_5()) { + Tag previous = item.getNBTComponent(ComponentKeys.LORE); + if (previous != null) { + networkData.put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java index b44deeca0..90dbb508c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java @@ -2,6 +2,9 @@ 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.item.NetworkItemHandler; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; import java.util.Collections; import java.util.List; @@ -24,13 +27,18 @@ public class RemoveComponentModifier implements ItemDataModifier { @Override public void apply(Item item, ItemBuildContext context) { - for (String argument : arguments) { + for (String argument : this.arguments) { item.removeComponent(argument); } } @Override - public void remove(Item item) { - // I can't guess + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + for (String component : this.arguments) { + Tag previous = item.getNBTComponent(component); + if (previous != null) { + networkData.put(component, NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } + } } } 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 69c29c859..c49ae4cbc 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 @@ -33,13 +33,6 @@ 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 3e078af4b..36ebfed1d 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 @@ -1,8 +1,13 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; public class TooltipStyleModifier implements ItemDataModifier { private final Key argument; @@ -22,7 +27,12 @@ public class TooltipStyleModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - item.tooltipStyle(null); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + Tag previous = item.getNBTComponent(ComponentKeys.TOOLTIP_STYLE); + if (previous != null) { + networkData.put(ComponentKeys.TOOLTIP_STYLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.TOOLTIP_STYLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } } } 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 011809750..e3a9e5cf1 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 @@ -22,9 +22,4 @@ public class TrimModifier implements ItemDataModifier { public void apply(Item item, ItemBuildContext context) { item.trim(new Trim(this.material, this.pattern)); } - - @Override - public void remove(Item item) { - item.trim(null); - } } 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 c673c82a4..3e3f2b93c 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 @@ -1,7 +1,12 @@ package net.momirealms.craftengine.core.item.modifier; +import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.NetworkItemHandler; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; public class UnbreakableModifier implements ItemDataModifier { private final boolean argument; @@ -21,9 +26,14 @@ public class UnbreakableModifier implements ItemDataModifier { } @Override - public void remove(Item item) { - if (this.argument) { - item.unbreakable(false); + public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + if (VersionHelper.isOrAbove1_20_5()) { + Tag previous = item.getNBTComponent(ComponentKeys.UNBREAKABLE); + if (previous != null) { + networkData.put(ComponentKeys.UNBREAKABLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.UNBREAKABLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } } } }