如何开发一款Minecraft Launcher

Minecraft文件介绍

Versions文件夹介绍


那versions文件夹中的文件夹存储的是什么?


打开json文件看看

这些乱七八糟的文字我们通过文本编辑器再看看

是不是清楚了很多

版本中的json介绍

"assetIndex": {
		"id": "1.7.10",
		"sha1": "1863782e33ce7b584fc45b037325a1964e095d3e",
		"size": 72996,
		"totalSize": 112396854,
		"url": "https://launchermeta.mojang.com/v1/packages/1863782e33ce7b584fc45b037325a1964e095d3e/1.7.10.json"
	}

url是资源文件下载网址
我们看看url中有什么

是全部asset文件清单,可以利用解析进行下载,后续我们继续研究

	"assets": "1.7.10"

这是资源文件版本

"downloads": {
		"client": {
			"sha1": "e80d9b3bf5085002218d4be59e668bac718abbc6",
			"size": 5256245,
			"url": "https://launcher.mojang.com/v1/objects/e80d9b3bf5085002218d4be59e668bac718abbc6/client.jar"
		},
		"server": {
			"sha1": "952438ac4e01b4d115c5fc38f891710c4941df29",
			"size": 9605030,
			"url": "https://launcher.mojang.com/v1/objects/952438ac4e01b4d115c5fc38f891710c4941df29/server.jar"
		},
		"windows_server": {
			"sha1": "a79b91ef69b9b4af63d1c7007f60259106869b21",
			"size": 9999270,
			"url": "https://launcher.mojang.com/v1/objects/a79b91ef69b9b4af63d1c7007f60259106869b21/windows_server.exe"
		}
	}

