From e6564af5bdbdcac435a990f1026a1b9964b8f478 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 27 May 2025 17:03:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=88=E6=9B=B4=E6=96=B0=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 1 + .../bukkit/item/BukkitItemManager.java | 29 +- .../bukkit/item/ComponentItemWrapper.java | 1 + .../bukkit/item/LegacyNetworkItemHandler.java | 69 ++++ .../bukkit/item/NetworkItemHandler.java | 13 + .../plugin/network/BukkitNetworkManager.java | 5 +- .../plugin/network/PacketConsumers.java | 339 ++++-------------- .../core/font/AbstractFontManager.java | 3 +- .../core/plugin/config/Config.java | 6 + .../core/plugin/dependency/Dependencies.java | 5 +- .../core/util/AdventureHelper.java | 13 + gradle.properties | 2 +- 12 files changed, 176 insertions(+), 310 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index b0133160f..b01304628 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -214,6 +214,7 @@ image: entity-name: false armor-stand: true # Legacy Holograms text-display: true # Modern Holograms + item: true # Defines Unicode characters used for positioning # - Must match the font defined in resource packs # - Do NOT modify unless you understand text rendering mechanics 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 724ff7f4c..b1352aa35 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 @@ -21,7 +21,6 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import org.bukkit.Bukkit; @@ -32,11 +31,9 @@ import org.bukkit.event.HandlerList; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Optional; import java.util.Set; -import java.util.function.Function; public class BukkitItemManager extends AbstractItemManager { static { @@ -50,6 +47,7 @@ public class BukkitItemManager extends AbstractItemManager { private final ItemEventListener itemEventListener; private final DebugStickListener debugStickListener; private final ArmorEventListener armorEventListener; + private final NetworkItemHandler networkItemHandler; public BukkitItemManager(BukkitCraftEngine plugin) { super(plugin); @@ -59,6 +57,7 @@ public class BukkitItemManager extends AbstractItemManager { this.itemEventListener = new ItemEventListener(plugin); this.debugStickListener = new DebugStickListener(plugin); this.armorEventListener = new ArmorEventListener(); + this.networkItemHandler = new LegacyNetworkItemHandler(this); this.registerAllVanillaItems(); } @@ -73,32 +72,12 @@ public class BukkitItemManager extends AbstractItemManager { return instance; } - @SuppressWarnings("DuplicatedCode") public Optional s2c(ItemStack itemStack, ItemBuildContext context) { - Item wrapped = this.wrap(itemStack.clone()); - if (wrapped == null) return Optional.empty(); - Optional> customItem = wrapped.getCustomItem(); - if (customItem.isEmpty()) return Optional.empty(); - CustomItem custom = customItem.get(); - if (!custom.hasClientBoundDataModifier()) return Optional.empty(); - for (NetworkItemDataProcessor processor : custom.networkItemDataProcessors()) { - processor.toClient(wrapped, context); - } - return Optional.of(wrapped.load()); + return this.networkItemHandler.s2c(itemStack, context); } - @SuppressWarnings("DuplicatedCode") public Optional c2s(ItemStack itemStack, ItemBuildContext context) { - Item wrapped = this.wrap(itemStack); - if (wrapped == null) return Optional.empty(); - Optional> customItem = wrapped.getCustomItem(); - if (customItem.isEmpty()) return Optional.empty(); - CustomItem custom = customItem.get(); - if (!custom.hasClientBoundDataModifier()) return Optional.empty(); - for (NetworkItemDataProcessor processor : custom.networkItemDataProcessors()) { - processor.toServer(wrapped, context); - } - return Optional.of(wrapped.load()); + return this.networkItemHandler.c2s(itemStack, context); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java index c4bdbc860..1ffb12708 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.item; import com.google.gson.JsonElement; +import com.saicone.rtag.RtagItem; import com.saicone.rtag.data.ComponentType; import com.saicone.rtag.tag.TagBase; import net.momirealms.craftengine.bukkit.nms.FastNMS; 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..8e7a1d159 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.kyori.adventure.text.Component; +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.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class LegacyNetworkItemHandler implements NetworkItemHandler { + private final BukkitItemManager itemManager; + + public LegacyNetworkItemHandler(BukkitItemManager itemManager) { + this.itemManager = itemManager; + } + + @Override + public Optional c2s(ItemStack itemStack, ItemBuildContext context) { + Item wrapped = this.itemManager.wrap(itemStack); + if (wrapped == null) return Optional.empty(); + + return Optional.empty(); + } + + @Override + public Optional s2c(ItemStack itemStack, ItemBuildContext context) { + Item wrapped = this.itemManager.wrap(itemStack); + if (wrapped == null) return Optional.empty(); + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isEmpty()) { + return s2cOtherItems(wrapped, context); + } else { + return Optional.empty(); + } + } + + private Optional s2cOtherItems(Item item, ItemBuildContext context) { + if (!Config.interceptItem()) return Optional.empty(); + +// Optional> optionalLore = item.lore(); +// 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.lore(newLore); +// } +// } +// + return Optional.empty(); + + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java new file mode 100644 index 000000000..22b2f7881 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.core.item.ItemBuildContext; +import org.bukkit.inventory.ItemStack; + +import java.util.Optional; + +public interface NetworkItemHandler { + + Optional s2c(ItemStack itemStack, ItemBuildContext context); + + Optional c2s(ItemStack itemStack, ItemBuildContext context); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index f5989d70a..f8ae2831d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -178,10 +178,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_SLOT, this.packetIds.clientboundContainerSetSlotPacket()); registerByteBufPacketConsumer(PacketConsumers.SET_CURSOR_ITEM, this.packetIds.clientboundSetCursorItemPacket()); registerByteBufPacketConsumer(PacketConsumers.SET_EQUIPMENT, this.packetIds.clientboundSetEquipmentPacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_PLAYER_INVENTORY, this.packetIds.clientboundSetPlayerInventoryPacket()); + registerByteBufPacketConsumer(PacketConsumers.SET_PLAYER_INVENTORY_1_21_2, this.packetIds.clientboundSetPlayerInventoryPacket()); registerByteBufPacketConsumer(PacketConsumers.SET_CREATIVE_MODE_SLOT, this.packetIds.serverboundSetCreativeModeSlotPacket()); - registerByteBufPacketConsumer(PacketConsumers.CONTAINER_CLICK, this.packetIds.serverboundContainerClickPacket()); - + registerByteBufPacketConsumer(PacketConsumers.CONTAINER_CLICK_1_20, this.packetIds.serverboundContainerClickPacket()); } public static BukkitNetworkManager instance() { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 94130f7f1..7171b67f2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -5,7 +5,6 @@ import com.mojang.datafixers.util.Either; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; @@ -339,23 +338,12 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); String name = buf.readUtf(); byte method = buf.readByte(); - if (method != 2 && method != 0) { - return; - } + if (method != 2 && method != 0) return; Tag displayName = buf.readNbt(false); if (displayName == null) return; byte friendlyFlags = buf.readByte(); - - Either eitherVisibility; - Either eitherCollisionRule; - - if (VersionHelper.isOrAbove1_21_5()) { - eitherVisibility = Either.right(buf.readVarInt()); - eitherCollisionRule = Either.right(buf.readVarInt()); - } else { - eitherVisibility = Either.left(buf.readUtf(40)); - eitherCollisionRule = Either.left(buf.readUtf(40)); - } + Either eitherVisibility = VersionHelper.isOrAbove1_21_5() ? Either.right(buf.readVarInt()) : Either.left(buf.readUtf(40)); + Either eitherCollisionRule = VersionHelper.isOrAbove1_21_5() ? Either.right(buf.readVarInt()) : Either.left(buf.readUtf(40)); int color = buf.readVarInt(); Tag prefix = buf.readNbt(false); if (prefix == null) return; @@ -366,55 +354,19 @@ public class PacketConsumers { Map tokens2 = CraftEngine.instance().fontManager().matchTags(prefix.getAsString()); Map tokens3 = CraftEngine.instance().fontManager().matchTags(suffix.getAsString()); if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; + List entities = method == 0 ? buf.readStringList() : null; event.setChanged(true); - - List entities; - if (method == 0) { - entities = buf.readStringList(); - } else { - entities = null; - } - buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUtf(name); buf.writeByte(method); - - if (!tokens1.isEmpty()) { - Component component = AdventureHelper.tagToComponent(displayName); - for (Map.Entry token : tokens1.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(displayName, false); - } - + buf.writeNbt(tokens1.isEmpty() ? displayName : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(displayName), tokens1)), false); buf.writeByte(friendlyFlags); eitherVisibility.ifLeft(buf::writeUtf).ifRight(buf::writeVarInt); eitherCollisionRule.ifLeft(buf::writeUtf).ifRight(buf::writeVarInt); buf.writeVarInt(color); - - if (!tokens2.isEmpty()) { - Component component = AdventureHelper.tagToComponent(prefix); - for (Map.Entry token : tokens2.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(prefix, false); - } - - if (!tokens3.isEmpty()) { - Component component = AdventureHelper.tagToComponent(suffix); - for (Map.Entry token : tokens3.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(suffix, false); - } - + buf.writeNbt(tokens2.isEmpty() ? prefix : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(prefix), tokens2)), false); + buf.writeNbt(tokens3.isEmpty() ? suffix : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(suffix), tokens3)), false); if (entities != null) { buf.writeStringList(entities); } @@ -432,8 +384,7 @@ public class PacketConsumers { return; } EnumSet> enums = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$actions(packet); - outer: - { + outer: { for (Object entry : enums) { if (entry == Reflections.instance$ClientboundPlayerInfoUpdatePacket$Action$UPDATE_DISPLAY_NAME) { break outer; @@ -441,28 +392,23 @@ public class PacketConsumers { } return; } - boolean isChanged = false; List newEntries = new MarkedArrayList<>(); for (Object entry : entries) { Object mcComponent = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$Entry$displayName(entry); if (mcComponent == null) { newEntries.add(entry); - continue; + } else { + String json = ComponentUtils.minecraftToJson(mcComponent); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); + if (tokens.isEmpty()) { + newEntries.add(entry); + } else { + Object newEntry = FastNMS.INSTANCE.constructor$ClientboundPlayerInfoUpdatePacket$Entry(entry, ComponentUtils.adventureToMinecraft(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); + newEntries.add(newEntry); + isChanged = true; + } } - String json = ComponentUtils.minecraftToJson(mcComponent); - Map tokens = CraftEngine.instance().fontManager().matchTags(json); - if (tokens.isEmpty()) { - newEntries.add(entry); - continue; - } - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - Object newEntry = FastNMS.INSTANCE.constructor$ClientboundPlayerInfoUpdatePacket$Entry(entry, ComponentUtils.adventureToMinecraft(component)); - newEntries.add(newEntry); - isChanged = true; } if (isChanged) { event.replacePacket(FastNMS.INSTANCE.constructor$ClientboundPlayerInfoUpdatePacket(enums, newEntries)); @@ -478,9 +424,8 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); String name = buf.readUtf(); byte method = buf.readByte(); - if (method != 2 && method != 0) { + if (method != 2 && method != 0) return; - } String displayName = buf.readUtf(); byte friendlyFlags = buf.readByte(); String nameTagVisibility = buf.readUtf(40); @@ -495,53 +440,18 @@ public class PacketConsumers { if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; event.setChanged(true); - List entities; - if (method == 0) { - entities = buf.readStringList(); - } else { - entities = null; - } - + List entities = method == 0 ? buf.readStringList() : null; buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUtf(name); buf.writeByte(method); - - if (!tokens1.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(displayName); - for (Map.Entry token : tokens1.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeUtf(AdventureHelper.componentToJson(component)); - } else { - buf.writeUtf(displayName); - } - + buf.writeUtf(tokens1.isEmpty() ? displayName : AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(displayName), tokens1))); buf.writeByte(friendlyFlags); buf.writeUtf(nameTagVisibility); buf.writeUtf(collisionRule); buf.writeVarInt(color); - - if (!tokens2.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(prefix); - for (Map.Entry token : tokens2.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeUtf(AdventureHelper.componentToJson(component)); - } else { - buf.writeUtf(prefix); - } - - if (!tokens3.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(suffix); - for (Map.Entry token : tokens3.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeUtf(AdventureHelper.componentToJson(component)); - } else { - buf.writeUtf(suffix); - } - + buf.writeUtf(tokens2.isEmpty() ? prefix : AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(prefix), tokens2))); + buf.writeUtf(tokens3.isEmpty() ? suffix : AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(suffix), tokens3))); if (entities != null) { buf.writeStringList(entities); } @@ -560,10 +470,6 @@ public class PacketConsumers { String json = buf.readUtf(); Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } float health = buf.readFloat(); int color = buf.readVarInt(); int division = buf.readVarInt(); @@ -573,7 +479,7 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUUID(uuid); buf.writeVarInt(actionType); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); buf.writeFloat(health); buf.writeVarInt(color); buf.writeVarInt(division); @@ -583,15 +489,11 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUUID(uuid); buf.writeVarInt(actionType); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e); @@ -609,10 +511,6 @@ public class PacketConsumers { if (nbt == null) return; Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } float health = buf.readFloat(); int color = buf.readVarInt(); int division = buf.readVarInt(); @@ -622,7 +520,7 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUUID(uuid); buf.writeVarInt(actionType); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); buf.writeFloat(health); buf.writeVarInt(color); buf.writeVarInt(division); @@ -633,15 +531,11 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUUID(uuid); buf.writeVarInt(actionType); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e); @@ -660,15 +554,11 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(displayName); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(displayName); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUtf(objective); buf.writeByte(mode); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(displayName), tokens))); buf.writeVarInt(renderType); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetObjectivePacket", e); @@ -692,15 +582,11 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.tagToComponent(displayName); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUtf(objective); buf.writeByte(mode); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(displayName), tokens)), false); buf.writeVarInt(renderType); buf.writeBoolean(true); buf.writeVarInt(0); @@ -709,15 +595,11 @@ public class PacketConsumers { if (tokens.isEmpty()) return; Tag style = buf.readNbt(false); event.setChanged(true); - Component component = AdventureHelper.tagToComponent(displayName); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUtf(objective); buf.writeByte(mode); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(displayName), tokens)), false); buf.writeVarInt(renderType); buf.writeBoolean(true); buf.writeVarInt(1); @@ -733,41 +615,21 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUtf(objective); buf.writeByte(mode); - if (!tokens1.isEmpty()) { - Component component = AdventureHelper.tagToComponent(displayName); - for (Map.Entry token : tokens1.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(displayName, false); - } + buf.writeNbt(tokens1.isEmpty() ? displayName : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(displayName), tokens1)), false); buf.writeVarInt(renderType); buf.writeBoolean(true); buf.writeVarInt(2); - if (!tokens2.isEmpty()) { - Component component = AdventureHelper.tagToComponent(fixed); - for (Map.Entry token : tokens2.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(fixed, false); - } + buf.writeNbt(tokens2.isEmpty() ? fixed : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(fixed), tokens2)), false); } } else { Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.tagToComponent(displayName); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeUtf(objective); buf.writeByte(mode); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(displayName), tokens)), false); buf.writeVarInt(renderType); buf.writeBoolean(false); } @@ -785,13 +647,9 @@ public class PacketConsumers { if (tokens.isEmpty()) return; boolean overlay = buf.readBoolean(); event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(jsonOrPlainString); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(jsonOrPlainString), tokens))); buf.writeBoolean(overlay); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); @@ -808,13 +666,9 @@ public class PacketConsumers { if (tokens.isEmpty()) return; boolean overlay = buf.readBoolean(); event.setChanged(true); - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); buf.writeBoolean(overlay); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); @@ -829,13 +683,9 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); } @@ -850,13 +700,9 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); } @@ -870,13 +716,9 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); } @@ -891,13 +733,9 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); } @@ -911,13 +749,9 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); } @@ -932,13 +766,9 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); } @@ -956,26 +786,10 @@ public class PacketConsumers { event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); - if (!tokens1.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(json1); - for (Map.Entry token : tokens1.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeUtf(AdventureHelper.componentToJson(component)); - } else { - buf.writeUtf(json1); - } - if (!tokens2.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(json2); - for (Map.Entry token : tokens2.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeUtf(AdventureHelper.componentToJson(component)); - } else { - buf.writeUtf(json2); - } + buf.writeUtf(tokens1.isEmpty() ? json1 : AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json1), tokens1))); + buf.writeUtf(tokens2.isEmpty() ? json2 : AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json2), tokens2))); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundTabListPacket", e); } }; @@ -993,26 +807,10 @@ public class PacketConsumers { event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); - if (!tokens1.isEmpty()) { - Component component = AdventureHelper.tagToComponent(nbt1); - for (Map.Entry token : tokens1.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(nbt1, false); - } - if (!tokens2.isEmpty()) { - Component component = AdventureHelper.tagToComponent(nbt2); - for (Map.Entry token : tokens2.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - buf.writeNbt(AdventureHelper.componentToTag(component), false); - } else { - buf.writeNbt(nbt2, false); - } + buf.writeNbt(tokens1.isEmpty() ? nbt1 : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt1), tokens1)), false); + buf.writeNbt(tokens2.isEmpty() ? nbt2 : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt2), tokens2)), false); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundTabListPacket", e); } }; @@ -1026,15 +824,11 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeVarInt(containerId); buf.writeVarInt(type); - buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeUtf(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(json), tokens))); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); } @@ -1050,15 +844,11 @@ public class PacketConsumers { if (nbt == null) return; Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; - Component component = AdventureHelper.tagToComponent(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } buf.clear(); buf.writeVarInt(event.packetID()); buf.writeVarInt(containerId); buf.writeVarInt(type); - buf.writeNbt(AdventureHelper.componentToTag(component), false); + buf.writeNbt(AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(nbt), tokens)), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); } @@ -1979,7 +1769,8 @@ public class PacketConsumers { Object payload = Reflections.field$ServerboundCustomPayloadPacket$payload.get(packet); if (Reflections.clazz$DiscardedPayload.isInstance(payload)) { Payload discardedPayload = DiscardedPayload.from(payload); - if (discardedPayload == null || !discardedPayload.channel().equals(NetworkManager.MOD_CHANNEL_KEY)) return; + if (discardedPayload == null || !discardedPayload.channel().equals(NetworkManager.MOD_CHANNEL_KEY)) + return; FriendlyByteBuf buf = discardedPayload.toBuffer(); NetWorkDataTypes dataType = NetWorkDataTypes.readType(buf); if (dataType == NetWorkDataTypes.CLIENT_CUSTOM_BLOCK) { @@ -2231,10 +2022,10 @@ public class PacketConsumers { Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); int entity = buf.readVarInt(); List> slots = Lists.newArrayList(); - int _byte; + int slotMask; do { - _byte = buf.readByte(); - Object equipmentSlot = Reflections.instance$EquipmentSlot$values[_byte & 127]; + slotMask = buf.readByte(); + Object equipmentSlot = Reflections.instance$EquipmentSlot$values[slotMask & 127]; ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); Optional optional = BukkitItemManager.instance().s2c(itemStack, context); if (optional.isPresent()) { @@ -2242,7 +2033,7 @@ public class PacketConsumers { itemStack = optional.get(); } slots.add(com.mojang.datafixers.util.Pair.of(equipmentSlot, itemStack)); - } while ((_byte & -128) != 0); + } while ((slotMask & -128) != 0); if (changed) { event.setChanged(true); buf.clear(); @@ -2250,7 +2041,7 @@ public class PacketConsumers { buf.writeVarInt(entity); int i = slots.size(); Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); - for(int j = 0; j < i; ++j) { + for (int j = 0; j < i; ++j) { com.mojang.datafixers.util.Pair pair = slots.get(j); Enum equipmentSlot = (Enum) pair.getFirst(); boolean bl = j != i - 1; @@ -2264,7 +2055,7 @@ public class PacketConsumers { } }; - public static final BiConsumer SET_PLAYER_INVENTORY = (user, event) -> { + public static final BiConsumer SET_PLAYER_INVENTORY_1_21_2 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); @@ -2287,15 +2078,11 @@ public class PacketConsumers { public static final BiConsumer SET_CREATIVE_MODE_SLOT = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); short slotNum = buf.readShort(); - ItemStack itemStack; - if (VersionHelper.isOrAbove1_20_5()) { - itemStack = FastNMS.INSTANCE.method$ServerboundSetCreativeModeSlotPacket$readItem(friendlyBuf); - } else { - itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - } + ItemStack itemStack = VersionHelper.isOrAbove1_20_5() ? + FastNMS.INSTANCE.method$FriendlyByteBuf$readUntrustedItem(friendlyBuf) : FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); + ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); BukkitItemManager.instance().c2s(itemStack, context).ifPresent((newItemStack) -> { event.setChanged(true); buf.clear(); @@ -2303,7 +2090,7 @@ public class PacketConsumers { buf.writeShort(slotNum); Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); if (VersionHelper.isOrAbove1_20_5()) { - FastNMS.INSTANCE.method$ServerboundSetCreativeModeSlotPacket$writeItem(newFriendlyBuf, newItemStack); + FastNMS.INSTANCE.method$FriendlyByteBuf$writeUntrustedItem(newFriendlyBuf, newItemStack); } else { FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack); } @@ -2313,7 +2100,7 @@ public class PacketConsumers { } }; - public static final BiConsumer CONTAINER_CLICK = (user, event) -> { + public static final BiConsumer CONTAINER_CLICK_1_20 = (user, event) -> { try { if (VersionHelper.isOrAbove1_21_5()) return; // 1.21.5+需要其他办法解决同步问题 FriendlyByteBuf buf = event.getBuffer(); @@ -2327,7 +2114,7 @@ public class PacketConsumers { int clickType = buf.readVarInt(); int i = buf.readVarInt(); Int2ObjectMap changedSlots = new Int2ObjectOpenHashMap<>(i); - for(int j = 0; j < i; ++j) { + for (int j = 0; j < i; ++j) { int k = buf.readShort(); ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); Optional optional = BukkitItemManager.instance().c2s(itemStack, context); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 495890b3f..8d2010eca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.font; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; @@ -516,7 +517,7 @@ public abstract class AbstractFontManager implements FontManager { .resolve(namespacedPath.value()); if (!doesImageFileExist(targetImagePath)) { - TranslationManager.instance().log("warning.config.image.file_not_found", path.toString(), id.toString(), targetImagePath.toString()); +// TranslationManager.instance().log("warning.config.image.file_not_found", path.toString(), id.toString(), targetImagePath.toString()); // DO NOT RETURN, JUST GIVE WARNINGS } else if (heightObj == null) { try (InputStream in = Files.newInputStream(targetImagePath)) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index ba0a8dc36..e33d35e57 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -140,6 +140,7 @@ public class Config { protected boolean image$intercept_packets$armor_stand; protected boolean image$intercept_packets$player_info; protected boolean image$intercept_packets$set_score; + protected boolean image$intercept_packets$item; protected boolean emoji$chat; protected boolean emoji$book; @@ -332,6 +333,7 @@ public class Config { image$intercept_packets$armor_stand = config.getBoolean("image.intercept-packets.armor-stand", true); image$intercept_packets$player_info = config.getBoolean("image.intercept-packets.player-info", true); image$intercept_packets$set_score = config.getBoolean("image.intercept-packets.set-score", true); + image$intercept_packets$item = config.getBoolean("image.intercept-packets.item", true); // emoji emoji$chat = config.getBoolean("emoji.chat", true); @@ -676,6 +678,10 @@ public class Config { return instance.image$intercept_packets$set_score; } + public static boolean interceptItem() { + return instance.image$intercept_packets$item; + } + public static boolean predictBreaking() { return instance.block$predict_breaking; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java index 6778e2cb8..2616f5142 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java @@ -385,10 +385,7 @@ public class Dependencies { "commons-imaging", "org{}apache{}commons", "commons-imaging", - List.of( - Relocation.of("imaging", "org{}apache{}commons{}imaging"), - Relocation.of("commons.io", "org{}apache{}commons{}io") - ) + List.of(Relocation.of("commons", "org{}apache{}commons")) ); public static final Dependency AMAZON_AWSSDK_S3 = new Dependency( diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index 0062e5bd6..c1abe066b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -15,6 +15,10 @@ import net.momirealms.sparrow.nbt.Tag; import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer; import net.momirealms.sparrow.nbt.serializer.NBTSerializerOptions; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + /** * Helper class for handling Adventure components and related functionalities. */ @@ -299,4 +303,13 @@ public class AdventureHelper { } return true; } + + public static Component replaceText(Component text, Map replacements) { + String patternString = replacements.keySet().stream() + .map(Pattern::quote) + .collect(Collectors.joining("|")); + return text.replaceText(builder -> + builder.match(Pattern.compile(patternString)) + .replacement((result, b) -> replacements.get(result.group()))); + } } diff --git a/gradle.properties b/gradle.properties index 3660116e6..de82be993 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67 +nms_helper_version=0.66.2 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23