From 4258f52f86604d2a86be8f6ff5f91954055897ce Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Sat, 27 Apr 2019 13:03:53 -0300 Subject: [PATCH 1/4] Workaround for packet order issue in neighbour chunk updates --- .../blockconnections/ConnectionData.java | 2 +- .../protocol1_13to1_12_2/packets/WorldPackets.java | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java index 9d80b64e6..287ed9105 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java @@ -118,7 +118,7 @@ public class ConnectionData { wrapper.write(Type.INT, chunkZ + chunkDeltaZ); wrapper.write(Type.BLOCK_CHANGE_RECORD_ARRAY, updates.toArray(new BlockChangeRecord[0])); try { - wrapper.send(Protocol1_13To1_12_2.class); + wrapper.send(Protocol1_13To1_12_2.class, true, true); } catch (Exception e) { e.printStackTrace(); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java index e5bf57e49..e47e58382 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java @@ -25,6 +25,7 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.BlockEntityP import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.PaintingProvider; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.BlockStorage; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type; +import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.types.Chunk1_9_3_4Type; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -366,10 +367,6 @@ public class WorldPackets { } } - if (Via.getConfig().isServersideBlockConnections()) { - ConnectionData.connectBlocks(wrapper.user(), chunk); - } - // Rewrite biome id 255 to plains if (chunk.isBiomeData()) { int latestBiomeWarn = Integer.MIN_VALUE; @@ -405,6 +402,13 @@ public class WorldPackets { chunk.getSections()[y >> 4].setFlatBlock(x & 0xF, y & 0xF, z & 0xF, newId); } } + + if (Via.getConfig().isServersideBlockConnections()) { + // Workaround for packet order issue + wrapper.send(Protocol1_14To1_13_2.class, true, true); + wrapper.cancel(); + ConnectionData.connectBlocks(wrapper.user(), chunk); + } } }); } From 7b29972af020d46afb4364d7a1bfc8f322ddbe70 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Sat, 27 Apr 2019 13:12:19 -0300 Subject: [PATCH 2/4] Fix wrong protocol class --- .../protocols/protocol1_13to1_12_2/packets/WorldPackets.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java index e47e58382..fd20e9a31 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java @@ -25,7 +25,6 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.BlockEntityP import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.PaintingProvider; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.BlockStorage; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type; -import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.types.Chunk1_9_3_4Type; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -405,7 +404,7 @@ public class WorldPackets { if (Via.getConfig().isServersideBlockConnections()) { // Workaround for packet order issue - wrapper.send(Protocol1_14To1_13_2.class, true, true); + wrapper.send(Protocol1_13To1_12_2.class, true, true); wrapper.cancel(); ConnectionData.connectBlocks(wrapper.user(), chunk); } From 87eceb5264172c3fcf2247012464cfff1205fd48 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Sat, 27 Apr 2019 13:34:35 -0300 Subject: [PATCH 3/4] Use cached cancel exception when not in debug mode --- .../bungee/handlers/BungeeEncodeHandler.java | 3 ++- .../ViaVersion/api/protocol/Protocol.java | 5 ++-- .../ViaVersion/exception/CancelException.java | 25 +++++++++++++++++++ .../sponge/handlers/SpongeEncodeHandler.java | 3 ++- .../handlers/VelocityEncodeHandler.java | 3 ++- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index 34ffb2667..e8106a9f1 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -5,6 +5,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageEncoder; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.bungee.util.BungeePipelineUtil; @@ -28,7 +29,7 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { @Override protected void encode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List out) throws Exception { if (bytebuf.readableBytes() == 0) { - throw new CancelException(); + throw Via.getManager().isDebug() ? new CancelException() : CancelException.CACHED; } boolean needsCompress = false; if (!handledCompression) { diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java index f66c43693..ad248bf26 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java @@ -167,8 +167,9 @@ public abstract class Protocol { // remap if (protocolPacket.getRemapper() != null) { protocolPacket.getRemapper().remap(packetWrapper); - if (packetWrapper.isCancelled()) - throw new CancelException(); + if (packetWrapper.isCancelled()) { + throw Via.getManager().isDebug() ? new CancelException() : CancelException.CACHED; + } } } diff --git a/common/src/main/java/us/myles/ViaVersion/exception/CancelException.java b/common/src/main/java/us/myles/ViaVersion/exception/CancelException.java index b71016854..93b5a7349 100644 --- a/common/src/main/java/us/myles/ViaVersion/exception/CancelException.java +++ b/common/src/main/java/us/myles/ViaVersion/exception/CancelException.java @@ -1,4 +1,29 @@ package us.myles.ViaVersion.exception; public class CancelException extends Exception { + public static final CancelException CACHED = new CancelException("Cached - Enable /viaver debug to not use cached exception") { + @Override + public synchronized Throwable fillInStackTrace() { + return this; + } + }; + + public CancelException() { + } + + public CancelException(String message) { + super(message); + } + + public CancelException(String message, Throwable cause) { + super(message, cause); + } + + public CancelException(Throwable cause) { + super(cause); + } + + public CancelException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java index 5db88d64a..41beb84e9 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java @@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; @@ -37,7 +38,7 @@ public class SpongeEncodeHandler extends MessageToByteEncoder { } } if (bytebuf.readableBytes() == 0) { - throw new CancelException(); + throw Via.getManager().isDebug() ? new CancelException() : CancelException.CACHED; } // Increment sent info.incrementSent(); diff --git a/velocity/src/main/java/us/myles/ViaVersion/velocity/handlers/VelocityEncodeHandler.java b/velocity/src/main/java/us/myles/ViaVersion/velocity/handlers/VelocityEncodeHandler.java index b671159c5..2ec4e2525 100644 --- a/velocity/src/main/java/us/myles/ViaVersion/velocity/handlers/VelocityEncodeHandler.java +++ b/velocity/src/main/java/us/myles/ViaVersion/velocity/handlers/VelocityEncodeHandler.java @@ -9,6 +9,7 @@ import io.netty.handler.codec.MessageToMessageEncoder; import lombok.NonNull; import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; @@ -28,7 +29,7 @@ public class VelocityEncodeHandler extends MessageToMessageEncoder { @Override protected void encode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List out) throws Exception { if (bytebuf.readableBytes() == 0) { - throw new CancelException(); + throw Via.getManager().isDebug() ? new CancelException() : CancelException.CACHED; } boolean needsCompress = false; if (!handledCompression From 13086c7cac2d8e67bfcefea59085fdee3e5d6b50 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Sat, 27 Apr 2019 14:03:48 -0300 Subject: [PATCH 4/4] Fixed connecting after sending the packet --- .../protocol1_13to1_12_2/packets/WorldPackets.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java index fd20e9a31..a5b82467d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java @@ -403,10 +403,15 @@ public class WorldPackets { } if (Via.getConfig().isServersideBlockConnections()) { + ConnectionData.connectBlocks(wrapper.user(), chunk); // Workaround for packet order issue wrapper.send(Protocol1_13To1_12_2.class, true, true); wrapper.cancel(); - ConnectionData.connectBlocks(wrapper.user(), chunk); + for (int i = 0; i < chunk.getSections().length; i++) { + ChunkSection section = chunk.getSections()[i]; + if (section == null) continue; + ConnectionData.updateChunkSectionNeighbours(wrapper.user(), chunk.getX(), chunk.getZ(), i); + } } } });