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 java.util.stream.Collectors; import joptsimple.OptionParser; import joptsimple.OptionSet; import joptsimple.OptionSpec; import net.minecraft.SharedConstants; import net.minecraft.Util; import net.minecraft.WorldVersion; import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistrySetBuilder; 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.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.models.ModelProvider; import net.minecraft.data.recipes.packs.BundleRecipeProvider; 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.CatVariantTagsProvider; 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.TradeRebalanceStructureTagsProvider; 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 { @DontObfuscate public static void main(String[] strings) throws IOException { SharedConstants.tryDetectVersion(); OptionParser optionParser = new OptionParser(); OptionSpec optionSpec = optionParser.accepts("help", "Show the help menu").forHelp(); OptionSpec optionSpec2 = optionParser.accepts("server", "Include server generators"); OptionSpec optionSpec3 = optionParser.accepts("client", "Include client generators"); OptionSpec optionSpec4 = optionParser.accepts("dev", "Include development tools"); OptionSpec optionSpec5 = optionParser.accepts("reports", "Include data reports"); OptionSpec optionSpec6 = optionParser.accepts("validate", "Validate inputs"); OptionSpec optionSpec7 = optionParser.accepts("all", "Include all generators"); OptionSpec optionSpec8 = optionParser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); OptionSpec optionSpec9 = optionParser.accepts("input", "Input folder").withRequiredArg(); OptionSet optionSet = optionParser.parse(strings); if (!optionSet.has(optionSpec) && optionSet.hasOptions()) { Path path = Paths.get(optionSpec8.value(optionSet)); boolean bl = optionSet.has(optionSpec7); boolean bl2 = bl || optionSet.has(optionSpec3); boolean bl3 = bl || optionSet.has(optionSpec2); boolean bl4 = bl || optionSet.has(optionSpec4); boolean bl5 = bl || optionSet.has(optionSpec5); boolean bl6 = bl || optionSet.has(optionSpec6); DataGenerator dataGenerator = createStandardGenerator( path, (Collection)optionSet.valuesOf(optionSpec9).stream().map(string -> Paths.get(string)).collect(Collectors.toList()), bl2, bl3, bl4, bl5, bl6, SharedConstants.getCurrentVersion(), true ); dataGenerator.run(); } else { optionParser.printHelpOn(System.out); } } private static DataProvider.Factory bindRegistries( BiFunction, T> tagProviderFactory, CompletableFuture lookupProvider ) { return packOutput -> (T)tagProviderFactory.apply(packOutput, lookupProvider); } public static DataGenerator createStandardGenerator( Path outputFolder, Collection inputFolders, boolean client, boolean server, boolean dev, boolean reports, boolean validate, WorldVersion version, boolean alwaysGenerate ) { DataGenerator dataGenerator = new DataGenerator(outputFolder, version, alwaysGenerate); DataGenerator.PackGenerator packGenerator = dataGenerator.getVanillaPack(client || server); packGenerator.addProvider(packOutput -> new SnbtToNbt(packOutput, inputFolders).addFilter(new StructureUpdater())); CompletableFuture completableFuture = CompletableFuture.supplyAsync(VanillaRegistries::createLookup, Util.backgroundExecutor()); DataGenerator.PackGenerator packGenerator2 = dataGenerator.getVanillaPack(client); packGenerator2.addProvider(ModelProvider::new); DataGenerator.PackGenerator packGenerator3 = dataGenerator.getVanillaPack(server); packGenerator3.addProvider(bindRegistries(RegistriesDatapackGenerator::new, completableFuture)); packGenerator3.addProvider(bindRegistries(VanillaAdvancementProvider::create, completableFuture)); packGenerator3.addProvider(bindRegistries(VanillaLootTableProvider::create, completableFuture)); packGenerator3.addProvider(bindRegistries(VanillaRecipeProvider::new, completableFuture)); TagsProvider tagsProvider = packGenerator3.addProvider(bindRegistries(VanillaBlockTagsProvider::new, completableFuture)); TagsProvider tagsProvider2 = packGenerator3.addProvider( packOutput -> new VanillaItemTagsProvider(packOutput, completableFuture, tagsProvider.contentsGetter()) ); TagsProvider tagsProvider3 = packGenerator3.addProvider(bindRegistries(BiomeTagsProvider::new, completableFuture)); TagsProvider tagsProvider4 = packGenerator3.addProvider(bindRegistries(BannerPatternTagsProvider::new, completableFuture)); TagsProvider tagsProvider5 = packGenerator3.addProvider(bindRegistries(StructureTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(CatVariantTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(DamageTypeTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(EntityTypeTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(FlatLevelGeneratorPresetTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(FluidTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(GameEventTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(InstrumentTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(PaintingVariantTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(PoiTypeTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(WorldPresetTagsProvider::new, completableFuture)); packGenerator3.addProvider(bindRegistries(VanillaEnchantmentTagsProvider::new, completableFuture)); packGenerator3 = dataGenerator.getVanillaPack(dev); packGenerator3.addProvider(packOutput -> new NbtToSnbt(packOutput, inputFolders)); packGenerator3 = dataGenerator.getVanillaPack(reports); packGenerator3.addProvider(bindRegistries(BiomeParametersDumpReport::new, completableFuture)); packGenerator3.addProvider(bindRegistries(ItemListReport::new, completableFuture)); packGenerator3.addProvider(bindRegistries(BlockListReport::new, completableFuture)); packGenerator3.addProvider(bindRegistries(CommandsReport::new, completableFuture)); packGenerator3.addProvider(RegistryDumpReport::new); packGenerator3.addProvider(PacketReport::new); packGenerator3 = dataGenerator.getBuiltinDatapack(server, "bundle"); packGenerator3.addProvider(bindRegistries(BundleRecipeProvider::new, completableFuture)); packGenerator3.addProvider( packOutput -> PackMetadataGenerator.forFeaturePack(packOutput, Component.translatable("dataPack.bundle.description"), FeatureFlagSet.of(FeatureFlags.BUNDLE)) ); CompletableFuture completableFuture2 = TradeRebalanceRegistries.createLookup(completableFuture); CompletableFuture completableFuture3 = completableFuture2.thenApply(RegistrySetBuilder.PatchedRegistries::patches); DataGenerator.PackGenerator packGenerator4 = dataGenerator.getBuiltinDatapack(server, "trade_rebalance"); packGenerator4.addProvider(bindRegistries(RegistriesDatapackGenerator::new, completableFuture3)); packGenerator4.addProvider( packOutput -> PackMetadataGenerator.forFeaturePack( packOutput, Component.translatable("dataPack.trade_rebalance.description"), FeatureFlagSet.of(FeatureFlags.TRADE_REBALANCE) ) ); packGenerator4.addProvider(bindRegistries(TradeRebalanceLootTableProvider::create, completableFuture)); packGenerator4.addProvider(bindRegistries(TradeRebalanceStructureTagsProvider::new, completableFuture)); packGenerator4.addProvider(bindRegistries(TradeRebalanceEnchantmentTagsProvider::new, completableFuture)); return dataGenerator; } }