package net.minecraft.data.info; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; import java.nio.file.Path; import java.util.concurrent.CompletableFuture; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.resources.RegistryOps; import net.minecraft.util.Util; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.BlockTypes; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.Property; /** * Access widened by fabric-data-generation-api-v1 to extendable */ public class BlockListReport implements DataProvider { private final PackOutput output; private final CompletableFuture registries; public BlockListReport(final PackOutput output, final CompletableFuture registries) { this.output = output; this.registries = registries; } @Override public CompletableFuture run(final CachedOutput cache) { Path path = this.output.getOutputFolder(PackOutput.Target.REPORTS).resolve("blocks.json"); return this.registries .thenCompose( registries -> { JsonObject root = new JsonObject(); RegistryOps registryOps = registries.createSerializationContext(JsonOps.INSTANCE); registries.lookupOrThrow(Registries.BLOCK) .listElements() .forEach( block -> { JsonObject entry = new JsonObject(); StateDefinition definition = ((Block)block.value()).getStateDefinition(); if (!definition.getProperties().isEmpty()) { JsonObject properties = new JsonObject(); for (Property property : definition.getProperties()) { JsonArray values = new JsonArray(); for (Comparable value : property.getPossibleValues()) { values.add(Util.getPropertyName(property, value)); } properties.add(property.getName(), values); } entry.add("properties", properties); } JsonArray protocol = new JsonArray(); for (BlockState state : definition.getPossibleStates()) { JsonObject stateEntry = new JsonObject(); JsonObject properties = new JsonObject(); for (Property property : definition.getProperties()) { properties.addProperty(property.getName(), Util.getPropertyName(property, state.getValue(property))); } if (!properties.isEmpty()) { stateEntry.add("properties", properties); } stateEntry.addProperty("id", Block.getId(state)); if (state == ((Block)block.value()).defaultBlockState()) { stateEntry.addProperty("default", true); } protocol.add(stateEntry); } entry.add("states", protocol); String id = block.getRegisteredName(); JsonElement data = BlockTypes.CODEC .codec() .encodeStart(registryOps, (Block)block.value()) .getOrThrow(msg -> new AssertionError("Failed to serialize block " + id + " (is type registered in BlockTypes?): " + msg)); entry.add("definition", data); root.add(id, entry); } ); return DataProvider.saveStable(cache, root, path); } ); } /** * Access widened by fabric-data-generation-api-v1 to extendable */ @Override public String getName() { return "Block List"; } }