minecraft-src/net/minecraft/data/Main.java
2025-07-04 03:45:38 +03:00

162 lines
9.7 KiB
Java

package net.minecraft.data;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
import net.minecraft.SharedConstants;
import net.minecraft.SuppressForbidden;
import net.minecraft.Util;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.data.DataGenerator.PackGenerator;
import net.minecraft.data.DataProvider.Factory;
import net.minecraft.data.advancements.packs.VanillaAdvancementProvider;
import net.minecraft.data.info.BiomeParametersDumpReport;
import net.minecraft.data.info.BlockListReport;
import net.minecraft.data.info.CommandsReport;
import net.minecraft.data.info.DatapackStructureReport;
import net.minecraft.data.info.ItemListReport;
import net.minecraft.data.info.PacketReport;
import net.minecraft.data.info.RegistryDumpReport;
import net.minecraft.data.loot.packs.TradeRebalanceLootTableProvider;
import net.minecraft.data.loot.packs.VanillaLootTableProvider;
import net.minecraft.data.metadata.PackMetadataGenerator;
import net.minecraft.data.recipes.packs.VanillaRecipeProvider;
import net.minecraft.data.registries.RegistriesDatapackGenerator;
import net.minecraft.data.registries.TradeRebalanceRegistries;
import net.minecraft.data.registries.VanillaRegistries;
import net.minecraft.data.structures.NbtToSnbt;
import net.minecraft.data.structures.SnbtToNbt;
import net.minecraft.data.structures.StructureUpdater;
import net.minecraft.data.tags.BannerPatternTagsProvider;
import net.minecraft.data.tags.BiomeTagsProvider;
import net.minecraft.data.tags.DamageTypeTagsProvider;
import net.minecraft.data.tags.EntityTypeTagsProvider;
import net.minecraft.data.tags.FlatLevelGeneratorPresetTagsProvider;
import net.minecraft.data.tags.FluidTagsProvider;
import net.minecraft.data.tags.GameEventTagsProvider;
import net.minecraft.data.tags.InstrumentTagsProvider;
import net.minecraft.data.tags.PaintingVariantTagsProvider;
import net.minecraft.data.tags.PoiTypeTagsProvider;
import net.minecraft.data.tags.StructureTagsProvider;
import net.minecraft.data.tags.TagsProvider;
import net.minecraft.data.tags.TradeRebalanceEnchantmentTagsProvider;
import net.minecraft.data.tags.VanillaBlockTagsProvider;
import net.minecraft.data.tags.VanillaEnchantmentTagsProvider;
import net.minecraft.data.tags.VanillaItemTagsProvider;
import net.minecraft.data.tags.WorldPresetTagsProvider;
import net.minecraft.network.chat.Component;
import net.minecraft.obfuscate.DontObfuscate;
import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BannerPattern;
import net.minecraft.world.level.levelgen.structure.Structure;
public class Main {
@SuppressForbidden(
reason = "System.out needed before bootstrap"
)
@DontObfuscate
public static void main(String[] strings) throws IOException {
SharedConstants.tryDetectVersion();
OptionParser optionParser = new OptionParser();
OptionSpec<Void> optionSpec = optionParser.accepts("help", "Show the help menu").forHelp();
OptionSpec<Void> optionSpec2 = optionParser.accepts("server", "Include server generators");
OptionSpec<Void> optionSpec3 = optionParser.accepts("dev", "Include development tools");
OptionSpec<Void> optionSpec4 = optionParser.accepts("reports", "Include data reports");
optionParser.accepts("validate", "Validate inputs");
OptionSpec<Void> optionSpec5 = optionParser.accepts("all", "Include all generators");
OptionSpec<String> optionSpec6 = optionParser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated");
OptionSpec<String> optionSpec7 = optionParser.accepts("input", "Input folder").withRequiredArg();
OptionSet optionSet = optionParser.parse(strings);
if (!optionSet.has(optionSpec) && optionSet.hasOptions()) {
Path path = Paths.get(optionSpec6.value(optionSet));
boolean bl = optionSet.has(optionSpec5);
boolean bl2 = bl || optionSet.has(optionSpec2);
boolean bl3 = bl || optionSet.has(optionSpec3);
boolean bl4 = bl || optionSet.has(optionSpec4);
Collection<Path> collection = optionSet.valuesOf(optionSpec7).stream().map(string -> Paths.get(string)).toList();
DataGenerator dataGenerator = new DataGenerator(path, SharedConstants.getCurrentVersion(), true);
addServerProviders(dataGenerator, collection, bl2, bl3, bl4);
dataGenerator.run();
} else {
optionParser.printHelpOn(System.out);
}
}
private static <T extends DataProvider> Factory<T> bindRegistries(
BiFunction<PackOutput, CompletableFuture<HolderLookup.Provider>, T> tagProviderFactory, CompletableFuture<HolderLookup.Provider> lookupProvider
) {
return packOutput -> (T)tagProviderFactory.apply(packOutput, lookupProvider);
}
public static void addServerProviders(DataGenerator dataGenerator, Collection<Path> paths, boolean server, boolean dev, boolean reports) {
PackGenerator packGenerator = dataGenerator.getVanillaPack(server);
packGenerator.addProvider(packOutput -> new SnbtToNbt(packOutput, paths).addFilter(new StructureUpdater()));
CompletableFuture<HolderLookup.Provider> completableFuture = CompletableFuture.supplyAsync(VanillaRegistries::createLookup, Util.backgroundExecutor());
PackGenerator packGenerator2 = dataGenerator.getVanillaPack(server);
packGenerator2.addProvider(bindRegistries(RegistriesDatapackGenerator::new, completableFuture));
packGenerator2.addProvider(bindRegistries(VanillaAdvancementProvider::create, completableFuture));
packGenerator2.addProvider(bindRegistries(VanillaLootTableProvider::create, completableFuture));
packGenerator2.addProvider(bindRegistries(VanillaRecipeProvider.Runner::new, completableFuture));
TagsProvider<Block> tagsProvider = packGenerator2.addProvider(bindRegistries(VanillaBlockTagsProvider::new, completableFuture));
TagsProvider<Item> tagsProvider2 = packGenerator2.addProvider(
packOutput -> new VanillaItemTagsProvider(packOutput, completableFuture, tagsProvider.contentsGetter())
);
TagsProvider<Biome> tagsProvider3 = packGenerator2.addProvider(bindRegistries(BiomeTagsProvider::new, completableFuture));
TagsProvider<BannerPattern> tagsProvider4 = packGenerator2.addProvider(bindRegistries(BannerPatternTagsProvider::new, completableFuture));
TagsProvider<Structure> tagsProvider5 = packGenerator2.addProvider(bindRegistries(StructureTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(DamageTypeTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(EntityTypeTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(FlatLevelGeneratorPresetTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(FluidTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(GameEventTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(InstrumentTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(PaintingVariantTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(PoiTypeTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(WorldPresetTagsProvider::new, completableFuture));
packGenerator2.addProvider(bindRegistries(VanillaEnchantmentTagsProvider::new, completableFuture));
packGenerator2 = dataGenerator.getVanillaPack(dev);
packGenerator2.addProvider(packOutput -> new NbtToSnbt(packOutput, paths));
packGenerator2 = dataGenerator.getVanillaPack(reports);
packGenerator2.addProvider(bindRegistries(BiomeParametersDumpReport::new, completableFuture));
packGenerator2.addProvider(bindRegistries(ItemListReport::new, completableFuture));
packGenerator2.addProvider(bindRegistries(BlockListReport::new, completableFuture));
packGenerator2.addProvider(bindRegistries(CommandsReport::new, completableFuture));
packGenerator2.addProvider(RegistryDumpReport::new);
packGenerator2.addProvider(PacketReport::new);
packGenerator2.addProvider(DatapackStructureReport::new);
CompletableFuture<RegistrySetBuilder.PatchedRegistries> completableFuture2 = TradeRebalanceRegistries.createLookup(completableFuture);
CompletableFuture<HolderLookup.Provider> completableFuture3 = completableFuture2.thenApply(RegistrySetBuilder.PatchedRegistries::patches);
PackGenerator packGenerator3 = dataGenerator.getBuiltinDatapack(server, "trade_rebalance");
packGenerator3.addProvider(bindRegistries(RegistriesDatapackGenerator::new, completableFuture3));
packGenerator3.addProvider(
packOutput -> PackMetadataGenerator.forFeaturePack(
packOutput, Component.translatable("dataPack.trade_rebalance.description"), FeatureFlagSet.of(FeatureFlags.TRADE_REBALANCE)
)
);
packGenerator3.addProvider(bindRegistries(TradeRebalanceLootTableProvider::create, completableFuture));
packGenerator3.addProvider(bindRegistries(TradeRebalanceEnchantmentTagsProvider::new, completableFuture));
packGenerator2 = dataGenerator.getBuiltinDatapack(server, "redstone_experiments");
packGenerator2.addProvider(
packOutput -> PackMetadataGenerator.forFeaturePack(
packOutput, Component.translatable("dataPack.redstone_experiments.description"), FeatureFlagSet.of(FeatureFlags.REDSTONE_EXPERIMENTS)
)
);
packGenerator2 = dataGenerator.getBuiltinDatapack(server, "minecart_improvements");
packGenerator2.addProvider(
packOutput -> PackMetadataGenerator.forFeaturePack(
packOutput, Component.translatable("dataPack.minecart_improvements.description"), FeatureFlagSet.of(FeatureFlags.MINECART_IMPROVEMENTS)
)
);
}
}