From a3cdd701d9c0146c7cb73c8eae8c1ccd2608fcfa Mon Sep 17 00:00:00 2001 From: Watermelcn Date: Tue, 19 May 2026 19:54:01 +0800 Subject: [PATCH 1/3] fix: intercept DecoderException in Connection.exceptionCaught to respect ignorePacketTranslationErrors setting --- .../core/integration/MixinConnection.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/core/integration/MixinConnection.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/core/integration/MixinConnection.java index 710cb79e4..8d3fdb74d 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/core/integration/MixinConnection.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/core/integration/MixinConnection.java @@ -23,13 +23,18 @@ import com.viaversion.viafabricplus.ViaFabricPlusImpl; import com.viaversion.viafabricplus.settings.impl.DebugSettings; +import com.viaversion.viafabricplus.settings.impl.GeneralSettings; +import com.viaversion.viafabricplus.util.ChatUtil; import com.viaversion.viaversion.platform.ViaChannelInitializer; import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.DecoderException; import java.net.ConnectException; import java.net.SocketException; import io.netty.channel.SimpleChannelInboundHandler; +import net.minecraft.ChatFormatting; import net.minecraft.network.Connection; import net.minecraft.network.HandlerNames; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -39,7 +44,7 @@ @Mixin(Connection.class) public abstract class MixinConnection extends SimpleChannelInboundHandler> { - @Inject(method = "exceptionCaught", at = @At("HEAD")) + @Inject(method = "exceptionCaught", at = @At("HEAD"), cancellable = true) private void printNetworkingErrors(ChannelHandlerContext context, Throwable ex, CallbackInfo ci) { if (DebugSettings.INSTANCE.printNetworkingErrorsToLogs.getValue()) { if (ex instanceof SocketException || ex instanceof ConnectException) { @@ -48,6 +53,24 @@ private void printNetworkingErrors(ChannelHandlerContext context, Throwable ex, } ViaFabricPlusImpl.INSTANCE.getLogger().error("An exception occurred while handling a packet", ex); } + + // When ignorePacketTranslationErrors is enabled, swallow DecoderExceptions + // to prevent the client from being disconnected. The exception originates from + // ByteToMessageDecoder which catches it internally and fires exceptionCaught + // on the pipeline — it never reaches ViaFabricPlusDecoder's catch block. + if (ex instanceof DecoderException) { + final int mode = GeneralSettings.INSTANCE.ignorePacketTranslationErrors.getIndex(); + if (mode > 0) { + ViaFabricPlusImpl.INSTANCE.getLogger().error("ViaFabricPlus ignored a packet translation error", ex); + if (mode == 1) { + ChatUtil.sendPrefixedMessage( + Component.translatable("translation.viafabricplus.packet_error") + .withStyle(ChatFormatting.RED) + ); + } + ci.cancel(); + } + } } @Override @@ -64,4 +87,4 @@ public void userEventTriggered(final ChannelHandlerContext ctx, final Object evt super.userEventTriggered(ctx, evt); } -} +} \ No newline at end of file From 7aad19bebefd7a3f6d1185bab2c3a0eb730c78cd Mon Sep 17 00:00:00 2001 From: Watermelcn Date: Tue, 19 May 2026 19:54:02 +0800 Subject: [PATCH 2/3] fix: add Minecraft 1.21 Mace enchantments to 1.14.4 registry --- .../r1_14_4_enchantment_tooltip/Enchantments1_14_4.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/viaversion/viafabricplus/features/item/r1_14_4_enchantment_tooltip/Enchantments1_14_4.java b/src/main/java/com/viaversion/viafabricplus/features/item/r1_14_4_enchantment_tooltip/Enchantments1_14_4.java index 883298e79..b50393c49 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/item/r1_14_4_enchantment_tooltip/Enchantments1_14_4.java +++ b/src/main/java/com/viaversion/viafabricplus/features/item/r1_14_4_enchantment_tooltip/Enchantments1_14_4.java @@ -71,10 +71,14 @@ public final class Enchantments1_14_4 { ENCHANTMENT_REGISTRY.put("piercing", Enchantments.PIERCING); ENCHANTMENT_REGISTRY.put("mending", Enchantments.MENDING); ENCHANTMENT_REGISTRY.put("vanishing_curse", Enchantments.VANISHING_CURSE); + // Minecraft 1.21 Mace enchantments + ENCHANTMENT_REGISTRY.put("density", Enchantments.DENSITY); + ENCHANTMENT_REGISTRY.put("breach", Enchantments.BREACH); + ENCHANTMENT_REGISTRY.put("wind_burst", Enchantments.WIND_BURST); } public static Optional> getOrEmpty(final String identifier) { return Optional.ofNullable(ENCHANTMENT_REGISTRY.get(Key.stripMinecraftNamespace(identifier))); } -} +} \ No newline at end of file From 1ca2c1b448348fdca2269f843ff6804b2c4b3835 Mon Sep 17 00:00:00 2001 From: Watermelcn Date: Tue, 19 May 2026 20:48:28 +0800 Subject: [PATCH 3/3] fix: add exceptionCaught handler to ViaFabricPlusDecoder for buffer cleanup on DecoderException --- .../netty/ViaFabricPlusDecoder.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/com/viaversion/viafabricplus/protocoltranslator/netty/ViaFabricPlusDecoder.java b/src/main/java/com/viaversion/viafabricplus/protocoltranslator/netty/ViaFabricPlusDecoder.java index ea17651fa..d20af7149 100644 --- a/src/main/java/com/viaversion/viafabricplus/protocoltranslator/netty/ViaFabricPlusDecoder.java +++ b/src/main/java/com/viaversion/viafabricplus/protocoltranslator/netty/ViaFabricPlusDecoder.java @@ -23,6 +23,7 @@ import com.viaversion.viafabricplus.ViaFabricPlusImpl; import com.viaversion.viafabricplus.settings.impl.GeneralSettings; +import io.netty.handler.codec.DecoderException; import com.viaversion.viafabricplus.util.ChatUtil; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.exception.CancelCodecException; @@ -37,6 +38,24 @@ public ViaFabricPlusDecoder(UserConnection connection) { super(connection); } + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (cause instanceof DecoderException) { + final int mode = GeneralSettings.INSTANCE.ignorePacketTranslationErrors.getIndex(); + if (mode > 0) { + ViaFabricPlusImpl.INSTANCE.getLogger().error("ViaFabricPlus ignored a packet translation error", cause); + if (mode == 1) { + ChatUtil.sendPrefixedMessage( + Component.translatable("translation.viafabricplus.packet_error") + .withStyle(ChatFormatting.RED) + ); + } + return; + } + } + super.exceptionCaught(ctx, cause); + } + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { try {