教程/編寫啟動器
此特性為Java版獨(dú)有。
本教程介紹如何制作Java版啟動器,并假定你已掌握任何一門編程語言。
?
基本原理
因?yàn)镸inecraft制作時采用了“啟動器+游戲文件”的模式:
將游戲文件單獨(dú)存儲,而通過啟動器調(diào)用JVM(Java Virtual Machine)執(zhí)行游戲主文件并傳入一些游戲參數(shù)來啟動Minecraft。
游戲依賴庫文件以及游戲資源文件由啟動器補(bǔ)全。
玩家登錄認(rèn)證由啟動器完成。
這使得我們能通過編寫第三方啟動器來接管游戲文件管理和登錄認(rèn)證。
準(zhǔn)備
要編寫一個啟動器,你需要:
一門編程語言其開發(fā)環(huán)境
Java運(yùn)行時環(huán)境(Java Runtime Environment,JRE),可于Java官網(wǎng)下載
并擁有支持下列功能的庫:
解析JSON文檔(得到啟動參數(shù)的關(guān)鍵)
解壓文件(解壓natives文件,也可使用鏈接外部程序替代)
網(wǎng)絡(luò)庫(正版驗(yàn)證、皮膚管理)
啟動參數(shù)
啟動參數(shù)將傳入java.exe
或javaw.exe
,使JVM
通過傳入的主類正確地啟動游戲。
啟動參數(shù)分為JVM參數(shù)和Minecraft參數(shù)兩部分。
獲取參數(shù)
運(yùn)行此命令可獲取當(dāng)前運(yùn)行的Minecraft進(jìn)程的參數(shù):
wmic process where caption="javaw.exe" get caption,commandline /value>args.txt
此時args.txt大致有這樣的文件內(nèi)容:
Caption=javaw.exe CommandLine="<javaw或java路徑>" -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump "-Dos.name=Windows 10" -Dos.version=10.0 -Xss1M -Djava.library.path=<natives文件夾路徑> -Dminecraft.launcher.brand=minecraft-launcher -Dminecraft.launcher.version=2.1.3674 -cp <一大串用;分開的文件路徑> -Xmx2G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -Dlog4j.configurationFile=<log4j配置文件路徑> net.minecraft.client.main.Main --username <用戶名> --version <游戲版本號> --gameDir <游戲路徑> --assetsDir <資源文件路徑> --assetIndex <資源索引版本> --uuid <用戶uuid> --accessToken <登錄令牌> --userType mojang --versionType release
僅保留CommandLine
后的內(nèi)容,然后將該文件后綴改為.bat
,雙擊即可啟動Minecraft。
運(yùn)行前注意文件編碼。并注意官方啟動器的解壓出的natives庫文件存儲在臨時文件夾下,可能因刪除導(dǎo)致無法啟動。
JVM參數(shù)
-X
、-XX
參數(shù)
配置JVM,如GC等:
-Xmx1024m
?最大堆大小為1024MB-Xmn128m
?新生代堆大小為128MB-XX:+UseG1GC
?開啟G1-XX:-UseAdaptiveSizePolicy
?自動選擇年輕代區(qū)大小和相應(yīng)的Survivor區(qū)比例-XX:-OmitStackTraceInFastThrow
?省略異常棧信息從而快速拋出
-D
參數(shù)
配置JVM系統(tǒng)屬性,格式為-D<name>=<value>
。
Dos.name=Windows 10 -Dos.version=10.0
?當(dāng)前系統(tǒng)名稱及版本-Dminecraft.launcher.brand=minecraft-launcher -Dminecraft.launcher.version=2.1.3674
?當(dāng)前啟動器名稱及版本-Dlog4j.configurationFile=<文件路徑>\client-1.12.xml
?游戲日志配置文件-Djava.library.path=<natives文件夾路徑>
?當(dāng)前系統(tǒng)下游戲運(yùn)行所需的動態(tài)鏈接庫
-cp
參數(shù)
全稱為-classpath
,后為所有當(dāng)前版本Minecraft的普通庫文件路徑及游戲主文件,中間用;
隔開。
Minecraft參數(shù)
以主類名開頭,通常為net.minecraft.client.main.Main
,若安裝Mod加載器則一般為net.minecraft.launchwrapper.Launch
參數(shù)通常有:
--username
?后接用戶名--version
?后接游戲版本--gameDir
?后接游戲路徑--assetsDir
?后接資源文件路徑--assetIndex
?后接資源索引版本--uuid
?后接用戶uuid--accessToken
?后接登錄令牌--userType
?后接用戶類型--versionType
?后接版本類型,會顯示在游戲主界面右下角等等,可能因版本而異,具體應(yīng)參考當(dāng)前版本json文件內(nèi)提供的信息。
游戲文件
文件結(jié)構(gòu)大致如下:
列表
.minecraft
[版本號]
[版本號].jar
[版本號].json
indexes
log_configs
objects
skins
[版本號].json
client-[版本號].xml
assets
resourcepacks
saves
screenshots
versions
launcher_profiles.json
launcher_profiles.json
options.txt
以上文件結(jié)構(gòu)經(jīng)過簡化,具體可參考.minecraft頁面。
JSON文件
Minecraft大多數(shù)信息使用JSON文檔存儲管理,使用這些JSON文件可以獲取下載、管理及啟動所需的大部分信息。
版本清單文件
主條目: /version_manifest.json
該文件可以在mojang官方服務(wù)器下載:
https://launchermeta.mojang.com/mc/game/version_manifest.json ??
內(nèi)容通常如下:{ ? ? "latest": { ? ? ? ? "release": "1.14.1", ? ? ? ? "snapshot": "1.14.2 Pre-Release 4" ? ? }, ? ? "versions": [ ? ? ? ? { ? ? ? ? ? ? "id": "1.14.2 Pre-Release 4", ? ? ? ? ? ? "type": "snapshot", ? ? ? ? ? ? "url": "https://launchermeta.mojang.com/v1/packages/f90f601344058a812144eb71a49552b30a70d589/1.14.2_Pre-Release_4.json", ? ? ? ? ? ? "time": "2019-05-24T15:50:42+00:00", ? ? ? ? ? ? "releaseTime": "2019-05-24T15:48:24+00:00" ? ? ? ? }, ? ? ? ? { ? ? ? ? ? ? "id": "1.14.2 Pre-Release 3", ? ? ? ? ? ? "type": "snapshot", ? ? ? ? ? ? "url": "https://launchermeta.mojang.com/v1/packages/48004350162b58ab677efb7db5cc417af13124ef/1.14.2_Pre-Release_3.json", ? ? ? ? ? ? "time": "2019-05-24T15:40:12+00:00", ? ? ? ? ? ? "releaseTime": "2019-05-22T13:12:51+00:00" ? ? ? ? }, ? ? ? ? ... ? ? ] }
其中,latest
中為當(dāng)前最新版本,分為發(fā)布版和快照版。versions
后為所有可下載的游戲版本,url
后為該版本的json文件下載地址。
版本json文件
主條目: /version.json
該文件一般下載后存儲在.minecraft/versions
文件夾下,有如下內(nèi)容:
??內(nèi)容通常如下:{ ? ? "arguments": { ? ? ? ? "game": [ ? ? ? ? ? ? "--username", ? ? ? ? ? ? "${auth_player_name}", ? ? ? ? ? ? "--version", ? ? ? ? ? ? "${version_name}", ? ? ? ? ? ? ..., ? ? ? ? ? ? { ? ? ? ? ? ? ? ? "rules": [ ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "action": "allow", ? ? ? ? ? ? ? ? ? ? ? ? "features": { ? ? ? ? ? ? ? ? ? ? ? ? ? ? "is_demo_user": true ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ], ? ? ? ? ? ? ? ? "value": "--demo" ? ? ? ? ? ? }, ? ? ? ? ? ? ... ? ? ? ? ], ? ? ? ? "jvm": [ ? ? ? ? ? ? { ? ? ? ? ? ? ? ? "rules": [ ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "action": "allow", ? ? ? ? ? ? ? ? ? ? ? ? "os": { ? ? ? ? ? ? ? ? ? ? ? ? ? ? "name": "osx" ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ], ? ? ? ? ? ? ? ? "value": [ ? ? ? ? ? ? ? ? ? ? "-XstartOnFirstThread" ? ? ? ? ? ? ? ? ] ? ? ? ? ? ? }, ? ? ? ? ? ? ... ? ? ? ? ] ? ? }, ? ? "assetIndex": { ? ? ? ? "id": "1.14", ? ? ? ? "sha1": "702d433ca9a27a2b75dc4e95ac57921a34d82bd3", ? ? ? ? "size": 226168, ? ? ? ? "totalSize": 207233561, ? ? ? ? "url": "https://launchermeta.mojang.com/v1/packages/702d433ca9a27a2b75dc4e95ac57921a34d82bd3/1.14.json" ? ? }, ? ? "assets": "1.14", ? ? "downloads": { ? ? ? ? "client": { ? ? ? ? ? ? "sha1": "f14e1ab15fb7455c81c487b2d82b29773e7cf4f6", ? ? ? ? ? ? "size": 18794301, ? ? ? ? ? ? "url": "https://launcher.mojang.com/v1/objects/f14e1ab15fb7455c81c487b2d82b29773e7cf4f6/client.jar" ? ? ? ? }, ? ? ? ? "server": { ? ? ? ? ? ? "sha1": "631e46624daaf9e8357fcb985e0fce489b020e74", ? ? ? ? ? ? "size": 35932929, ? ? ? ? ? ? "url": "https://launcher.mojang.com/v1/objects/631e46624daaf9e8357fcb985e0fce489b020e74/server.jar" ? ? ? ? } ? ? }, ? ? "id": "1.14.2 Pre-Release 4", ? ? "libraries": [ ? ? ? ? { ? ? ? ? ? ? "downloads": { ? ? ? ? ? ? ? ? "artifact": { ? ? ? ? ? ? ? ? ? ? "path": "com/mojang/patchy/1.1/patchy-1.1.jar", ? ? ? ? ? ? ? ? ? ? "sha1": "aef610b34a1be37fa851825f12372b78424d8903", ? ? ? ? ? ? ? ? ? ? "size": 15817, ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/com/mojang/patchy/1.1/patchy-1.1.jar" ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }, ? ? ? ? ? ? "name": "com.mojang:patchy:1.1" ? ? ? ? }, ? ? ? ? ..., ? ? ? ? { ? ? ? ? ? ? "downloads": { ? ? ? ? ? ? ? ? "artifact": { ? ? ? ? ? ? ? ? ? ? "path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar", ? ? ? ? ? ? ? ? ? ? "sha1": "2bb514e444994c6fece99a21f76e0c90438e377f", ? ? ? ? ? ? ? ? ? ? "size": 317748, ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar" ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? "classifiers": { ? ? ? ? ? ? ? ? ? ? "javadoc": { ? ? ? ? ? ? ? ? ? ? ? ? "path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-javadoc.jar", ? ? ? ? ? ? ? ? ? ? ? ? "sha1": "1f6b7050737559b775d797c0ea56612b8e373fd6", ? ? ? ? ? ? ? ? ? ? ? ? "size": 1287174, ? ? ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-javadoc.jar" ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? "natives-linux": { ? ? ? ? ? ? ? ? ? ? ? ? "path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-linux.jar", ? ? ? ? ? ? ? ? ? ? ? ? "sha1": "9bdd47cd63ce102cec837a396c8ded597cb75a66", ? ? ? ? ? ? ? ? ? ? ? ? "size": 87484, ? ? ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-linux.jar" ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? "natives-macos": { ? ? ? ? ? ? ? ? ? ? ? ? "path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-macos.jar", ? ? ? ? ? ? ? ? ? ? ? ? "sha1": "5a4c271d150906858d475603dcb9479453c60555", ? ? ? ? ? ? ? ? ? ? ? ? "size": 39835, ? ? ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-macos.jar" ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? "natives-windows": { ? ? ? ? ? ? ? ? ? ? ? ? "path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-windows.jar", ? ? ? ? ? ? ? ? ? ? ? ? "sha1": "e799d06b8969db0610e68776e0eff4b6191098bd", ? ? ? ? ? ? ? ? ? ? ? ? "size": 255871, ? ? ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-windows.jar" ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? "sources": { ? ? ? ? ? ? ? ? ? ? ? ? "path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-sources.jar", ? ? ? ? ? ? ? ? ? ? ? ? "sha1": "106f90ac41449004a969309488aa6e3a2f7d6731", ? ? ? ? ? ? ? ? ? ? ? ? "size": 255671, ? ? ? ? ? ? ? ? ? ? ? ? "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-sources.jar" ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? ... ? ? ], ? ? "logging": { ? ? ? ? "client": { ? ? ? ? ? ? "argument": "-Dlog4j.configurationFile=${path}", ? ? ? ? ? ? "file": { ? ? ? ? ? ? ? ? "id": "client-1.12.xml", ? ? ? ? ? ? ? ? "sha1": "ef4f57b922df243d0cef096efe808c72db042149", ? ? ? ? ? ? ? ? "size": 877, ? ? ? ? ? ? ? ? "url": "https://launcher.mojang.com/v1/objects/ef4f57b922df243d0cef096efe808c72db042149/client-1.12.xml" ? ? ? ? ? ? }, ? ? ? ? ? ? "type": "log4j2-xml" ? ? ? ? } ? ? }, ? ? "mainClass": "net.minecraft.client.main.Main", ? ? "minimumLauncherVersion": 21, ? ? "releaseTime": "2019-05-24T15:48:24+00:00", ? ? "time": "2019-05-24T15:48:24+00:00", ? ? "type": "snapshot" }
rules
用于可選條目,使用?
features
判斷并應(yīng)用其?action
。
arguments
1.13后新增鍵,舊版本為?
gameArguments
,且不提供JVM參數(shù)及?rules
規(guī)則。
${****}
字符串模板,替換相應(yīng)內(nèi)容來使用。
assetIndex
當(dāng)前版本的資源文件索引,包含其下載地址等信息。
downloads
游戲主文件,分為客戶端及服務(wù)端,包含其下載地址等信息。
libraries
游戲所有依賴庫,包含其下載地址等信息。
downloads
下均含有?artifact
鍵,有些含有?classifiers
鍵。只含有
artifact
鍵的為-cp
參數(shù)后所需拼接的路徑,注意path
鍵中為不完整路徑,請補(bǔ)全為完整路徑。含有
classifiers
鍵的為natives庫,在游戲啟動前將對應(yīng)平臺的含有jar
文件解壓至natives文件夾。
logging
log4j配置文件,包含其下載地址等信息。
mainClass
主類名。
資源索引文件
一般存儲于.minecraft/assets/indexes
路徑下,用于指示objects
文件的信息及其下載地址。
該文件的下載地址等信息存儲在版本json文件中,該文件可能需要不定期更新。
內(nèi)容如下:
{ ? ? "objects": { ? ? ? ? "icons/icon_16x16.png": { ? ? ? ? ? ? "hash": "bdf48ef6b5d0d23bbb02e17d04865216179f510a", ? ? ? ? ? ? "size": 3665 ? ? ? ? }, ? ? ? ? ... ? ? } }
objects
文件的下載地址為:
http://resources.download.minecraft.net/<hash的前兩位字符>/<hash>
存儲路徑為:
.minecraft/assets/objects/<hash的前兩位字符>/<hash>
并在.minecraft/assets/virtual/legacy/
留下一份拷貝。
啟動器配置文件
主條目: launcher_profiles.json
該文件不是必須的,但它是官方啟動器的配置文件。所以可用于與官方啟動器數(shù)據(jù)互通,以及forge安裝檢驗(yàn)。
最簡單的配置文件為:
{ ? ? "profiles": { ? ? ? ? "(Default)": { ? ? ? ? ? ? "gameDir": "<游戲目錄>", ? ? ? ? ? ? "lastVersionId": "1.14.1", ? ? ? ? ? ? "name": "(Default)" ? ? ? ? } ? ? }, ? ? "selectedProfileName": "(Default)", ? ? 等等亂七八糟的配置 }
profiles
為啟動器中創(chuàng)建的所有配置文件。
游戲主文件
通常存儲于.minecraft/versions/<version>/<version>.jar
,下載地址等信息存儲在版本json文件中,下載時注意將該文件重命名為對應(yīng)版本號。
依賴庫文件
通常存儲于.minecraft/libraries/
路徑下,下載地址等信息存儲在版本json文件中。
普通庫文件
在啟動前需拼接在啟動參數(shù)的-cp
參數(shù)后。
natives庫文件
在啟動前需解壓至natives路徑下。
資源文件
通常存儲在.minecraft/assets/objects/
,并在.minecraft/assets/virtual/legacy/
有一份拷貝。
下載地址等信息存儲在資源索引文件中。
這些文件可能在發(fā)布后更新,留意更新資源索引文件來更新他們。
正版驗(yàn)證
Minecraft自1.6后使用了Yggdrasil驗(yàn)證方法,驗(yàn)證服務(wù)器為:
https://authserver.mojang.com
驗(yàn)證時需要:
為
POST
請求Content-Type
設(shè)置為application/json
負(fù)載以JSON編碼
若請求成功則返回狀態(tài)碼200
及一個JSON文檔。
若失敗則返回錯誤信息:
{ ? ?"error": "錯誤簡要描述", ? ?"errorMessage": "向用戶顯示的長描述", ? ?"cause": "錯誤原因" // 可選的 }
具體錯誤信息可參考https://wiki.vg/ZH:Authentication#錯誤。
驗(yàn)證賬號密碼
后綴:
/authenticate
負(fù)載:
{ ? ?"agent": { ? ? ? ?"name": "Minecraft", ? ? ? ? ? ? ? ?// 默認(rèn)為Minecraft,可選 ? ? ? ?"version": 1 ? ? ? ? ? ? ? ? ? ? ? ?// 未來可能會改(不會) ? ?}, ? ?"username": "mojang用戶名", ? ? ? ? ? ? ?// 可以是郵箱地址或舊版mojang用戶名 ? ?"password": "密碼", ? ?"clientToken": "客戶端標(biāo)識符", ? ? ? ? ? ?// 可選的,用于復(fù)用該值 }
響應(yīng):
{ ? ?"accessToken": "隨機(jī)令牌", ? ?"clientToken": "客戶端標(biāo)識符", ? ?"availableProfiles": [ ? ? ? ?{ ? ? ? ? ? ?"id": "profile identifier", ? ? ? ? ? ?"name": "玩家名" ? ? ? ?} ? ?], ? ?"selectedProfile": { ? ? ? ?"id": "不含-的uuid", ? ? ? ?"name": "玩家名" ? ?} }
(有刪節(jié),參考https://wiki.vg/ZH:Authentication#Authentication)
你可以存儲這個clientToken
,用來標(biāo)識這個客戶端。
此處獲取的uuid
和accessToken
即為啟動參數(shù)中所需的,傳入你剛剛獲得的值,啟動游戲后便能發(fā)現(xiàn)已顯示正版皮膚,即完成了正版登錄。
檢驗(yàn)令牌有效性
accessToken
具有有效期,可能因?yàn)橐恍┰蚴?。你可以發(fā)送請求,驗(yàn)證當(dāng)前accessToken
是否還是有效的.
后綴:
/validate
負(fù)載:
{ ? ?"accessToken": "valid accessToken", ? ?"clientToken": "associated clientToken" //可選的 }
響應(yīng):
如果狀態(tài)碼為204 No Content
則有效,而403 Forbidden
為已失效。
刷新令牌
刷新一個accessToken
,用于保持用戶在游戲會話之間登錄。
后綴:
/refresh
負(fù)載:
{ ? ?"accessToken": "valid accessToken", ? ?"clientToken": "associated clientToken" //可選的 }
響應(yīng):
{ ? ?"accessToken": "隨機(jī)令牌", ? ?"clientToken": "客戶端標(biāo)識符", ? ?"availableProfiles": [ ? ? ? ?{ ? ? ? ? ? ?"id": "profile identifier", ? ? ? ? ? ?"name": "玩家名" ? ? ? ?} ? ?], ? ?"selectedProfile": { ? ? ? ?"id": "不含-的uuid", ? ? ? ?"name": "玩家名" ? ?} }
(有刪節(jié),參考https://wiki.vg/ZH:Authentication#Refresh)
與“驗(yàn)證賬號密碼”中相同。
啟動游戲
首先必須保證啟動參數(shù)中出現(xiàn)的所有文件及提供的資源索引文件中的
object
文件都存在且未被損壞。選定一個natives路徑,可以自由選定,也可像官方啟動器一樣使用臨時路徑。將natives庫文件解壓至該路徑,并將該路徑使用
-Djava.library.path=
傳入游戲。完成正版驗(yàn)證,得到uuid及accessToken
拼接啟動參數(shù),創(chuàng)建游戲進(jìn)程
處理游戲輸出及游戲錯誤
支持forge等Mod加載器
運(yùn)行forge等Mod加載器的安裝包后,可以發(fā)現(xiàn):
啟動器配置文件中添加了一條新安裝的配置
.minecraft/libraries/
文件夾中多了一些文件.minecraft/versions/
文件夾中多了一個版本json文件(也可能會有jar文件)
額外的版本json文件
該文件相比原版的版本json文件文件多了inheritsFrom
和jar
鍵,而且其他鍵內(nèi)容明顯是不完整的。
inheritsFrom
該參數(shù)指定了當(dāng)前版本所繼承的原版版本,意思為除此 版本json文件外,同時使用?
inheritsFrom
中指定的 版本json文件內(nèi)容。即,?-cp
參數(shù)后同時包含兩個 版本json文件指定的 普通庫文件,且 natives庫文件也同時包含兩個 版本json文件指定的,且該 版本json文件優(yōu)先于原版 版本json文件。
jar
該參數(shù)指定了?
-cp
參數(shù)后的 游戲主文件。
除此之外, 版本json文件中的?
libraries
鍵的格式也有些不一樣了,如:
{ ? "name": "org.ow2.asm:asm-all:5.0.3", ? "serverreq": true }, { ? "name": "jline:jline:2.13", ? "url": "http://files.minecraftforge.net/maven/", ? "checksums": [ ? ? "2d9530d0a25daffaffda7c35037b046b627bb171" ? ], ? "serverreq": true, ? "clientreq": false }
不再有downloads
鍵了,只剩下name
和url
,文件路徑及下載路徑需要根據(jù)一定規(guī)則拼接。
name
鍵的格式為:
<package>:<name>:<version>
我們將它變形重組一下:
<package>/<name>/<version>/<name>-<version>.jar
前方接上.minecraft/libraries/
即為文件路徑,而接上url
的內(nèi)容即為下載地址。
serverreq
和clientreq
用于區(qū)分客戶端和服務(wù)端的需要。
優(yōu)化下載
有時,在官方服務(wù)器下載文件會很緩慢,這時可以考慮使用第三方鏡像下載。
當(dāng)前常用的第三方鏡像有:
BMCLAPI
另外,Minecraft的依賴庫文件和資源索引文件很多為小文件,可以考慮使用多線程下載來優(yōu)化速度。
皮膚管理
皮膚管理需要使用Mojang API:
api.mojang.com
可通過發(fā)送GET
請求獲得Mojang API的狀態(tài):
https://status.mojang.com/check
獲取皮膚及披風(fēng)
可通過發(fā)送GET
請求獲得皮膚及披風(fēng)地址:
https://sessionserver.mojang.com/session/minecraft/profile/<uuid>
響應(yīng):
{ ? ?"id": "<配置標(biāo)識符>", ? ?"name": "<玩家名>", ? ?"properties": [ ? ? ? ? { ? ? ? ? ? ?"name": "textures", ? ? ? ? ? ?"value": "<base64字符串>" ? ? ? ?} ? ?] }
解碼該base64字符串,可獲得另一JSON文檔:
{ ? ?"timestamp": <java time in ms>, ? ?"profileId": "<配置uuid>", ? ?"profileName": "<玩家名>", ? ?"textures": { ? ? ? ?"SKIN": { ? ? ? ? ? ?"url": "<玩家皮膚URL>" ? ? ? ?}, ? ? ? ?"CAPE": { ? ? ? ? ? ?"url": "<玩家披風(fēng)URL>" ? ? ? ?} ? ?} }
更換皮膚
發(fā)送POST
請求至:
https://api.mojang.com/user/profile/<uuid>/skin
頭:
Authorization: Bearer <access token>
負(fù)載:
model=<""/"slim">&url=<皮膚url>
空字符串為Steve模型,“slim”為Alex模型。
上傳皮膚
發(fā)送PUT
請求至:
https://api.mojang.com/user/profile/<uuid>/skin
頭:
Authorization: Bearer <access token>
負(fù)載:
由兩部分組成:
model:人物模型,空字符串為Steve模型,“slim”為Alex模型。
file:原始圖像文件數(shù)據(jù)
重置皮膚
發(fā)送DELETE
請求至:
https://api.mojang.com/user/profile/<uuid>/skin
頭:
Authorization: Bearer <access token>

