From b376b52ce884f4fe0c62ae9a3e8f5bf5ca3cfbcd Mon Sep 17 00:00:00 2001 From: EnZaXD Date: Sun, 15 Sep 2024 22:09:03 +0200 Subject: [PATCH] Refactor dimension switch handling across all protocols (#884) --- .../api/rewriters/EntityRewriter.java | 1 - .../api/rewriters/EntityRewriterBase.java | 21 +++++++++++++++---- .../api/rewriters/LegacyEntityRewriter.java | 10 +++++---- .../v1_10to1_9_3/Protocol1_10To1_9_3.java | 5 +---- .../rewriter/BlockItemPacketRewriter1_10.java | 2 +- .../v1_11_1to1_11/Protocol1_11_1To1_11.java | 5 +---- .../v1_11to1_10/Protocol1_11To1_10.java | 5 +---- .../rewriter/BlockItemPacketRewriter1_11.java | 2 +- .../v1_12to1_11_1/Protocol1_12To1_11_1.java | 5 +---- .../rewriter/BlockItemPacketRewriter1_12.java | 2 +- .../rewriter/EntityPacketRewriter1_12.java | 3 +-- .../v1_13_1to1_13/Protocol1_13_1To1_13.java | 5 +---- .../rewriter/WorldPacketRewriter1_13_1.java | 2 +- .../v1_13to1_12_2/Protocol1_13To1_12_2.java | 5 +---- .../rewriter/BlockItemPacketRewriter1_13.java | 2 +- .../rewriter/EntityPacketRewriter1_13.java | 14 +++++++++---- .../v1_14to1_13_2/Protocol1_14To1_13_2.java | 5 +---- .../rewriter/BlockItemPacketRewriter1_14.java | 2 +- .../rewriter/EntityPacketRewriter1_14.java | 12 ++++++----- .../v1_15to1_14_4/Protocol1_15To1_14_4.java | 5 ++++- .../rewriter/EntityPacketRewriter1_15.java | 5 +++-- .../rewriter/EntityPacketRewriter1_16_2.java | 4 +++- .../v1_16to1_15_2/Protocol1_16To1_15_2.java | 6 ++---- .../rewriter/EntityPacketRewriter1_16.java | 11 +++++----- .../rewriter/EntityPacketRewriter1_17.java | 2 +- .../v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java | 12 +++++------ 26 files changed, 78 insertions(+), 75 deletions(-) diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java index c29b69de..242f4c67 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java @@ -127,7 +127,6 @@ public abstract class EntityRewriter intType) { - return wrapper -> tracker(wrapper.user()).addEntity((int) wrapper.get(intType, 0), entityType); + protected PacketHandler getTrackerHandler(EntityType entityType) { + return wrapper -> tracker(wrapper.user()).addEntity((int) wrapper.get(Types.VAR_INT, 0), entityType); + } + + protected PacketHandler getPlayerTrackerHandler() { + return wrapper -> { + final int entityId = wrapper.get(Types.INT, 0); + + final EntityTracker tracker = tracker(wrapper.user()); + tracker(wrapper.user()).setClientEntityId(entityId); + tracker.addEntity(entityId, tracker.playerType()); + }; } protected PacketHandler getDimensionHandler(int index) { return wrapper -> { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(this.protocol.getClass()); int dimensionId = wrapper.get(Types.INT, index); - clientWorld.setEnvironment(dimensionId); + if (clientWorld.setEnvironment(dimensionId)) { + tracker(wrapper.user()).clearEntities(); + } }; } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java index 8728902e..08404a2f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java @@ -66,8 +66,10 @@ public abstract class LegacyEntityRewriter { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); - clientWorld.setEnvironment(wrapper.get(Types.INT, 0)); + ClientWorld clientWorld = wrapper.user().getClientWorld(protocol.getClass()); + if (clientWorld.setEnvironment(wrapper.get(Types.INT, 0))) { + tracker(wrapper.user()).clearEntities(); + } }); } }); @@ -81,8 +83,8 @@ public abstract class LegacyEntityRewriter { - ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); - clientChunks.setEnvironment(wrapper.get(Types.INT, 1)); + ClientWorld clientWorld = wrapper.user().getClientWorld(protocol.getClass()); + clientWorld.setEnvironment(wrapper.get(Types.INT, 1)); final int entityId = wrapper.get(Types.INT, 0); addTrackedEntity(wrapper, entityId, playerType); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java index d5eae4bc..a4ea27d4 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java @@ -98,11 +98,8 @@ public class Protocol1_10To1_9_3 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_10To1_9_3.class); ChunkType1_9_3 type = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); Chunk chunk = wrapper.passthrough(type); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11_1to1_11/Protocol1_11_1To1_11.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11_1to1_11/Protocol1_11_1To1_11.java index 0c7482a9..0f128d3f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11_1to1_11/Protocol1_11_1To1_11.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11_1to1_11/Protocol1_11_1To1_11.java @@ -39,11 +39,8 @@ public class Protocol1_11_1To1_11 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_11To1_10.class); ChunkType1_9_3 type = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); // Use the 1.10 Chunk type since nothing changed. Chunk chunk = wrapper.passthrough(type); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/Protocol1_12To1_11_1.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/Protocol1_12To1_11_1.java index 7ea21aa9..43831b8c 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/Protocol1_12To1_11_1.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/Protocol1_12To1_11_1.java @@ -71,11 +71,8 @@ public class Protocol1_12To1_11_1 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_12To1_11_1.class); ChunkType1_9_3 type = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); // Use the 1.9.4 Chunk type since nothing changed. Chunk chunk = wrapper.passthrough(type); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java index b6a73f53..23d06457 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java @@ -119,9 +119,8 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter { ShoulderTracker tracker = wrapper.user().get(ShoulderTracker.class); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13_1to1_13/Protocol1_13_1To1_13.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13_1to1_13/Protocol1_13_1To1_13.java index d811253b..2ed9918f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13_1to1_13/Protocol1_13_1To1_13.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13_1to1_13/Protocol1_13_1To1_13.java @@ -203,10 +203,7 @@ public class Protocol1_13_1To1_13 extends BackwardsProtocol blockRewriter = BlockRewriter.legacy(protocol); protocol.registerClientbound(ClientboundPackets1_13.LEVEL_CHUNK, wrapper -> { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13_1To1_13.class); Chunk chunk = wrapper.passthrough(ChunkType1_13.forEnvironment(clientWorld.getEnvironment())); blockRewriter.handleChunk(chunk); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/Protocol1_13To1_12_2.java index 8d07e4f7..3a2b0c1f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/Protocol1_13To1_12_2.java @@ -114,11 +114,8 @@ public class Protocol1_13To1_12_2 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13To1_12_2.class); ChunkType1_9_3 type_old = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); ChunkType1_13 type = ChunkType1_13.forEnvironment(clientWorld.getEnvironment()); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/rewriter/EntityPacketRewriter1_13.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/rewriter/EntityPacketRewriter1_13.java index 0d9bc3ef..b103e23b 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/rewriter/EntityPacketRewriter1_13.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_13to1_12_2/rewriter/EntityPacketRewriter1_13.java @@ -27,6 +27,7 @@ import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.ParticleIdMapping import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.BackwardsBlockStorage; import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.NoteBlockStorage; import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.PlayerPositionStorage1_13; +import com.viaversion.viaversion.api.minecraft.ClientWorld; import com.viaversion.viaversion.api.minecraft.Particle; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_13; @@ -172,7 +173,7 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter { int motive = wrapper.read(Types.VAR_INT); String title = PaintingNames1_13.getStringId(motive); @@ -188,10 +189,15 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter { - wrapper.user().get(BackwardsBlockStorage.class).clear(); - wrapper.user().get(NoteBlockStorage.class).clear(); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13To1_12_2.class); + int dimensionId = wrapper.get(Types.INT, 0); + + if (clientWorld.setEnvironment(dimensionId)) { + tracker(wrapper.user()).clearEntities(); + wrapper.user().get(BackwardsBlockStorage.class).clear(); + wrapper.user().get(NoteBlockStorage.class).clear(); + } }); } }); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/Protocol1_14To1_13_2.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/Protocol1_14To1_13_2.java index 7af0a097..08bf1d42 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/Protocol1_14To1_13_2.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/Protocol1_14To1_13_2.java @@ -162,11 +162,8 @@ public class Protocol1_14To1_13_2 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_14To1_13_2.class); Chunk chunk = wrapper.read(ChunkType1_14.TYPE); wrapper.write(ChunkType1_13.forEnvironment(clientWorld.getEnvironment()), chunk); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/rewriter/EntityPacketRewriter1_14.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/rewriter/EntityPacketRewriter1_14.java index 6141fd35..8e1ad70c 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/rewriter/EntityPacketRewriter1_14.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_14to1_13_2/rewriter/EntityPacketRewriter1_14.java @@ -304,8 +304,8 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter { short difficulty = wrapper.user().get(DifficultyStorage.class).getDifficulty(); wrapper.write(Types.UNSIGNED_BYTE, difficulty); @@ -329,14 +329,16 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_14To1_13_2.class); int dimensionId = wrapper.get(Types.INT, 0); - clientWorld.setEnvironment(dimensionId); + + if (clientWorld.setEnvironment(dimensionId)) { + tracker(wrapper.user()).clearEntities(); + wrapper.user().get(ChunkLightStorage.class).clear(); + } short difficulty = wrapper.user().get(DifficultyStorage.class).getDifficulty(); wrapper.write(Types.UNSIGNED_BYTE, difficulty); - - wrapper.user().get(ChunkLightStorage.class).clear(); }); } }); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_15to1_14_4/Protocol1_15To1_14_4.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_15to1_14_4/Protocol1_15To1_14_4.java index eedaa693..b0ad6fe8 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_15to1_14_4/Protocol1_15To1_14_4.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_15to1_14_4/Protocol1_15To1_14_4.java @@ -25,6 +25,7 @@ import com.viaversion.viabackwards.protocol.v1_15to1_14_4.storage.ImmediateRespa import com.viaversion.viabackwards.protocol.v1_15to1_14_4.rewriter.BlockItemPacketRewriter1_15; import com.viaversion.viabackwards.protocol.v1_15to1_14_4.rewriter.EntityPacketRewriter1_15; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.ClientWorld; import com.viaversion.viaversion.api.minecraft.RegistryType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_15; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; @@ -102,8 +103,10 @@ public class Protocol1_15To1_14_4 extends BackwardsProtocol { boolean immediateRespawn = !wrapper.read(Types.BOOLEAN); // Inverted @@ -138,7 +139,7 @@ public class EntityPacketRewriter1_15 extends EntityRewriter wrapper.write(Types1_14.ENTITY_DATA_LIST, new ArrayList<>())); // Entity data is no longer sent in 1.15, so we have to send an empty one - handler(getTrackerHandler(EntityTypes1_15.PLAYER, Types.VAR_INT)); + handler(getTrackerHandler(EntityTypes1_15.PLAYER)); } }); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16_2to1_16_1/rewriter/EntityPacketRewriter1_16_2.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16_2to1_16_1/rewriter/EntityPacketRewriter1_16_2.java index 1721b191..5034b24c 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16_2to1_16_1/rewriter/EntityPacketRewriter1_16_2.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16_2to1_16_1/rewriter/EntityPacketRewriter1_16_2.java @@ -101,13 +101,15 @@ public class EntityPacketRewriter1_16_2 extends EntityRewriter { CompoundTag dimensionData = wrapper.read(Types.NAMED_COMPOUND_TAG); wrapper.write(Types.STRING, getDimensionFromData(dimensionData)); + + tracker(wrapper.user()).clearEntities(); }); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16to1_15_2/Protocol1_16To1_15_2.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16to1_15_2/Protocol1_16To1_15_2.java index c90c5b88..97336dbe 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16to1_15_2/Protocol1_16To1_15_2.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_16to1_15_2/Protocol1_16To1_15_2.java @@ -168,14 +168,12 @@ public class Protocol1_16To1_15_2 extends BackwardsProtocol { - ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); - clientChunks.setEnvironment(wrapper.get(Types.INT, 1)); - tracker(wrapper.user()).addEntity(wrapper.get(Types.INT, 0), EntityTypes1_16.PLAYER); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_16To1_15_2.class); + clientWorld.setEnvironment(wrapper.get(Types.INT, 1)); wrapper.write(Types.STRING, "default"); // Level type diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_17to1_16_4/rewriter/EntityPacketRewriter1_17.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_17to1_16_4/rewriter/EntityPacketRewriter1_17.java index bac9d0e5..3da39f89 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_17to1_16_4/rewriter/EntityPacketRewriter1_17.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_17to1_16_4/rewriter/EntityPacketRewriter1_17.java @@ -100,7 +100,7 @@ public final class EntityPacketRewriter1_17 extends EntityRewriter { CompoundTag registry = wrapper.get(Types.NAMED_COMPOUND_TAG, 0); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java index 3415876b..8e5595b1 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java @@ -71,7 +71,7 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_9_3To1_9_1.class); ChunkType1_9_3 newType = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); ChunkType1_9_1 oldType = ChunkType1_9_1.forEnvironment(clientWorld.getEnvironment()); // Get the old type to not write Block Entities @@ -89,10 +89,10 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol { - ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_9_3To1_9_1.class); int dimensionId = wrapper.get(Types.INT, 1); - clientChunks.setEnvironment(dimensionId); + clientWorld.setEnvironment(dimensionId); }); } }); @@ -103,7 +103,7 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol { - ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_9_3To1_9_1.class); int dimensionId = wrapper.get(Types.INT, 0); clientWorld.setEnvironment(dimensionId); @@ -117,8 +117,6 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol