nsisogf
本帖最后由 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结构


tallmoon
支持楼主希望尽快更新

神封林
很不错的 我感觉还不错 至于说什么 我想不起来

nsisogf
Minecraft如何启动?
Minecraft的编写语言基于JAVA。其启动,离不开JVM(JAVA虚拟机)
要使Minecraft正常启动。就必须传入一个完整的并相对于Minecraft可用的JVM启动参数。


下面提供经过格式化的完整启动参数:
  1. [url=home.php?mod=space&uid=39305]@echo[/url] off
  2. set appdata=[游戏路径]\.minecraft

  3. "[JAVA路径]"

  4. -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
  5. -XX:+UseG1GC
  6. -XX:-UseAdaptiveSizePolicy
  7. -XX:-OmitStackTraceInFastThrow
  8. -Xmn128m
  9. -Xmx3072m
  10. -Djava.library.path=[游戏路径]\.minecraft\versions\1.7.10\1.7.10-natives
  11. -Dfml.ignoreInvalidMinecraftCertificates=true
  12. -Dfml.ignorePatchDiscrepancies=true
  13. -cp=
  14.                 [游戏路径]\.minecraft\libraries\com\mojang\netty\1.6\netty-1.6.jar;
  15.                 [游戏路径]\.minecraft\libraries\com\mojang\realms\1.3.5\realms-1.3.5.jar;
  16.                 [游戏路径]\.minecraft\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;
  17.                 [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;
  18.                 [游戏路径]\.minecraft\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;
  19.                 [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;
  20.                 [游戏路径]\.minecraft\libraries\java3d\vecmath\1.3.1\vecmath-1.3.1.jar;
  21.                 [游戏路径]\.minecraft\libraries\net\sf\trove4j\trove4j\3.0.3\trove4j-3.0.3.jar;
  22.                 [游戏路径]\.minecraft\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;
  23.                 [游戏路径]\.minecraft\libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;
  24.                 [游戏路径]\.minecraft\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;
  25.                 [游戏路径]\.minecraft\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;
  26.                 [游戏路径]\.minecraft\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;
  27.                 [游戏路径]\.minecraft\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;
  28.                 [游戏路径]\.minecraft\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;
  29.                 [游戏路径]\.minecraft\libraries\io\netty\netty-all\4.0.10.Final\netty-all-4.0.10.Final.jar;
  30.                 [游戏路径]\.minecraft\libraries\com\google\guava\guava\15.0\guava-15.0.jar;
  31.                 [游戏路径]\.minecraft\libraries\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;
  32.                 [游戏路径]\.minecraft\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;
  33.                 [游戏路径]\.minecraft\libraries\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;
  34.                 [游戏路径]\.minecraft\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;
  35.                 [游戏路径]\.minecraft\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;
  36.                 [游戏路径]\.minecraft\libraries\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar;
  37.                 [游戏路径]\.minecraft\libraries\com\mojang\authlib\1.5.21\authlib-1.5.21.jar;
  38.                 [游戏路径]\.minecraft\libraries\org\apache\logging\log4j\log4j-api\2.0-beta9\log4j-api-2.0-beta9.jar;
  39.                 [游戏路径]\.minecraft\libraries\org\apache\logging\log4j\log4j-core\2.0-beta9\log4j-core-2.0-beta9.jar;
  40.                 [游戏路径]\.minecraft\libraries\org\lwjgl\lwjgl\lwjgl\2.9.1\lwjgl-2.9.1.jar;
  41.                 [游戏路径]\.minecraft\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.1\lwjgl_util-2.9.1.jar;
  42.                 [游戏路径]\.minecraft\libraries\tv\twitch\twitch\5.16\twitch-5.16.jar;
  43.                
  44.                 [游戏路径]\.minecraft\versions\1.7.10\1.7.10.jar
  45.                         -mainClass=net.minecraft.client.main.Main
  46.                         --username [玩家名称]
  47.                         --version "[version信息]"
  48.                         --gameDir [游戏路径]\.minecraft
  49.                         --assetsDir [游戏路径]\.minecraft\assets
  50.                         --assetIndex 1.7.10
  51.                         --uuid 78db288208c027abd8d6fce4b368c62d
  52.                         --accessToken 78db288208c027abd8d6fce4b368c62d
  53.                         --userProperties {}
  54.                         --userType Legacy
  55.                         --height 480
  56.                         --width 854
复制代码
注:游戏启动于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

Heer_Kaisair
楼主加油更新==

nsisogf
本帖最后由 nsisogf 于 2017-9-28 23:30 编辑

KMCCC如何启动? (I-环境篇)

通过前面的启动参数分析我们可以知道,启动一个基于JAVA语言编写的游戏,则必须依赖于JAVA环境。
启动一个带有参数(正确且符合Minecraft启动参数规范)的java.exe*的进程,我们便可以开始启动游戏。
在任何编程语言中。如果需要启动一个进程,就必须**此进程程序的路径,这是最基本的要求。
所以第一步我们要做的就是寻找本机中可用的JAVA路径。
我们要知道,如果要寻找一个文件,则需要通过正则式一个个检索本机中文件,这必定是十分低效且累赘的方法(在某种意义上他是可行并准确的)。
在现代环境中,我们必须要寻找一个更加高效的方法来寻找这个文件路径。

JAVA在完整安装后会在注册表中写入本体的信息。其中的信息就包括了JAVA路径等可用信息
而KMCCC开发者就利用了注册表来寻找JAVA的可能位置。这是十分明智的做法

下面我们开始对KMCCC进行代码分析:
KMCCC.Tools.SystemTools.cs:
  1. /// <summary>
  2.         ///     从注册表中查找可能的javaw.exe位置
  3.         /// </summary>
  4.         /// <returns>JAVA地址列表</returns>
  5.         public static IEnumerable<string> FindJava()
  6.                 {
  7.                         try
  8.                         {
  9.                                 var rootReg = Registry.LocalMachine.OpenSubKey("SOFTWARE");
  10.                                 return rootReg == null
  11.                                         ? new string[0]
  12.                                         : FindJavaInternal(rootReg).Union(FindJavaInternal(rootReg.OpenSubKey("Wow6432Node")));
  13.                         }
  14.                         catch
  15.                         {
  16.                                 return new string[0];
  17.                         }
  18.                 }

  19. public static IEnumerable<string> FindJavaInternal(RegistryKey registry)
  20.                 {
  21.                         try
  22.                         {
  23.                                 var registryKey = registry.OpenSubKey("JavaSoft");
  24.                                 if ((registryKey == null) || ((registry = registryKey.OpenSubKey("Java Runtime Environment")) == null)) return new string[0];
  25.                                 return (from ver in registry.GetSubKeyNames()
  26.                                         select registry.OpenSubKey(ver)
  27.                                         into command
  28.                                         where command != null
  29.                                         select command.GetValue("JavaHome")
  30.                                         into javaHomes
  31.                                         where javaHomes != null
  32.                                         select javaHomes.ToString()
  33.                                         into str
  34.                                         where !String.IsNullOrWhiteSpace(str)
  35.                                         select str + @"\bin\javaw.exe");
  36.                         }
  37.                         catch
  38.                         {
  39.                                 return new string[0];
  40.                         }
  41.                 }
复制代码

在这里,KMCCC将注册表查询操作分为两个方法。正式使用时应使用FindJava()而非FindJavaInternal(RegistryKey registry)
之所以分为两个方法,是为了保证此功能的高度弹性。

通过Union方法生成两个使用FindJavaInternal(RegistryKey registry)打开的子键返回的序列的并集。
既LocalMachine子键SOFTWARE 及SOFTWARE子键Wow6432Node,传递给FindJavaInternal(RegistryKey registry)
当注册表结构发生变动时,只需改变FindJava()方法而无需改动内部方法。这便是优点所在

当成功进入JAVA注册表所在的参数子键中时,经过一系列的有效性判断,返回所有子项的字符串名称数组
  1. registry.GetSubKeyNames()
复制代码

并利用一系列LINQ语句检索
  1. from ver in registry.GetSubKeyNames()
  2.                                         select registry.OpenSubKey(ver)
  3.                                         into command
  4.                                         where command != null
  5.                                         select command.GetValue("JavaHome")
  6.                                         into javaHomes
  7.                                         where javaHomes != null
  8.                                         select javaHomes.ToString()
  9.                                         into str
  10.                                         where !String.IsNullOrWhiteSpace(str)
  11.                                         select str + @"\bin\javaw.exe"
复制代码


检索到的匹配内容(既JAVA根路径)加上 \bin\javaw.exe 既是这个JAVA程序的路径
最终返回符合条件的所有JAVA路径(IEnumerable<string>类型)
再增加一个文件存在检测就更完美了

更新时间比较慢。。冷静。。

参考文献:
https://msdn.microsoft.com/zh-cn ... 32.registrykey.aspx


nsisogf
读取JAVA注册表(I - 环境篇补充)
我们将会以图文与代码结合介绍的方式来方便读者理解。

前章回顾:
FindJava()方法中分两次使用FindJavaInternal(RegistryKey registry)读取HKEY_LOCAL_MACHINE的子键SOFTWARE
以及HKEY_LOCAL_MACHINE\SOFTWARE的子键Wow6432Node匹配Linq结果的并集(Union方法)

接下来我们以FindJavaInternal(RegistryKey registry)作为示范。传递的参数键为SOFTWARE:
在windows中的regedit视图就是这个键


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


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


使用Linq语句,返回Java Runtime Environment中的所有子项的字符串名称
  1. from ver in registry.GetSubKeyNames()
复制代码
再一个个进入每个子键中
  1. select registry.OpenSubKey(ver)
复制代码
并获取这个键中的JavaHome值
  1. select command.GetValue("JavaHome")
复制代码
值的结构像这样的:


获取到的就是这个JAVA的根目录。

最后在所有匹配的字符串上加上字符串"\bin\javaw.exe"
就成功获取了

本补充章无参考文献

nsisogf
KMCCC如何启动?(II-运行环境准备与操作1)
当您准备好用户的JAVA路径,启动最佳内存,垃圾回收器时。我们就要为游戏的运行环境进行准备了。

在此之前。我们要获取这个版本的详细信息,来提取我们必要的游戏依赖库和其他重要信息。
Mojang将一个版本的详细信息写入了[版本号].json文件中。
通常来说,游戏核心总是和他的版本信息在同一目录下(.minecraft\versions\)
该文件的结构如下(Json格式):
  1. {
  2.     "assetIndex": {
  3.         "id": "1.7.10",
  4.         "sha1": "f90ca2878ba3141d32d949ea7f665855dd073c65",
  5.         "size": 88096,
  6.         "url": "https://launchermeta.mojang.com/mc/assets/1.7.10/f90ca2878ba3141d32d949ea7f665855dd073c65/1.7.10.json",
  7.         "totalSize": 112220327
  8.     },
  9.     "assets": "1.7.10",
  10.     "downloads": {
  11.         "client": {
  12.             "sha1": "e80d9b3bf5085002218d4be59e668bac718abbc6",
  13.             "size": 5256245,
  14.             "url": "https://launcher.mojang.com/mc/game/1.7.10/client/e80d9b3bf5085002218d4be59e668bac718abbc6/client.jar"
  15.         },
  16.         "server": {
  17.             "sha1": "952438ac4e01b4d115c5fc38f891710c4941df29",
  18.             "size": 9605030,
  19.             "url": "https://launcher.mojang.com/mc/game/1.7.10/server/952438ac4e01b4d115c5fc38f891710c4941df29/server.jar"
  20.         },
  21.         "windows_server": {
  22.             "sha1": "a79b91ef69b9b4af63d1c7007f60259106869b21",
  23.             "size": 9999270,
  24.             "url": "https://launcher.mojang.com/mc/game/1.7.10/windows_server/a79b91ef69b9b4af63d1c7007f60259106869b21/windows_server.exe"
  25.         }
  26.     },
  27.     "id": "1.7.10",
  28.     "libraries": [
  29.         {
  30.             "name": "com.mojang:netty:1.6",
  31.             "downloads": {
  32.                 "artifact": {
  33.                     "size": 7877,
  34.                     "sha1": "4b75825a06139752bd800d9e29c5fd55b8b1b1e4",
  35.                     "path": "com/mojang/netty/1.6/netty-1.6.jar",
  36.                     "url": "https://libraries.minecraft.net/com/mojang/netty/1.6/netty-1.6.jar"
  37.                 }
  38.             }
  39.         },
  40.         {
  41.             "name": "com.mojang:realms:1.3.5",
  42.             "downloads": {
  43.                 "artifact": {
  44.                     "size": 353818,
  45.                     "sha1": "0807ae355ee63583becd7ea60e76aab1532bb42e",
  46.                     "path": "com/mojang/realms/1.3.5/realms-1.3.5.jar",
  47.                     "url": "https://libraries.minecraft.net/com/mojang/realms/1.3.5/realms-1.3.5.jar"
  48.                 }
  49.             }
  50.         },
  51.         {
  52.             "name": "org.apache.commons:commons-compress:1.8.1",
  53.             "downloads": {
  54.                 "artifact": {
  55.                     "size": 365552,
  56.                     "sha1": "a698750c16740fd5b3871425f4cb3bbaa87f529d",
  57.                     "path": "org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar",
  58.                     "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar"
  59.                 }
  60.             }
  61.         },
  62.         {
  63.             "name": "org.apache.httpcomponents:httpclient:4.3.3",
  64.             "downloads": {
  65.                 "artifact": {
  66.                     "size": 589512,
  67.                     "sha1": "18f4247ff4572a074444572cee34647c43e7c9c7",
  68.                     "path": "org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar",
  69.                     "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar"
  70.                 }
  71.             }
  72.         },
  73.         {
  74.             "name": "commons-logging:commons-logging:1.1.3",
  75.             "downloads": {
  76.                 "artifact": {
  77.                     "size": 62050,
  78.                     "sha1": "f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f",
  79.                     "path": "commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar",
  80.                     "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"
  81.                 }
  82.             }
  83.         },
  84.         {
  85.             "name": "org.apache.httpcomponents:httpcore:4.3.2",
  86.             "downloads": {
  87.                 "artifact": {
  88.                     "size": 282269,
  89.                     "sha1": "31fbbff1ddbf98f3aa7377c94d33b0447c646b6e",
  90.                     "path": "org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar",
  91.                     "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar"
  92.                 }
  93.             }
  94.         },
  95.         {
  96.             "name": "java3d:vecmath:1.3.1",
  97.             "downloads": {
  98.                 "artifact": {
  99.                     "size": 289881,
  100.                     "sha1": "a0ae4f51da409fa0c20fa0ca59e6bbc9413ae71d",
  101.                     "path": "java3d/vecmath/1.3.1/vecmath-1.3.1.jar",
  102.                     "url": "https://libraries.minecraft.net/java3d/vecmath/1.3.1/vecmath-1.3.1.jar"
  103.                 }
  104.             }
  105.         },
  106.         {
  107.             "name": "net.sf.trove4j:trove4j:3.0.3",
  108.             "downloads": {
  109.                 "artifact": {
  110.                     "size": 2523218,
  111.                     "sha1": "42ccaf4761f0dfdfa805c9e340d99a755907e2dd",
  112.                     "path": "net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar",
  113.                     "url": "https://libraries.minecraft.net/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar"
  114.                 }
  115.             }
  116.         },
  117.         {
  118.             "name": "com.ibm.icu:icu4j-core-mojang:51.2",
  119.             "downloads": {
  120.                 "artifact": {
  121.                     "size": 1634692,
  122.                     "sha1": "63d216a9311cca6be337c1e458e587f99d382b84",
  123.                     "path": "com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar",
  124.                     "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar"
  125.                 }
  126.             }
  127.         },
  128.         {
  129.             "name": "net.sf.jopt-simple:jopt-simple:4.5",
  130.             "downloads": {
  131.                 "artifact": {
  132.                     "size": 61311,
  133.                     "sha1": "6065cc95c661255349c1d0756657be17c29a4fd3",
  134.                     "path": "net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar",
  135.                     "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar"
  136.                 }
  137.             }
  138.         },
  139.         {
  140.             "name": "com.paulscode:codecjorbis:20101023",
  141.             "downloads": {
  142.                 "artifact": {
  143.                     "size": 103871,
  144.                     "sha1": "c73b5636faf089d9f00e8732a829577de25237ee",
  145.                     "path": "com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar",
  146.                     "url": "https://libraries.minecraft.net/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar"
  147.                 }
  148.             }
  149.         },
  150.         {
  151.             "name": "com.paulscode:codecwav:20101023",
  152.             "downloads": {
  153.                 "artifact": {
  154.                     "size": 5618,
  155.                     "sha1": "12f031cfe88fef5c1dd36c563c0a3a69bd7261da",
  156.                     "path": "com/paulscode/codecwav/20101023/codecwav-20101023.jar",
  157.                     "url": "https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar"
  158.                 }
  159.             }
  160.         },
  161.         {
  162.             "name": "com.paulscode:libraryjavasound:20101123",
  163.             "downloads": {
  164.                 "artifact": {
  165.                     "size": 21679,
  166.                     "sha1": "5c5e304366f75f9eaa2e8cca546a1fb6109348b3",
  167.                     "path": "com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar",
  168.                     "url": "https://libraries.minecraft.net/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar"
  169.                 }
  170.             }
  171.         },
  172.         {
  173.             "name": "com.paulscode:librarylwjglopenal:20100824",
  174.             "downloads": {
  175.                 "artifact": {
  176.                     "size": 18981,
  177.                     "sha1": "73e80d0794c39665aec3f62eee88ca91676674ef",
  178.                     "path": "com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar",
  179.                     "url": "https://libraries.minecraft.net/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar"
  180.                 }
  181.             }
  182.         },
  183.         {
  184.             "name": "com.paulscode:soundsystem:20120107",
  185.             "downloads": {
  186.                 "artifact": {
  187.                     "size": 65020,
  188.                     "sha1": "419c05fe9be71f792b2d76cfc9b67f1ed0fec7f6",
  189.                     "path": "com/paulscode/soundsystem/20120107/soundsystem-20120107.jar",
  190.                     "url": "https://libraries.minecraft.net/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar"
  191.                 }
  192.             }
  193.         },
  194.         {
  195.             "name": "io.netty:netty-all:4.0.10.Final",
  196.             "downloads": {
  197.                 "artifact": {
  198.                     "size": 1452995,
  199.                     "sha1": "9e50bd52ffe257a0e2cd8d971688d6ce7d174325",
  200.                     "path": "io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar",
  201.                     "url": "https://libraries.minecraft.net/io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar"
  202.                 }
  203.             }
  204.         },
  205.         {
  206.             "name": "com.google.guava:guava:15.0",
  207.             "downloads": {
  208.                 "artifact": {
  209.                     "size": 2172168,
  210.                     "sha1": "ed727a8d9f247e2050281cb083f1c77b09dcb5cd",
  211.                     "path": "com/google/guava/guava/15.0/guava-15.0.jar",
  212.                     "url": "https://libraries.minecraft.net/com/google/guava/guava/15.0/guava-15.0.jar"
  213.                 }
  214.             }
  215.         },
  216.         {
  217.             "name": "org.apache.commons:commons-lang3:3.1",
  218.             "downloads": {
  219.                 "artifact": {
  220.                     "size": 315805,
  221.                     "sha1": "905075e6c80f206bbe6cf1e809d2caa69f420c76",
  222.                     "path": "org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar",
  223.                     "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar"
  224.                 }
  225.             }
  226.         },
  227.         {
  228.             "name": "commons-io:commons-io:2.4",
  229.             "downloads": {
  230.                 "artifact": {
  231.                     "size": 185140,
  232.                     "sha1": "b1b6ea3b7e4aa4f492509a4952029cd8e48019ad",
  233.                     "path": "commons-io/commons-io/2.4/commons-io-2.4.jar",
  234.                     "url": "https://libraries.minecraft.net/commons-io/commons-io/2.4/commons-io-2.4.jar"
  235.                 }
  236.             }
  237.         },
  238.         {
  239.             "name": "commons-codec:commons-codec:1.9",
  240.             "downloads": {
  241.                 "artifact": {
  242.                     "size": 263965,
  243.                     "sha1": "9ce04e34240f674bc72680f8b843b1457383161a",
  244.                     "path": "commons-codec/commons-codec/1.9/commons-codec-1.9.jar",
  245.                     "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.9/commons-codec-1.9.jar"
  246.                 }
  247.             }
  248.         },
  249.         {
  250.             "name": "net.java.jinput:jinput:2.0.5",
  251.             "downloads": {
  252.                 "artifact": {
  253.                     "size": 208338,
  254.                     "sha1": "39c7796b469a600f72380316f6b1f11db6c2c7c4",
  255.                     "path": "net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar",
  256.                     "url": "https://libraries.minecraft.net/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"
  257.                 }
  258.             }
  259.         },
  260.         {
  261.             "name": "net.java.jutils:jutils:1.0.0",
  262.             "downloads": {
  263.                 "artifact": {
  264.                     "size": 7508,
  265.                     "sha1": "e12fe1fda814bd348c1579329c86943d2cd3c6a6",
  266.                     "path": "net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar",
  267.                     "url": "https://libraries.minecraft.net/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar"
  268.                 }
  269.             }
  270.         },
  271.         {
  272.             "name": "com.google.code.gson:gson:2.2.4",
  273.             "downloads": {
  274.                 "artifact": {
  275.                     "size": 190432,
  276.                     "sha1": "a60a5e993c98c864010053cb901b7eab25306568",
  277.                     "path": "com/google/code/gson/gson/2.2.4/gson-2.2.4.jar",
  278.                     "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar"
  279.                 }
  280.             }
  281.         },
  282.         {
  283.             "name": "com.mojang:authlib:1.5.21",
  284.             "downloads": {
  285.                 "artifact": {
  286.                     "size": 64412,
  287.                     "sha1": "aefba0d5b53fbcb70860bc8046ab95d5854c07a5",
  288.                     "path": "com/mojang/authlib/1.5.21/authlib-1.5.21.jar",
  289.                     "url": "https://libraries.minecraft.net/com/mojang/authlib/1.5.21/authlib-1.5.21.jar"
  290.                 }
  291.             }
  292.         },
  293.         {
  294.             "name": "org.apache.logging.log4j:log4j-api:2.0-beta9",
  295.             "downloads": {
  296.                 "artifact": {
  297.                     "size": 108161,
  298.                     "sha1": "1dd66e68cccd907880229f9e2de1314bd13ff785",
  299.                     "path": "org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar",
  300.                     "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar"
  301.                 }
  302.             }
  303.         },
  304.         {
  305.             "name": "org.apache.logging.log4j:log4j-core:2.0-beta9",
  306.             "downloads": {
  307.                 "artifact": {
  308.                     "size": 681134,
  309.                     "sha1": "678861ba1b2e1fccb594bb0ca03114bb05da9695",
  310.                     "path": "org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar",
  311.                     "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar"
  312.                 }
  313.             }
  314.         },
  315.         {
  316.             "name": "org.lwjgl.lwjgl:lwjgl:2.9.1",
  317.             "downloads": {
  318.                 "artifact": {
  319.                     "size": 1014790,
  320.                     "sha1": "f58c5aabcef0e41718a564be9f8e412fff8db847",
  321.                     "path": "org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar",
  322.                     "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar"
  323.                 }
  324.             }
  325.         },
  326.         {
  327.             "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1",
  328.             "downloads": {
  329.                 "artifact": {
  330.                     "size": 173909,
  331.                     "sha1": "290d7ba8a1bd9566f5ddf16ad06f09af5ec9b20e",
  332.                     "path": "org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar",
  333.                     "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar"
  334.                 }
  335.             }
  336.         },
  337.         {
  338.             "extract": {
  339.                 "exclude": [
  340.                     "META-INF/"
  341.                 ]
  342.             },
  343.             "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
  344.             "natives": {
  345.                 "linux": "natives-linux",
  346.                 "osx": "natives-osx",
  347.                 "windows": "natives-windows"
  348.             },
  349.             "downloads": {
  350.                 "classifiers": {
  351.                     "natives-linux": {
  352.                         "size": 571424,
  353.                         "sha1": "aa9aae879af8eb378e22cfc64db56ec2ca9a44d1",
  354.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar",
  355.                         "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar"
  356.                     },
  357.                     "natives-osx": {
  358.                         "size": 527196,
  359.                         "sha1": "2d12c83fdfbc04ecabf02c7bc8cc54d034f0daac",
  360.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar",
  361.                         "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar"
  362.                     },
  363.                     "natives-windows": {
  364.                         "size": 611334,
  365.                         "sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
  366.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
  367.                         "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar"
  368.                     }
  369.                 }
  370.             }
  371.         },
  372.         {
  373.             "extract": {
  374.                 "exclude": [
  375.                     "META-INF/"
  376.                 ]
  377.             },
  378.             "name": "net.java.jinput:jinput-platform:2.0.5",
  379.             "natives": {
  380.                 "linux": "natives-linux",
  381.                 "osx": "natives-osx",
  382.                 "windows": "natives-windows"
  383.             },
  384.             "downloads": {
  385.                 "classifiers": {
  386.                     "natives-linux": {
  387.                         "size": 10362,
  388.                         "sha1": "7ff832a6eb9ab6a767f1ade2b548092d0fa64795",
  389.                         "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar",
  390.                         "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar"
  391.                     },
  392.                     "natives-osx": {
  393.                         "size": 12186,
  394.                         "sha1": "53f9c919f34d2ca9de8c51fc4e1e8282029a9232",
  395.                         "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar",
  396.                         "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar"
  397.                     },
  398.                     "natives-windows": {
  399.                         "size": 155179,
  400.                         "sha1": "385ee093e01f587f30ee1c8a2ee7d408fd732e16",
  401.                         "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar",
  402.                         "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar"
  403.                     }
  404.                 }
  405.             }
  406.         },
  407.         {
  408.             "name": "tv.twitch:twitch:5.16",
  409.             "downloads": {
  410.                 "artifact": {
  411.                     "size": 52315,
  412.                     "sha1": "1f55f009c61637c10c0acfb8b5ffc600f30044b4",
  413.                     "path": "tv/twitch/twitch/5.16/twitch-5.16.jar",
  414.                     "url": "https://libraries.minecraft.net/tv/twitch/twitch/5.16/twitch-5.16.jar"
  415.                 }
  416.             }
  417.         },
  418.         {
  419.             "extract": {
  420.                 "exclude": [
  421.                     "META-INF/"
  422.                 ]
  423.             },
  424.             "name": "tv.twitch:twitch-platform:5.16",
  425.             "natives": {
  426.                 "linux": "natives-linux",
  427.                 "osx": "natives-osx",
  428.                 "windows": "natives-windows-${arch}"
  429.             },
  430.             "rules": [
  431.                 {
  432.                     "action": "allow"
  433.                 },
  434.                 {
  435.                     "action": "disallow",
  436.                     "os": {
  437.                         "name": "linux"
  438.                     }
  439.                 }
  440.             ],
  441.             "downloads": {
  442.                 "classifiers": {
  443.                     "natives-osx": {
  444.                         "size": 418331,
  445.                         "sha1": "62503ee712766cf77f97252e5902786fd834b8c5",
  446.                         "path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar",
  447.                         "url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar"
  448.                     },
  449.                     "natives-windows-32": {
  450.                         "size": 386792,
  451.                         "sha1": "7c6affe439099806a4f552da14c42f9d643d8b23",
  452.                         "path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar",
  453.                         "url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar"
  454.                     },
  455.                     "natives-windows-64": {
  456.                         "size": 463390,
  457.                         "sha1": "39d0c3d363735b4785598e0e7fbf8297c706a9f9",
  458.                         "path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar",
  459.                         "url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar"
  460.                     }
  461.                 }
  462.             }
  463.         },
  464.         {
  465.             "extract": {
  466.                 "exclude": [
  467.                     "META-INF/"
  468.                 ]
  469.             },
  470.             "name": "tv.twitch:twitch-external-platform:4.5",
  471.             "natives": {
  472.                 "windows": "natives-windows-${arch}"
  473.             },
  474.             "rules": [
  475.                 {
  476.                     "action": "allow",
  477.                     "os": {
  478.                         "name": "windows"
  479.                     }
  480.                 }
  481.             ],
  482.             "downloads": {
  483.                 "classifiers": {
  484.                     "natives-windows-32": {
  485.                         "size": 5654047,
  486.                         "sha1": "18215140f010c05b9f86ef6f0f8871954d2ccebf",
  487.                         "path": "tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-32.jar",
  488.                         "url": "https://libraries.minecraft.net/tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-32.jar"
  489.                     },
  490.                     "natives-windows-64": {
  491.                         "size": 7457619,
  492.                         "sha1": "c3cde57891b935d41b6680a9c5e1502eeab76d86",
  493.                         "path": "tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar",
  494.                         "url": "https://libraries.minecraft.net/tv/twitch/twitch-external-platform/4.5/twitch-external-platform-4.5-natives-windows-64.jar"
  495.                     }
  496.                 }
  497.             }
  498.         }
  499.     ],
  500.     "logging": {
  501.         "client": {
  502.             "file": {
  503.                 "id": "client-1.7.xml",
  504.                 "sha1": "49e2e41bc339698bd8199e0da9398c926e68c95d",
  505.                 "size": 467,
  506.                 "url": "https://launchermeta.mojang.com/mc-staging/log_configs/client-1.7.xml/49e2e41bc339698bd8199e0da9398c926e68c95d/client-1.7.xml"
  507.             },
  508.             "argument": "-Dlog4j.configurationFile=${path}",
  509.             "type": "log4j2-xml"
  510.         }
  511.     },
  512.     "mainClass": "net.minecraft.client.main.Main",
  513.     "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}",
  514.     "minimumLauncherVersion": 13,
  515.     "releaseTime": "2014-05-14T17:29:23+00:00",
  516.     "time": "2016-06-01T11:45:48+00:00",
  517.     "type": "release"
  518. }
复制代码
将该文件转换为视图模式,它将会时这样的结构:

(Json文本视图转换在线工具:http://www.bejson.com/jsonviewernew/

其中具体介绍([数据类型]-[Key名称]:[数据介绍]):
  1. [结构]-[assetIndex]:游戏资源文件引导信息
  2. [字符串]-[assets]:游戏资源ID
  3. [结构]-[downloads]:游戏客户端/服务端文件引导下载信息
  4. [字符串]-[id]:游戏版本ID
  5. [数组结构]-[libraries]:游戏依赖库信息(重点)
  6. [结构]-[logging]:未知且不常用*
  7. [字符串]-[mainClass]:游戏的主类
  8. [字符串]-[minecraftArguments]:游戏启动参数结构(重点)
  9. [整数]-[minimumLauncherVersion]:最低支持的启动器版本
  10. [字符串]-[releaseTime]:发布时间
  11. [字符串]-[time]:版本变动*时间
  12. [字符串]-[releaseTime]:游戏版本类型
复制代码
星号代表具有争议。实际意义由官方决定

此章未完待续

天行
很有帮助 加油!

nsisogf
本帖最后由 nsisogf 于 2017-10-19 23:19 编辑

KMCCC如何启动?(II-运行环境准备与操作2)我们前面已经详细介绍了游戏版本目录下[版本号].json文件的结构和介绍
接下来我们将探讨启动游戏与其离不开的关系
我们在“Minecraft如何启动”一章中学习到了游戏启动参数将使用-cp导入Minecraft所依赖的运行类库(jar包)
格式如下
  1. -cp=
  2.                 [游戏路径]\.minecraft\libraries\com\mojang\netty\1.6\netty-1.6.jar;
  3.                 [游戏路径]\.minecraft\libraries\com\mojang\realms\1.3.5\realms-1.3.5.jar;
  4.                 [游戏路径]\.minecraft\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;
  5.                 [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;
  6.                 [游戏路径]\.minecraft\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;
  7.                 [游戏路径]\.minecraft\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;
  8.                 [游戏路径]\.minecraft\libraries\java3d\vecmath\1.3.1\vecmath-1.3.1.jar;
  9.                 [游戏路径]\.minecraft\libraries\net\sf\trove4j\trove4j\3.0.3\trove4j-3.0.3.jar;
  10. ......
复制代码

但实质上,这些导入的jar包就是根据Json文件中的libraries解析而得
在版本Json文件的libraries中,所依赖的类库都是以结构数组展现
其中一个完整的元素结构如下(既libraries数组中的一个libraries元素)
  1. {
  2.   "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3",
  3.   "natives": {
  4.     "linux": "natives-linux",
  5.     "windows": "natives-windows",
  6.     "osx": "natives-osx"
  7.   },
  8.   "extract": {
  9.     "exclude": [
  10.       "META-INF/"
  11.     ]
  12.   },
  13.   "rules": [
  14.     {
  15.       "action": "allow",
  16.       "os": {
  17.         "name": "osx",
  18.         "version": "^10\\.5\\.\\d[        DISCUZ_CODE_1        ]quot;
  19.       }
  20.     }
  21.   ]
  22. }
复制代码
其中name为该依赖库的详细名称,为字符串格式,命名结构请参照如下:
  1. <package>:<name>:<version>
复制代码

KMCCC读取本地lib库目录标准如下(包括大部分主流启动器):
  1. <libraries> \ <package> \ <name> \ <version> \ <name>  -  <version> .jar
复制代码
其中需要将package中的所有"."替换为"\"
例如name为 com.mojang:netty:1.6的lib
那么这个lib库的位置就在libraries\com\mojang\netty\1.6\netty-1.6.jar

那么这个lib库下载地址就为
  1. https://libraries.minecraft.net/ <package> / <name> / <version> / <name>  -  <version> .jar
复制代码
同样的,需要将package中的所有"."替换为"/"
这样,您就可以根据版本json文件来下载缺失的依赖库文件
KMCCC检查lib完整性(文件是否存在)并下载原理也就如此。就那么简单

natives结构:
natives为文件名的.jar和<version>之间的每个特定平台提供一个字符串,产生一个文件名,格式如下:
  1. <name>-<version>-<native-string>.jar
复制代码
这适用于任何带有natives的文件。本地的字符串可能包含${arch},应该替换为32或64。


extract结构:
该extract键提供的文件提取规则。

rules结构:
该rules密钥用于确定哪些平台,来决定是否下载文件。当action是allow,文件将被下载到所述的平台os。当action是disallow,文件将不会下载到所述的平台os。如果没有os键,那么该规则是非指定平台的默认值。
下载的网址目录结构与其前面的基本相同,自行理解

根据以上的内容,启动器就可以顺利地将游戏运行依赖库准备就绪了。
未完待续

参考文献:
http://wiki.vg/Game_files



nsisogf
KMCCC如何启动?(II-运行环境准备与操作3)
前面我们已经成功的为minecraft启动环境准备好了引用库。
但是细心的读者已经发现,我们在最前面的启动参数中提到了-Djava.library.path参数
到目前为止,我们都没有谈及这个参数的准备,但当您准备好引用库的时候,这个东西就将发挥作用了

我们知道。大多运行在windows操作环境上的程序,都将程序函数体分布在已编译好的dll文件(动态链接库文件)中
以对程序在windows系统上的最大程度兼容和支持。
minecraft的部分运行依赖库也如此。为在特定平台上做到最大程度兼容性和支持,为各平台提供了专门的库文件。
老样子,引用版本json文件中的其中一个libraries
  1. {
  2.             "extract": {
  3.                 "exclude": [
  4.                     "META-INF/"
  5.                 ]
  6.             },
  7.             "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
  8.             "natives": {
  9.                 "linux": "natives-linux",
  10.                 "osx": "natives-osx",
  11.                 "windows": "natives-windows"
  12.             },
  13.             "downloads": {
  14.                 "classifiers": {
  15.                     "natives-linux": {
  16.                         "size": 571424,
  17.                         "sha1": "aa9aae879af8eb378e22cfc64db56ec2ca9a44d1",
  18.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar",
  19.                         "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar"
  20.                     },
  21.                     "natives-osx": {
  22.                         "size": 527196,
  23.                         "sha1": "2d12c83fdfbc04ecabf02c7bc8cc54d034f0daac",
  24.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar",
  25.                         "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar"
  26.                     },
  27.                     "natives-windows": {
  28.                         "size": 611334,
  29.                         "sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
  30.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
  31.                         "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar"
  32.                     }
  33.                 }
  34.             }
  35.         }
复制代码
如果对这部分结构不熟悉,请再回头查看前一章
我们详细看natives结构:
  1. "<平台名称>": "<natives>-<平台名称>"
复制代码
目前已知的平台名称:
linux,osx,windows。

我们将以windows平台作为案例:
在download key中获取了该平台的支持库的下载连接
  1. "natives-windows": {
  2.                         "size": 611334,
  3.                         "sha1": "4c517eca808522457dd95ee8fc1fbcdbb602efbe",
  4.                         "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar",
  5. <b>                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar"</b>
  6.                     }
复制代码


并下载在本地后:
  1. <natives root>\<name>-<version>-<native-string>.jar
复制代码


我们用压缩文件打开这个jar包,可以看到下面的结构:


都是已经编译好的dll文件。
我们将其全部解压到一个文件夹中,即可
(其他具有natives性质的依赖库也如此)
并在-Djava.library.path中定义其全部dll解压完成的目录即可

在kmccc中,在 KMCCC.Tools.ZipTools & KMCCC.Modules.Zip中可以看到其对zip的操作
没错,就那么简单,解压就完成了。

到目前为止,我们已经完全准备好了minecraft的启动环境。并且大多数学习的都是理论,并没有实际接触多少的代码
下一章我们将从kmccc的代码来分析游戏启动的原理和机制。
学业繁忙,也请谅解更新缓慢

本期无参考文献

梦都
希望看到您更多作品~

nsisogf
(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")
建议第二种做法,缩短字符串处理所占用的启动时间