HookLib

HookLib

核心模组框架

基础库

简介

这是 MinecraftForge 核心模组(coremod)的框架。

基本上,对模组开发者很有用。

本项目的目标是提供一种简便的方式,在不直接修改原有代码的情况下,通过编写附加代码来修改现有逻辑。

无需了解 JVM 字节码知识。

唉,我发布这个项目确实有点晚了,因为 Mixins 已经席卷了整个世界,但我发现 HookLib 更顺手,而且我还有一些尚未实现的好点子,它们会让它变得更好。所以也许它还是有意义的

入门

理解钩子(hooks)

当存在一些你想改变的代码,但它属于 Minecraft 或其他模组时,你可以这样写:

@HookContainer
public class MyHooks {
    @Hook
    @OnBegin
    public static void resize(Minecraft mc, int x, int y) {
        System.out.println("Resize, x=" + x + ", y=" + y);
    }
}

HookLib 会在 Minecraft 类中找到名为 resize、带有两个 int 参数的方法,并将对 MyHooks#resize 的调用插入到所找到的目标方法的开头。

之后,当窗口大小改变时,你就会在控制台看到消息。

添加到项目

  • 在 build.gradle 中添加依赖:

    repositories { maven { url "https://cursemaven.com" } } dependencies { implementation "curse.maven:hooklib:12345" }

  • 添加 VM 选项 -Dfml.coreMods.load=gloomyfolken.hooklib.minecraft.MainHookLoader

也可以通过 gradle 实现:

minecraft {
    mappings channel: 'snapshot', version: '20171003-1.12'

    runs {
        client {
            workingDirectory project.file('run')
            property "fml.coreMods.load", "gloomyfolken.hooklib.minecraft.MainHookLoader" //here
        }

        server {
            workingDirectory project.file('run')
            property "fml.coreMods.load", "gloomyfolken.hooklib.minecraft.MainHookLoader" //here
        }
    }
}
  • 在你的 IDE 中执行 Gradle Refresh

接下来学习

查看我们的 wiki了解 API 细节和高级技巧

路线图

  • 让 HookLib 成为核心模组的模组加载器

  • 方法调用处的注入点

  • 打印可能的 @LocalVariable 参数的方法

  • 表达式处的注入点

  • 访问私有变量的方法

  • 移植到新版本的 Minecraft

  • 用于编译期校验的注解处理器

  • 核心模组的配置

  • 对应用了钩子的目标类进行缓存

致谢

  • 感谢 @GloomyFolken 对原始 HookLib 的开发!
  • 感谢 @Foreck 提供超酷的 logo!