我已经将近一年没有接触过Minecraft了。最近我重新加入了Minecraft的圈子,并在不久前在Minecraft官网购买了正版。了解到Java版是用LWJGL编写的之后一直对Minecraft的启动原理很感兴趣。我于是开始编写一个启动器来研究Minecraft的细节。

IDEA Minecraft Launcher

IDEA Minecraft Launcher(简称IMCL)是一个开源的Minecraft启动器。代码存放在GitHub

(欢迎点Star)

https://github.com/resetpower/imcl​github.com

IMCL的编写语言主要为Kotlin和少量Java,使用JavaFX编写,JSON解析部分使用的是阿里爸爸的FastJSON,UI部分使用了JFoeniX,处于极其不稳定阶段的下载功能使用了Apache的commons-io,下载服务由BMCLAPI提供。

目前支持1.13以上的Fabric Forge 以及纯净版的启动,支持1.12以下的Forge 以及纯净版的启动。Bugjump在1.13修改了启动参数模式,macOS下需要 -XstartOnFirstThread 的jvm命令。1.13以上Forge版本在classpath中添加的并非forge版的jar文件而是对应原版的jar文件。在刚开始适配1.13以下版本的时候我看着一脸茫然 =-= 1.13以上Bugjump在版本json中加入了人性化的「arguments」参数,我就是照着这个参数成功启动的 =-=

那么IMCL就没有什么特色功能嘛 =-= 当然有,那就是从官启学来的「特色版本分离」,也就是将versions libraries等文件夹存放在原路径,而mods saves等文件夹存放在另外的路径。这样可以方便地分离mod而不用像网易一样复制客户端占用空间 =-=

总而言之,希望大家可以下载尝试,提出意见。

需要注意的是该启动器目前仅支持macOS 原因很简单,JVM跨平台但是启动参数并不跨平台,所以核心部分我需要根据不同平台特性作出完善,而这个真的很难。测试方便,所以我是最先支持自己使用的平台,后期再完善的……请大家谅解。

(4月27日更新:支持Windows10下的1.15.2纯净版和Forge版启动)

=-=

开发历程

4月5日,IMCL项目刚刚开启。那个时候的我刚刚了解到JMCCC,打算使用,结果总是因未知原因失败……于是我果断放弃了JMCCC,打算自己写启动核心。

现在的ideamc-core虽然是半残,但是也能启动了 =-=

代码结构介绍

项目使用IntelliJ IDEA Community Edition编写(没错这就是启动器名字来源),目前不使用Gradle、Maven等项目构建工具。

分多个模块。

1ef6daec98b2a8037e4ee9a31a5db48d.png
ideamc结构图

如图,分为ideamc-core ideamc-launcher ideamc-toolkit三个模块,ideamc-core是启动核心,不涉及UI部分,只负责启动功能。依赖FastJSON和commons-io。ideamc-launcher是启动器的基础部分,负责UI和各种花式功能 =-= 启动启动器的时候是启动这个模块的。ideamc-toolkit这个模块比较废……只负责一些与启动器无关却有用的东西,比如里面有被我优化过的Properties类(支持UTF-8字符)

启动逻辑

启动功能由ideamc-core下的Launcher.kt负责。启动方法是这样的

fun 

然而,这不是最核心的部分。细心的朋友可能注意到它调用了generateMacOSLaunchScript方法。而generateMacOSLaunchScript方法的源代码是这样的

fun 

我知道你没认真看 =-= 基本的逻辑就是判断版本json里有没有inheritsFrom参数(有说明是用了模组加载器,没有就是原版),再判断有没有minecraftArguments参数(有说明是1.13以下版本,没有说明是1.12以上版本)然后解析json里的各种库,然后一堆神奇的操作就生成完了启动命令……

=-=

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