156 lines
6.0 KiB
Java
156 lines
6.0 KiB
Java
package net.minecraft.server.packs;
|
|
|
|
import com.google.common.base.Joiner;
|
|
import com.google.common.collect.Sets;
|
|
import com.mojang.logging.LogUtils;
|
|
import com.mojang.serialization.DataResult.Error;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.file.DirectoryStream;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.NoSuchFileException;
|
|
import java.nio.file.NotDirectoryException;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.attribute.BasicFileAttributes;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
import java.util.Set;
|
|
import java.util.stream.Stream;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.FileUtil;
|
|
import net.minecraft.Util;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.server.packs.repository.Pack;
|
|
import net.minecraft.server.packs.resources.IoSupplier;
|
|
import org.slf4j.Logger;
|
|
|
|
public class PathPackResources extends AbstractPackResources {
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
private static final Joiner PATH_JOINER = Joiner.on("/");
|
|
private final Path root;
|
|
|
|
public PathPackResources(PackLocationInfo p_335945_, Path p_256025_) {
|
|
super(p_335945_);
|
|
this.root = p_256025_;
|
|
}
|
|
|
|
@Nullable
|
|
@Override
|
|
public IoSupplier<InputStream> getRootResource(String... p_249041_) {
|
|
FileUtil.validatePath(p_249041_);
|
|
Path path = FileUtil.resolvePath(this.root, List.of(p_249041_));
|
|
return Files.exists(path) ? IoSupplier.create(path) : null;
|
|
}
|
|
|
|
public static boolean validatePath(Path p_249579_) {
|
|
return true;
|
|
}
|
|
|
|
@Nullable
|
|
@Override
|
|
public IoSupplier<InputStream> getResource(PackType p_249352_, ResourceLocation p_251715_) {
|
|
Path path = this.root.resolve(p_249352_.getDirectory()).resolve(p_251715_.getNamespace());
|
|
return getResource(p_251715_, path);
|
|
}
|
|
|
|
@Nullable
|
|
public static IoSupplier<InputStream> getResource(ResourceLocation p_250145_, Path p_251046_) {
|
|
return FileUtil.decomposePath(p_250145_.getPath()).mapOrElse(p_251647_ -> {
|
|
Path path = FileUtil.resolvePath(p_251046_, (List<String>)p_251647_);
|
|
return returnFileIfExists(path);
|
|
}, p_326463_ -> {
|
|
LOGGER.error("Invalid path {}: {}", p_250145_, p_326463_.message());
|
|
return null;
|
|
});
|
|
}
|
|
|
|
@Nullable
|
|
private static IoSupplier<InputStream> returnFileIfExists(Path p_250506_) {
|
|
return Files.exists(p_250506_) && validatePath(p_250506_) ? IoSupplier.create(p_250506_) : null;
|
|
}
|
|
|
|
@Override
|
|
public void listResources(PackType p_251452_, String p_249854_, String p_248650_, PackResources.ResourceOutput p_248572_) {
|
|
FileUtil.decomposePath(p_248650_).ifSuccess(p_250225_ -> {
|
|
Path path = this.root.resolve(p_251452_.getDirectory()).resolve(p_249854_);
|
|
listPath(p_249854_, path, (List<String>)p_250225_, p_248572_);
|
|
}).ifError(p_326465_ -> LOGGER.error("Invalid path {}: {}", p_248650_, p_326465_.message()));
|
|
}
|
|
|
|
public static void listPath(String p_249455_, Path p_249514_, List<String> p_251918_, PackResources.ResourceOutput p_249964_) {
|
|
Path path = FileUtil.resolvePath(p_249514_, p_251918_);
|
|
|
|
try (Stream<Path> stream = Files.find(path, Integer.MAX_VALUE, (p_250060_, p_250796_) -> p_250796_.isRegularFile())) {
|
|
stream.forEach(p_249092_ -> {
|
|
String s = PATH_JOINER.join(p_249514_.relativize(p_249092_));
|
|
ResourceLocation resourcelocation = ResourceLocation.tryBuild(p_249455_, s);
|
|
if (resourcelocation == null) {
|
|
Util.logAndPauseIfInIde(String.format(Locale.ROOT, "Invalid path in pack: %s:%s, ignoring", p_249455_, s));
|
|
} else {
|
|
p_249964_.accept(resourcelocation, IoSupplier.create(p_249092_));
|
|
}
|
|
});
|
|
} catch (NotDirectoryException | NoSuchFileException nosuchfileexception) {
|
|
} catch (IOException ioexception) {
|
|
LOGGER.error("Failed to list path {}", path, ioexception);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Set<String> getNamespaces(PackType p_251896_) {
|
|
Set<String> set = Sets.newHashSet();
|
|
Path path = this.root.resolve(p_251896_.getDirectory());
|
|
|
|
try (DirectoryStream<Path> directorystream = Files.newDirectoryStream(path)) {
|
|
for (Path path1 : directorystream) {
|
|
String s = path1.getFileName().toString();
|
|
if (ResourceLocation.isValidNamespace(s)) {
|
|
set.add(s);
|
|
} else {
|
|
LOGGER.warn("Non [a-z0-9_.-] character in namespace {} in pack {}, ignoring", s, this.root);
|
|
}
|
|
}
|
|
} catch (NotDirectoryException | NoSuchFileException nosuchfileexception) {
|
|
} catch (IOException ioexception) {
|
|
LOGGER.error("Failed to list path {}", path, ioexception);
|
|
}
|
|
|
|
return set;
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
}
|
|
|
|
public static class PathResourcesSupplier implements Pack.ResourcesSupplier {
|
|
private final Path content;
|
|
|
|
public PathResourcesSupplier(Path p_298516_) {
|
|
this.content = p_298516_;
|
|
}
|
|
|
|
@Override
|
|
public PackResources openPrimary(PackLocationInfo p_332278_) {
|
|
return new PathPackResources(p_332278_, this.content);
|
|
}
|
|
|
|
@Override
|
|
public PackResources openFull(PackLocationInfo p_329373_, Pack.Metadata p_332015_) {
|
|
PackResources packresources = this.openPrimary(p_329373_);
|
|
List<String> list = p_332015_.overlays();
|
|
if (list.isEmpty()) {
|
|
return packresources;
|
|
} else {
|
|
List<PackResources> list1 = new ArrayList<>(list.size());
|
|
|
|
for (String s : list) {
|
|
Path path = this.content.resolve(s);
|
|
list1.add(new PathPackResources(p_329373_, path));
|
|
}
|
|
|
|
return new CompositePackResources(packresources, list1);
|
|
}
|
|
}
|
|
}
|
|
} |