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.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.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 { @SuppressForbidden( reason = "System.out needed before bootstrap" ) @DontObfuscate public static void main(String[] p_129669_) throws IOException { SharedConstants.tryDetectVersion(); OptionParser optionparser = new OptionParser(); OptionSpec optionspec = optionparser.accepts("help", "Show the help menu").forHelp(); OptionSpec optionspec1 = optionparser.accepts("server", "Include server generators"); OptionSpec optionspec2 = optionparser.accepts("dev", "Include development tools"); OptionSpec optionspec3 = optionparser.accepts("reports", "Include data reports"); optionparser.accepts("validate", "Validate inputs"); OptionSpec optionspec4 = optionparser.accepts("all", "Include all generators"); OptionSpec optionspec5 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); OptionSpec optionspec6 = optionparser.accepts("input", "Input folder").withRequiredArg(); OptionSet optionset = optionparser.parse(p_129669_); if (!optionset.has(optionspec) && optionset.hasOptions()) { Path path = Paths.get(optionspec5.value(optionset)); boolean flag = optionset.has(optionspec4); boolean flag1 = flag || optionset.has(optionspec1); boolean flag2 = flag || optionset.has(optionspec2); boolean flag3 = flag || optionset.has(optionspec3); Collection collection = optionset.valuesOf(optionspec6).stream().map(p_129659_ -> Paths.get(p_129659_)).toList(); DataGenerator datagenerator = new DataGenerator(path, SharedConstants.getCurrentVersion(), true); addServerProviders(datagenerator, collection, flag1, flag2, flag3); datagenerator.run(); } else { optionparser.printHelpOn(System.out); } } private static DataProvider.Factory bindRegistries( BiFunction, T> p_256618_, CompletableFuture p_256515_ ) { return p_255476_ -> p_256618_.apply(p_255476_, p_256515_); } public static void addServerProviders(DataGenerator p_378724_, Collection p_375786_, boolean p_376625_, boolean p_377749_, boolean p_378020_) { DataGenerator.PackGenerator datagenerator$packgenerator = p_378724_.getVanillaPack(p_376625_); datagenerator$packgenerator.addProvider(p_253388_ -> new SnbtToNbt(p_253388_, p_375786_).addFilter(new StructureUpdater())); CompletableFuture completablefuture1 = CompletableFuture.supplyAsync(VanillaRegistries::createLookup, Util.backgroundExecutor()); DataGenerator.PackGenerator datagenerator$packgenerator1 = p_378724_.getVanillaPack(p_376625_); datagenerator$packgenerator1.addProvider(bindRegistries(RegistriesDatapackGenerator::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(VanillaAdvancementProvider::create, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(VanillaLootTableProvider::create, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(VanillaRecipeProvider.Runner::new, completablefuture1)); TagsProvider tagsprovider = datagenerator$packgenerator1.addProvider(bindRegistries(VanillaBlockTagsProvider::new, completablefuture1)); TagsProvider tagsprovider1 = datagenerator$packgenerator1.addProvider( p_274753_ -> new VanillaItemTagsProvider(p_274753_, completablefuture1, tagsprovider.contentsGetter()) ); TagsProvider tagsprovider2 = datagenerator$packgenerator1.addProvider(bindRegistries(BiomeTagsProvider::new, completablefuture1)); TagsProvider tagsprovider3 = datagenerator$packgenerator1.addProvider(bindRegistries(BannerPatternTagsProvider::new, completablefuture1)); TagsProvider tagsprovider4 = datagenerator$packgenerator1.addProvider(bindRegistries(StructureTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(CatVariantTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(DamageTypeTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(EntityTypeTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(FlatLevelGeneratorPresetTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(FluidTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(GameEventTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(InstrumentTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(PaintingVariantTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(PoiTypeTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(WorldPresetTagsProvider::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(VanillaEnchantmentTagsProvider::new, completablefuture1)); datagenerator$packgenerator1 = p_378724_.getVanillaPack(p_377749_); datagenerator$packgenerator1.addProvider(p_253386_ -> new NbtToSnbt(p_253386_, p_375786_)); datagenerator$packgenerator1 = p_378724_.getVanillaPack(p_378020_); datagenerator$packgenerator1.addProvider(bindRegistries(BiomeParametersDumpReport::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(ItemListReport::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(BlockListReport::new, completablefuture1)); datagenerator$packgenerator1.addProvider(bindRegistries(CommandsReport::new, completablefuture1)); datagenerator$packgenerator1.addProvider(RegistryDumpReport::new); datagenerator$packgenerator1.addProvider(PacketReport::new); datagenerator$packgenerator1.addProvider(DatapackStructureReport::new); CompletableFuture completablefuture2 = TradeRebalanceRegistries.createLookup(completablefuture1); CompletableFuture completablefuture = completablefuture2.thenApply(RegistrySetBuilder.PatchedRegistries::patches); DataGenerator.PackGenerator datagenerator$packgenerator2 = p_378724_.getBuiltinDatapack(p_376625_, "trade_rebalance"); datagenerator$packgenerator2.addProvider(bindRegistries(RegistriesDatapackGenerator::new, completablefuture)); datagenerator$packgenerator2.addProvider( p_296336_ -> PackMetadataGenerator.forFeaturePack( p_296336_, Component.translatable("dataPack.trade_rebalance.description"), FeatureFlagSet.of(FeatureFlags.TRADE_REBALANCE) ) ); datagenerator$packgenerator2.addProvider(bindRegistries(TradeRebalanceLootTableProvider::create, completablefuture1)); datagenerator$packgenerator2.addProvider(bindRegistries(TradeRebalanceStructureTagsProvider::new, completablefuture1)); datagenerator$packgenerator2.addProvider(bindRegistries(TradeRebalanceEnchantmentTagsProvider::new, completablefuture1)); datagenerator$packgenerator1 = p_378724_.getBuiltinDatapack(p_376625_, "redstone_experiments"); datagenerator$packgenerator1.addProvider( p_358165_ -> PackMetadataGenerator.forFeaturePack( p_358165_, Component.translatable("dataPack.redstone_experiments.description"), FeatureFlagSet.of(FeatureFlags.REDSTONE_EXPERIMENTS) ) ); datagenerator$packgenerator1 = p_378724_.getBuiltinDatapack(p_376625_, "minecart_improvements"); datagenerator$packgenerator1.addProvider( p_358177_ -> PackMetadataGenerator.forFeaturePack( p_358177_, Component.translatable("dataPack.minecart_improvements.description"), FeatureFlagSet.of(FeatureFlags.MINECART_IMPROVEMENTS) ) ); } }