Class MinecraftProvider
- Direct Known Subclasses:
LegacyMergedMinecraftProvider,MergedMinecraftProvider,SingleJarMinecraftProvider,SplitMinecraftProvider
-
Constructor Summary
ConstructorsConstructorDescriptionMinecraftProvider(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) -
Method Summary
Modifier and TypeMethodDescriptionvoidaddProducerDependency(org.gradle.api.Task task, Path artifact) 把「本任务以该产物为输入」表达成任务依赖;未投影时什么也不做.protected StringcacheKey()protected static voiddependOn(org.gradle.api.Task task, @Nullable RemapMinecraftTaskRegistry.Producer producer) 把生产者登记成任务依赖;未投影(无任务)时什么也不做.protected @Nullable StringReturns 与依赖 provider 无关的那部分判据;子类覆写点.final voidprotected LoomGradleExtension@Nullable Fileabstract MappingsNamespaceprotected org.gradle.api.Project@Nullable BundleMetadataprotected voidprotected booleanReturns 此刻getMinecraftJars()是否已能求值.booleanReturns true if the minecraft version is between Beta 1.0 (inclusive) and 1.3 (exclusive), which splits theofficialmapping namespace into env-specific variants.booleanprotected final booleanReturns 本次是否已把产物生产交给执行期任务.static FileminecraftWorkingDirectory(org.gradle.api.Project project, String version) protected static PathReturns 路径的绝对规范化形式.org.gradle.api.file.FileCollectionoutputForTasks(Path artifact) Returns 该产物「按路径声明 + 携带产出任务依赖」的单文件集合.protected void子类在此生产自己的产物(合并/拆分/env-only 透传).protected static @Nullable RemapMinecraftTaskRegistry.ProducerproducerOf(Map<Path, RemapMinecraftTaskRegistry.Producer> producers, Path artifact) Returns 本批登记中该产物的生产者;未登记时为null.@Nullable StringproductionTaskPath(Path artifact) Returns 该产物的产出任务路径;本 provider 未投影或该路径不由本 provider 产出时为null.protected @Nullable StringReturns 不能把产物生产投影成执行期任务的原因;可以投影时为null.voidprovide()内存配置段:与产物是否已落位无关的那部分.protected booleanvoid产物生产段:由CompileConfiguration在setupDependencyProviders之后调用.protected booleanbooleanprotected void子 provider 在此注册自己的产物(合并/拆分),并把它们的输入登记成任务依赖.voidregisterTaskProducedArtifact(Path artifact, RemapMinecraftTaskRegistry.Producer producer) 登记一个由**本 provider 之外的接线方**(Forge 的 patch 链)产出的最终 jar.voidsetJarPrefix(String jarSuffix)
-
Constructor Details
-
MinecraftProvider
-
-
Method Details
-
provideClient
protected boolean provideClient() -
provideServer
protected boolean provideServer() -
provide
内存配置段:与产物是否已落位无关的那部分.产物生产(下载/抽取,子类再含合并/拆分/env-only 透传)**不在这里**,由
provideMinecraftJars()承担。拆开的理由是判据的求值时机:projectionBlocker()里那条 Forge 系判据要读isLegacyForge(),而它依赖已解析的 userdev 配置——依赖 provider 只能在库处理器把仓库定稿之后建立 (见CompileConfiguration.setupDependencyProviders的注释),因此生产整体推迟到那之后。库注入(
MinecraftLibraryProvider)仍留在本段:它必须在依赖 provider 之前完成, 且服务端库列表取自 bundle 元数据。推迟路径下元数据由earlyProjectionBlocker()的末条保证命中 L2 规格缓存,读它不会打开 server jar。- Throws:
Exception
-
provideMinecraftJars
产物生产段:由CompileConfiguration在setupDependencyProviders之后调用.只有
provide()判定「判据尚不可求值」的形态(Forge 系)才会真正生产;其余形态 已在provide()里就地生产完毕,这里什么也不做——生产段对每个 provider 恰好执行一次。- Throws:
Exception
-
produceOwnJars
子类在此生产自己的产物(合并/拆分/env-only 透传).由
provide()与provideMinecraftJars()在基类产物之后调用,因此 「我的输入就是基类产物」这条关系由调用点保证。投影时不会调用本方法:那时产物由registerProviderTasks(java.util.Map<java.nio.file.Path, net.fabricmc.loom.pipeline.RemapMinecraftTaskRegistry.Producer>)登记的执行期任务承担(子类在那里决定自己怎么接线)。- Throws:
Exception
-
isTaskProduction
protected final boolean isTaskProduction()Returns 本次是否已把产物生产交给执行期任务. 子 provider(合并/拆分)据此决定自己怎么生产.- Returns:
- 本次是否已把产物生产交给执行期任务
-
projectionBlocker
Returns 不能把产物生产投影成执行期任务的原因;可以投影时为null..每一条都是一个「配置期必须真读产物 jar(或必须由配置期落盘)」的形态。投影后产物只在执行期落位, 这些配置期读者会读到不存在(或上一代)的文件,因此必须整批退回配置期生产——那个路径与改造前逐字一致。
只能在依赖 provider 建立之后调用:最后那条 Forge 系判据要读
isLegacyForge(), 它依赖已解析的 userdev 配置。provide()执行得更早,那里只能求earlyProjectionBlocker();两者的差集就是「本形态为什么必须把生产推迟」。- legacy Forge(FG2 形态的 userdev,MC 1.7-1.12.2):patch 流程走 FG2 工作目录下的一组产物,
MinecraftLegacyPatchedProvider在配置期按路径读 vanilla jar。
与依赖 provider 无关的那几条见
earlyProjectionBlocker()。- Returns:
- 不能把产物生产投影成执行期任务的原因;可以投影时为
null
- legacy Forge(FG2 形态的 userdev,MC 1.7-1.12.2):patch 流程走 FG2 工作目录下的一组产物,
-
earlyProjectionBlocker
Returns 与依赖 provider 无关的那部分判据;子类覆写点..本方法能在
provide()里求值(那时依赖 provider 尚未建立),因此它是子类表达 「本形态不能投影」的唯一位置:命中即整批回退,生产与库注入都留在改造前的位置与顺序上。- disableObfuscation:mapped 阶段自身整批回退到配置期生产,配置期会按路径读 vanilla jar; 它同时覆盖 unobfuscated Forge,故必须排在 Forge 判据之前——那一条要读依赖 provider。
- 签名校验开启:校验要打开 jar 读签名与内容,本次未随链迁移(见
verificationEnabled())。 - 映射可能不是 tiny v2:V1 映射的字段名补全在配置期读 merged jar,且只支持单 jar 形态。
- bundle 元数据未进 L2 规格缓存:服务端库的注入是配置期事实,元数据没有缓存就必须先 下载并打开 server jar——那正是本次要移出配置期的动作。
- Returns:
- 与依赖 provider 无关的那部分判据;子类覆写点
-
isFinalProductKnown
protected boolean isFinalProductKnown()Returns 此刻getMinecraftJars()是否已能求值..默认恒为真。Forge 的合并形态是唯一例外:它的最终产物是 patched jar,其路径要等
MinecraftPatchedProvider.initPatchedFiles()之后才确定,而那时 patch 链已经自己走过registerTaskProducedArtifact(java.nio.file.Path, net.fabricmc.loom.pipeline.RemapMinecraftTaskRegistry.Producer)(同一条registerJarOutputs()登记路径), 因此这里跳过不会让任何产物失去登记。- Returns:
- 此刻
getMinecraftJars()是否已能求值
-
registerProviderTasks
子 provider 在此注册自己的产物(合并/拆分),并把它们的输入登记成任务依赖.默认什么也不做:产物就是下载/抽取出来的那些 jar。
- Parameters:
producers- 本次已登记的产物(可写):键是产物的绝对规范化路径
-
registerTaskProducedArtifact
public void registerTaskProducedArtifact(Path artifact, RemapMinecraftTaskRegistry.Producer producer) 登记一个由**本 provider 之外的接线方**(Forge 的 patch 链)产出的最终 jar.这些 jar 同样出现在
getMinecraftJars()里,因此必须走同一条登记路径: 消费侧(getMinecraftJarsCollection(OFFICIAL)、mapped provider 的重映射任务)靠这里拿到 「我的输入由哪个任务产出」的任务依赖。只把产物当成路径交给它们,冷缓存下消费方就会在产物落位前开跑。只能在
provide()之后调用:那时getMinecraftJars()才有意义, 且首次registerJarOutputs()已经把命名空间下的集合实例发出去,这里的重复登记是「并进」语义。- Parameters:
artifact- 产物路径(绝对规范化)producer- 该产物的生产者(携带任务路径)
-
producerOf
protected static @Nullable RemapMinecraftTaskRegistry.Producer producerOf(Map<Path, RemapMinecraftTaskRegistry.Producer> producers, Path artifact) Returns 本批登记中该产物的生产者;未登记时为null. 供子 provider 建任务依赖用.- Returns:
- 本批登记中该产物的生产者;未登记时为
null
-
dependOn
protected static void dependOn(org.gradle.api.Task task, @Nullable RemapMinecraftTaskRegistry.Producer producer) 把生产者登记成任务依赖;未投影(无任务)时什么也不做.dependsOn/builtBy都接受任务路径:产出方可能由另一份 Loom classloader 配置, 把对方的任务实例交过来会在使用处抛ClassCastException。 -
productionTaskPath
Returns 该产物的产出任务路径;本 provider 未投影或该路径不由本 provider 产出时为null..供消费方把「我的输入就是你的产出」表达成任务依赖。
- Returns:
- 该产物的产出任务路径;本 provider 未投影或该路径不由本 provider 产出时为
null
-
outputForTasks
Returns 该产物「按路径声明 + 携带产出任务依赖」的单文件集合..未投影时是裸文件,与改造前的语义一致(消费侧只需路径,产物早已在配置期落盘)。
- Returns:
- 该产物「按路径声明 + 携带产出任务依赖」的单文件集合
-
addProducerDependency
把「本任务以该产物为输入」表达成任务依赖;未投影时什么也不做. -
normalize
Returns 路径的绝对规范化形式. 生产者的键一律用它,避免「同一文件两种写法」查不到生产者.- Returns:
- 路径的绝对规范化形式
-
cacheKey
-
initFiles
protected void initFiles() -
extractBundledServerJar
- Throws:
IOException
-
workingDir
-
dir
-
file
-
path
-
getMinecraftClientJar
-
getMinecraftExtractedServerJar
-
getMinecraftServerJar
-
minecraftVersion
-
getVersionInfo
-
isLegacyVersion
public boolean isLegacyVersion()- Returns:
- true if the minecraft version is older than 1.3.
-
isLegacySplitOfficialNamespaceVersion
public boolean isLegacySplitOfficialNamespaceVersion()Returns true if the minecraft version is between Beta 1.0 (inclusive) and 1.3 (exclusive), which splits theofficialmapping namespace into env-specific variants. -
getJarPrefix
-
setJarPrefix
-
getServerBundleMetadata
-
getMinecraftJars
-
getOfficialNamespace
-
getProject
protected org.gradle.api.Project getProject() -
getExtension
-
refreshDeps
public boolean refreshDeps() -
minecraftWorkingDirectory
-