diff --git a/Data Asset Sources.md b/Data Asset Sources.md index 92a0dd07e..02470c82d 100644 --- a/Data Asset Sources.md +++ b/Data Asset Sources.md @@ -35,6 +35,9 @@ This file has been generated using `./gradlew generateBedrockSoundLists` from th [Mojang/bedrock-samples](https://github.com/Mojang/bedrock-samples/blob/84aa19df535fcf6d044f28bf76f236029bd8407a/metadata/doc_modules/addons.json) [wiki.bedrock.dev](https://wiki.bedrock.dev/blocks/block-traits.html) +### data/bedrock/data_driven_blocks.nbt +[CloudburstMC/Data](https://github.com/CloudburstMC/Data/blob/e5c84599b43b2670e9c22ae3d032f925a7d9590c/data_driven_blocks.nbt) + ### data/bedrock/effects.json [minecraft.wiki](https://minecraft.wiki/w/Effect) diff --git a/src/main/java/net/raphimc/viabedrock/protocol/data/BedrockMappingData.java b/src/main/java/net/raphimc/viabedrock/protocol/data/BedrockMappingData.java index b7330220e..10e9ac59e 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/data/BedrockMappingData.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/data/BedrockMappingData.java @@ -102,6 +102,7 @@ public class BedrockMappingData extends MappingDataBase { private IntSet javaFluidBlockStates; private Int2IntMap javaPottedBlockStates; private Map javaHeightMapBlockStates; + private Set dataDrivenBedrockBlocks; // Biomes private CompoundTag bedrockBiomeDefinitions; @@ -352,6 +353,13 @@ public void load() { } this.javaHeightMapBlockStates.put(entry.getKey(), blockStates); } + + final CompoundTag dataDrivenBedrockBlocksTag = this.readNbt("bedrock/data_driven_blocks.nbt"); + this.dataDrivenBedrockBlocks = new HashSet<>(dataDrivenBedrockBlocksTag.size()); + for (Map.Entry entry : dataDrivenBedrockBlocksTag.getValue().entrySet()) { + this.dataDrivenBedrockBlocks.add(entry.getKey()); + } + } { // Biomes @@ -1101,6 +1109,10 @@ public Map getJavaHeightMapBlockStates() { return this.javaHeightMapBlockStates; } + public Set getBedrockDataDrivenBlocks() { + return this.dataDrivenBedrockBlocks; + } + public CompoundTag getBedrockBiomeDefinitions() { return this.bedrockBiomeDefinitions; } diff --git a/src/main/java/net/raphimc/viabedrock/protocol/rewriter/BlockStateRewriter.java b/src/main/java/net/raphimc/viabedrock/protocol/rewriter/BlockStateRewriter.java index 2cb4a79b6..c9adc71cb 100644 --- a/src/main/java/net/raphimc/viabedrock/protocol/rewriter/BlockStateRewriter.java +++ b/src/main/java/net/raphimc/viabedrock/protocol/rewriter/BlockStateRewriter.java @@ -52,7 +52,7 @@ public BlockStateRewriter(final BlockProperties[] blockProperties, final boolean this.blockStateIdMappings.defaultReturnValue(-1); this.legacyBlockStateIdMappings.defaultReturnValue(-1); - final List bedrockBlockStates = new ArrayList<>(BedrockProtocol.MAPPINGS.getBedrockBlockStates()); + final List bedrockBlockStates = this.getBedrockBlockStates(blockProperties); final Map javaBlockStates = BedrockProtocol.MAPPINGS.getJavaBlockStates(); final Map bedrockToJavaBlockStates = BedrockProtocol.MAPPINGS.getBedrockToJavaBlockStates(); final Map blockTags = BedrockProtocol.MAPPINGS.getBedrockCustomBlockTags(); @@ -192,6 +192,22 @@ public BlockStateRewriter(final BlockProperties[] blockProperties, final boolean this.blockStateSanitizer = new BlockStateSanitizer(bedrockBlockStates); } + private List getBedrockBlockStates(final BlockProperties[] definitions) { + final Set registered = new HashSet<>(); + for (final BlockProperties definition : definitions) { + if (definition.properties().contains("vanilla_block_data")) { + registered.add(definition.name().toLowerCase(Locale.ROOT)); + } + } + final List states = new ArrayList<>(BedrockProtocol.MAPPINGS.getBedrockBlockStates().size()); + for (final BedrockBlockState state : BedrockProtocol.MAPPINGS.getBedrockBlockStates()) { + if (!BedrockProtocol.MAPPINGS.getBedrockDataDrivenBlocks().contains(state.namespacedIdentifier()) || registered.contains(state.namespacedIdentifier())) { + states.add(state); + } + } + return states; + } + public int bedrockId(final CompoundTag bedrockBlockStateTag) { final CompoundTag bedrockBlockStateTagClone = bedrockBlockStateTag.copy(); try { diff --git a/src/main/resources/assets/viabedrock/data/bedrock/data_driven_blocks.nbt b/src/main/resources/assets/viabedrock/data/bedrock/data_driven_blocks.nbt new file mode 100644 index 000000000..e0565ec39 Binary files /dev/null and b/src/main/resources/assets/viabedrock/data/bedrock/data_driven_blocks.nbt differ