From 81ba0d589f6b3ceb4f5519bf385b1fedadc30528 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 28 May 2025 04:25:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=89=A9=E5=93=81=E5=8C=85?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitItemManager.java | 2 +- .../bukkit/item/ModernNetworkItemHandler.java | 227 +++++++++++------- 2 files changed, 136 insertions(+), 93 deletions(-) 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 0b51af970..54088f41d 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 @@ -59,7 +59,7 @@ public class BukkitItemManager extends AbstractItemManager { this.itemEventListener = new ItemEventListener(plugin); this.debugStickListener = new DebugStickListener(plugin); this.armorEventListener = new ArmorEventListener(); - this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler(this) : new LegacyNetworkItemHandler(this); + this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler() : new LegacyNetworkItemHandler(this); this.registerAllVanillaItems(); } 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 c6d40697d..654da8cfc 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,26 +1,27 @@ package net.momirealms.craftengine.bukkit.item; +import com.mojang.datafixers.util.Either; import net.kyori.adventure.text.Component; 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; +import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.ListTag; +import net.momirealms.sparrow.nbt.StringTag; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Supplier; @SuppressWarnings("DuplicatedCode") -public class ModernNetworkItemHandler implements NetworkItemHandler { - private final BukkitItemManager itemManager; - - public ModernNetworkItemHandler(BukkitItemManager itemManager) { - this.itemManager = itemManager; - } +public final class ModernNetworkItemHandler implements NetworkItemHandler { @Override public Optional> c2s(Item wrapped, ItemBuildContext context) { @@ -60,45 +61,16 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { } if (Config.interceptItem()) { if (!tag.containsKey(ComponentIds.ITEM_NAME)) { - Tag nameTag = wrapped.getNBTComponent(ComponentTypes.ITEM_NAME); - if (nameTag != null) { - String tagStr = nameTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); - if (!tokens.isEmpty()) { - wrapped.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens))); - tag.put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag)); - } - } + if (VersionHelper.isOrAbove1_21_5()) processModernItemName(wrapped, () -> tag); + else processLegacyItemName(wrapped, () -> tag); } if (!tag.containsKey(ComponentIds.CUSTOM_NAME)) { - Tag nameTag = wrapped.getNBTComponent(ComponentTypes.CUSTOM_NAME); - if (nameTag != null) { - String tagStr = nameTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); - if (!tokens.isEmpty()) { - wrapped.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens))); - tag.put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag)); - } - } + if (VersionHelper.isOrAbove1_21_5()) processModernCustomName(wrapped, () -> tag); + else processLegacyCustomName(wrapped, () -> tag); } if (!tag.containsKey(ComponentIds.LORE)) { - Tag loreTag = wrapped.getNBTComponent(ComponentTypes.LORE); - if (loreTag instanceof ListTag listTag) { - ListTag newLore = new ListTag(); - boolean changed = false; - String tagStr = listTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); - if (tokens.isEmpty()) { - newLore.add(tag); - } else { - newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens))); - changed = true; - } - if (changed) { - wrapped.setNBTComponent(ComponentKeys.LORE, newLore); - tag.put(ComponentIds.LORE, NetworkItemHandler.pack(Operation.ADD, listTag)); - } - } + if (VersionHelper.isOrAbove1_21_5()) processModernLore(wrapped, () -> tag); + else processLegacyLore(wrapped, () -> tag); } } if (tag.isEmpty()) return Optional.empty(); @@ -109,6 +81,113 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { } } + public static boolean processLegacyLore(Item item, Supplier tag) { + Optional> optionalLore = item.loreJson(); + if (optionalLore.isPresent()) { + boolean changed = false; + List lore = optionalLore.get(); + List newLore = new ArrayList<>(lore.size()); + for (String line : lore) { + Map tokens = CraftEngine.instance().fontManager().matchTags(line); + if (tokens.isEmpty()) { + newLore.add(line); + } else { + newLore.add(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens))); + changed = true; + } + } + if (changed) { + item.loreJson(newLore); + ListTag listTag = new ListTag(); + for (String line : lore) { + listTag.add(new StringTag(line)); + } + tag.get().put(ComponentIds.LORE, NetworkItemHandler.pack(Operation.ADD, listTag)); + return true; + } + } + return false; + } + + public static boolean processLegacyCustomName(Item item, Supplier tag) { + Optional optionalCustomName = item.customNameJson(); + if (optionalCustomName.isPresent()) { + String line = optionalCustomName.get(); + Map tokens = CraftEngine.instance().fontManager().matchTags(line); + if (!tokens.isEmpty()) { + item.customNameJson(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens))); + tag.get().put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, new StringTag(line))); + return true; + } + } + return false; + } + + public static boolean processLegacyItemName(Item item, Supplier tag) { + Optional optionalItemName = item.itemNameJson(); + if (optionalItemName.isPresent()) { + String line = optionalItemName.get(); + Map tokens = CraftEngine.instance().fontManager().matchTags(line); + if (!tokens.isEmpty()) { + item.itemNameJson(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens))); + tag.get().put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, new StringTag(line))); + return true; + } + } + return false; + } + + public static boolean processModernItemName(Item item, Supplier tag) { + Tag nameTag = item.getNBTComponent(ComponentTypes.ITEM_NAME); + if (nameTag == null) return false; + String tagStr = nameTag.getAsString(); + Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + if (!tokens.isEmpty()) { + item.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens))); + tag.get().put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag)); + return true; + } + return false; + } + + public static boolean processModernCustomName(Item item, Supplier tag) { + Tag nameTag = item.getNBTComponent(ComponentTypes.CUSTOM_NAME); + if (nameTag == null) return false; + String tagStr = nameTag.getAsString(); + Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + if (!tokens.isEmpty()) { + item.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens))); + tag.get().put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag)); + return true; + } + return false; + } + + public static boolean processModernLore(Item item, Supplier tagSupplier) { + Tag loreTag = item.getNBTComponent(ComponentTypes.LORE); + boolean changed = false; + if (!(loreTag instanceof ListTag listTag)) { + return false; + } + ListTag newLore = new ListTag(); + for (Tag tag : listTag) { + String tagStr = tag.getAsString(); + Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + if (tokens.isEmpty()) { + newLore.add(tag); + } else { + newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens))); + changed = true; + } + } + if (changed) { + item.setNBTComponent(ComponentKeys.LORE, newLore); + tagSupplier.get().put(ComponentIds.LORE, NetworkItemHandler.pack(Operation.ADD, listTag)); + return true; + } + return false; + } + static class OtherItem { private final Item item; private boolean globalChanged = false; @@ -119,9 +198,21 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { } public Optional> process() { - processModernLore(); - processModernCustomName(); - processModernItemName(); + if (VersionHelper.isOrAbove1_21_5()) { + if (processModernLore(this.item, this::getOrCreateTag)) + this.globalChanged = true; + if (processModernCustomName(this.item, this::getOrCreateTag)) + this.globalChanged = true; + if (processModernItemName(this.item, this::getOrCreateTag)) + this.globalChanged = true; + } else { + if (processLegacyLore(this.item, this::getOrCreateTag)) + this.globalChanged = true; + if (processLegacyCustomName(this.item, this::getOrCreateTag)) + this.globalChanged = true; + if (processLegacyItemName(this.item, this::getOrCreateTag)) + this.globalChanged = true; + } if (this.globalChanged) { CompoundTag customData = Optional.ofNullable(this.item.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag()); customData.put(NETWORK_ITEM_TAG, getOrCreateTag()); @@ -132,54 +223,6 @@ public class ModernNetworkItemHandler implements NetworkItemHandler { } } - private void processModernItemName() { - Tag nameTag = this.item.getNBTComponent(ComponentTypes.ITEM_NAME); - if (nameTag == null) return; - String tagStr = nameTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); - if (!tokens.isEmpty()) { - this.item.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens))); - this.globalChanged = true; - getOrCreateTag().put(ComponentKeys.ITEM_NAME.asString(), NetworkItemHandler.pack(Operation.ADD, nameTag)); - } - } - - private void processModernCustomName() { - Tag nameTag = this.item.getNBTComponent(ComponentTypes.CUSTOM_NAME); - if (nameTag == null) return; - String tagStr = nameTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); - if (!tokens.isEmpty()) { - this.item.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens))); - this.globalChanged = true; - getOrCreateTag().put(ComponentKeys.CUSTOM_NAME.asString(), NetworkItemHandler.pack(Operation.ADD, nameTag)); - } - } - - private void processModernLore() { - Tag loreTag = this.item.getNBTComponent(ComponentTypes.LORE); - boolean changed = false; - if (!(loreTag instanceof ListTag listTag)) { - return; - } - ListTag newLore = new ListTag(); - for (Tag tag : listTag) { - String tagStr = tag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); - if (tokens.isEmpty()) { - newLore.add(tag); - } else { - newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens))); - changed = true; - } - } - if (changed) { - this.globalChanged = true; - this.item.setNBTComponent(ComponentKeys.LORE, newLore); - getOrCreateTag().put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(Operation.ADD, listTag)); - } - } - private CompoundTag getOrCreateTag() { if (this.tag == null) { this.tag = new CompoundTag();