从零开始制作Minecraft启动器(C++开源)
新手飙车了~~~,MC启动器源码大放送,随心所欲打造自己的专属MC启动器,这不是易语言,是C++。。。分析原理,关键源码都有详细的注释,代码编好就打包放送,所以说凌乱无比。。。
下载地址:
百度网盘:http://pan.baidu.com/s/1i3UDOXn
CSDN下载:http://download.csdn.net/detail/u010661060/9376136
MClauncher(公版)启动器界面:
代码全部开源,拥有详细的注释:
测试过的平台:windows7 64位、windowsXP,在这两个平台上都能运行。
测试MC启动版本:Minecraft1.7.10纯净版、Minecraft1.7.10 forge版都能启动,讲道理的话,其他版本的游戏也有可能启动。。。
特别说明:
因为采用的Qt为夸平台软件,编译出来的exe文件运行需要很多的夸平台库,这样的话导致启动器比一般的都要大而且启动器目录非常混乱,为了解决此问题,已将所有的库文件和exe打包成新的exe文件了,直接点击MClauncher.exe运行即可。注意,360会瞎比报毒,直接无视即可。。。
历经千辛万苦终于撸出了自己的启动器,尽管还有无数的BUG,但至少能用了。。。
刚开始什么都不知道,在网上大量搜索MC启动器源码、MC启动原理等。搜索到的源码还是挺多的,但是大多是易语言写的,下了好多下来。但是,不懂易语言,愣是没看懂怎么启动的。后想到Google上找点源码,但是有GFW的存在,买不起VPN,好多网页都打不开,而且最为关键的是尼玛看不懂英文啊。后来在某个论坛里看见一条回复,说是要启动MC,分析里面的JSON文件就可以了,看到这句话,制作MC启动器终于有了眉目了。
先着手分析MC启动器启动参数,参考旋律启动器,打开旋律启动器调试开关,就可获得启动器传给游戏的参数。当然,也可以打开cmd,在启动器启动时输入“wmic process where caption="javaw.exe" get caption,commandline /value>D:\canshu.txt”参数,即可获得启动器参数。
在看MC启动器参数之前,先来看看运行jar包参数传递及依赖关系分析。
之前为了弄清MC参数传递,特地做了个小的java程序模拟MC游戏,这样不必在庞大的MC游戏上做这个小参数测试。
小游戏启动脚本:
java -Xmx1024m -Dplayer.name=BlueCat -cp HelloFrame.jar HelloFrame
参数分析:
-Xmx1024m:代表JVM最大堆内存值(不懂,反正照着别人的抄就行。。。)
-Dplayer.name:(用-D<name>=<value>来设定系统属性值)这里利用来传递游戏参数,在java程序里可以用:System.getProperty("player.name")获得其值,这样就可以在测试窗口上显示玩家名称了。
-cp:目录和 zip/jar 文件的类搜索路径,后面的参数为main函数执行所依赖的jar包,以及其所在的jar包,无先后顺序。
最后一个参数:指定main函数所在的类HelloFrame,若该类在包中,前面加上包名,否则只写类名即可。
现在再来看真正的Minecraft启动参数,太长了,分段来看。
第一段:
C:\Program Files\Java\jre7\bin\javaw.exe
(包含全路径的javaw.exe)
第二段:
-Xmx1024m
-Dfml.ignoreInvalidMinecraftCertificates=true
-Dfml.ignorePatchDiscrepancies=true
-Djava.library.path=".minecraft\natives"
(堆内存及相关系统变量设置)
第三段:
-cp “ ...(此处省略一万个jar包)...1.7.10-Forge10.13.2.1230.jar”
(所依赖的jar包)
第四段:
net.minecraft.launchwrapper.Launch
(main所在的类)
第五段:
--username BlueCat
--version 1.7.10-Forge10.13.2.1230
--gameDir .minecraft
--assetsDir .minecraft\assets
--assetIndex 1.7.10
--uuid ${auth_uuid}
--accessToken ${auth_access_token}
--userProperties {}
--userType legacy
--tweakClass cpw.mods.fml.common.launcher.FMLTweaker
(游戏参数,在JSON文件中的minecraftArguments)
在模拟小程序中,除了第五段没有模拟外,其他都是类似的。
启动游戏时传递这些参数即可启动游戏了,这些参数都可以从JSON文件中获得,当然有些参数是固定的有的是自己设置,比如游戏名字自己设置吧。
所说的JSON文件在.minecraft\versions\1.7.10\目录下的1.7.10.json
重要的参数都在这里,所以启动器要做的就是解析这个JSON文件,获得其中的值,转化为启动参数,传递给JVM就可以了。所以,做启动器做的最多的就是字符串处理了,我是个菜鸡,C++和Qt都是半吊子,一知半解,也不知道有什么好的方法。反正很多地方都做得比较蠢,代码也写的相当的凌乱,想起什么就写什么,写到最后连我自己都理不清思路了,所以看源代码可能会比较费解,不过关键的方法都有注释。在阅读源代码时记住一条,所做的一切的目的是将JSON中的一串字符转化为合适的启动参数。所以在看到代码在瞎JB做循环或者突然减个1时,不要懵圈了,~_~。关于启动器的原理就说这么多了,更多的查看源代码,哈哈~~~。
噢,对了,还有些事情。
1、 就是希望大家帮忙测试启动器,BUG发送至我的邮箱[email protected],感激不尽!
可能不会尽快修复BUG,因为有更重要的事情要做,应该最近很长一段时间内不会再碰启动器了。
2、 公版启动器现存的BUG:
(1)在选启动版本时存在窗口滑动BUG,类似下图。
这个BUG,我暂时无能为力,我只是一只菜鸡,在不断的学习中。。。
(2)那个自动设置内存选项是假的,就是固定设置为1024m,我暂时还不知到怎么弄。
(3)java路径自动查找算法还有待强化,这其实也不太算是BUG,目前只是查找系统环境变量中PATH中含有的java路径,在别的电脑上测试时有失败过。
3、 关于制作启动器过程中一点蛋疼的问题
先是在Qt4上撸出了启动器的界面,大多按钮采用假连接,后来到解析JSON文件时才发现Qt4没有JSON相关的类,JSON相关的类从Qt5才开始有。于是跑到官网上下了最新版的Qt5.5.1(minGW版),编译好了程序一运行就导致Qt Creater一直未响应,这真的是很蛋疼。后来换到Qt5.0.2才没有这个问题,可是这版本编译的Release版要在没有装Qt的电脑上运行很麻烦,要多很多的库文件。于是,又下了个Qt5.5.0,还是有一直未响应的问题。所以呢,最后用Qt5.0.2编译调试,然后用Qt5.5.0编译在别的电脑上测试。。。
4、 最后一点,参考旋律启动器时有个natives文件夹,里面放的是些dll文件,不知道有什么用,反正没了就是启不动,旋律缺少的话是下载过来的。在这里的话,我是解压相关jar包中的文件到该目录下的,所以,公版启动器中还内置了一个unzip32.exe程序。
启动器是从零开始撸出来的,很多地方不是很理解,也有的地方做的有些愚,还望有大牛能够指点一二,万分感谢!!!