本帖最后由 nsisogf 于 2017-11-19 01:26 编辑
前言:
本人使用KMCCC已超过一年时间,既鄙人作品NSISO启动器。经过这段时间不断研究KMCCC的代码,总结出个人认为有所帮助的优化和扩展教程(毕竟官方已停止更新),希望能对有需要的开发者有所帮助。同时我也在此感谢全体KMCCC开发者。
我会在介绍和分析时附上其他信息来源的地址。供读者自行阅读学习。
您需要:
1.有C#编程(OOP)基础
2.有足够分析代码的能力
3.使用KMCCC本体时遵循其LGPL-3.0协议,尊重他人劳动成果
4.使用此贴中的代码需声明来源。(建议您使用我们的代码作为参考自行优化扩展)
我们将会:
1.介绍游戏启动原理
2.分析KMCCC启动原理
3.介绍KMCCC高级功能
3.魔改KMCCC核心(优化/扩展)
魔改后能做到什么?:
1.搜索获取系统中JAVA环境具体信息(位数,版本,路径)
2.根据环境获取最匹配的JAVA
3.获取版本Assets列表。
4.联机获取并解析全部版本列表
5.下载游戏本体功能
6.获取启动最佳内存
7.获取服务器信息(玩家列表,mod列表,motd,icon)
8.游戏错误的处理
9.游戏本体操作
等...
我们的更新时间?:
这将是一项持久更新工程。我们会尽量在一个星期内更新一次。
当我们的教程出现错误/无法理解时:
请在贴中回复我们并指出。我们会尽快修正。避免误导读者
在开始前我们建议的阅读资料:
- Minecraft开发维基
- KMCCC官方教程
- C#官方开发指南
- JVM详解
- Json结构
前言:
本人使用KMCCC已超过一年时间,既鄙人作品NSISO启动器。经过这段时间不断研究KMCCC的代码,总结出个人认为有所帮助的优化和扩展教程(毕竟官方已停止更新),希望能对有需要的开发者有所帮助。同时我也在此感谢全体KMCCC开发者。
我会在介绍和分析时附上其他信息来源的地址。供读者自行阅读学习。
您需要:
1.有C#编程(OOP)基础
2.有足够分析代码的能力
3.使用KMCCC本体时遵循其LGPL-3.0协议,尊重他人劳动成果
4.使用此贴中的代码需声明来源。(建议您使用我们的代码作为参考自行优化扩展)
我们将会:
1.介绍游戏启动原理
2.分析KMCCC启动原理
3.介绍KMCCC高级功能
3.魔改KMCCC核心(优化/扩展)
魔改后能做到什么?:
1.搜索获取系统中JAVA环境具体信息(位数,版本,路径)
2.根据环境获取最匹配的JAVA
3.获取版本Assets列表。
4.联机获取并解析全部版本列表
5.下载游戏本体功能
6.获取启动最佳内存
7.获取服务器信息(玩家列表,mod列表,motd,icon)
8.游戏错误的处理
9.游戏本体操作
等...
我们的更新时间?:
这将是一项持久更新工程。我们会尽量在一个星期内更新一次。
当我们的教程出现错误/无法理解时:
请在贴中回复我们并指出。我们会尽快修正。避免误导读者
在开始前我们建议的阅读资料:
- Minecraft开发维基
- KMCCC官方教程
- C#官方开发指南
- JVM详解
- Json结构
支持楼主希望尽快更新
很不错的 我感觉还不错 至于说什么 我想不起来
Minecraft如何启动?
Minecraft的编写语言基于JAVA。其启动,离不开JVM(JAVA虚拟机)
要使Minecraft正常启动。就必须传入一个完整的并相对于Minecraft可用的JVM启动参数。
下面提供经过格式化的完整启动参数:
复制代码注:游戏启动于Windows离线环境,Token和UUID为离线生成。游戏版本1.7.10 已装载Forge版本,部分路径已做删减。启动参数为方便理解,已经过格式化。无法用于实际应用
我们可以看到,一个完整的启动参数,具有以下内容
(I)JVM参数
1.内存分配(堆栈设置)
2.垃圾回收器
3.[可用]Dump文件路径,堆栈跟踪等高级参数
(II).设置系统属性参数 (-D)
1.指定的natives路径(加载DLL库)*
2.程序属性设置(如FML忽略证书等参数)
(III)导入类库(-cp)
1.所有Minecraft会用到的lib类库(libraries文件)
2.Minecraft核心(附带游戏参数)
(IV)游戏参数*
1.主类入口(-MainClass)
2.玩家名称(--userName)
3.Version信息(--version)
4.游戏路径(--assetsDir)
5.资源文件路径(--assetsDir)
6.资源引导文件(--assetIndex)
7.UUID(--UUID)
8.验证Token(--accessToken)
9.用户Properties(--userProperties)
10.用户类型(--userType)
11.窗口长宽(--height --width)
所以我们现在能看到,为何我们需要启动器来启动游戏了。
下一章节,我们将详细讨论程序是如何根据设置生成这些参数的。
标有星号*的内容表示具有异议。在不同环境,不同版本等不可抗因素导致。敬请自己理解
参考文献:
1.https://www.zhihu.com/question/49997128/answer/119951802
2.http://www.cnblogs.com/grefr/p/6087955.html
3.http://www.cnblogs.com/z-sm/p/5674684.html
4.http://wiki.vg/Game_files
Minecraft的编写语言基于JAVA。其启动,离不开JVM(JAVA虚拟机)
要使Minecraft正常启动。就必须传入一个完整的并相对于Minecraft可用的JVM启动参数。
下面提供经过格式化的完整启动参数:
- [url=home.php?mod=space&uid=39305]@echo[/url] off
- set appdata=[游戏路径]\.minecraft
- "[JAVA路径]"
- -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
- -XX:+UseG1GC
- -XX:-UseAdaptiveSizePolicy
- -XX:-OmitStackTraceInFastThrow
- -Xmn128m
- -Xmx3072m
- -Djava.library.path=[游戏路径]\.minecraft\versions\1.7.10\1.7.10-natives
- -Dfml.ignoreInvalidMinecraftCertificates=true
- -Dfml.ignorePatchDiscrepancies=true
- -cp=
- [游戏路径]\.minecraft\libraries\com\mojang\netty\1.6\netty-1.6.jar;
- [游戏路径]\.minecraft\libraries\com\mojang\realms\1.3.5\realms-1.3.5.jar;
- [游戏路径]\.minecraft\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;
- [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;
- [游戏路径]\.minecraft\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;
- [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;
- [游戏路径]\.minecraft\libraries\java3d\vecmath\1.3.1\vecmath-1.3.1.jar;
- [游戏路径]\.minecraft\libraries\net\sf\trove4j\trove4j\3.0.3\trove4j-3.0.3.jar;
- [游戏路径]\.minecraft\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;
- [游戏路径]\.minecraft\libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;
- [游戏路径]\.minecraft\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;
- [游戏路径]\.minecraft\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;
- [游戏路径]\.minecraft\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;
- [游戏路径]\.minecraft\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;
- [游戏路径]\.minecraft\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;
- [游戏路径]\.minecraft\libraries\io\netty\netty-all\4.0.10.Final\netty-all-4.0.10.Final.jar;
- [游戏路径]\.minecraft\libraries\com\google\guava\guava\15.0\guava-15.0.jar;
- [游戏路径]\.minecraft\libraries\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;
- [游戏路径]\.minecraft\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;
- [游戏路径]\.minecraft\libraries\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;
- [游戏路径]\.minecraft\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;
- [游戏路径]\.minecraft\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;
- [游戏路径]\.minecraft\libraries\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar;
- [游戏路径]\.minecraft\libraries\com\mojang\authlib\1.5.21\authlib-1.5.21.jar;
- [游戏路径]\.minecraft\libraries\org\apache\logging\log4j\log4j-api\2.0-beta9\log4j-api-2.0-beta9.jar;
- [游戏路径]\.minecraft\libraries\org\apache\logging\log4j\log4j-core\2.0-beta9\log4j-core-2.0-beta9.jar;
- [游戏路径]\.minecraft\libraries\org\lwjgl\lwjgl\lwjgl\2.9.1\lwjgl-2.9.1.jar;
- [游戏路径]\.minecraft\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.1\lwjgl_util-2.9.1.jar;
- [游戏路径]\.minecraft\libraries\tv\twitch\twitch\5.16\twitch-5.16.jar;
-
- [游戏路径]\.minecraft\versions\1.7.10\1.7.10.jar
- -mainClass=net.minecraft.client.main.Main
- --username [玩家名称]
- --version "[version信息]"
- --gameDir [游戏路径]\.minecraft
- --assetsDir [游戏路径]\.minecraft\assets
- --assetIndex 1.7.10
- --uuid 78db288208c027abd8d6fce4b368c62d
- --accessToken 78db288208c027abd8d6fce4b368c62d
- --userProperties {}
- --userType Legacy
- --height 480
- --width 854
我们可以看到,一个完整的启动参数,具有以下内容
(I)JVM参数
1.内存分配(堆栈设置)
2.垃圾回收器
3.[可用]Dump文件路径,堆栈跟踪等高级参数
(II).设置系统属性参数 (-D)
1.指定的natives路径(加载DLL库)*
2.程序属性设置(如FML忽略证书等参数)
(III)导入类库(-cp)
1.所有Minecraft会用到的lib类库(libraries文件)
2.Minecraft核心(附带游戏参数)
(IV)游戏参数*
1.主类入口(-MainClass)
2.玩家名称(--userName)
3.Version信息(--version)
4.游戏路径(--assetsDir)
5.资源文件路径(--assetsDir)
6.资源引导文件(--assetIndex)
7.UUID(--UUID)
8.验证Token(--accessToken)
9.用户Properties(--userProperties)
10.用户类型(--userType)
11.窗口长宽(--height --width)
所以我们现在能看到,为何我们需要启动器来启动游戏了。
下一章节,我们将详细讨论程序是如何根据设置生成这些参数的。
标有星号*的内容表示具有异议。在不同环境,不同版本等不可抗因素导致。敬请自己理解
参考文献:
1.https://www.zhihu.com/question/49997128/answer/119951802
2.http://www.cnblogs.com/grefr/p/6087955.html
3.http://www.cnblogs.com/z-sm/p/5674684.html
4.http://wiki.vg/Game_files
楼主加油更新==
本帖最后由 nsisogf 于 2017-9-28 23:30 编辑
KMCCC如何启动? (I-环境篇)
通过前面的启动参数分析我们可以知道,启动一个基于JAVA语言编写的游戏,则必须依赖于JAVA环境。
启动一个带有参数(正确且符合Minecraft启动参数规范)的java.exe*的进程,我们便可以开始启动游戏。
在任何编程语言中。如果需要启动一个进程,就必须**此进程程序的路径,这是最基本的要求。
所以第一步我们要做的就是寻找本机中可用的JAVA路径。
我们要知道,如果要寻找一个文件,则需要通过正则式一个个检索本机中文件,这必定是十分低效且累赘的方法(在某种意义上他是可行并准确的)。
在现代环境中,我们必须要寻找一个更加高效的方法来寻找这个文件路径。
JAVA在完整安装后会在注册表中写入本体的信息。其中的信息就包括了JAVA路径等可用信息
而KMCCC开发者就利用了注册表来寻找JAVA的可能位置。这是十分明智的做法
下面我们开始对KMCCC进行代码分析:
KMCCC.Tools.SystemTools.cs:
复制代码
在这里,KMCCC将注册表查询操作分为两个方法。正式使用时应使用FindJava()而非FindJavaInternal(RegistryKey registry)
之所以分为两个方法,是为了保证此功能的高度弹性。
通过Union方法生成两个使用FindJavaInternal(RegistryKey registry)打开的子键返回的序列的并集。
既LocalMachine子键SOFTWARE 及SOFTWARE子键Wow6432Node,传递给FindJavaInternal(RegistryKey registry)
当注册表结构发生变动时,只需改变FindJava()方法而无需改动内部方法。这便是优点所在
当成功进入JAVA注册表所在的参数子键中时,经过一系列的有效性判断,返回所有子项的字符串名称数组
复制代码
并利用一系列LINQ语句检索
复制代码
检索到的匹配内容(既JAVA根路径)加上 \bin\javaw.exe 既是这个JAVA程序的路径
最终返回符合条件的所有JAVA路径(IEnumerable<string>类型)
再增加一个文件存在检测就更完美了
更新时间比较慢。。冷静。。
参考文献:
https://msdn.microsoft.com/zh-cn ... 32.registrykey.aspx
KMCCC如何启动? (I-环境篇)
通过前面的启动参数分析我们可以知道,启动一个基于JAVA语言编写的游戏,则必须依赖于JAVA环境。
启动一个带有参数(正确且符合Minecraft启动参数规范)的java.exe*的进程,我们便可以开始启动游戏。
在任何编程语言中。如果需要启动一个进程,就必须**此进程程序的路径,这是最基本的要求。
所以第一步我们要做的就是寻找本机中可用的JAVA路径。
我们要知道,如果要寻找一个文件,则需要通过正则式一个个检索本机中文件,这必定是十分低效且累赘的方法(在某种意义上他是可行并准确的)。
在现代环境中,我们必须要寻找一个更加高效的方法来寻找这个文件路径。
JAVA在完整安装后会在注册表中写入本体的信息。其中的信息就包括了JAVA路径等可用信息
而KMCCC开发者就利用了注册表来寻找JAVA的可能位置。这是十分明智的做法
下面我们开始对KMCCC进行代码分析:
KMCCC.Tools.SystemTools.cs:
- /// <summary>
- /// 从注册表中查找可能的javaw.exe位置
- /// </summary>
- /// <returns>JAVA地址列表</returns>
- public static IEnumerable<string> FindJava()
- {
- try
- {
- var rootReg = Registry.LocalMachine.OpenSubKey("SOFTWARE");
- return rootReg == null
- ? new string[0]
- : FindJavaInternal(rootReg).Union(FindJavaInternal(rootReg.OpenSubKey("Wow6432Node")));
- }
- catch
- {
- return new string[0];
- }
- }
- public static IEnumerable<string> FindJavaInternal(RegistryKey registry)
- {
- try
- {
- var registryKey = registry.OpenSubKey("JavaSoft");
- if ((registryKey == null) || ((registry = registryKey.OpenSubKey("Java Runtime Environment")) == null)) return new string[0];
- return (from ver in registry.GetSubKeyNames()
- select registry.OpenSubKey(ver)
- into command
- where command != null
- select command.GetValue("JavaHome")
- into javaHomes
- where javaHomes != null
- select javaHomes.ToString()
- into str
- where !String.IsNullOrWhiteSpace(str)
- select str + @"\bin\javaw.exe");
- }
- catch
- {
- return new string[0];
- }
- }
在这里,KMCCC将注册表查询操作分为两个方法。正式使用时应使用FindJava()而非FindJavaInternal(RegistryKey registry)
之所以分为两个方法,是为了保证此功能的高度弹性。
通过Union方法生成两个使用FindJavaInternal(RegistryKey registry)打开的子键返回的序列的并集。
既LocalMachine子键SOFTWARE 及SOFTWARE子键Wow6432Node,传递给FindJavaInternal(RegistryKey registry)
当注册表结构发生变动时,只需改变FindJava()方法而无需改动内部方法。这便是优点所在
当成功进入JAVA注册表所在的参数子键中时,经过一系列的有效性判断,返回所有子项的字符串名称数组
- registry.GetSubKeyNames()
并利用一系列LINQ语句检索
- from ver in registry.GetSubKeyNames()
- select registry.OpenSubKey(ver)
- into command
- where command != null
- select command.GetValue("JavaHome")
- into javaHomes
- where javaHomes != null
- select javaHomes.ToString()
- into str
- where !String.IsNullOrWhiteSpace(str)
- select str + @"\bin\javaw.exe"
检索到的匹配内容(既JAVA根路径)加上 \bin\javaw.exe 既是这个JAVA程序的路径
最终返回符合条件的所有JAVA路径(IEnumerable<string>类型)
再增加一个文件存在检测就更完美了
更新时间比较慢。。冷静。。
参考文献:
https://msdn.microsoft.com/zh-cn ... 32.registrykey.aspx
读取JAVA注册表(I - 环境篇补充)
我们将会以图文与代码结合介绍的方式来方便读者理解。
前章回顾:
FindJava()方法中分两次使用FindJavaInternal(RegistryKey registry)读取HKEY_LOCAL_MACHINE的子键SOFTWARE
以及HKEY_LOCAL_MACHINE\SOFTWARE的子键Wow6432Node匹配Linq结果的并集(Union方法)
接下来我们以FindJavaInternal(RegistryKey registry)作为示范。传递的参数键为SOFTWARE:
在windows中的regedit视图就是这个键

当进入software这个子键后
复制代码打开传递的参数的子键(既SOFTWARE子键):JavaSoft键。并赋值给新变量registryKey。
如果用户安装了JAVA,那么视图就像这样的(不一定完全一样。但HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment总是一样的)

经过可用性判断。使用
复制代码打开JavaSoft键中的Java Runtime Environment子键,并赋值给变量。
打开后结构就像这样的

使用Linq语句,返回Java Runtime Environment中的所有子项的字符串名称
复制代码再一个个进入每个子键中
复制代码并获取这个键中的JavaHome值
复制代码值的结构像这样的:

获取到的就是这个JAVA的根目录。
最后在所有匹配的字符串上加上字符串"\bin\javaw.exe"
就成功获取了
本补充章无参考文献
我们将会以图文与代码结合介绍的方式来方便读者理解。
前章回顾:
FindJava()方法中分两次使用FindJavaInternal(RegistryKey registry)读取HKEY_LOCAL_MACHINE的子键SOFTWARE
以及HKEY_LOCAL_MACHINE\SOFTWARE的子键Wow6432Node匹配Linq结果的并集(Union方法)
接下来我们以FindJavaInternal(RegistryKey registry)作为示范。传递的参数键为SOFTWARE:
在windows中的regedit视图就是这个键

当进入software这个子键后
- var registryKey = registry.OpenSubKey("JavaSoft");
如果用户安装了JAVA,那么视图就像这样的(不一定完全一样。但HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment总是一样的)

经过可用性判断。使用
- registry = registryKey.OpenSubKey("Java Runtime Environment")
打开后结构就像这样的

使用Linq语句,返回Java Runtime Environment中的所有子项的字符串名称
- from ver in registry.GetSubKeyNames()
- select registry.OpenSubKey(ver)
- select command.GetValue("JavaHome")

获取到的就是这个JAVA的根目录。
最后在所有匹配的字符串上加上字符串"\bin\javaw.exe"
就成功获取了
本补充章无参考文献
KMCCC如何启动?(II-运行环境准备与操作1)
当您准备好用户的JAVA路径,启动最佳内存,垃圾回收器时。我们就要为游戏的运行环境进行准备了。
在此之前。我们要获取这个版本的详细信息,来提取我们必要的游戏依赖库和其他重要信息。
Mojang将一个版本的详细信息写入了[版本号].json文件中。
通常来说,游戏核心总是和他的版本信息在同一目录下(.minecraft\versions\)
该文件的结构如下(Json格式):
复制代码将该文件转换为视图模式,它将会时这样的结构:

(Json文本视图转换在线工具:http://www.bejson.com/jsonviewernew/)
其中具体介绍([数据类型]-[Key名称]:[数据介绍]):
复制代码星号代表具有争议。实际意义由官方决定
此章未完待续
当您准备好用户的JAVA路径,启动最佳内存,垃圾回收器时。我们就要为游戏的运行环境进行准备了。
在此之前。我们要获取这个版本的详细信息,来提取我们必要的游戏依赖库和其他重要信息。
Mojang将一个版本的详细信息写入了[版本号].json文件中。
通常来说,游戏核心总是和他的版本信息在同一目录下(.minecraft\versions\)
该文件的结构如下(Json格式):
- {
- "assetIndex": {
- "id": "1.7.10",
- "sha1": "f90ca2878ba3141d32d949ea7f665855dd073c65",
- "size": 88096,
- "url": "https://launchermeta.mojang.com/mc/assets/1.7.10/f90ca2878ba3141d32d949ea7f665855dd073c65/1.7.10.json",
- "totalSize": 112220327
- },
- "assets": "1.7.10",
- "downloads": {
- "client": {
- "sha1": "e80d9b3bf5085002218d4be59e668bac718abbc6",
- "size": 5256245,
- "url": "https://launcher.mojang.com/mc/game/1.7.10/client/e80d9b3bf5085002218d4be59e668bac718abbc6/client.jar"
- },
- "server": {
- "sha1": "952438ac4e01b4d115c5fc38f891710c4941df29",
- "size": 9605030,
- "url": "https://launcher.mojang.com/mc/game/1.7.10/server/952438ac4e01b4d115c5fc38f891710c4941df29/server.jar"
- },
- "windows_server": {
- "sha1": "a79b91ef69b9b4af63d1c7007f60259106869b21",
- "size": 9999270,
- "url": "https://launcher.mojang.com/mc/game/1.7.10/windows_server/a79b91ef69b9b4af63d1c7007f60259106869b21/windows_server.exe"
- }
- },
- "id": "1.7.10",
- "libraries": [
- {
- "name": "com.mojang:netty:1.6",
- "downloads": {
- "artifact": {
- "size": 7877,
- "sha1": "4b75825a06139752bd800d9e29c5fd55b8b1b1e4",
- "path": "com/mojang/netty/1.6/netty-1.6.jar",
- "url": "https://libraries.minecraft.net/com/mojang/netty/1.6/netty-1.6.jar"
- }
- }
- },
- {
- "name": "com.mojang:realms:1.3.5",
- "downloads": {
- "artifact": {
- "size": 353818,
- "sha1": "0807ae355ee63583becd7ea60e76aab1532bb42e",
- "path": "com/mojang/realms/1.3.5/realms-1.3.5.jar",
- "url": "https://libraries.minecraft.net/com/mojang/realms/1.3.5/realms-1.3.5.jar"
- }
- }
- },
- {
- "name": "org.apache.commons:commons-compress:1.8.1",
- "downloads": {
- "artifact": {
- "size": 365552,
- "sha1": "a698750c16740fd5b3871425f4cb3bbaa87f529d",
- "path": "org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar",
- "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar"
- }
- }
- },
- {
- "name": "org.apache.httpcomponents:httpclient:4.3.3",
- "downloads": {
- "artifact": {
- "size": 589512,
- "sha1": "18f4247ff4572a074444572cee34647c43e7c9c7",
- "path": "org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar",
- "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar"
- }
- }
- },
- {
- "name": "commons-logging:commons-logging:1.1.3",
- "downloads": {
- "artifact": {
- "size": 62050,
- "sha1": "f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f",
- "path": "commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar",
- "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"
- }
- }
- },
- {
- "name": "org.apache.httpcomponents:httpcore:4.3.2",
- "downloads": {
- "artifact": {
- "size": 282269,
- "sha1": "31fbbff1ddbf98f3aa7377c94d33b0447c646b6e",
- "path": "org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar",
- "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar"
- }
- }
- },
- {
- "name": "java3d:vecmath:1.3.1",
- "downloads": {
- "artifact": {
- "size": 289881,
- "sha1": "a0ae4f51da409fa0c20fa0ca59e6bbc9413ae71d",
- "path": "java3d/vecmath/1.3.1/vecmath-1.3.1.jar",
- "url": "https://libraries.minecraft.net/java3d/vecmath/1.3.1/vecmath-1.3.1.jar"
- }
- }
- },
- {
- "name": "net.sf.trove4j:trove4j:3.0.3",
- "downloads": {
- "artifact": {
- "size": 2523218,
- "sha1": "42ccaf4761f0dfdfa805c9e340d99a755907e2dd",
- "path": "net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar",
- "url": "https://libraries.minecraft.net/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar"
- }
- }
- },
- {
- "name": "com.ibm.icu:icu4j-core-mojang:51.2",
- "downloads": {
- "artifact": {
- "size": 1634692,
- "sha1": "63d216a9311cca6be337c1e458e587f99d382b84",
- "path": "com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar",
- "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar"
- }
- }
- },
- {
- "name": "net.sf.jopt-simple:jopt-simple:4.5",
- "downloads": {
- "artifact": {
- "size": 61311,
- "sha1": "6065cc95c661255349c1d0756657be17c29a4fd3",
- "path": "net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar",
- "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar"
- }
- }
- },
- {
- "name": "com.paulscode:codecjorbis:20101023",
- "downloads": {
- "artifact": {
- "size": 103871,
- "sha1": "c73b5636faf089d9f00e8732a829577de25237ee",
- "path": "com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar",
- "url": "https://libraries.minecraft.net/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar"
- }
- }
- },
- {
- "name": "com.paulscode:codecwav:20101023",
- "downloads": {
- "artifact": {
- "size": 5618,
- "sha1": "12f031cfe88fef5c1dd36c563c0a3a69bd7261da",
- "path": "com/paulscode/codecwav/20101023/codecwav-20101023.jar",
- "url": "https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar"
- }
- }
- },
- {
- "name": "com.paulscode:libraryjavasound:20101123",
- "downloads": {
- "artifact": {
- "size": 21679,
- "sha1": "5c5e304366f75f9eaa2e8cca546a1fb6109348b3",
- "path": "com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar",
- "url": "https://libraries.minecraft.net/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar"
- }
- }
- },
- {
- "name": "com.paulscode:librarylwjglopenal:20100824",
- "downloads": {
- "artifact": {
- "size": 18981,
- "sha1": "73e80d0794c39665aec3f62eee88ca91676674ef",
- "path": "com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar",
- "url": "https://libraries.minecraft.net/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar"
- }
- }
- },
- {
- "name": "com.paulscode:soundsystem:20120107",
- "downloads": {
- "artifact": {
- "size": 65020,
- "sha1": "419c05fe9be71f792b2d76cfc9b67f1ed0fec7f6",
- "path": "com/paulscode/soundsystem/20120107/soundsystem-20120107.jar",
- "url": "https://libraries.minecraft.net/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar"
- }
- }
- },
- {
- "name": "io.netty:netty-all:4.0.10.Final",
- "downloads": {
- "artifact": {
- "size": 1452995,
- "sha1": "9e50bd52ffe257a0e2cd8d971688d6ce7d174325",
- "path": "io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar",
- "url": "https://libraries.minecraft.net/io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar"
- }
- }
- },
- {
- "name": "com.google.guava:guava:15.0",
- "downloads": {
- "artifact": {
- "size": 2172168,
- "sha1": "ed727a8d9f247e2050281cb083f1c77b09dcb5cd",
- "path": "com/google/guava/guava/15.0/guava-15.0.jar",
- "url": "https://libraries.minecraft.net/com/google/guava/guava/15.0/guava-15.0.jar"
- }
- }
- },
- {
- "name": "org.apache.commons:commons-lang3:3.1",
- "downloads": {
- "artifact": {
- "size": 315805,
- "sha1": "905075e6c80f206bbe6cf1e809d2caa69f420c76",
- "path": "org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar",
- "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar"
- }
- }
- },
- {
- "name": "commons-io:commons-io:2.4",
- "downloads": {
- "artifact": {
- "size": 185140,
- "sha1": "b1b6ea3b7e4aa4f492509a4952029cd8e48019ad",
- "path": "commons-io/commons-io/2.4/commons-io-2.4.jar",
- "url": "https://libraries.minecraft.net/commons-io/commons-io/2.4/commons-io-2.4.jar"
- }
- }
- },
- {
- "name": "commons-codec:commons-codec:1.9",
- "downloads": {
- "artifact": {
- "size": 263965,
- "sha1": "9ce04e34240f674bc72680f8b843b1457383161a",
- "path": "commons-codec/commons-codec/1.9/commons-codec-1.9.jar",
- "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.9/commons-codec-1.9.jar"
- }
- }
- },
- {
- "name": "net.java.jinput:jinput:2.0.5",
- "downloads": {
- "artifact": {
- "size": 208338,
- "sha1": "39c7796b469a600f72380316f6b1f11db6c2c7c4",
- "path": "net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar",
- "url": "https://libraries.minecraft.net/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"
- }
- }
- },
- {
- "name": "net.java.jutils:jutils:1.0.0",
- "downloads": {
- "artifact": {
- "size": 7508,
- "sha1": "e12fe1fda814bd348c1579329c86943d2cd3c6a6",
- "path": "net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar",
- "url": "https://libraries.minecraft.net/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar"
- }
- }
- },
- {
- "name": "com.google.code.gson:gson:2.2.4",
- "downloads": {
- "artifact": {
- "size": 190432,
- "sha1": "a60a5e993c98c864010053cb901b7eab25306568",
- "path": "com/google/code/gson/gson/2.2.4/gson-2.2.4.jar",
- "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar"
- }
- }
- },
- {
- "name": "com.mojang:authlib:1.5.21",
- "downloads": {
- "artifact": {
- "size": 64412,
- "sha1": "aefba0d5b53fbcb70860bc8046ab95d5854c07a5",
- "path": "com/mojang/authlib/1.5.21/authlib-1.5.21.jar",
- "url": "https://libraries.minecraft.net/com/mojang/authlib/1.5.21/authlib-1.5.21.jar"
- }
- }
- },
- {
- "name": "org.apache.logging.log4j:log4j-api:2.0-beta9",
- "downloads": {
- "artifact": {
- "size": 108161,
- "sha1": "1dd66e68cccd907880229f9e2de1314bd13ff785",
- "path": "org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar",
- "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar"
- }
- }
- },
- {
- "name": "org.apache.logging.log4j:log4j-core:2.0-beta9",
- "downloads": {
- "artifact": {
- "size": 681134,
- "sha1": "678861ba1b2e1fccb594bb0ca03114bb05da9695",
- "path": "org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar",
- "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar"
- }
- }
- },
- {
- "name": "org.lwjgl.lwjgl:lwjgl:2.9.1",
- "downloads": {
- "artifact": {
- "size": 1014790,
- "sha1": "f58c5aabcef0e41718a564be9f8e412fff8db847",
- "path": "org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar"
- }
- }
- },
- {
- "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1",
- "downloads": {
- "artifact": {
- "size": 173909,
- "sha1": "290d7ba8a1bd9566f5ddf16ad06f09af5ec9b20e",
- "path": "org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar"
- }
- }
- },
- {
- "extract": {
- "exclude": [
- "META-INF/"
- ]
- },
- "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
- "natives": {
- "linux": "natives-linux",
- "osx": "natives-osx",
- "windows": "natives-windows"
- },
- "downloads": {
- "classifiers": {
- "natives-linux": {
- "size": 571424,
- "sha1": "aa9aae879af8eb378e22cfc64db56ec2ca9a44d1",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar"
- },
- "natives-osx": {
- "size": 527196,
- "sha1": "2d12c83fdfbc04ecabf02c7bc8cc54d034f0daac",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar"
- },
- "natives-windows": {
- "size": 611334,
- "sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
- "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": "net.java.jinput:jinput-platform:2.0.5",
- "natives": {
- "linux": "natives-linux",
- "osx": "natives-osx",
- "windows": "natives-windows"
- },
- "downloads": {
- "classifiers": {
- "natives-linux": {
- "size": 10362,
- "sha1": "7ff832a6eb9ab6a767f1ade2b548092d0fa64795",
- "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar",
- "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar"
- },
- "natives-osx": {
- "size": 12186,
- "sha1": "53f9c919f34d2ca9de8c51fc4e1e8282029a9232",
- "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar",
- "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar"
- },
- "natives-windows": {
- "size": 155179,
- "sha1": "385ee093e01f587f30ee1c8a2ee7d408fd732e16",
- "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar",
- "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar"
- }
- }
- }
- },
- {
- "name": "tv.twitch:twitch:5.16",
- "downloads": {
- "artifact": {
- "size": 52315,
- "sha1": "1f55f009c61637c10c0acfb8b5ffc600f30044b4",
- "path": "tv/twitch/twitch/5.16/twitch-5.16.jar",
- "url": "https://libraries.minecraft.net/tv/twitch/twitch/5.16/twitch-5.16.jar"
- }
- }
- },
- {
- "extract": {
- "exclude": [
- "META-INF/"
- ]
- },
- "name": "tv.twitch:twitch-platform:5.16",
- "natives": {
- "linux": "natives-linux",
- "osx": "natives-osx",
- "windows": "natives-windows-${arch}"
- },
- "rules": [
- {
- "action": "allow"
- },
- {
- "action": "disallow",
- "os": {
- "name": "linux"
- }
- }
- ],
- "downloads": {
- "classifiers": {
- "natives-osx": {
- "size": 418331,
- "sha1": "62503ee712766cf77f97252e5902786fd834b8c5",
- "path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar",
- "url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar"
- },
- "natives-windows-32": {
- "size": 386792,
- "sha1": "7c6affe439099806a4f552da14c42f9d643d8b23",
- "path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar",
- "url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar"
- },
- "natives-windows-64": {
- "size": 463390,
- "sha1": "39d0c3d363735b4785598e0e7fbf8297c706a9f9",
- "path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar",
- "url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar"
- }
- }
- }
- },
- {
- "extract": {
- "exclude": [
- "META-INF/"
- ]
- },
- "name": "tv.twitch:twitch-external-platform:4.5",
- "natives": {
- "windows": "natives-windows-${arch}"
- },
- "rules": [
- {
- "action": "allow",
- "os": {
- "name": "windows"
- }
- }
- ],
- "downloads": {
- "classifiers": {
- "natives-windows-32": {
- "size": 5654047,
- "sha1": "18215140f010c05b9f86ef6f0f8871954d2ccebf",
- "path": "tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-32.jar",
- "url": "https://libraries.minecraft.net/tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-32.jar"
- },
- "natives-windows-64": {
- "size": 7457619,
- "sha1": "c3cde57891b935d41b6680a9c5e1502eeab76d86",
- "path": "tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar",
- "url": "https://libraries.minecraft.net/tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar"
- }
- }
- }
- }
- ],
- "logging": {
- "client": {
- "file": {
- "id": "client-1.7.xml",
- "sha1": "49e2e41bc339698bd8199e0da9398c926e68c95d",
- "size": 467,
- "url": "https://launchermeta.mojang.com/mc-staging/log_configs/client-1.7.xml/49e2e41bc339698bd8199e0da9398c926e68c95d/client-1.7.xml"
- },
- "argument": "-Dlog4j.configurationFile=${path}",
- "type": "log4j2-xml"
- }
- },
- "mainClass": "net.minecraft.client.main.Main",
- "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}",
- "minimumLauncherVersion": 13,
- "releaseTime": "2014-05-14T17:29:23+00:00",
- "time": "2016-06-01T11:45:48+00:00",
- "type": "release"
- }

(Json文本视图转换在线工具:http://www.bejson.com/jsonviewernew/)
其中具体介绍([数据类型]-[Key名称]:[数据介绍]):
- [结构]-[assetIndex]:游戏资源文件引导信息
- [字符串]-[assets]:游戏资源ID
- [结构]-[downloads]:游戏客户端/服务端文件引导下载信息
- [字符串]-[id]:游戏版本ID
- [数组结构]-[libraries]:游戏依赖库信息(重点)
- [结构]-[logging]:未知且不常用*
- [字符串]-[mainClass]:游戏的主类
- [字符串]-[minecraftArguments]:游戏启动参数结构(重点)
- [整数]-[minimumLauncherVersion]:最低支持的启动器版本
- [字符串]-[releaseTime]:发布时间
- [字符串]-[time]:版本变动*时间
- [字符串]-[releaseTime]:游戏版本类型
此章未完待续
很有帮助 加油!
本帖最后由 nsisogf 于 2017-10-19 23:19 编辑
KMCCC如何启动?(II-运行环境准备与操作2)我们前面已经详细介绍了游戏版本目录下[版本号].json文件的结构和介绍
接下来我们将探讨启动游戏与其离不开的关系
我们在“Minecraft如何启动”一章中学习到了游戏启动参数将使用-cp导入Minecraft所依赖的运行类库(jar包)
格式如下
复制代码
但实质上,这些导入的jar包就是根据Json文件中的libraries解析而得
在版本Json文件的libraries中,所依赖的类库都是以结构数组展现
其中一个完整的元素结构如下(既libraries数组中的一个libraries元素)
复制代码其中name为该依赖库的详细名称,为字符串格式,命名结构请参照如下:
复制代码
KMCCC读取本地lib库目录标准如下(包括大部分主流启动器):
复制代码其中需要将package中的所有"."替换为"\"
例如name为 com.mojang:netty:1.6的lib
那么这个lib库的位置就在libraries\com\mojang\netty\1.6\netty-1.6.jar
那么这个lib库下载地址就为
复制代码同样的,需要将package中的所有"."替换为"/"
这样,您就可以根据版本json文件来下载缺失的依赖库文件
KMCCC检查lib完整性(文件是否存在)并下载原理也就如此。就那么简单
natives结构:
natives为文件名的.jar和<version>之间的每个特定平台提供一个字符串,产生一个文件名,格式如下:
复制代码这适用于任何带有natives的文件。本地的字符串可能包含${arch},应该替换为32或64。
extract结构:
KMCCC如何启动?(II-运行环境准备与操作2)我们前面已经详细介绍了游戏版本目录下[版本号].json文件的结构和介绍
接下来我们将探讨启动游戏与其离不开的关系
我们在“Minecraft如何启动”一章中学习到了游戏启动参数将使用-cp导入Minecraft所依赖的运行类库(jar包)
格式如下
- -cp=
- [游戏路径]\.minecraft\libraries\com\mojang\netty\1.6\netty-1.6.jar;
- [游戏路径]\.minecraft\libraries\com\mojang\realms\1.3.5\realms-1.3.5.jar;
- [游戏路径]\.minecraft\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;
- [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;
- [游戏路径]\.minecraft\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;
- [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;
- [游戏路径]\.minecraft\libraries\java3d\vecmath\1.3.1\vecmath-1.3.1.jar;
- [游戏路径]\.minecraft\libraries\net\sf\trove4j\trove4j\3.0.3\trove4j-3.0.3.jar;
- ......
但实质上,这些导入的jar包就是根据Json文件中的libraries解析而得
在版本Json文件的libraries中,所依赖的类库都是以结构数组展现
其中一个完整的元素结构如下(既libraries数组中的一个libraries元素)
- {
- "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3",
- "natives": {
- "linux": "natives-linux",
- "windows": "natives-windows",
- "osx": "natives-osx"
- },
- "extract": {
- "exclude": [
- "META-INF/"
- ]
- },
- "rules": [
- {
- "action": "allow",
- "os": {
- "name": "osx",
- "version": "^10\\.5\\.\\d[ DISCUZ_CODE_1 ]quot;
- }
- }
- ]
- }
- <package>:<name>:<version>
KMCCC读取本地lib库目录标准如下(包括大部分主流启动器):
- <libraries> \ <package> \ <name> \ <version> \ <name> - <version> .jar
例如name为 com.mojang:netty:1.6的lib
那么这个lib库的位置就在libraries\com\mojang\netty\1.6\netty-1.6.jar
那么这个lib库下载地址就为
- https://libraries.minecraft.net/ <package> / <name> / <version> / <name> - <version> .jar
这样,您就可以根据版本json文件来下载缺失的依赖库文件
KMCCC检查lib完整性(文件是否存在)并下载原理也就如此。就那么简单
natives结构:
natives为文件名的.jar和<version>之间的每个特定平台提供一个字符串,产生一个文件名,格式如下:
- <name>-<version>-<native-string>.jar
extract结构:
该extract键提供的文件提取规则。
rules结构:
该rules密钥用于确定哪些平台,来决定是否下载文件。当action是allow,文件将被下载到所述的平台os。当action是disallow,文件将不会下载到所述的平台os。如果没有os键,那么该规则是非指定平台的默认值。
下载的网址目录结构与其前面的基本相同,自行理解
根据以上的内容,启动器就可以顺利地将游戏运行依赖库准备就绪了。
未完待续
参考文献:
http://wiki.vg/Game_files
KMCCC如何启动?(II-运行环境准备与操作3)
前面我们已经成功的为minecraft启动环境准备好了引用库。
但是细心的读者已经发现,我们在最前面的启动参数中提到了-Djava.library.path参数
到目前为止,我们都没有谈及这个参数的准备,但当您准备好引用库的时候,这个东西就将发挥作用了
我们知道。大多运行在windows操作环境上的程序,都将程序函数体分布在已编译好的dll文件(动态链接库文件)中
以对程序在windows系统上的最大程度兼容和支持。
minecraft的部分运行依赖库也如此。为在特定平台上做到最大程度兼容性和支持,为各平台提供了专门的库文件。
老样子,引用版本json文件中的其中一个libraries
复制代码如果对这部分结构不熟悉,请再回头查看前一章
我们详细看natives结构:
复制代码目前已知的平台名称:
linux,osx,windows。
我们将以windows平台作为案例:
在download key中获取了该平台的支持库的下载连接
复制代码
并下载在本地后:
复制代码
我们用压缩文件打开这个jar包,可以看到下面的结构:

都是已经编译好的dll文件。
我们将其全部解压到一个文件夹中,即可
(其他具有natives性质的依赖库也如此)
并在-Djava.library.path中定义其全部dll解压完成的目录即可
在kmccc中,在 KMCCC.Tools.ZipTools & KMCCC.Modules.Zip中可以看到其对zip的操作
没错,就那么简单,解压就完成了。
到目前为止,我们已经完全准备好了minecraft的启动环境。并且大多数学习的都是理论,并没有实际接触多少的代码
下一章我们将从kmccc的代码来分析游戏启动的原理和机制。
学业繁忙,也请谅解更新缓慢
本期无参考文献
前面我们已经成功的为minecraft启动环境准备好了引用库。
但是细心的读者已经发现,我们在最前面的启动参数中提到了-Djava.library.path参数
到目前为止,我们都没有谈及这个参数的准备,但当您准备好引用库的时候,这个东西就将发挥作用了
我们知道。大多运行在windows操作环境上的程序,都将程序函数体分布在已编译好的dll文件(动态链接库文件)中
以对程序在windows系统上的最大程度兼容和支持。
minecraft的部分运行依赖库也如此。为在特定平台上做到最大程度兼容性和支持,为各平台提供了专门的库文件。
老样子,引用版本json文件中的其中一个libraries
- {
- "extract": {
- "exclude": [
- "META-INF/"
- ]
- },
- "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
- "natives": {
- "linux": "natives-linux",
- "osx": "natives-osx",
- "windows": "natives-windows"
- },
- "downloads": {
- "classifiers": {
- "natives-linux": {
- "size": 571424,
- "sha1": "aa9aae879af8eb378e22cfc64db56ec2ca9a44d1",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar"
- },
- "natives-osx": {
- "size": 527196,
- "sha1": "2d12c83fdfbc04ecabf02c7bc8cc54d034f0daac",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar"
- },
- "natives-windows": {
- "size": 611334,
- "sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
- "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar"
- }
- }
- }
- }
我们详细看natives结构:
- "<平台名称>": "<natives>-<平台名称>"
linux,osx,windows。
我们将以windows平台作为案例:
在download key中获取了该平台的支持库的下载连接
- "natives-windows": {
- "size": 611334,
- "sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
- "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
- <b> "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar"</b>
- }
并下载在本地后:
- <natives root>\<name>-<version>-<native-string>.jar
我们用压缩文件打开这个jar包,可以看到下面的结构:

都是已经编译好的dll文件。
我们将其全部解压到一个文件夹中,即可
(其他具有natives性质的依赖库也如此)
并在-Djava.library.path中定义其全部dll解压完成的目录即可
在kmccc中,在 KMCCC.Tools.ZipTools & KMCCC.Modules.Zip中可以看到其对zip的操作
没错,就那么简单,解压就完成了。
到目前为止,我们已经完全准备好了minecraft的启动环境。并且大多数学习的都是理论,并没有实际接触多少的代码
下一章我们将从kmccc的代码来分析游戏启动的原理和机制。
学业繁忙,也请谅解更新缓慢
本期无参考文献
希望看到您更多作品~
(II-运行环境准备与操作复习篇)
好久没更新Nsiso启动器已经脱离KMCCC使用自己独立开发的核心了,支持启动1.13
近日受邀继续回来赶教程
整理之前的教程,我发现比较散乱:
读取JAVA注册表(I - 环境篇补充)-获取本机JAVA
(II-运行环境准备与操作1)-Json解析格式
(II-运行环境准备与操作2)-Lib/Native库格式,与启动行(-cp)关系
(II-运行环境准备与操作3)-详写native与启动行(-Djava.library.path)关系
我发现II-运行环境准备与操作2中说明的比较乱
现在重新简单说一下
读取版本Json(解析,判断,具体请看楼层),获取版本所需要的依赖库Jar包(假设已经下载完成)
其中包括lib和Native
Native是本机库,需要从jar包中解压出来(DLL文件),并放置在特定文件夹,将该文件夹路径赋值给-Djava.library.path参数
lib直接以路径形式以分号作为分界列出在-cp参数中(-cp=......xxx.jar;.....xxxx.jar;.......xxx.jar)
在此处做提醒:若路径中存在空格,请为您的参数行添加双引号
-cp中既可以每个路径用" "(双引号)圈住(-cp="....xxx.jar";"....xxx.jar";".....xxx.jar"),也可以连同全部包括分号圈住(-cp="....xxx.jar;...xxx.jar")
建议第二种做法,缩短字符串处理所占用的启动时间
好久没更新Nsiso启动器已经脱离KMCCC使用自己独立开发的核心了,支持启动1.13
近日受邀继续回来赶教程
整理之前的教程,我发现比较散乱:
读取JAVA注册表(I - 环境篇补充)-获取本机JAVA
(II-运行环境准备与操作1)-Json解析格式
(II-运行环境准备与操作2)-Lib/Native库格式,与启动行(-cp)关系
(II-运行环境准备与操作3)-详写native与启动行(-Djava.library.path)关系
我发现II-运行环境准备与操作2中说明的比较乱
现在重新简单说一下
读取版本Json(解析,判断,具体请看楼层),获取版本所需要的依赖库Jar包(假设已经下载完成)
其中包括lib和Native
Native是本机库,需要从jar包中解压出来(DLL文件),并放置在特定文件夹,将该文件夹路径赋值给-Djava.library.path参数
lib直接以路径形式以分号作为分界列出在-cp参数中(-cp=......xxx.jar;.....xxxx.jar;.......xxx.jar)
在此处做提醒:若路径中存在空格,请为您的参数行添加双引号
-cp中既可以每个路径用" "(双引号)圈住(-cp="....xxx.jar";"....xxx.jar";".....xxx.jar"),也可以连同全部包括分号圈住(-cp="....xxx.jar;...xxx.jar")
建议第二种做法,缩短字符串处理所占用的启动时间