diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index db41b3d52..b1d1e570b 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -19,6 +19,10 @@ dependencies { compileOnly("net.momirealms:antigrieflib:${rootProject.properties["anti_grief_version"]}") // NBT compileOnly("net.momirealms:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}") + compileOnly("net.momirealms:sparrow-nbt-adventure:${rootProject.properties["sparrow_nbt_version"]}") + compileOnly("net.momirealms:sparrow-nbt-codec:${rootProject.properties["sparrow_nbt_version"]}") + compileOnly("net.momirealms:sparrow-nbt-legacy-codec:${rootProject.properties["sparrow_nbt_version"]}") + // Util compileOnly("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}") // NMS compileOnly("net.momirealms:craft-engine-nms-helper:${rootProject.properties["nms_helper_version"]}") diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java index dec3c6b62..452cf8cb1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.item; import com.saicone.rtag.RtagItem; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.item.ItemWrapper; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.VersionHelper; @@ -32,13 +33,7 @@ public class LegacyItemWrapper implements ItemWrapper { public boolean setTag(Object value, Object... path) { if (value instanceof Tag tag) { - try { - Object nmsTag = FastNMS.INSTANCE.method$NbtIo$fromBytes(NBT.toBytes(tag, true)); - return this.rtagItem.set(nmsTag, path); - } catch (IOException e) { - CraftEngine.instance().logger().warn("Failed to set NBT tag " + Arrays.toString(path), e); - return false; - } + return this.rtagItem.set(Reflections.instance$SPARROW_NBT_OPS.convertTo(Reflections.instance$NBT_OPS, tag), path); } else { return this.rtagItem.set(value, path); } @@ -46,15 +41,7 @@ public class LegacyItemWrapper implements ItemWrapper { public boolean add(Object value, Object... path) { if (value instanceof Tag tag) { - try { - // Incompatible DFU version - // return this.rtagItem.add(Reflections.instance$SPARROW_NBT_OPS.convertTo(Reflections.instance$NBT_OPS, tag), path); - Object nmsTag = FastNMS.INSTANCE.method$NbtIo$fromBytes(NBT.toBytes(tag, true)); - return this.rtagItem.add(nmsTag, path); - } catch (IOException e) { - CraftEngine.instance().logger().warn("Failed to add NBT tag " + Arrays.toString(path), e); - return false; - } + return this.rtagItem.add(Reflections.instance$SPARROW_NBT_OPS.convertTo(Reflections.instance$NBT_OPS, tag), path); } else { return this.rtagItem.add(value, path); } @@ -67,12 +54,7 @@ public class LegacyItemWrapper implements ItemWrapper { public Tag getNBTTag(Object... path) { Object tag = getExactTag(path); if (tag == null) return null; - try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(FastNMS.INSTANCE.method$NbtIo$toBytes(tag)))) { - return NBT.readUnnamedTag(dis, !VersionHelper.isOrAbove1_20_3()); - } catch (IOException e) { - CraftEngine.instance().logger().warn("Failed to read NBT tag " + Arrays.toString(path), e); - return null; - } + return Reflections.instance$NBT_OPS.convertTo(Reflections.instance$SPARROW_NBT_OPS, tag); } public int count() { 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 11db3f193..e3975568f 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 @@ -565,17 +565,25 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { - if (handledCompression) return false; + if (this.handledCompression) return false; int compressIndex = ctx.pipeline().names().indexOf("compress"); if (compressIndex == -1) return false; - handledCompression = true; + this.handledCompression = true; int encoderIndex = ctx.pipeline().names().indexOf(PACKET_ENCODER); if (encoderIndex == -1) return false; if (compressIndex > encoderIndex) { decompress(ctx, buffer, buffer); + PluginChannelDecoder decoder = (PluginChannelDecoder) ctx.pipeline().get(PACKET_DECODER); + if (decoder != null) { + if (decoder.relocated) return true; + decoder.relocated = true; + } PluginChannelEncoder encoder = (PluginChannelEncoder) ctx.pipeline().remove(PACKET_ENCODER); String encoderName = ctx.pipeline().names().contains("outbound_config") ? "outbound_config" : "encoder"; ctx.pipeline().addBefore(encoderName, PACKET_ENCODER, new PluginChannelEncoder(encoder)); + decoder = (PluginChannelDecoder) ctx.pipeline().remove(PACKET_DECODER); + String decoderName = ctx.pipeline().names().contains("inbound_config") ? "inbound_config" : "decoder"; + ctx.pipeline().addBefore(decoderName, PACKET_DECODER, new PluginChannelDecoder(decoder)); return true; } return false; @@ -608,7 +616,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes public class PluginChannelDecoder extends MessageToMessageDecoder { private final NetWorkUser player; - private boolean handledCompression = false; + public boolean relocated = false; public PluginChannelDecoder(NetWorkUser player) { this.player = player; @@ -616,38 +624,17 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes public PluginChannelDecoder(PluginChannelDecoder decoder) { this.player = decoder.player; - this.handledCompression = decoder.handledCompression; + this.relocated = decoder.relocated; } @Override protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) { - boolean needCompression = !handledCompression && handleCompression(channelHandlerContext, byteBuf); this.onByteBufReceive(byteBuf); - if (needCompression) { - compress(channelHandlerContext, byteBuf); - } if (byteBuf.isReadable()) { list.add(byteBuf.retain()); } } - private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { - if (handledCompression) return false; - int compressIndex = ctx.pipeline().names().indexOf("compress"); - if (compressIndex == -1) return false; - handledCompression = true; - int decoderIndex = ctx.pipeline().names().indexOf(PACKET_DECODER); - if (decoderIndex == -1) return false; - if (compressIndex > decoderIndex) { - decompress(ctx, buffer, buffer); - PluginChannelDecoder encoder = (PluginChannelDecoder) ctx.pipeline().remove(PACKET_DECODER); - String decoderName = ctx.pipeline().names().contains("inbound_config") ? "inbound_config" : "decoder"; - ctx.pipeline().addBefore(decoderName, PACKET_DECODER, new PluginChannelDecoder(encoder)); - return true; - } - return false; - } - private void onByteBufReceive(ByteBuf buffer) { // I don't care packets before PLAY for the moment if (player.decoderState() != ConnectionState.PLAY) return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 6587d5cac..ede8f4f74 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -17,6 +17,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.Tag; +import net.momirealms.sparrow.nbt.codec.LegacyNBTOps; import net.momirealms.sparrow.nbt.codec.NBTOps; import org.bukkit.NamespacedKey; import org.bukkit.block.BlockState; @@ -6969,7 +6970,7 @@ public class Reflections { instance$JAVA_OPS = null; } instance$JSON_OPS = (DynamicOps) method$RegistryOps$create.invoke(null, JsonOps.INSTANCE, instance$MinecraftRegistry); - instance$SPARROW_NBT_OPS = (DynamicOps) method$RegistryOps$create.invoke(null, NBTOps.INSTANCE, instance$MinecraftRegistry); + instance$SPARROW_NBT_OPS = (DynamicOps) method$RegistryOps$create.invoke(null, VersionHelper.isOrAbove1_20_5() ? NBTOps.INSTANCE : LegacyNBTOps.INSTANCE, instance$MinecraftRegistry); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 7af5d3bbe..29856d15b 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -18,6 +18,10 @@ dependencies { compileOnly("org.yaml:snakeyaml:${rootProject.properties["snake_yaml_version"]}") // NBT implementation("net.momirealms:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}") + implementation("net.momirealms:sparrow-nbt-adventure:${rootProject.properties["sparrow_nbt_version"]}") + implementation("net.momirealms:sparrow-nbt-codec:${rootProject.properties["sparrow_nbt_version"]}") + implementation("net.momirealms:sparrow-nbt-legacy-codec:${rootProject.properties["sparrow_nbt_version"]}") + // Util compileOnly("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}") // Adventure // TODO Create an API module 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 51bcb5f9e..c404f15a8 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 @@ -12,8 +12,8 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONOptions; import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; import net.momirealms.sparrow.nbt.Tag; -import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer; -import net.momirealms.sparrow.nbt.serializer.NBTSerializerOptions; +import net.momirealms.sparrow.nbt.adventure.NBTComponentSerializer; +import net.momirealms.sparrow.nbt.adventure.NBTSerializerOptions; import java.util.Map; import java.util.regex.Pattern; diff --git a/gradle.properties b/gradle.properties index 750471733..5aefedf21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.54.12 +project_version=0.0.55 config_version=34 lang_version=14 project_group=net.momirealms @@ -39,7 +39,7 @@ geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 commons_imaging_version=1.0.0-alpha6 -sparrow_nbt_version=0.8.4 +sparrow_nbt_version=0.9.0 sparrow_util_version=0.47 fastutil_version=8.5.15 netty_version=4.1.121.Final