ModCandidateFinder 接口
基本信息
| 属性 |
值 |
| 类型 |
@FunctionalInterface |
| 方法 |
void findCandidates(ModCandidateConsumer out) |
| 嵌套接口 |
ModCandidateConsumer |
ModCandidateFinder 是 JarJar 把"mod 候选来源"抽象为可插拔 finder 的函数式接口。ParallellModDiscoverer 用一组 finder 收集候选 path。
接口定义
@FunctionalInterface
public interface ModCandidateFinder {
void findCandidates(ModCandidateConsumer out);
interface ModCandidateConsumer {
default void accept(Path path, boolean requiresRemap) {
accept(Collections.singletonList(path), requiresRemap, false, false);
}
default void accept(List<Path> paths, boolean requiresRemap) {
accept(paths, requiresRemap, false, false);
}
void accept(List<Path> paths, boolean requiresRemap, boolean isMinecraft, boolean isClasspath);
}
}
标志位
| 标志 |
默认 |
含义 |
requiresRemap |
false |
path 是否需要重映射(classpath jar 通常 true) |
isMinecraft |
false |
是否为 Minecraft jar(标记 ASMDataTable 行为) |
isClasspath |
false |
是否为 classpath 阶段 jar(标记 ModCandidateV2 字段) |
三个 accept 重载
accept(Path, boolean):单个 path,非 Minecraft 非 classpath
accept(List<Path>, boolean):多个 path,非 Minecraft 非 classpath
accept(List<Path>, boolean, boolean, boolean):完整四参数
finder 通常调用完整版本。ParallellModDiscoverer 实现 ModCandidateConsumer lambda:
ModCandidateFinder.ModCandidateConsumer taskSubmitter = (paths, requiresRemap, isMinecraft, isClasspath) -> {
List<Path> pendingPaths = new ArrayList<>(paths.size());
for (Path path : paths) {
assert path.equals(LoaderUtil.normalizeExistingPath(path));
if (processedPaths.add(path)) pendingPaths.add(path);
}
if (!pendingPaths.isEmpty()) futures.add(pool.submit(new ModScanTask(pendingPaths, requiresRemap, isMinecraft, isClasspath)));
};
实现类
| 实现 |
来源 |
用途 |
ClasspathModCandidateFinder |
JarJar |
扫描 Minecraft jar |
DirectoryModCandidateFinder |
Fabric 移植 |
扫描 mods 目录 |
相关条目