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 目录

相关条目