diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/Protocol1_20_3To1_20_5.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/Protocol1_20_3To1_20_5.java index e3b7500b..adf7dd8c 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/Protocol1_20_3To1_20_5.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/Protocol1_20_3To1_20_5.java @@ -25,6 +25,7 @@ import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.provider.Tran import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.rewriter.BlockItemPacketRewriter1_20_5; import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.rewriter.EntityPacketRewriter1_20_5; import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.storage.CookieStorage; +import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.storage.RegistryDataStorage; import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.storage.SecureChatStorage; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; @@ -69,7 +70,16 @@ public final class Protocol1_20_3To1_20_5 extends BackwardsProtocol tagRewriter = new TagRewriter<>(this); tagRewriter.registerGeneric(ClientboundPackets1_20_5.TAGS); - tagRewriter.registerGeneric(State.CONFIGURATION, ClientboundConfigurationPackets1_20_5.UPDATE_TAGS); + registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_5.UPDATE_TAGS, wrapper -> { + // Send off registry data first + final PacketWrapper registryDataPacket = wrapper.create(ClientboundConfigurationPackets1_20_3.REGISTRY_DATA); + registryDataPacket.write(Type.COMPOUND_TAG, wrapper.user().get(RegistryDataStorage.class).registryData().copy()); + registryDataPacket.send(Protocol1_20_3To1_20_5.class); + + tagRewriter.getGenericHandler().handle(wrapper); + }); + + registerClientbound(ClientboundPackets1_20_5.START_CONFIGURATION, wrapper -> wrapper.user().get(RegistryDataStorage.class).registryData().clear()); final SoundRewriter soundRewriter = new SoundRewriter<>(this); soundRewriter.register1_19_3Sound(ClientboundPackets1_20_5.SOUND); @@ -151,6 +161,7 @@ public final class Protocol1_20_3To1_20_5 extends BackwardsProtocol { @@ -46,9 +55,45 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter { + final String registryKey = Key.stripMinecraftNamespace(wrapper.read(Type.STRING)); + final RegistryEntry[] entries = wrapper.read(Type.REGISTRY_ENTRY_ARRAY); + + // Track data + final RegistryDataStorage registryDataStorage = wrapper.user().get(RegistryDataStorage.class); + if (registryKey.equals("worldgen/biome")) { + tracker(wrapper.user()).setBiomesSent(entries.length); + } else if (registryKey.equals("dimension_type")) { + final Map dimensionDataMap = new HashMap<>(entries.length); + final String[] keys = new String[entries.length]; + for (int i = 0; i < entries.length; i++) { + final RegistryEntry entry = entries[i]; + final String dimensionKey = Key.stripMinecraftNamespace(entry.key()); + dimensionDataMap.put(dimensionKey, new DimensionDataImpl(i, (CompoundTag) entry.tag())); + keys[i] = dimensionKey; + } + registryDataStorage.setDimensionKeys(keys); + tracker(wrapper.user()).setDimensions(dimensionDataMap); + } + + // Write to old format + final CompoundTag registryTag = new CompoundTag(); + final ListTag entriesTag = new ListTag(); + registryTag.putString("type", registryKey); + registryTag.put("value", entriesTag); + for (int i = 0; i < entries.length; i++) { + final RegistryEntry entry = entries[i]; + final CompoundTag entryCompoundTag = new CompoundTag(); + entryCompoundTag.putString("name", entry.key()); + entryCompoundTag.putInt("id", i); + entryCompoundTag.put("element", entry.tag()); + entriesTag.add(entryCompoundTag); + } + + // Store and send together with the rest later + registryDataStorage.registryData().put(registryKey, registryTag); + wrapper.cancel(); + }); } }); @@ -64,6 +109,11 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter { + final int dimensionId = wrapper.read(Type.VAR_INT); + final RegistryDataStorage storage = wrapper.user().get(RegistryDataStorage.class); + wrapper.write(Type.STRING, storage.dimensionKeys()[dimensionId]); + }); map(Type.STRING); // Dimension key map(Type.STRING); // World map(Type.LONG); // Seed @@ -84,7 +134,11 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter { + final int dimensionId = wrapper.read(Type.VAR_INT); + final RegistryDataStorage storage = wrapper.user().get(RegistryDataStorage.class); + wrapper.write(Type.STRING, storage.dimensionKeys()[dimensionId]); + }); map(Type.STRING); // World handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/storage/RegistryDataStorage.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/storage/RegistryDataStorage.java new file mode 100644 index 00000000..b438eac1 --- /dev/null +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/storage/RegistryDataStorage.java @@ -0,0 +1,45 @@ +/* + * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards + * Copyright (C) 2016-2024 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_20_3to1_20_5.storage; + +import com.viaversion.viaversion.api.connection.StorableObject; +import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; +import org.checkerframework.checker.nullness.qual.Nullable; + +public final class RegistryDataStorage implements StorableObject { + + private final CompoundTag registryData = new CompoundTag(); + private String[] dimensionKeys; + + public CompoundTag registryData() { + return registryData; + } + + public String @Nullable [] dimensionKeys() { + return dimensionKeys; + } + + public void setDimensionKeys(final String[] dimensionKeys) { + this.dimensionKeys = dimensionKeys; + } + + public void clear() { + registryData.clear(); + dimensionKeys = null; + } +} diff --git a/common/src/main/resources/assets/viabackwards/data/mappings-1.20.5to1.20.3.nbt b/common/src/main/resources/assets/viabackwards/data/mappings-1.20.5to1.20.3.nbt index cc795811..09f42be9 100644 Binary files a/common/src/main/resources/assets/viabackwards/data/mappings-1.20.5to1.20.3.nbt and b/common/src/main/resources/assets/viabackwards/data/mappings-1.20.5to1.20.3.nbt differ diff --git a/gradle.properties b/gradle.properties index 01037e31..3dc69af8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=4.10.0-24w03a-SNAPSHOT +projectVersion=4.10.0-24w04a-SNAPSHOT # Smile emoji mcVersions=1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b8d6b13..8e06f82a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ metadata.format.version = "1.1" [versions] # ViaVersion -viaver = "4.10.0-24w03a-SNAPSHOT" +viaver = "4.10.0-24w04a-SNAPSHOT" # Common provided netty = "4.0.20.Final" diff --git a/settings.gradle.kts b/settings.gradle.kts index 8ac5a9e9..08cd9c00 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,7 @@ rootProject.name = "viabackwards-parent" dependencyResolutionManagement { repositories { + mavenLocal() maven("https://repo.viaversion.com") maven("https://repo.papermc.io/repository/maven-public/") maven("https://oss.sonatype.org/content/repositories/snapshots/") diff --git a/template/src/main/java/com/viaversion/viabackwards/template/protocol/rewriter/EntityPacketRewriter1_99.java b/template/src/main/java/com/viaversion/viabackwards/template/protocol/rewriter/EntityPacketRewriter1_99.java index 0f63f962..d375b030 100644 --- a/template/src/main/java/com/viaversion/viabackwards/template/protocol/rewriter/EntityPacketRewriter1_99.java +++ b/template/src/main/java/com/viaversion/viabackwards/template/protocol/rewriter/EntityPacketRewriter1_99.java @@ -46,9 +46,9 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter