MC Forge环境配置究竟是什么

想进行forge开发,首先要搞清楚一件事情:当我们谈配置forge环境时,我们在谈什么?

答:是在处理forge的 依赖项目和生成启动

MC和forge并不仅仅依赖Java本身,而是若干个其他程序包(目光转向开源三方库弱鸡的C#),下面罗列一下:

lwjgl:OpenGL在Java上的一个封装,MC的渲染基于此类库,但显然实现的不好,大量使用GL11(OpenGL1.1)时代留下来的老旧API(坊间传闻MC用的是固定管线渲染就是来源于此),如果你能在MC和forge的源码中找到一个不是GL11的API调用,我就把 @Yanbing Zhao 卖给你。

gson:google出品的json解析器,你用来注册合成表,模型等的各种json资源文件等(统称ResourceLocation),由它解析加载,实际开发中如果是一个较大的json文件,我建议使用TypeAdapter<ResourceLocation>,它是流式API,比JsonElement性能更好。

guava:google出品的著名Java开发框架,提供了很多实用的集合(例如Multimap<K,V>)和并发相关(例如ListenableFuture),该框架提供的EventBus类,被forge用来做FML加载时期的事件系统。

icu4j-core-mojang:icu4j是 International Components for Unicode(Unicode本地化组件) 在Java上的实现,用于处理生僻字(例如希伯来文)。

authlib:mojang自己用来负责玩家登陆的工具,用于正版启动器。

realms:原版领域服相关。

paulscode:一个提供Java音效的包。

akka actor:一个typesafe公司开发,用scala编写的高性能并发框架,但可惜在MC开发中形同虚设,反倒带来了scala类库下载的不便,如果你的HMCL资源下载失败了,看看是不是它的问题吧。

apache common:一个和guava对标的著名Java开发框架,提供了线程监视等实用功能(MC居然还在用common 2.5这样老旧的版本)

netty:高性能网络通信框架,MC内部的服务端(NMS)基于此实现(但令人惊讶的是mojang并没有利用好这个根基,监听netty的事件居然还是forge加的),如果你的服务器掉线了,经常会看到来自netty的报错。

fastutil:提供了一系列高效存储大量元素的集合,例如BigArray类,Object2ObjectOpenHashMap集合,BigList接口等。

java3d:Java自己的一个简易3d制作包。

jline:用来处理控制台输入的一个Java类库。

jna(Java native access):Java自带的调用本地(native)方法的类库,LWJGL调用OpenGL的native方法时用到,效率不高。

launchwrapper:mojang自己提供的一个类加载工具,内含ITweaker和IClassTransformer这两个修改类加载和编写字节码的重要接口,以及MC原版类加载器LaunchClassLoader,因不支持Java 9+,将在1.13的forge被废弃。

log4j:最早出现的Java日志输出类库,现被广泛使用。

asm:Java的虚拟机指令只有200多个,不超过byte[]类型保存的上限,因此可以用byte来保存这些指令,故称“字节码”,asm就是目前使用最广泛的字节码操纵框架(用来动态修改其他人的代码),forge本身就是建立在asm修改MC的基础上。

scala:scala语言的标准库,将在1.13的forge中被移除。

这些依赖往往没有被充分利用,大多数情况下,就是个玩具钟——虚有其表。


这么一通交待下来,看的晕头转向了吧?总而言之,如果要把这些依赖库一一手动下载下来,不知道要浪费多少宝贵的时间和精力,最重要的是没有相应的主类启动它们(MC的主类只管自己,无视他人),因此需要gradle来管理这些依赖,并按照给定配置对它们生成主类(GradleStart和GradleStartServer)。

forge自带了forgegradle插件,当用户按照教程运行/gradlew setupDecompWorkspace时,就会自行下载gradle,并根据build.gradle文件,从forge默认的maven源( files.minecraftforge.net )下载相应的依赖文件,对其进行构建生成主类。

然而因为某些你也知道的原因,从外网下载gradle速度会很慢很慢,时常掉线,大多数情况下这是你构建失败的元凶。而且forge依然在采用gradle 2.14这个老版本,而最新的gradle出到了5——因此,不通过forge自己的配置,自行下载gradle是个非常明智的选择。

如果你已经下载了自己的gradle,如何让forge或者IDE“知道”这件事呢?

方法1:输入/gradle setupDecompWorkspace(原来的命令gradlew是gradle wrapper的缩写),这会调用forge自己的gradle配置而不是用户自己的gradle。

方法2:在IDEA里指定gradle路径。

选中“Use auto import(自动导入)”选项,选择“Use local gradle distribution”选项,即可在gradle home选项中指定你安装gradle的位置,以及用来运行gradle的JVM位置。

如果你在这之前已经构建过,不想再下载一次依赖,可以选择“Offline work(离线构建)”选项,然后在下方选择上一次构建后依赖存放的位置(默认是C:/Users/用户名/.gradle)。

然后点击“File”→“New”→“Project from existing sources”,在弹出的对话框中选择build.gradle文件,会弹出一个和上图类似的对话框:

设置同上,点击OK,即可导入。

也可以点击“File”→“Open”,然后打开build.gradle,会弹出对话框问你是否以一个工程的形式打开它。

以这两种方式,IDEA都可以自动为你配置forge环境而不需要输入什么指令(记得给自己开一下魔法上网加速下载),如果部署成功,你会在externallib里看到一大堆包(botania是植物魔法的名字,如果你不做植魔附属请忽略它):

到此为止,你的forge开发环境就建立成功了。

编辑于 2018-12-02 17:03