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 optionSpec = optionParser.accepts("help", "Show the help menu").forHelp(); OptionSpec optionSpec2 = optionParser.accepts("server", "Include server generators"); OptionSpec optionSpec3 = optionParser.accepts("dev", "Include development tools"); OptionSpec optionSpec4 = optionParser.accepts("reports", "Include data reports"); optionParser.accepts("validate", "Validate inputs"); OptionSpec optionSpec5 = optionParser.accepts("all", "Include all generators"); OptionSpec optionSpec6 = optionParser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); OptionSpec 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 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 Factory bindRegistries( BiFunction, T> tagProviderFactory, CompletableFuture lookupProvider ) { return packOutput -> (T)tagProviderFactory.apply(packOutput, lookupProvider); } public static void addServerProviders(DataGenerator dataGenerator, Collection paths, boolean server, boolean dev, boolean reports) { PackGenerator packGenerator = dataGenerator.getVanillaPack(server); packGenerator.addProvider(packOutput -> new SnbtToNbt(packOutput, paths).addFilter(new StructureUpdater())); CompletableFuture 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 tagsProvider = packGenerator2.addProvider(bindRegistries(VanillaBlockTagsProvider::new, completableFuture)); TagsProvider tagsProvider2 = packGenerator2.addProvider( packOutput -> new VanillaItemTagsProvider(packOutput, completableFuture, tagsProvider.contentsGetter()) ); TagsProvider tagsProvider3 = packGenerator2.addProvider(bindRegistries(BiomeTagsProvider::new, completableFuture)); TagsProvider tagsProvider4 = packGenerator2.addProvider(bindRegistries(BannerPatternTagsProvider::new, completableFuture)); TagsProvider 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 completableFuture2 = TradeRebalanceRegistries.createLookup(completableFuture); CompletableFuture 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) ) ); } }