Class MinecraftLegacyPatchedProvider

java.lang.Object
dev.architectury.loom.forge.minecraft.MinecraftPatchedProvider
dev.architectury.loom.forge.minecraft.MinecraftLegacyPatchedProvider

public class MinecraftLegacyPatchedProvider extends MinecraftPatchedProvider
  • Constructor Details

  • Method Details

    • provide

      public void provide() throws Exception
      Overrides:
      provide in class MinecraftPatchedProvider
      Throws:
      Exception
    • checkCache

      protected boolean checkCache() throws IOException
      锁内二次确认:判定现有产物能否复用,并返回本次是否需要整链重建.

      与父类一致,本方法不再删除共享产物:删除会让锁外只做存在性判定的读方拿到缺失文件, 也会让其它工作树互相触发重建。legacy 链没有单一版本标记产物,任一件缺失即无法确认 其余产物与当前算法同代,因此按整链重建处理(各件仍以「临时文件 + 原子落位」重新生成)。

      Overrides:
      checkCache in class MinecraftPatchedProvider
      Returns:
      是否需要整链重建
      Throws:
      IOException
    • getGlobalCaches

      protected Path[] getGlobalCaches()
      Description copied from class: MinecraftPatchedProvider
      Returns 本配置下必须可复用的共享产物列表,供 MinecraftPatchedProvider.needsWork() 判定..

      列表只包含当前 jar 配置确实会生成的产物:server-only 不提供 client jar, client-extra.jar 既不生成也不进 classpath、不注册进 FORGE_EXTRA(见 MinecraftPatchedProvider.providesClientJar()), 把它计入判定会让 MinecraftPatchedProvider.needsWork() 恒为真、每次构建都白取一次跨进程锁。

      Overrides:
      getGlobalCaches in class MinecraftPatchedProvider
      Returns:
      本配置下必须可复用的共享产物列表,供 MinecraftPatchedProvider.needsWork() 判定
    • produceIntermediateJarIfMissing

      protected void produceIntermediateJarIfMissing() throws Exception
      Description copied from class: MinecraftPatchedProvider
      确保 MinecraftPatchedProvider.getMinecraftPatchedIntermediateJar() 指向的产物已存在.

      默认实现调用 MinecraftPatchedProvider.provide();legacy 链的产物在 MinecraftPatchedProvider.remapJar(ServiceFactory) 阶段生成(provide() 只做判定),由子类覆盖补齐。

      任务路径下不能走 provide():那条路径只做接线、不写产物。本方法只被**配置期读者**调用 (getOrProduceMinecraftPatchedIntermediateJar 的调用方:mappings 迁移的配置期回退路径), 而那个读者与 MinecraftPatchedProvider.provideProjectionBlocker() 用的是同一个判据——走到这里时任务路径本不该生效。 真走到这里(产物在判定之后被其它工作树删掉或写坏)时,provide() 只做接线, 随后 getOrProduceMinecraftPatchedIntermediateJar 的可复用性复检会以明确异常报出, 而不是把不存在的路径交给迁移器去读。

      Overrides:
      produceIntermediateJarIfMissing in class MinecraftPatchedProvider
      Throws:
      Exception
    • getNamedForgeJar

      public Path getNamedForgeJar()
      Returns 已重映射到 named 的 Forge jar. 仅 legacy Forge 具备该产物.

      legacy 的 Forge universal jar 按 srg 名发布,patchForge 会把它重映射成 named, 落位在 Forge 缓存工作目录的 forge.jar。该产物是 ForgeMemberNameFixer 建立「srg 名 → named 名」映射的 对照来源之一;现代 Forge 的 universal jar 本身就在 named 空间,没有这份产物。

      这里按路径定位而非依赖实例类型:MergedForgeMinecraftProvider.getPatchedProvider() 在部分时序下返回的是本基类而非 MinecraftLegacyPatchedProvider(实测 1.12.2 即如此), 若只靠子类覆写会拿到 null。产物不存在时返回 null,调用方据此跳过。

      legacy 的 named forge jar 由 patchForge 内的 srg→named 重映射产出, 位置固定为 forgeWorkingDir/forge.jar,在 provide() 阶段就已写入字段 (与重映射是否已执行无关)。因此本方法只负责给路径,**是否真的产出**由调用方用 Files.isRegularFile 自行判断——基类的按路径推导版本也是同样的契约。

      Overrides:
      getNamedForgeJar in class MinecraftPatchedProvider
      Returns:
      已重映射到 named 的 Forge jar
    • remapJar

      public void remapJar(ServiceFactory serviceFactory) throws Exception
      Overrides:
      remapJar in class MinecraftPatchedProvider
      Throws:
      Exception
    • patchJars

      protected void patchJars(Path clean, Path output, Path patches) throws Exception
      Description copied from class: MinecraftPatchedProvider
      对给定 jar 执行 Forge 的 binary patch.

      工具的 classpath、主类与参数模板都由 ForgeExternalToolService.Options 声明: classpath 是惰性的(配置期只接线,取值推迟到真正执行时),发起调用也只依赖 ServiceFactory。 因此本方法既能在配置期路径里调用,也能在把它连同调用点搬进任务之后于执行期调用—— 那条路径上不再有任何需要 Project 的同步求值。

      Overrides:
      patchJars in class MinecraftPatchedProvider
      Throws:
      Exception
    • modifySideAnnotations

      public static void modifySideAnnotations(Path jarFile) throws Exception
      对合并产物应用 SideAnnotationMerger(供执行期任务复用).

      合并后的 jar 会同时带 JillMerger 写的 Fabric 风格 Sided 注解与 Forge 补丁自己写的, 前者中非冗余的要转换成 Forge 形式、冗余的直接丢弃(详见该 visitor 的说明)。

      Parameters:
      jarFile - 合并后的 jar(就地修改)
      Throws:
      Exception
    • modifyParameterAnnotations

      public static void modifyParameterAnnotations(Path jarFile) throws Exception
      对打完补丁的 jar 应用 ParameterAnnotationsFixer(供执行期任务复用).

      Forge 补丁产出的 class 里,Runtime[In]VisibleParameterAnnotation.num_parameters 可能小于方法形参个数(最后一个参数无注解时),会让编译器读到表尾而报错。 这个 visitor 忽略原值、让 ASM 按签名重算(详见内部类的说明)。

      Parameters:
      jarFile - 打完补丁的 jar(就地修改)
      Throws:
      Exception
    • modifyClassesStatic

      public static void modifyClassesStatic(Path jarFile, Function<org.objectweb.asm.ClassVisitor,org.objectweb.asm.ClassVisitor> func) throws Exception
      用 ASM 逐类改写一个 jar 内的 class(与配置期 modifyClasses 同一条实现).

      是静态且不读项目模型:它只看 jar 文件与 visitor 工厂,因此执行期任务与配置期路径 可以共用同一处实现,不会出现两份逐类改写逻辑。

      Parameters:
      jarFile - 待改写的 jar(就地修改)
      func - 每个类构造 visitor 的函数
      Throws:
      Exception
    • getMinecraftIntermediateJar

      public Path getMinecraftIntermediateJar()
      Overrides:
      getMinecraftIntermediateJar in class MinecraftPatchedProvider
    • getMinecraftPatchedIntermediateJar

      public Path getMinecraftPatchedIntermediateJar()
      Overrides:
      getMinecraftPatchedIntermediateJar in class MinecraftPatchedProvider
    • getMinecraftPatchedJar

      public Path getMinecraftPatchedJar()
      Overrides:
      getMinecraftPatchedJar in class MinecraftPatchedProvider