Code/net/minecraft/server/packs/repository/BuiltInPackSource.java

110 lines
4.1 KiB
Java

package net.minecraft.server.packs.repository;
import com.mojang.logging.LogUtils;
import java.io.IOException;
import java.nio.file.Files;
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 javax.annotation.Nullable;
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.world.level.validation.DirectoryValidator;
import org.apache.commons.lang3.StringUtils;
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 p_249137_, VanillaPackResources p_250453_, ResourceLocation p_251151_, DirectoryValidator p_300643_) {
this.packType = p_249137_;
this.vanillaPack = p_250453_;
this.packDir = p_251151_;
this.validator = p_300643_;
}
@Override
public void loadPacks(Consumer<Pack> p_250708_) {
Pack pack = this.createVanillaPack(this.vanillaPack);
if (pack != null) {
p_250708_.accept(pack);
}
this.listBundledPacks(p_250708_);
}
@Nullable
protected abstract Pack createVanillaPack(PackResources p_251690_);
protected abstract Component getPackTitle(String p_251850_);
public VanillaPackResources getVanillaPack() {
return this.vanillaPack;
}
private void listBundledPacks(Consumer<Pack> p_249128_) {
Map<String, Function<String, Pack>> map = new HashMap<>();
this.populatePackList(map::put);
map.forEach((p_250371_, p_250946_) -> {
Pack pack = p_250946_.apply(p_250371_);
if (pack != null) {
p_249128_.accept(pack);
}
});
}
protected void populatePackList(BiConsumer<String, Function<String, Pack>> p_250341_) {
this.vanillaPack.listRawPaths(this.packType, this.packDir, p_250248_ -> this.discoverPacksInPath(p_250248_, p_250341_));
}
protected void discoverPacksInPath(@Nullable Path p_250013_, BiConsumer<String, Function<String, Pack>> p_249898_) {
if (p_250013_ != null && Files.isDirectory(p_250013_)) {
try {
FolderRepositorySource.discoverPacks(
p_250013_,
this.validator,
(p_252012_, p_249772_) -> p_249898_.accept(
pathToId(p_252012_), p_250601_ -> this.createBuiltinPack(p_250601_, p_249772_, this.getPackTitle(p_250601_))
)
);
} catch (IOException ioexception) {
LOGGER.warn("Failed to discover packs in {}", p_250013_, ioexception);
}
}
}
private static String pathToId(Path p_252048_) {
return StringUtils.removeEnd(p_252048_.getFileName().toString(), ".zip");
}
@Nullable
protected abstract Pack createBuiltinPack(String p_249992_, Pack.ResourcesSupplier p_248670_, Component p_252197_);
protected static Pack.ResourcesSupplier fixedResources(final PackResources p_298206_) {
return new Pack.ResourcesSupplier() {
@Override
public PackResources openPrimary(PackLocationInfo p_333958_) {
return p_298206_;
}
@Override
public PackResources openFull(PackLocationInfo p_336095_, Pack.Metadata p_328489_) {
return p_298206_;
}
};
}
}