diff --git a/src/main/java/dev/dubhe/anvilcraft/building/StructureSnapshotCodec.java b/src/main/java/dev/dubhe/anvilcraft/building/StructureSnapshotCodec.java index 8c263c73fc..aa85d368eb 100644 --- a/src/main/java/dev/dubhe/anvilcraft/building/StructureSnapshotCodec.java +++ b/src/main/java/dev/dubhe/anvilcraft/building/StructureSnapshotCodec.java @@ -1,5 +1,7 @@ package dev.dubhe.anvilcraft.building; +import dev.dubhe.anvilcraft.AnvilCraft; +import dev.dubhe.anvilcraft.block.state.Color; import net.minecraft.SharedConstants; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderGetter; @@ -133,6 +135,7 @@ private static List parsePaletteStates(ListTag paletteTag, HolderLoo throws ConstructionBlueprintException { HolderGetter lookup = registries.lookupOrThrow(Registries.BLOCK); Set unknownIds = new LinkedHashSet<>(); + List states = new ArrayList<>(paletteTag.size()); for (int index = 0; index < paletteTag.size(); index++) { CompoundTag stateTag = paletteTag.getCompound(index); String rawName = stateTag.getString("Name"); @@ -140,7 +143,13 @@ private static List parsePaletteStates(ListTag paletteTag, HolderLoo if (id == null) { throw new ConstructionBlueprintException("corrupt_palette", "invalid block id: " + rawName); } - if (lookup.get(ResourceKey.create(Registries.BLOCK, id)).isEmpty()) { + ResourceLocation normalizedId = normalizeConcreteId(id); + if (!normalizedId.equals(id)) { + stateTag = stateTag.copy(); + stateTag.putString("Name", normalizedId.toString()); + } + states.add(stateTag); + if (lookup.get(ResourceKey.create(Registries.BLOCK, normalizedId)).isEmpty()) { unknownIds.add(id.toString()); } } @@ -149,11 +158,28 @@ private static List parsePaletteStates(ListTag paletteTag, HolderLoo } List palette = new ArrayList<>(paletteTag.size()); for (int index = 0; index < paletteTag.size(); index++) { - palette.add(NbtUtils.readBlockState(lookup, paletteTag.getCompound(index))); + palette.add(NbtUtils.readBlockState(lookup, states.get(index))); } return palette; } + private static ResourceLocation normalizeConcreteId(ResourceLocation id) { + if (!id.getNamespace().equals(AnvilCraft.MOD_ID)) { + return id; + } + for (Color color : Color.values()) { + String prefix = color + "_reinforced_concrete"; + if (!id.getPath().startsWith(prefix)) { + continue; + } + String suffix = id.getPath().substring(prefix.length()); + if (List.of("", "_slab", "_stair", "_wall").contains(suffix)) { + return AnvilCraft.of("reinforced_concrete_" + color + suffix); + } + } + return id; + } + private static List parseBlocks( CompoundTag tag, Vec3i size,