diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 366e06556..ceacf8a2b 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -164,6 +164,7 @@ public final class BlockRegistryPopulator { BiFunction stateMapper = blockMappers.getOrDefault(palette.getKey(), emptyMapper); int[] javaToBedrockBlocks = new int[BLOCKS_JSON.size()]; + int[] javaToVanillaBedrockBlocks = new int[BLOCKS_JSON.size()]; Map flowerPotBlocks = new Object2ObjectOpenHashMap<>(); Object2IntMap itemFrames = new Object2IntOpenHashMap<>(); @@ -175,11 +176,12 @@ public final class BlockRegistryPopulator { javaRuntimeId++; Map.Entry entry = blocksIterator.next(); String javaId = entry.getKey(); + int vanillaBedrockRuntimeId = blockStateOrderedMap.getOrDefault(buildBedrockState(entry.getValue(), stateVersion, stateMapper), -1); int bedrockRuntimeId; CustomBlockState blockStateOverride = BlockRegistries.CUSTOM_BLOCK_STATE_OVERRIDES.get(javaRuntimeId); if (blockStateOverride == null) { - bedrockRuntimeId = blockStateOrderedMap.getOrDefault(buildBedrockState(entry.getValue(), stateVersion, stateMapper), -1); + bedrockRuntimeId = vanillaBedrockRuntimeId; if (bedrockRuntimeId == -1) { throw new RuntimeException("Unable to find " + javaId + " Bedrock runtime ID! Built NBT tag: \n" + buildBedrockState(entry.getValue(), stateVersion, stateMapper)); @@ -218,6 +220,7 @@ public final class BlockRegistryPopulator { flowerPotBlocks.put(cleanJavaIdentifier.intern(), blockStates.get(bedrockRuntimeId)); } + javaToVanillaBedrockBlocks[javaRuntimeId] = vanillaBedrockRuntimeId; javaToBedrockBlocks[javaRuntimeId] = bedrockRuntimeId; } @@ -252,6 +255,7 @@ public final class BlockRegistryPopulator { BlockRegistries.BLOCKS.register(palette.getKey().valueInt(), builder.blockStateVersion(stateVersion) .javaToBedrockBlocks(javaToBedrockBlocks) + .javaToVanillaBedrockBlocks(javaToVanillaBedrockBlocks) .itemFrames(itemFrames) .flowerPotBlocks(flowerPotBlocks) .jigsawStateIds(jigsawStateIds) diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index bfb34bca4..87d487ea6 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -375,7 +375,7 @@ public class ItemRegistryPopulator { // and the last, if relevant. We then iterate over all those values and get their Bedrock equivalents Integer lastBlockRuntimeId = entry.getValue().getLastBlockRuntimeId() == null ? firstBlockRuntimeId : entry.getValue().getLastBlockRuntimeId(); for (int i = firstBlockRuntimeId; i <= lastBlockRuntimeId; i++) { - int bedrockBlockRuntimeId = blockMappings.getBedrockBlockId(i); + int bedrockBlockRuntimeId = blockMappings.getVanillaBedrockBlockId(i); NbtMap blockTag = blockMappings.getBedrockBlockStates().get(bedrockBlockRuntimeId); String bedrockName = blockTag.getString("name"); if (!bedrockName.equals(correctBedrockIdentifier)) { diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java index e2e99d5e7..7c3cc0c79 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java @@ -47,6 +47,7 @@ public class BlockMappings { int blockStateVersion; int[] javaToBedrockBlocks; + int[] javaToVanillaBedrockBlocks; NbtList bedrockBlockStates; int[] remappedVanillaIds; @@ -68,6 +69,13 @@ public class BlockMappings { return this.javaToBedrockBlocks[state]; } + public int getVanillaBedrockBlockId(int state) { + if (state >= this.javaToVanillaBedrockBlocks.length) { + return bedrockAirId; + } + return this.javaToVanillaBedrockBlocks[state]; + } + public int getItemFrame(NbtMap tag) { return this.itemFrames.getOrDefault(tag, -1); }