package net.minecraft.server.packs.repository; import com.mojang.logging.LogUtils; import java.io.IOException; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.PackLocationInfo; import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.VanillaPackResources; import net.minecraft.server.packs.repository.Pack.Metadata; import net.minecraft.server.packs.repository.Pack.ResourcesSupplier; import net.minecraft.world.level.validation.DirectoryValidator; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; public abstract class BuiltInPackSource implements RepositorySource { private static final Logger LOGGER = LogUtils.getLogger(); public static final String VANILLA_ID = "vanilla"; public static final String TESTS_ID = "tests"; public static final KnownPack CORE_PACK_INFO = KnownPack.vanilla("core"); private final PackType packType; private final VanillaPackResources vanillaPack; private final ResourceLocation packDir; private final DirectoryValidator validator; public BuiltInPackSource(PackType packType, VanillaPackResources vanillaPack, ResourceLocation packDir, DirectoryValidator validator) { this.packType = packType; this.vanillaPack = vanillaPack; this.packDir = packDir; this.validator = validator; } @Override public void loadPacks(Consumer consumer) { Pack pack = this.createVanillaPack(this.vanillaPack); if (pack != null) { consumer.accept(pack); } this.listBundledPacks(consumer); } @Nullable protected abstract Pack createVanillaPack(PackResources resources); protected abstract Component getPackTitle(String id); public VanillaPackResources getVanillaPack() { return this.vanillaPack; } private void listBundledPacks(Consumer packConsumer) { Map> map = new HashMap(); this.populatePackList(map::put); map.forEach((string, function) -> { Pack pack = (Pack)function.apply(string); if (pack != null) { packConsumer.accept(pack); } }); } protected void populatePackList(BiConsumer> populator) { this.vanillaPack.listRawPaths(this.packType, this.packDir, path -> this.discoverPacksInPath(path, populator)); } protected void discoverPacksInPath(@Nullable Path directoryPath, BiConsumer> packGetter) { if (directoryPath != null && Files.isDirectory(directoryPath, new LinkOption[0])) { try { FolderRepositorySource.discoverPacks( directoryPath, this.validator, (path, resourcesSupplier) -> packGetter.accept( pathToId(path), (Function)string -> this.createBuiltinPack(string, resourcesSupplier, this.getPackTitle(string)) ) ); } catch (IOException var4) { LOGGER.warn("Failed to discover packs in {}", directoryPath, var4); } } } private static String pathToId(Path path) { return StringUtils.removeEnd(path.getFileName().toString(), ".zip"); } @Nullable protected abstract Pack createBuiltinPack(String id, ResourcesSupplier resources, Component title); protected static ResourcesSupplier fixedResources(PackResources resources) { return new ResourcesSupplier() { @Override public PackResources openPrimary(PackLocationInfo location) { return resources; } @Override public PackResources openFull(PackLocationInfo location, Metadata metadata) { return resources; } }; } }