ClasspathModCandidateFinder
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.mitchej123.jarjar.fml.common.discovery.finder.ClasspathModCandidateFinder |
| 接口 | ModCandidateFinder |
| 用途 | 把 Minecraft jar 与相关源文件作为 mod 候选提交给 ParallellModDiscoverer |
ClasspathModCandidateFinder 扫描 ModClassLoader.getParentSources()(即 Minecraft 自身的 jar/zip 与 classpath 上的相关文件),过滤掉已知库/已加载 coremod 后,输出为 candidate。每个 source 被标记 isClasspath=true。
findCandidates 流程
public void findCandidates(ModCandidateConsumer out) {
LOGGER.info("Searching for classpath mods");
List<String> knownLibraries = ImmutableList.<String>builder()
.addAll(modClassLoader.getDefaultLibraries())
.addAll(CoreModManager.getLoadedCoremods())
.addAll(CoreModManager.getReparseableCoremods())
.build();
final File[] minecraftSources = modClassLoader.getParentSources();
if (minecraftSources.length == 1 && minecraftSources[0].isFile()) {
FMLLog.fine("Minecraft is a file at %s, loading", minecraftSources[0].getAbsolutePath());
out.accept(Collections.singletonList(minecraftSources[0].toPath()), true, true, true);
} else {
for (int i = 0; i < minecraftSources.length; i++) {
if (minecraftSources[i].isFile()) {
if (knownLibraries.contains(minecraftSources[i].getName()) || DefaultLibraries.isDefaultLibrary(minecraftSources[i])) {
FMLLog.finer("Skipping known library file %s", minecraftSources[i].getAbsolutePath());
} else {
FMLLog.fine("Found a minecraft related file at %s, examining for mod candidates", minecraftSources[i].getAbsolutePath());
out.accept(Collections.singletonList(minecraftSources[i].toPath()), true, i == 0, true);
}
} else if (minecraftSources[i].isDirectory()) {
FMLLog.fine("Found a minecraft related directory at %s, ignoring", minecraftSources[i].getAbsolutePath());
}
}
}
}
过滤规则
| 类型 | 跳过 |
|---|---|
defaultLibraries(Forge 自带) |
是 |
loadedCoremods |
是 |
reparseableCoremods |
是 |
DefaultLibraries 命中任一前缀 |
是 |
| 第一个 source(即真正的 Minecraft jar) | 始终输出,isMinecraft=true |
| 后续 source(非默认库) | 输出,i==0? isMinecraft : false |
输出标志
| 标志 | 值 | 含义 |
|---|---|---|
requiresRemap |
true |
classpath 阶段 jar 都视为需要重映射 |
isMinecraft |
true(仅首个) |
标记为 Minecraft jar |
isClasspath |
true |
标记为 classpath 阶段 jar |
ParallellModDiscoverer.ModScanTask 用这些标志构造 ModCandidateV2(classPathJar, ..., isMinecraft, isClasspath)。
与 ParallellModDiscoverer 协作
ParallellModDiscoverer 构造函数第一个 finder 即 ClasspathModCandidateFinder(modClassLoader),保证 Minecraft jar 在 Directory finder 之前被处理。
相关条目
- ModCandidateFinder 接口 - 实现接口
- DefaultLibraries 过滤 - 第二层过滤
- 并行 mod 发现 - 主调度方
- DirectoryModCandidateFinder - 兄弟 finder