本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:1.13版本之后如何制作Minecraft CoreMod
本文链接:1.13版本之后如何制作Minecraft CoreMod
现在用到CoreMod的地方比较少了,大部分功能都不需要用CoreMod修改原本的Minecraft代码,而是能用钩子或者类继承的方式完成。不过还是有很多地方需要它,我自己的一个CoreMod仍然需要修改原本的代码,现在Minecraft都已经1.16.1了,Minecraft Forge也支持到了1.15.2。而1.13版本CoreMod机制做了次大改,我之前为1.12.2做的CoreMod都不能用了。
参考这篇文章就能做出修改Minecraft代码的CoreMod了:https://xfl03.gitbook.io/coremodtutor/3-yuan-ban-coremod/3.4#zhi-zuo-fang-fa。
但是有一点没有提到,如果你修改后的代码调用了自己的类,那么需要提供这个类所在的文件路径。CoreMod本身所在的Jar并不会被加载到classpath里。提供的方式就是在ITransformationService
里重载additionalClassesLocator
方法。我在这里的实现如下:
1 2 3 4 5 6 7 8 9 |
@Override public Map.Entry<Set<String>, Supplier<Function<String, Optional<URL>>>> additionalClassesLocator() { return new AbstractMap.SimpleEntry<>( new HashSet<>(Arrays.asList("my.coremod.common.")), () -> (className) -> { URL location = getClass().getResource("/" + className); return Optional.ofNullable(location); }); } |
这个方法用Map.Entry
返回了两个值,第一个值是一个Set
,包含所有要处理的类名的前缀,比如我这里就要处理以my.coremod.common.
开头的类。第二个值是个方法,要求返回一个方法,这个方法输入类名,输出类的路径,用URL
格式表示。这里面的类名的格式是:my/coremod/common/MyClass.class
,以/
分隔,.class
结尾的,在getResource
时需要加/
在最前面。
🐂🍺啊 老哥