diff --git a/build.gradle.kts b/build.gradle.kts
index 34df0265..9a771cd0 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -5,7 +5,7 @@ plugins {
allprojects {
group = "com.viaversion"
- version = "4.6.2-SNAPSHOT"
+ version = "4.7.0-23w12a-SNAPSHOT"
description = "Allow older clients to join newer server versions."
}
diff --git a/common/src/main/java/com/viaversion/viabackwards/api/ViaBackwardsPlatform.java b/common/src/main/java/com/viaversion/viabackwards/api/ViaBackwardsPlatform.java
index 9afb24a9..29264f77 100644
--- a/common/src/main/java/com/viaversion/viabackwards/api/ViaBackwardsPlatform.java
+++ b/common/src/main/java/com/viaversion/viabackwards/api/ViaBackwardsPlatform.java
@@ -49,6 +49,7 @@ import com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.Protocol1_18_2T
import com.viaversion.viabackwards.protocol.protocol1_18to1_18_2.Protocol1_18To1_18_2;
import com.viaversion.viabackwards.protocol.protocol1_19_1to1_19_3.Protocol1_19_1To1_19_3;
import com.viaversion.viabackwards.protocol.protocol1_19_3to1_19_4.Protocol1_19_3To1_19_4;
+import com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.Protocol1_19_4To1_20;
import com.viaversion.viabackwards.protocol.protocol1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.Protocol1_9_4To1_10;
import com.viaversion.viaversion.api.Via;
@@ -60,7 +61,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
- String MINIMUM_VV_VERSION = "4.6.0";
+ String MINIMUM_VV_VERSION = "4.7.0";
String IMPL_VERSION = "$IMPL_VERSION";
/**
@@ -123,6 +124,8 @@ public interface ViaBackwardsPlatform {
protocolManager.registerProtocol(new Protocol1_19To1_19_1(), ProtocolVersion.v1_19, ProtocolVersion.v1_19_1);
protocolManager.registerProtocol(new Protocol1_19_1To1_19_3(), ProtocolVersion.v1_19_1, ProtocolVersion.v1_19_3);
protocolManager.registerProtocol(new Protocol1_19_3To1_19_4(), ProtocolVersion.v1_19_3, ProtocolVersion.v1_19_4);
+
+ protocolManager.registerProtocol(new Protocol1_19_4To1_20(), ProtocolVersion.v1_19_4, ProtocolVersion.v1_20);
}
/**
diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/Protocol1_19_3To1_19_4.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/Protocol1_19_3To1_19_4.java
index be46d5bd..1c8b6824 100644
--- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/Protocol1_19_3To1_19_4.java
+++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/Protocol1_19_3To1_19_4.java
@@ -1,5 +1,5 @@
/*
- * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
+ * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2023 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/packets/EntityPackets1_19_4.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/packets/EntityPackets1_19_4.java
index cc163da0..7f31bb59 100644
--- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/packets/EntityPackets1_19_4.java
+++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_3to1_19_4/packets/EntityPackets1_19_4.java
@@ -1,5 +1,5 @@
/*
- * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
+ * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2023 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/Protocol1_19_4To1_20.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/Protocol1_19_4To1_20.java
new file mode 100644
index 00000000..abf1568f
--- /dev/null
+++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/Protocol1_19_4To1_20.java
@@ -0,0 +1,85 @@
+/*
+ * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
+ * Copyright (C) 2023 ViaVersion and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.viaversion.viabackwards.protocol.protocol1_19_4to1_20;
+
+import com.viaversion.viabackwards.api.BackwardsProtocol;
+import com.viaversion.viabackwards.api.data.BackwardsMappings;
+import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
+import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
+import com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.packets.BlockItemPackets1_20;
+import com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.packets.EntityPackets1_20;
+import com.viaversion.viaversion.api.connection.UserConnection;
+import com.viaversion.viaversion.api.minecraft.entities.Entity1_19_4Types;
+import com.viaversion.viaversion.data.entity.EntityTrackerBase;
+import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ClientboundPackets1_19_4;
+import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ServerboundPackets1_19_4;
+import com.viaversion.viaversion.protocols.protocol1_20to1_19_4.Protocol1_20To1_19_4;
+import com.viaversion.viaversion.rewriter.StatisticsRewriter;
+import com.viaversion.viaversion.rewriter.TagRewriter;
+
+public final class Protocol1_19_4To1_20 extends BackwardsProtocol {
+
+ public static final BackwardsMappings MAPPINGS = new BackwardsMappings("1.20", "1.19.4", Protocol1_20To1_19_4.class);
+ private final TranslatableRewriter translatableRewriter = new TranslatableRewriter<>(this);
+ private final EntityPackets1_20 entityRewriter = new EntityPackets1_20(this);
+ private final BlockItemPackets1_20 itemRewriter = new BlockItemPackets1_20(this);
+
+ public Protocol1_19_4To1_20() {
+ super(ClientboundPackets1_19_4.class, ClientboundPackets1_19_4.class, ServerboundPackets1_19_4.class, ServerboundPackets1_19_4.class);
+ }
+
+ @Override
+ protected void registerPackets() {
+ super.registerPackets();
+
+ final TagRewriter tagRewriter = new TagRewriter<>(this);
+ tagRewriter.registerGeneric(ClientboundPackets1_19_4.TAGS);
+
+ final SoundRewriter soundRewriter = new SoundRewriter<>(this);
+ soundRewriter.registerStopSound(ClientboundPackets1_19_4.STOP_SOUND);
+ soundRewriter.register1_19_3Sound(ClientboundPackets1_19_4.SOUND);
+ soundRewriter.registerSound(ClientboundPackets1_19_4.ENTITY_SOUND);
+
+ new StatisticsRewriter<>(this).register(ClientboundPackets1_19_4.STATISTICS);
+ }
+
+ @Override
+ public void init(final UserConnection user) {
+ addEntityTracker(user, new EntityTrackerBase(user, Entity1_19_4Types.PLAYER));
+ }
+
+ @Override
+ public BackwardsMappings getMappingData() {
+ return MAPPINGS;
+ }
+
+ @Override
+ public EntityPackets1_20 getEntityRewriter() {
+ return entityRewriter;
+ }
+
+ @Override
+ public BlockItemPackets1_20 getItemRewriter() {
+ return itemRewriter;
+ }
+
+ @Override
+ public TranslatableRewriter getTranslatableRewriter() {
+ return translatableRewriter;
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/BlockItemPackets1_20.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/BlockItemPackets1_20.java
new file mode 100644
index 00000000..d8ec0fee
--- /dev/null
+++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/BlockItemPackets1_20.java
@@ -0,0 +1,81 @@
+/*
+ * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
+ * Copyright (C) 2023 ViaVersion and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.packets;
+
+import com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.Protocol1_19_4To1_20;
+import com.viaversion.viaversion.api.minecraft.Position;
+import com.viaversion.viaversion.api.type.Type;
+import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.types.Chunk1_18Type;
+import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ClientboundPackets1_19_4;
+import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ServerboundPackets1_19_4;
+import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.rewriter.RecipeRewriter1_19_4;
+import com.viaversion.viaversion.rewriter.BlockRewriter;
+import com.viaversion.viaversion.rewriter.ItemRewriter;
+
+public final class BlockItemPackets1_20 extends ItemRewriter {
+
+ public BlockItemPackets1_20(final Protocol1_19_4To1_20 protocol) {
+ super(protocol);
+ }
+
+ @Override
+ public void registerPackets() {
+ final BlockRewriter blockRewriter = new BlockRewriter<>(protocol, Type.POSITION1_14);
+ blockRewriter.registerBlockAction(ClientboundPackets1_19_4.BLOCK_ACTION);
+ blockRewriter.registerBlockChange(ClientboundPackets1_19_4.BLOCK_CHANGE);
+ blockRewriter.registerVarLongMultiBlockChange(ClientboundPackets1_19_4.MULTI_BLOCK_CHANGE);
+ blockRewriter.registerEffect(ClientboundPackets1_19_4.EFFECT, 1010, 2001);
+ blockRewriter.registerChunkData1_19(ClientboundPackets1_19_4.CHUNK_DATA, Chunk1_18Type::new);
+ blockRewriter.registerBlockEntityData(ClientboundPackets1_19_4.BLOCK_ENTITY_DATA);
+
+ registerOpenWindow(ClientboundPackets1_19_4.OPEN_WINDOW);
+ registerSetCooldown(ClientboundPackets1_19_4.COOLDOWN);
+ registerWindowItems1_17_1(ClientboundPackets1_19_4.WINDOW_ITEMS);
+ registerSetSlot1_17_1(ClientboundPackets1_19_4.SET_SLOT);
+ registerAdvancements(ClientboundPackets1_19_4.ADVANCEMENTS, Type.FLAT_VAR_INT_ITEM);
+ registerEntityEquipmentArray(ClientboundPackets1_19_4.ENTITY_EQUIPMENT);
+ registerClickWindow1_17_1(ServerboundPackets1_19_4.CLICK_WINDOW);
+ registerTradeList1_19(ClientboundPackets1_19_4.TRADE_LIST);
+ registerCreativeInvAction(ServerboundPackets1_19_4.CREATIVE_INVENTORY_ACTION, Type.FLAT_VAR_INT_ITEM);
+ registerWindowPropertyEnchantmentHandler(ClientboundPackets1_19_4.WINDOW_PROPERTY);
+ registerSpawnParticle1_19(ClientboundPackets1_19_4.SPAWN_PARTICLE);
+
+ protocol.registerClientbound(ClientboundPackets1_19_4.OPEN_SIGN_EDITOR, wrapper -> {
+ wrapper.passthrough(Type.POSITION1_14);
+ final boolean frontSide = wrapper.read(Type.BOOLEAN);
+ if (!frontSide) {
+ // TODO track front side to check in serverbound
+ wrapper.cancel();
+ }
+ });
+ protocol.registerServerbound(ServerboundPackets1_19_4.UPDATE_SIGN, wrapper -> {
+ final Position position = wrapper.passthrough(Type.POSITION1_14);
+ wrapper.write(Type.BOOLEAN, true); // Front side
+
+ //TODO Track lines to send back with edited
+ /*final CompoundTag tag = new CompoundTag();
+ final PacketWrapper signUpdate = wrapper.create(ClientboundPackets1_19_4.BLOCK_ENTITY_DATA);
+ signUpdate.send(Protocol1_19_4To1_20.class);
+ signUpdate.write(Type.POSITION1_14, position);
+ signUpdate.write(Type.VAR_INT, 5); // Sign
+ signUpdate.write(Type.NBT, tag);*/
+ });
+
+ new RecipeRewriter1_19_4<>(protocol).register(ClientboundPackets1_19_4.DECLARE_RECIPES);
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java
new file mode 100644
index 00000000..ba22c1ab
--- /dev/null
+++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java
@@ -0,0 +1,85 @@
+/*
+ * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
+ * Copyright (C) 2023 ViaVersion and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.packets;
+
+import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
+import com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.Protocol1_19_4To1_20;
+import com.viaversion.viaversion.api.minecraft.entities.Entity1_19_4Types;
+import com.viaversion.viaversion.api.minecraft.entities.EntityType;
+import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
+import com.viaversion.viaversion.api.type.Type;
+import com.viaversion.viaversion.api.type.types.version.Types1_19_4;
+import com.viaversion.viaversion.api.type.types.version.Types1_20;
+import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ClientboundPackets1_19_4;
+
+public final class EntityPackets1_20 extends EntityRewriter {
+
+ public EntityPackets1_20(final Protocol1_19_4To1_20 protocol) {
+ super(protocol);
+ }
+
+ @Override
+ public void registerPackets() {
+ registerTrackerWithData1_19(ClientboundPackets1_19_4.SPAWN_ENTITY, Entity1_19_4Types.FALLING_BLOCK);
+ registerMetadataRewriter(ClientboundPackets1_19_4.ENTITY_METADATA, Types1_20.METADATA_LIST, Types1_19_4.METADATA_LIST);
+ registerRemoveEntities(ClientboundPackets1_19_4.REMOVE_ENTITIES);
+
+ protocol.registerClientbound(ClientboundPackets1_19_4.JOIN_GAME, new PacketHandlers() {
+ @Override
+ public void register() {
+ map(Type.INT); // Entity id
+ map(Type.BOOLEAN); // Hardcore
+ map(Type.UNSIGNED_BYTE); // Gamemode
+ map(Type.BYTE); // Previous Gamemode
+ map(Type.STRING_ARRAY); // World List
+ map(Type.NBT); // Dimension registry
+ map(Type.STRING); // Dimension key
+ map(Type.STRING); // World
+ handler(dimensionDataHandler()); // Caches dimensions to access data like height later
+ handler(biomeSizeTracker()); // Tracks the amount of biomes sent for chunk data
+ handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking
+ }
+ });
+
+ protocol.registerClientbound(ClientboundPackets1_19_4.RESPAWN, new PacketHandlers() {
+ @Override
+ public void register() {
+ map(Type.STRING); // Dimension
+ map(Type.STRING); // World
+ handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking
+ }
+ });
+ }
+
+ @Override
+ protected void registerRewrites() {
+ filter().handler((event, meta) -> meta.setMetaType(Types1_19_4.META_TYPES.byId(meta.metaType().typeId())));
+ registerMetaTypeHandler(Types1_19_4.META_TYPES.itemType, Types1_19_4.META_TYPES.blockStateType,
+ Types1_19_4.META_TYPES.particleType, Types1_19_4.META_TYPES.optionalComponentType, Types1_19_4.META_TYPES.componentType);
+
+ filter().filterFamily(Entity1_19_4Types.MINECART_ABSTRACT).index(11).handler((event, meta) -> {
+ final int blockState = meta.value();
+ meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState));
+ });
+ }
+
+ @Override
+ public EntityType typeFromId(final int type) {
+ return Entity1_19_4Types.getTypeFromId(type);
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/resources/assets/viabackwards/data/mappings-1.20to1.19.4.nbt b/common/src/main/resources/assets/viabackwards/data/mappings-1.20to1.19.4.nbt
new file mode 100644
index 00000000..a53fef85
Binary files /dev/null and b/common/src/main/resources/assets/viabackwards/data/mappings-1.20to1.19.4.nbt differ
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 53dc8a87..82ca5eac 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
-viaver = "4.6.0"
+viaver = "4.7.0-23w12a-SNAPSHOT"
# Common provided
netty = "4.0.20.Final"