From bd42bdcaebab1ed0ef39ddf3a9a82f457f936b17 Mon Sep 17 00:00:00 2001 From: olcxja Date: Sat, 24 Oct 2026 18:36:56 +0200 Subject: [PATCH] Fix unknown block states in registry data for pre-26.3 clients --- .../rewriters/BackwardsRegistryRewriter.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/BackwardsRegistryRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/BackwardsRegistryRewriter.java index faf45cd1e..0e1b0a8a9 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/BackwardsRegistryRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/BackwardsRegistryRewriter.java @@ -21,6 +21,7 @@ import com.viaversion.nbt.tag.Tag; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.data.FullMappings; import com.viaversion.viaversion.api.minecraft.RegistryEntry; import com.viaversion.viaversion.rewriter.RegistryDataRewriter; import com.viaversion.viaversion.util.Key; @@ -69,6 +70,28 @@ public void updateJukeboxSongs(final UserConnection connection, final RegistryEn } } + @Override + protected boolean updateBlockState(final Tag blockStateTag) { + if (!(blockStateTag instanceof CompoundTag blockState) || blockState.getStringTag("Name") == null) { + return super.updateBlockState(blockStateTag); + } + + // Up to 26.2, block states use "Name" and "Properties" instead of "id" and "properties" + final FullMappings blockMappings = protocol.getMappingData().getFullBlockMappings(); + if (blockMappings == null) { + return false; + } + + final int blockId = blockMappings.id(blockState.getString("Name")); + if (blockId == -1 || protocol.getMappingData().hasBlockChanged(blockId)) { + // Replace unknown or changed blocks with a dummy state, else the client will fail to load the registry + blockState.putString("Name", "minecraft:dirt"); + blockState.remove("Properties"); + return true; + } + return false; + } + private void updateBiomeEffects(final CompoundTag effects) { updateSound(effects.getCompoundTag("mood_sound"), "sound"); updateSound(effects.getCompoundTag("additions_sound"), "sound");