85 lines
2.5 KiB
Java
85 lines
2.5 KiB
Java
package net.minecraft.server.packs;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.server.packs.metadata.MetadataSectionType;
|
|
import net.minecraft.server.packs.resources.IoSupplier;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class CompositePackResources implements PackResources {
|
|
private final PackResources primaryPackResources;
|
|
private final List<PackResources> packResourcesStack;
|
|
|
|
public CompositePackResources(PackResources primaryPackResources, List<PackResources> packResourcesStack) {
|
|
this.primaryPackResources = primaryPackResources;
|
|
List<PackResources> list = new ArrayList(packResourcesStack.size() + 1);
|
|
list.addAll(Lists.reverse(packResourcesStack));
|
|
list.add(primaryPackResources);
|
|
this.packResourcesStack = List.copyOf(list);
|
|
}
|
|
|
|
@Nullable
|
|
@Override
|
|
public IoSupplier<InputStream> getRootResource(String... elements) {
|
|
return this.primaryPackResources.getRootResource(elements);
|
|
}
|
|
|
|
@Nullable
|
|
@Override
|
|
public IoSupplier<InputStream> getResource(PackType packType, ResourceLocation location) {
|
|
for (PackResources packResources : this.packResourcesStack) {
|
|
IoSupplier<InputStream> ioSupplier = packResources.getResource(packType, location);
|
|
if (ioSupplier != null) {
|
|
return ioSupplier;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void listResources(PackType packType, String namespace, String path, PackResources.ResourceOutput resourceOutput) {
|
|
Map<ResourceLocation, IoSupplier<InputStream>> map = new HashMap();
|
|
|
|
for (PackResources packResources : this.packResourcesStack) {
|
|
packResources.listResources(packType, namespace, path, map::putIfAbsent);
|
|
}
|
|
|
|
map.forEach(resourceOutput);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> getNamespaces(PackType type) {
|
|
Set<String> set = new HashSet();
|
|
|
|
for (PackResources packResources : this.packResourcesStack) {
|
|
set.addAll(packResources.getNamespaces(type));
|
|
}
|
|
|
|
return set;
|
|
}
|
|
|
|
@Nullable
|
|
@Override
|
|
public <T> T getMetadataSection(MetadataSectionType<T> type) throws IOException {
|
|
return this.primaryPackResources.getMetadataSection(type);
|
|
}
|
|
|
|
@Override
|
|
public PackLocationInfo location() {
|
|
return this.primaryPackResources.location();
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
this.packResourcesStack.forEach(PackResources::close);
|
|
}
|
|
}
|