package net.minecraft.data.advancements; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; 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.Identifier; /** * Access widened by fabric-data-generation-api-v1 to extendable */ public class AdvancementProvider implements DataProvider { private final PackOutput.PathProvider pathProvider; private final List subProviders; private final CompletableFuture registries; public AdvancementProvider(final PackOutput output, final CompletableFuture registries, final List subProviders) { this.pathProvider = output.createRegistryElementsPathProvider(Registries.ADVANCEMENT); this.subProviders = subProviders; this.registries = registries; } @Override public CompletableFuture run(final CachedOutput cache) { return this.registries.thenCompose(lookup -> { Set allAdvancements = new HashSet(); List> tasks = new ArrayList(); Consumer consumer = holder -> { if (!allAdvancements.add(holder.id())) { throw new IllegalStateException("Duplicate advancement " + holder.id()); } else { Path path = this.pathProvider.json(holder.id()); tasks.add(DataProvider.saveStable(cache, lookup, Advancement.CODEC, holder.value(), path)); } }; for (AdvancementSubProvider subProvider : this.subProviders) { subProvider.generate(lookup, consumer); } return CompletableFuture.allOf((CompletableFuture[])tasks.toArray(CompletableFuture[]::new)); }); } /** * Access widened by fabric-data-generation-api-v1 to extendable */ @Override public String getName() { return "Advancements"; } }