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"