从零开始制作Minecraft启动器(C++开源) - 大梦烟云

时间:2024-03-01 18:36:26

从零开始制作Minecraft启动器(C++开源)

从零开始制作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发送至我的邮箱1425078914@qq.com,感激不尽!

可能不会尽快修复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程序。

 

启动器是从零开始撸出来的,很多地方不是很理解,也有的地方做的有些愚,还望有大牛能够指点一二,万分感谢!!!