这里client的url是游戏版本下载网址
下载游戏核心还可以看HMCLAPI(https://bmclapidoc.bangbang93.com)提供的下载API
其他的并没有多大用

"libraries": [{
		"downloads": {
			"artifact": {
				"path": "com/mojang/netty/1.6/netty-1.6.jar",
				"sha1": "4b75825a06139752bd800d9e29c5fd55b8b1b1e4",
				"size": 7877,
				"url": "https://libraries.minecraft.net/com/mojang/netty/1.6/netty-1.6.jar"
			}
		},
		"name": "com.mojang:netty:1.6"
	}, {
		"downloads": {
			"artifact": {
				"path": "com/mojang/realms/1.3.5/realms-1.3.5.jar",
				"sha1": "0807ae355ee63583becd7ea60e76aab1532bb42e",
				"size": 353818,
				"url": "https://libraries.minecraft.net/com/mojang/realms/1.3.5/realms-1.3.5.jar"
			}
		},
		"name": "com.mojang:realms:1.3.5"
	}, {
		"downloads": {
			"artifact": {
				"path": "org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar",
				"sha1": "a698750c16740fd5b3871425f4cb3bbaa87f529d",
				"size": 365552,
				"url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar"
			}
		},
		"name": "org.apache.commons:commons-compress:1.8.1"
	}, {
		"downloads": {
			"artifact": {
				"path": "org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar",
				"sha1": "18f4247ff4572a074444572cee34647c43e7c9c7",
				"size": 589512,
				"url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar"
			}
		},
		"name": "org.apache.httpcomponents:httpclient:4.3.3"
	}, {
		"downloads": {
			"artifact": {
				"path": "commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar",
				"sha1": "f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f",
				"size": 62050,
				"url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"
			}
		},
		"name": "commons-logging:commons-logging:1.1.3"
	}, {
		"downloads": {
			"artifact": {
				"path": "org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar",
				"sha1": "31fbbff1ddbf98f3aa7377c94d33b0447c646b6e",
				"size": 282269,
				"url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar"
			}
		},
		"name": "org.apache.httpcomponents:httpcore:4.3.2"
	}, {
		"downloads": {
			"artifact": {
				"path": "java3d/vecmath/1.3.1/vecmath-1.3.1.jar",
				"sha1": "a0ae4f51da409fa0c20fa0ca59e6bbc9413ae71d",
				"size": 289881,
				"url": "https://libraries.minecraft.net/java3d/vecmath/1.3.1/vecmath-1.3.1.jar"
			}
		}
		...

这里是Minecraft运行库,后续我们再来研究

"mainClass": "net.minecraft.client.main.Main"

这是用于启动Minecraft的类,所有启动Minecraft方式都与它有关

"minecraftArguments": "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} --assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} --accessToken ${auth_access_token} --userProperties ${user_properties} --userType ${user_type}"

这是启动Minecraft的参数

Minecraft启动介绍

启动Minecraft是一个非常繁琐的过程,我们先看看Minecraft启动命令行

“C:\Program Files (x86)\Java\jre1.8.0_221\bin\javaw.exe” -Xincgc -Xmx512M -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Djava.library.path=“E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\versions\1.10.2\1.10.2-natives” -cp “E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\mojang\netty\1.6\netty-1.6.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\oshi-project\oshi-core\1.1\oshi-core-1.1.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\net\java\dev\jna\jna\3.4.0\jna-3.4.0.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\net\sf\jopt-simple\jopt-simple\4.6\jopt-simple-4.6.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\io\netty\netty-all\4.0.23.Final\netty-all-4.0.23.Final.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\google\guava\guava\17.0\guava-17.0.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\apache\commons\commons-lang3\3.3.2\commons-lang3-3.3.2.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\mojang\authlib\1.5.22\authlib-1.5.22.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\com\mojang\realms\1.9.8\realms-1.9.8.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\it\unimi\dsi\fastutil\7.0.12_mojang\fastutil-7.0.12_mojang.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\apache\logging\log4j\log4j-api\2.0-beta9\log4j-api-2.0-beta9.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\apache\logging\log4j\log4j-core\2.0-beta9\log4j-core-2.0-beta9.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\lwjgl\lwjgl\lwjgl\2.9.4-nightly-20150209\lwjgl-2.9.4-nightly-20150209.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.4-nightly-20150209\lwjgl_util-2.9.4-nightly-20150209.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\lwjgl\lwjgl\lwjgl-platform\2.9.4-nightly-20150209\lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\lwjgl\lwjgl\lwjgl\2.9.2-nightly-20140822\lwjgl-2.9.2-nightly-20140822.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.2-nightly-20140822\lwjgl_util-2.9.2-nightly-20140822.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\org\lwjgl\lwjgl\lwjgl-platform\2.9.2-nightly-20140822\lwjgl-platform-2.9.2-nightly-20140822-natives-windows.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\libraries\net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar;E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\versions\1.10.2\1.10.2.jar” net.minecraft.client.main.Main --username “baibao” --version “1.10.2” --gameDir “E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft” --assetsDir “E:\2019备份\SikaDeerLauncherDemo\SikaDeerLauncherDemo\bin\Debug.minecraft\assets” --assetIndex 1.10 --uuid ed8a5d4b37684136a8b63e22d83f7326
YHC --accessToken NsQ6mhps3JBJwangC54rnuTrBllZ7vnR --userType Legacy --versionType “SikaDeerLauncher - BaiBao”

先从这些命令行进行分析一下
命令行的写法是:
javaw路径 -Xincgc -Xmx<内存大小>M <jvm参数> -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Djava.library.path="<natives路径>" -cp <所有libraries路径+版本路径> <主类> <附加参数> <参数>
但在启动时需要解压natives,我们之后再研究

Libraries介绍

{
		"downloads": {
			"artifact": {
				"path": "com/mojang/netty/1.6/netty-1.6.jar",
				"sha1": "4b75825a06139752bd800d9e29c5fd55b8b1b1e4",
				"size": 7877,
				"url": "https://libraries.minecraft.net/com/mojang/netty/1.6/netty-1.6.jar"
			}
		},
		"name": "com.mojang:netty:1.6"
	}

我们先分析一下这个
name在libraries中起到一定的作用
我们将com.mojang:netty:1.6先分成三个部分
[0] = com.mojang
[1] = netty
[2] = 1.6
再将[0]中的“.”替换成“\”,得出:com\mojang
我们再进行一个拼接
[0]+"\"+[1]+"\"+[2]+"\"+[1]+"-"+[2]+".jar"
就可以得出:com\mojang\netty\1.6\netty-1.6.jar
路径:".minecraft\libraries\com\mojang\netty\1.6\netty-1.6.jar"
我们再来看看natives库

{
		"downloads": {
			"classifiers": {
				"natives-linux": {
					"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar",
					"sha1": "aa9aae879af8eb378e22cfc64db56ec2ca9a44d1",
					"size": 571424,
					"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar"
				},
				"natives-osx": {
					"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar",
					"sha1": "2d12c83fdfbc04ecabf02c7bc8cc54d034f0daac",
					"size": 527196,
					"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar"
				},
				"natives-windows": {
					"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
					"sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
					"size": 611334,
					"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar"
				}
			}
		},
		"extract": {
			"exclude": ["META-INF/"]
		},
		"name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
		"natives": {
			"linux": "natives-linux",
			"osx": "natives-osx",
			"windows": "natives-windows"
		}
	}

拼接方法和普通的libraries差不多
也是先将name分为三个部分以“:”为分割点
[0] = org.lwjgl.lwjgl
[1] = lwjgl-platform
[2] = 2.9.1
再将[0]中的“.”替换成“\”,得出:org\lwjgl\lwjgl
拼接成:org\lwjgl\lwjgl\lwjgl-platform\2.9.1\lwjgl-platform-2.9.1
但最后要通过判断natives是否存在natives-windows来决定是否使用它
如果是natives-windows,就在后面加上-natives-windows.jar
最后拼接结果:org\lwjgl\lwjgl\lwjgl-platform\2.9.1\lwjgl-platform-2.9.1-natives-windows.jar
但是有时会有一个特殊情况,就比如:

"natives": {
			"windows": "natives-windows-${arch}"
		}

像这种情况只需判断系统位数下载对应版本就行。
如果系统是64位,那么就在原基础拼接后的内容加入-natives-windows-64.jar
如果系统是32位,那么就加上-natives-windows-32.jar
例:原基础拼接:tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5
因为它的natives中的windows带有natives-windows-${arch}且系统为64位,所以拼接后:tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar
在启动时需要将natives解压下来,普通的zip解压就行,解压到versions文件夹对应版本文件夹中新建一个例名为:1.8.1-natives文件夹里

MC参数介绍

"minecraftArguments": "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} --assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} --accessToken ${auth_access_token} --userProperties ${user_properties} --userType ${user_type}"

${auth_player_name} 游戏名 如果是正版登录需要与正版用户名一致(正版登录我下一篇文章有写)
${version_name} 游戏版本名 推荐提取[id]项进行写进去
${game_directory} 游戏路径 你的启动路径+”/.minecraft”
${assets_root} 游戏资源文件路径assets 你的启动路径+”/.minecraft/assets”
${assets_index_name} 填写游戏版本名 譬如1.7.10等
${auth_uuid} 正版登录用的uuid如果不是正版登录可以调用API,API后续会讲,如果API调用不了可以生成32位随机数,非正版登录要记得保存该项,因为有些mod是认uuid提供相关数据,丢失该项会导致游戏物品丢失
${auth_access_token} 正版登录用 如果非正版登录可以生成32位随机数
${user_properties} 直接写{}
${user_type} 获取json内的[type]项进行写进去

libraries下载拼接

下载libraries有两种方式,一种是官方源还有一种是BMCLAPI(https://bmclapidoc.bangbang93.com
官方源拼接:
https://libraries.minecraft.net/ + libraries拼接
BMCLAPI拼接:
https://bmclapi2.bangbang93.com/libraries/ + libraries拼接

assets下载拼接

"minecraft/lang/af_ZA.lang": 
{
	"hash": "913dac82b2c852eb1b6f371fe14456901386cd13", 
	"size": 71178
}

路径:minecraft路径 + “\assets” + hash开头2个字符 + “\” + hash
下载: http://resources.download.minecraft.net/ + hash开头2个字符 + “/” + hash

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值