From 7171802b78a298f755e5a85a89600941aa695f27 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Wed, 8 Jul 2020 21:01:18 +0200 Subject: [PATCH] 20w28a --- bukkit-legacy/pom.xml | 2 +- bukkit/pom.xml | 2 +- bungee/pom.xml | 2 +- common/pom.xml | 2 +- .../api/data/MappingDataLoader.java | 7 +- .../api/minecraft/BlockChangeRecord.java | 55 +++++---- .../minecraft/BlockChangeRecord1_16_2.java | 50 +++++++++ .../api/minecraft/BlockChangeRecord1_8.java | 54 +++++++++ .../api/protocol/ProtocolVersion.java | 2 +- .../api/rewriters/BlockRewriter.java | 17 ++- .../us/myles/ViaVersion/api/type/Type.java | 52 ++++++++- .../api/type/types/VarLongType.java | 58 +++++----- .../minecraft/BlockChangeRecordType.java | 11 +- .../VarLongBlockChangeRecordType.java | 26 +++++ .../blockconnections/ConnectionData.java | 10 +- .../packets/WorldPackets.java | 12 +- .../ClientboundPackets1_16_2.java | 99 ++++++++++++++++ .../Protocol1_16_2To1_16_1.java | 4 +- .../data/MappingData.java | 13 +++ .../packets/EntityPackets.java | 7 +- .../packets/WorldPackets.java | 48 +++++++- .../types/Chunk1_16_2Type.java | 106 ++++++++++++++++++ .../data/dimension-registry-1.16.2.nbt | Bin 0 -> 43744 bytes fabric/pom.xml | 2 +- jar/pom.xml | 2 +- pom.xml | 2 +- sponge-legacy/pom.xml | 2 +- sponge/pom.xml | 2 +- velocity/pom.xml | 2 +- 29 files changed, 562 insertions(+), 89 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_16_2.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_8.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VarLongBlockChangeRecordType.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/ClientboundPackets1_16_2.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/types/Chunk1_16_2Type.java create mode 100644 common/src/main/resources/assets/viaversion/data/dimension-registry-1.16.2.nbt diff --git a/bukkit-legacy/pom.xml b/bukkit-legacy/pom.xml index 1ad375b8f..83c517ada 100644 --- a/bukkit-legacy/pom.xml +++ b/bukkit-legacy/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/bukkit/pom.xml b/bukkit/pom.xml index b70822b5f..07b0cc823 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/bungee/pom.xml b/bungee/pom.xml index 78d6c2d71..ada84a0be 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index df66ca6f3..7da0a1b94 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java b/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java index 448d6c066..6caae609a 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java @@ -14,6 +14,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URL; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -205,7 +206,11 @@ public class MappingDataLoader { return null; } - private static InputStream getResource(String name) { + public static InputStream getResource(String name) { return MappingDataLoader.class.getClassLoader().getResourceAsStream("assets/viaversion/data/" + name); } + + public static URL getResourceUrl(String name) { + return MappingDataLoader.class.getClassLoader().getResource("assets/viaversion/data/" + name); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord.java index 4ea1fae42..40b550b03 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord.java @@ -1,29 +1,38 @@ package us.myles.ViaVersion.api.minecraft; -public class BlockChangeRecord { - private final short horizontal; - private final short y; - private int blockId; +public interface BlockChangeRecord { - public BlockChangeRecord(short horizontal, short y, int blockId) { - this.horizontal = horizontal; - this.y = y; - this.blockId = blockId; + /** + * @return relative x coordinate within the chunk section + */ + byte getSectionX(); + + /** + * @return relative y coordinate within the chunk section + */ + byte getSectionY(); + + /** + * @return relative z coordinate within the chunk section + */ + byte getSectionZ(); + + /** + * @param chunkSectionY chunk section + * @return absolute y coordinate + */ + short getY(int chunkSectionY); + + /** + * @return absolute y coordinate + * @deprecated 1.16+ stores the relative y coordinate + */ + @Deprecated + default short getY() { + return getY(-1); } - public short getHorizontal() { - return horizontal; - } + int getBlockId(); - public short getY() { - return y; - } - - public int getBlockId() { - return blockId; - } - - public void setBlockId(int blockId) { - this.blockId = blockId; - } -} + void setBlockId(int blockId); +} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_16_2.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_16_2.java new file mode 100644 index 000000000..88d9a3bcf --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_16_2.java @@ -0,0 +1,50 @@ +package us.myles.ViaVersion.api.minecraft; + +import com.google.common.base.Preconditions; + +public class BlockChangeRecord1_16_2 implements BlockChangeRecord { + private final byte sectionX; + private final byte sectionY; + private final byte sectionZ; + private int blockId; + + public BlockChangeRecord1_16_2(byte sectionX, byte sectionY, byte sectionZ, int blockId) { + this.sectionX = sectionX; + this.sectionY = sectionY; + this.sectionZ = sectionZ; + this.blockId = blockId; + } + + public BlockChangeRecord1_16_2(int sectionX, int sectionY, int sectionZ, int blockId) { + this((byte) sectionX, (byte) sectionY, (byte) sectionZ, blockId); + } + + @Override + public byte getSectionX() { + return sectionX; + } + + @Override + public byte getSectionY() { + return sectionY; + } + + @Override + public byte getSectionZ() { + return sectionZ; + } + + @Override + public short getY(int chunkSectionY) { + Preconditions.checkArgument(chunkSectionY >= 0 && chunkSectionY < 16); + return (short) ((chunkSectionY << 4) + sectionY); + } + + public int getBlockId() { + return blockId; + } + + public void setBlockId(int blockId) { + this.blockId = blockId; + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_8.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_8.java new file mode 100644 index 000000000..2aef45583 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/BlockChangeRecord1_8.java @@ -0,0 +1,54 @@ +package us.myles.ViaVersion.api.minecraft; + +public class BlockChangeRecord1_8 implements BlockChangeRecord { + private final byte sectionX; + private final short y; + private final byte sectionZ; + private int blockId; + + public BlockChangeRecord1_8(byte sectionX, short y, byte sectionZ, int blockId) { + this.sectionX = sectionX; + this.y = y; + this.sectionZ = sectionZ; + this.blockId = blockId; + } + + public BlockChangeRecord1_8(int sectionX, int y, int sectionZ, int blockId) { + this((byte) sectionX, (short) y, (byte) sectionZ, blockId); + } + + /** + * @return x coordinate within the chunk section + */ + public byte getSectionX() { + return sectionX; + } + + @Override + public byte getSectionY() { + return (byte) (y & 0xF); + } + + /** + * @return y coordinate + */ + @Override + public short getY(int chunkSectionY) { + return y; + } + + /** + * @return z coordinate within the chunk section + */ + public byte getSectionZ() { + return sectionZ; + } + + public int getBlockId() { + return blockId; + } + + public void setBlockId(int blockId) { + this.blockId = blockId; + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java index d50419f2a..dbe394b08 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java @@ -84,7 +84,7 @@ public class ProtocolVersion { register(v1_15_2 = new ProtocolVersion(578, "1.15.2")); register(v1_16 = new ProtocolVersion(735, "1.16")); register(v1_16_1 = new ProtocolVersion(736, "1.16.1")); - register(v1_16_2 = new ProtocolVersion(738, "1.16.2")); + register(v1_16_2 = new ProtocolVersion(740, "1.16.2")); register(unknown = new ProtocolVersion(-1, "UNKNOWN")); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/rewriters/BlockRewriter.java b/common/src/main/java/us/myles/ViaVersion/api/rewriters/BlockRewriter.java index 0d128576c..b6905933f 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/rewriters/BlockRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/api/rewriters/BlockRewriter.java @@ -63,9 +63,22 @@ public class BlockRewriter { public void registerMap() { map(Type.INT); // 0 - Chunk X map(Type.INT); // 1 - Chunk Z - map(Type.BLOCK_CHANGE_RECORD_ARRAY); // 2 - Records handler(wrapper -> { - for (BlockChangeRecord record : wrapper.get(Type.BLOCK_CHANGE_RECORD_ARRAY, 0)) { + for (BlockChangeRecord record : wrapper.passthrough(Type.BLOCK_CHANGE_RECORD_ARRAY)) { + record.setBlockId(blockStateRewriter.rewrite(record.getBlockId())); + } + }); + } + }); + } + + public void registerVarLongMultiBlockChange(ClientboundPacketType packetType) { + protocol.registerOutgoing(packetType, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.LONG); // Chunk position + handler(wrapper -> { + for (BlockChangeRecord record : wrapper.passthrough(Type.VAR_LONG_BLOCK_CHANGE_RECORD_ARRAY)) { record.setBlockId(blockStateRewriter.rewrite(record.getBlockId())); } }); diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java index b300033b3..7071fd369 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java @@ -3,10 +3,51 @@ package us.myles.ViaVersion.api.type; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.google.gson.JsonElement; -import us.myles.ViaVersion.api.minecraft.*; +import us.myles.ViaVersion.api.minecraft.BlockChangeRecord; +import us.myles.ViaVersion.api.minecraft.EulerAngle; +import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.api.minecraft.Vector; +import us.myles.ViaVersion.api.minecraft.VillagerData; import us.myles.ViaVersion.api.minecraft.item.Item; -import us.myles.ViaVersion.api.type.types.*; -import us.myles.ViaVersion.api.type.types.minecraft.*; +import us.myles.ViaVersion.api.type.types.ArrayType; +import us.myles.ViaVersion.api.type.types.BooleanType; +import us.myles.ViaVersion.api.type.types.ByteArrayType; +import us.myles.ViaVersion.api.type.types.ByteType; +import us.myles.ViaVersion.api.type.types.ComponentType; +import us.myles.ViaVersion.api.type.types.DoubleType; +import us.myles.ViaVersion.api.type.types.FloatType; +import us.myles.ViaVersion.api.type.types.IntType; +import us.myles.ViaVersion.api.type.types.LongType; +import us.myles.ViaVersion.api.type.types.RemainingBytesType; +import us.myles.ViaVersion.api.type.types.ShortType; +import us.myles.ViaVersion.api.type.types.StringType; +import us.myles.ViaVersion.api.type.types.UUIDIntArrayType; +import us.myles.ViaVersion.api.type.types.UUIDType; +import us.myles.ViaVersion.api.type.types.UnsignedByteType; +import us.myles.ViaVersion.api.type.types.UnsignedShortType; +import us.myles.ViaVersion.api.type.types.VarIntArrayType; +import us.myles.ViaVersion.api.type.types.VarIntType; +import us.myles.ViaVersion.api.type.types.VarLongType; +import us.myles.ViaVersion.api.type.types.VoidType; +import us.myles.ViaVersion.api.type.types.minecraft.BlockChangeRecordType; +import us.myles.ViaVersion.api.type.types.minecraft.EulerAngleType; +import us.myles.ViaVersion.api.type.types.minecraft.FlatItemArrayType; +import us.myles.ViaVersion.api.type.types.minecraft.FlatItemType; +import us.myles.ViaVersion.api.type.types.minecraft.FlatVarIntItemArrayType; +import us.myles.ViaVersion.api.type.types.minecraft.FlatVarIntItemType; +import us.myles.ViaVersion.api.type.types.minecraft.ItemArrayType; +import us.myles.ViaVersion.api.type.types.minecraft.ItemType; +import us.myles.ViaVersion.api.type.types.minecraft.NBTType; +import us.myles.ViaVersion.api.type.types.minecraft.OptPosition1_14Type; +import us.myles.ViaVersion.api.type.types.minecraft.OptPositionType; +import us.myles.ViaVersion.api.type.types.minecraft.OptUUIDType; +import us.myles.ViaVersion.api.type.types.minecraft.OptionalComponentType; +import us.myles.ViaVersion.api.type.types.minecraft.OptionalVarIntType; +import us.myles.ViaVersion.api.type.types.minecraft.Position1_14Type; +import us.myles.ViaVersion.api.type.types.minecraft.PositionType; +import us.myles.ViaVersion.api.type.types.minecraft.VarLongBlockChangeRecordType; +import us.myles.ViaVersion.api.type.types.minecraft.VectorType; +import us.myles.ViaVersion.api.type.types.minecraft.VillagerDataType; import java.util.UUID; @@ -94,7 +135,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { public static final Type VAR_INT_ARRAY = new ArrayType<>(Type.VAR_INT); public static final Type VAR_INT_ARRAY_PRIMITIVE = new VarIntArrayType(); public static final Type OPTIONAL_VAR_INT = new OptionalVarIntType(); - public static final Type VAR_LONG = new VarLongType(); + public static final VarLongType VAR_LONG = new VarLongType(); /** * @deprecated unreasonable overhead */ @@ -121,6 +162,9 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { public static final Type BLOCK_CHANGE_RECORD = new BlockChangeRecordType(); public static final Type BLOCK_CHANGE_RECORD_ARRAY = new ArrayType<>(Type.BLOCK_CHANGE_RECORD); + public static final Type VAR_LONG_BLOCK_CHANGE_RECORD = new VarLongBlockChangeRecordType(); + public static final Type VAR_LONG_BLOCK_CHANGE_RECORD_ARRAY = new ArrayType<>(Type.VAR_LONG_BLOCK_CHANGE_RECORD); + public static final Type VILLAGER_DATA = new VillagerDataType(); /* 1.13 Flat Item (no data) */ diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/VarLongType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/VarLongType.java index 5dfbb54df..a72fefb5c 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/VarLongType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/VarLongType.java @@ -10,10 +10,25 @@ public class VarLongType extends Type implements TypeConverter { super("VarLong", Long.class); } - @Override - public void write(ByteBuf buffer, Long object) { + public long readPrimitive(ByteBuf buffer) { + long out = 0; + int bytes = 0; + byte in; + do { + in = buffer.readByte(); + + out |= (long) (in & 0x7F) << (bytes++ * 7); + + if (bytes > 10) { // 10 is maxBytes + throw new RuntimeException("VarLong too big"); + } + } while ((in & 0x80) == 0x80); + return out; + } + + public void writePrimitive(ByteBuf buffer, long object) { int part; - while (true) { + do { part = (int) (object & 0x7F); object >>>= 7; @@ -22,35 +37,26 @@ public class VarLongType extends Type implements TypeConverter { } buffer.writeByte(part); - - if (object == 0) { - break; - } - } + } while (object != 0); } + /** + * @deprecated use {@link #readPrimitive(ByteBuf)} for manual reading to avoid wrapping + */ @Override + @Deprecated public Long read(ByteBuf buffer) { - long out = 0; - int bytes = 0; - byte in; - while (true) { - in = buffer.readByte(); - - out |= (in & 0x7F) << (bytes++ * 7); - - if (bytes > 10) { // 10 is maxBytes - throw new RuntimeException("VarLong too big"); - } - - if ((in & 0x80) != 0x80) { - break; - } - } - - return out; + return readPrimitive(buffer); } + /** + * @deprecated use {@link #writePrimitive(ByteBuf, long)} for manual reading to avoid wrapping + */ + @Override + @Deprecated + public void write(ByteBuf buffer, Long object) { + writePrimitive(buffer, object); + } @Override public Long from(Object o) { diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BlockChangeRecordType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BlockChangeRecordType.java index 1ff20f973..ff2bb2014 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BlockChangeRecordType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BlockChangeRecordType.java @@ -2,26 +2,25 @@ package us.myles.ViaVersion.api.type.types.minecraft; import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.api.minecraft.BlockChangeRecord; +import us.myles.ViaVersion.api.minecraft.BlockChangeRecord1_8; import us.myles.ViaVersion.api.type.Type; public class BlockChangeRecordType extends Type { + public BlockChangeRecordType() { super(BlockChangeRecord.class); } @Override public BlockChangeRecord read(ByteBuf buffer) throws Exception { - short horizontal = Type.UNSIGNED_BYTE.read(buffer); - short y = Type.UNSIGNED_BYTE.read(buffer); + short position = Type.SHORT.readPrimitive(buffer); int blockId = Type.VAR_INT.readPrimitive(buffer); - - return new BlockChangeRecord(horizontal, y, blockId); + return new BlockChangeRecord1_8(position >> 12 & 0xF, position & 0xFF, position >> 8 & 0xF, blockId); } @Override public void write(ByteBuf buffer, BlockChangeRecord object) throws Exception { - Type.UNSIGNED_BYTE.write(buffer, object.getHorizontal()); - Type.UNSIGNED_BYTE.write(buffer, object.getY()); + Type.SHORT.writePrimitive(buffer, (short) (object.getSectionX() << 12 | object.getSectionZ() << 8 | object.getY())); Type.VAR_INT.writePrimitive(buffer, object.getBlockId()); } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VarLongBlockChangeRecordType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VarLongBlockChangeRecordType.java new file mode 100644 index 000000000..039522802 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VarLongBlockChangeRecordType.java @@ -0,0 +1,26 @@ +package us.myles.ViaVersion.api.type.types.minecraft; + +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.minecraft.BlockChangeRecord; +import us.myles.ViaVersion.api.minecraft.BlockChangeRecord1_16_2; +import us.myles.ViaVersion.api.type.Type; + +public class VarLongBlockChangeRecordType extends Type { + + public VarLongBlockChangeRecordType() { + super(BlockChangeRecord.class); + } + + @Override + public BlockChangeRecord read(ByteBuf buffer) throws Exception { + long data = Type.VAR_LONG.readPrimitive(buffer); + short position = (short) (data & 0xFFFL); + return new BlockChangeRecord1_16_2(position >>> 8 & 0xF, position & 0xF, position >>> 4 & 0xF, (int) (data >>> 12)); + } + + @Override + public void write(ByteBuf buffer, BlockChangeRecord object) throws Exception { + short position = (short) (object.getSectionX() << 8 | object.getSectionZ() << 4 | object.getSectionY()); + Type.VAR_LONG.writePrimitive(buffer, (long) object.getBlockId() << 12 | position); + } +} 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 80940ba8b..9e14a37c2 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 @@ -11,7 +11,7 @@ import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.api.minecraft.BlockChangeRecord; +import us.myles.ViaVersion.api.minecraft.BlockChangeRecord1_8; import us.myles.ViaVersion.api.minecraft.BlockFace; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; @@ -29,7 +29,7 @@ import java.util.Map; import java.util.Map.Entry; public class ConnectionData { - private static final BlockChangeRecord[] EMPTY_RECORDS = new BlockChangeRecord[0]; + private static final BlockChangeRecord1_8[] EMPTY_RECORDS = new BlockChangeRecord1_8[0]; public static BlockConnectionProvider blockConnectionProvider; static Int2ObjectMap idToKey = new Int2ObjectOpenHashMap<>(8582, 1F); static Map keyToId = new HashMap<>(8582, 1F); @@ -61,7 +61,7 @@ public class ConnectionData { for (int chunkDeltaZ = -1; chunkDeltaZ <= 1; chunkDeltaZ++) { if (Math.abs(chunkDeltaX) + Math.abs(chunkDeltaZ) == 0) continue; - List updates = new ArrayList<>(); + List updates = new ArrayList<>(); if (Math.abs(chunkDeltaX) + Math.abs(chunkDeltaZ) == 2) { // Corner for (int blockY = chunkSectionY * 16; blockY < chunkSectionY * 16 + 16; blockY++) { @@ -132,13 +132,13 @@ public class ConnectionData { } } - public static void updateBlock(UserConnection user, Position pos, List records) { + public static void updateBlock(UserConnection user, Position pos, List records) { int blockState = blockConnectionProvider.getBlockData(user, pos.getX(), pos.getY(), pos.getZ()); ConnectionHandler handler = getConnectionHandler(blockState); if (handler == null) return; int newBlockState = handler.connect(user, pos, blockState); - records.add(new BlockChangeRecord((short) (((pos.getX() & 0xF) << 4) | (pos.getZ() & 0xF)), pos.getY(), newBlockState)); + records.add(new BlockChangeRecord1_8(pos.getX() & 0xF, pos.getY(), pos.getZ() & 0xF, newBlockState)); } public static void updateBlockStorage(UserConnection userConnection, int x, int y, int z, int blockState) { 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 7a9a42be6..8de58d31f 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 @@ -207,9 +207,9 @@ public class WorldPackets { for (BlockChangeRecord record : records) { int newBlock = toNewId(record.getBlockId()); Position position = new Position( - (record.getHorizontal() >> 4 & 15) + (chunkX * 16), + record.getSectionX() + (chunkX * 16), record.getY(), - (record.getHorizontal() & 15) + (chunkZ * 16)); + record.getSectionZ() + (chunkZ * 16)); if (Via.getConfig().isServersideBlockConnections()) { ConnectionData.updateBlockStorage(userConnection, position.getX(), position.getY(), position.getZ(), newBlock); @@ -222,9 +222,9 @@ public class WorldPackets { int blockState = record.getBlockId(); Position position = new Position( - (record.getHorizontal() >> 4 & 15) + (chunkX * 16), + record.getSectionX() + (chunkX * 16), record.getY(), - (record.getHorizontal() & 15) + (chunkZ * 16)); + record.getSectionZ() + (chunkZ * 16)); ConnectionHandler handler = ConnectionData.getConnectionHandler(blockState); if (handler != null) { @@ -238,9 +238,9 @@ public class WorldPackets { for (BlockChangeRecord record : records) { Position position = new Position( - (record.getHorizontal() >> 4 & 15) + (chunkX * 16), + record.getSectionX() + (chunkX * 16), record.getY(), - (record.getHorizontal() & 15) + (chunkZ * 16)); + record.getSectionZ() + (chunkZ * 16)); ConnectionData.update(userConnection, position); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/ClientboundPackets1_16_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/ClientboundPackets1_16_2.java new file mode 100644 index 000000000..6b476922b --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/ClientboundPackets1_16_2.java @@ -0,0 +1,99 @@ +package us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1; + +import us.myles.ViaVersion.api.protocol.ClientboundPacketType; + +public enum ClientboundPackets1_16_2 implements ClientboundPacketType { + + SPAWN_ENTITY, // 0x00 + SPAWN_EXPERIENCE_ORB, // 0x01 + SPAWN_MOB, // 0x02 + SPAWN_PAINTING, // 0x03 + SPAWN_PLAYER, // 0x04 + ENTITY_ANIMATION, // 0x05 + STATISTICS, // 0x06 + ACKNOWLEDGE_PLAYER_DIGGING, // 0x07 + BLOCK_BREAK_ANIMATION, // 0x08 + BLOCK_ENTITY_DATA, // 0x09 + BLOCK_ACTION, // 0x0A + BLOCK_CHANGE, // 0x0B + BOSSBAR, // 0x0C + SERVER_DIFFICULTY, // 0x0D + CHAT_MESSAGE, // 0x0E + TAB_COMPLETE, // 0x0F + DECLARE_COMMANDS, // 0x10 + WINDOW_CONFIRMATION, // 0x11 + CLOSE_WINDOW, // 0x12 + WINDOW_ITEMS, // 0x13 + WINDOW_PROPERTY, // 0x14 + SET_SLOT, // 0x15 + COOLDOWN, // 0x16 + PLUGIN_MESSAGE, // 0x17 + NAMED_SOUND, // 0x18 + DISCONNECT, // 0x19 + ENTITY_STATUS, // 0x1A + EXPLOSION, // 0x1B + UNLOAD_CHUNK, // 0x1C + GAME_EVENT, // 0x1D + OPEN_HORSE_WINDOW, // 0x1E + KEEP_ALIVE, // 0x1F + CHUNK_DATA, // 0x20 + EFFECT, // 0x21 + SPAWN_PARTICLE, // 0x22 + UPDATE_LIGHT, // 0x23 + JOIN_GAME, // 0x24 + MAP_DATA, // 0x25 + TRADE_LIST, // 0x26 + ENTITY_POSITION, // 0x27 + ENTITY_POSITION_AND_ROTATION, // 0x28 + ENTITY_ROTATION, // 0x29 + ENTITY_MOVEMENT, // 0x2A + VEHICLE_MOVE, // 0x2B + OPEN_BOOK, // 0x2C + OPEN_WINDOW, // 0x2D + OPEN_SIGN_EDITOR, // 0x2E + CRAFT_RECIPE_RESPONSE, // 0x2F + PLAYER_ABILITIES, // 0x30 + COMBAT_EVENT, // 0x31 + PLAYER_INFO, // 0x32 + FACE_PLAYER, // 0x33 + PLAYER_POSITION, // 0x34 + UNLOCK_RECIPES, // 0x35 + DESTROY_ENTITIES, // 0x36 + REMOVE_ENTITY_EFFECT, // 0x37 + RESOURCE_PACK, // 0x38 + RESPAWN, // 0x39 + ENTITY_HEAD_LOOK, // 0x3A + MULTI_BLOCK_CHANGE, // 0x3B + SELECT_ADVANCEMENTS_TAB, // 0x3C + WORLD_BORDER, // 0x3D + CAMERA, // 0x3E + HELD_ITEM_CHANGE, // 0x3F + UPDATE_VIEW_POSITION, // 0x40 + UPDATE_VIEW_DISTANCE, // 0x41 + SPAWN_POSITION, // 0x42 + DISPLAY_SCOREBOARD, // 0x43 + ENTITY_METADATA, // 0x44 + ATTACH_ENTITY, // 0x45 + ENTITY_VELOCITY, // 0x46 + ENTITY_EQUIPMENT, // 0x47 + SET_EXPERIENCE, // 0x48 + UPDATE_HEALTH, // 0x49 + SCOREBOARD_OBJECTIVE, // 0x4A + SET_PASSENGERS, // 0x4B + TEAMS, // 0x4C + UPDATE_SCORE, // 0x4D + TIME_UPDATE, // 0x4E + TITLE, // 0x4F + ENTITY_SOUND, // 0x50 + SOUND, // 0x51 + STOP_SOUND, // 0x52 + TAB_LIST, // 0x53 + NBT_QUERY, // 0x54 + COLLECT_ITEM, // 0x55 + ENTITY_TELEPORT, // 0x56 + ADVANCEMENTS, // 0x57 + ENTITY_PROPERTIES, // 0x58 + ENTITY_EFFECT, // 0x59 + DECLARE_RECIPES, // 0x5A + TAGS, // 0x5B +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java index c6b2f5a5c..73eb4bd0e 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/Protocol1_16_2To1_16_1.java @@ -18,12 +18,12 @@ import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.ClientboundPackets1_16 import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.ServerboundPackets1_16; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; -public class Protocol1_16_2To1_16_1 extends Protocol { +public class Protocol1_16_2To1_16_1 extends Protocol { private TagRewriter tagRewriter; public Protocol1_16_2To1_16_1() { - super(ClientboundPackets1_16.class, ClientboundPackets1_16.class, ServerboundPackets1_16.class, ServerboundPackets1_16_2.class, true); + super(ClientboundPackets1_16.class, ClientboundPackets1_16_2.class, ServerboundPackets1_16.class, ServerboundPackets1_16_2.class, true); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/data/MappingData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/data/MappingData.java index 6208b8f81..b9c7e8cc7 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/data/MappingData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/data/MappingData.java @@ -1,12 +1,18 @@ package us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.data; +import com.github.steveice10.opennbt.NBTIO; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.google.gson.JsonObject; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.Mappings; import us.myles.ViaVersion.util.Int2IntBiMap; +import java.io.File; +import java.io.IOException; + public class MappingData { + public static CompoundTag dimensionRegistry; public static Int2IntBiMap oldToNewItems = new Int2IntBiMap(); public static Mappings blockMappings; public static Mappings blockStateMappings; @@ -17,6 +23,13 @@ public class MappingData { JsonObject mapping1_16 = MappingDataLoader.loadData("mapping-1.16.json", true); JsonObject mapping1_16_2 = MappingDataLoader.loadData("mapping-1.16.2.json", true); + try { + dimensionRegistry = NBTIO.readFile(new File(MappingDataLoader.getResourceUrl("dimenstion-registry-1.16.2.nbt").getFile())); + } catch (IOException e) { + Via.getPlatform().getLogger().severe("Error loading dimenstion registry:"); + e.printStackTrace(); + } + oldToNewItems.defaultReturnValue(-1); blockStateMappings = new Mappings(mapping1_16.getAsJsonObject("blockstates"), mapping1_16_2.getAsJsonObject("blockstates")); blockMappings = new Mappings(mapping1_16.getAsJsonObject("blocks"), mapping1_16_2.getAsJsonObject("blocks")); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/EntityPackets.java index 934f92141..1d155525c 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/EntityPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/EntityPackets.java @@ -5,6 +5,7 @@ import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_14; import us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.Protocol1_16_2To1_16_1; +import us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.data.MappingData; import us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.metadata.MetadataRewriter1_16_2To1_16_1; import us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.storage.EntityTracker1_16_2; import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.ClientboundPackets1_16; @@ -35,7 +36,11 @@ public class EntityPackets { }); map(Type.BYTE); // Previous Gamemode map(Type.STRING_ARRAY); // World List - map(Type.NBT); // Dimension Registry + handler(wrapper -> { + // Throw away the old dimension registry, extra conversion would be too hard of a hit + wrapper.read(Type.NBT); + wrapper.write(Type.NBT, MappingData.dimensionRegistry); + }); map(Type.STRING); // Dimension Type map(Type.STRING); // Dimension map(Type.LONG); // Seed diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/WorldPackets.java index 83ba4301a..fc554f8e8 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/packets/WorldPackets.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.packets; +import us.myles.ViaVersion.api.minecraft.BlockChangeRecord; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.protocol.Protocol; @@ -7,6 +8,7 @@ import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.rewriters.BlockRewriter; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.Protocol1_16_2To1_16_1; +import us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.types.Chunk1_16_2Type; import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.ClientboundPackets1_16; import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.types.Chunk1_16Type; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -18,7 +20,6 @@ public class WorldPackets { blockRewriter.registerBlockAction(ClientboundPackets1_16.BLOCK_ACTION); blockRewriter.registerBlockChange(ClientboundPackets1_16.BLOCK_CHANGE); - blockRewriter.registerMultiBlockChange(ClientboundPackets1_16.MULTI_BLOCK_CHANGE); blockRewriter.registerAcknowledgePlayerDigging(ClientboundPackets1_16.ACKNOWLEDGE_PLAYER_DIGGING); protocol.registerOutgoing(ClientboundPackets1_16.CHUNK_DATA, new PacketRemapper() { @@ -26,7 +27,9 @@ public class WorldPackets { public void registerMap() { handler(wrapper -> { ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); - Chunk chunk = wrapper.passthrough(new Chunk1_16Type(clientWorld)); + Chunk chunk = wrapper.read(new Chunk1_16Type(clientWorld)); + wrapper.write(new Chunk1_16_2Type(clientWorld), chunk); + for (int s = 0; s < 16; s++) { ChunkSection section = chunk.getSections()[s]; if (section == null) continue; @@ -39,8 +42,49 @@ public class WorldPackets { } }); + protocol.registerOutgoing(ClientboundPackets1_16.MULTI_BLOCK_CHANGE, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + wrapper.cancel(); + + int chunkX = wrapper.read(Type.INT); + int chunkZ = wrapper.read(Type.INT); + wrapper.write(Type.LONG, asLong(chunkX, 0, chunkZ)); //TODO + + BlockChangeRecord[] blockChangeRecord = wrapper.read(Type.BLOCK_CHANGE_RECORD_ARRAY); + wrapper.write(Type.VAR_LONG_BLOCK_CHANGE_RECORD_ARRAY, blockChangeRecord); + for (BlockChangeRecord record : blockChangeRecord) { + record.setBlockId(Protocol1_16_2To1_16_1.getNewBlockId(record.getBlockId())); + } + }); + } + }); + blockRewriter.registerEffect(ClientboundPackets1_16.EFFECT, 1010, 2001, InventoryPackets::getNewItemId); blockRewriter.registerSpawnParticle(ClientboundPackets1_16.SPAWN_PARTICLE, 3, 23, 34, null, InventoryPackets::toClient, Type.FLAT_VAR_INT_ITEM, Type.DOUBLE); } + + //TODO to chunk coordinates + public static int x(final long long1) { + return (int) (long1 >> 42); + } + + public static int y(final long long1) { + return (int) (long1 << 44 >> 44); + } + + public static int z(final long long1) { + return (int) (long1 << 22 >> 42); + } + + + public static long asLong(final int x, final int y, final int z) { + long long4 = 0L; + long4 |= (x & 0x3FFFFFL) << 42; + long4 |= (y & 0xFFFFFL); + long4 |= (z & 0x3FFFFFL) << 20; + return long4; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/types/Chunk1_16_2Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/types/Chunk1_16_2Type.java new file mode 100644 index 000000000..8fd73884f --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/types/Chunk1_16_2Type.java @@ -0,0 +1,106 @@ +package us.myles.ViaVersion.protocols.protocol1_16_2to1_16_1.types; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.minecraft.chunks.BaseChunk; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; +import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; +import us.myles.ViaVersion.api.type.PartialType; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.minecraft.BaseChunkType; +import us.myles.ViaVersion.api.type.types.version.Types1_16; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Chunk1_16_2Type extends PartialType { + private static final CompoundTag[] EMPTY_COMPOUNDS = new CompoundTag[0]; + + public Chunk1_16_2Type(ClientWorld param) { + super(param, Chunk.class); + } + + @Override + public Chunk read(ByteBuf input, ClientWorld world) throws Exception { + int chunkX = input.readInt(); + int chunkZ = input.readInt(); + + boolean fullChunk = input.readBoolean(); + boolean ignoreOldLightData = input.readBoolean(); + int primaryBitmask = Type.VAR_INT.readPrimitive(input); + CompoundTag heightMap = Type.NBT.read(input); + + int[] biomeData = null; + if (fullChunk) { + biomeData = Type.VAR_INT_ARRAY_PRIMITIVE.read(input); + } + + Type.VAR_INT.readPrimitive(input); // data size in bytes + + // Read sections + ChunkSection[] sections = new ChunkSection[16]; + for (int i = 0; i < 16; i++) { + if ((primaryBitmask & (1 << i)) == 0) continue; // Section not set + + short nonAirBlocksCount = input.readShort(); + ChunkSection section = Types1_16.CHUNK_SECTION.read(input); + section.setNonAirBlocksCount(nonAirBlocksCount); + sections[i] = section; + } + + List nbtData = new ArrayList<>(Arrays.asList(Type.NBT_ARRAY.read(input))); + + // Read all the remaining bytes (workaround for #681) + if (input.readableBytes() > 0) { + byte[] array = Type.REMAINING_BYTES.read(input); + if (Via.getManager().isDebug()) { + Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); + } + } + + return new BaseChunk(chunkX, chunkZ, fullChunk, ignoreOldLightData, primaryBitmask, sections, biomeData, heightMap, nbtData); + } + + @Override + public void write(ByteBuf output, ClientWorld world, Chunk chunk) throws Exception { + output.writeInt(chunk.getX()); + output.writeInt(chunk.getZ()); + + output.writeBoolean(chunk.isFullChunk()); + output.writeBoolean(chunk.isIgnoreOldLightData()); + Type.VAR_INT.writePrimitive(output, chunk.getBitmask()); + Type.NBT.write(output, chunk.getHeightMap()); + + // Write biome data + if (chunk.isBiomeData()) { + Type.VAR_INT_ARRAY_PRIMITIVE.write(output, chunk.getBiomeData()); + } + + ByteBuf buf = output.alloc().buffer(); + try { + for (int i = 0; i < 16; i++) { + ChunkSection section = chunk.getSections()[i]; + if (section == null) continue; // Section not set + + buf.writeShort(section.getNonAirBlocksCount()); + Types1_16.CHUNK_SECTION.write(buf, section); + } + buf.readerIndex(0); + Type.VAR_INT.writePrimitive(output, buf.readableBytes()); + output.writeBytes(buf); + } finally { + buf.release(); // release buffer + } + + // Write Block Entities + Type.NBT_ARRAY.write(output, chunk.getBlockEntities().toArray(EMPTY_COMPOUNDS)); + } + + @Override + public Class getBaseClass() { + return BaseChunkType.class; + } +} diff --git a/common/src/main/resources/assets/viaversion/data/dimension-registry-1.16.2.nbt b/common/src/main/resources/assets/viaversion/data/dimension-registry-1.16.2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..76b74bcee96756d315932ffade05b43fab372db8 GIT binary patch literal 43744 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 AZ2$lO literal 0 HcmV?d00001 diff --git a/fabric/pom.xml b/fabric/pom.xml index c6834bb7b..6a0f4e1dd 100644 --- a/fabric/pom.xml +++ b/fabric/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/jar/pom.xml b/jar/pom.xml index eccda7698..eeffe666b 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 viaversion-jar diff --git a/pom.xml b/pom.xml index 0dec419c2..58dfdf531 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ us.myles viaversion-parent - 3.0.2-20w27a + 3.0.2-20w28a pom viaversion-parent diff --git a/sponge-legacy/pom.xml b/sponge-legacy/pom.xml index 9cd2b6a32..76ca91ff2 100644 --- a/sponge-legacy/pom.xml +++ b/sponge-legacy/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/sponge/pom.xml b/sponge/pom.xml index 20bba0b3a..a170bd396 100644 --- a/sponge/pom.xml +++ b/sponge/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0 diff --git a/velocity/pom.xml b/velocity/pom.xml index ad650e9ce..24fdb80b7 100644 --- a/velocity/pom.xml +++ b/velocity/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 3.0.2-20w27a + 3.0.2-20w28a 4.0.0