教学/如何编写一个minecraft启动器

您所在的位置:网站首页 minecraftlauncher启动器文件 教学/如何编写一个minecraft启动器

教学/如何编写一个minecraft启动器

2024-07-14 11:48| 来源: 网络整理| 查看: 265

本文转自minecraftwiki

仅java版专有,并且正版登录只能使用mojang账号登录,如使用微软帐号登录请另找教程

本教程介绍如何制作Java版启动器,并假定你已掌握任何一门编程语言。

目录

1        基本原理

2        准备

3        启动参数

3.1        JVM参数

3.1.1        -X、-XX参数

3.1.2        -D参数

3.1.3        -cp参数

3.2        Minecraft参数

3.3        获取参数

4        游戏文件

4.1        JSON文件

4.1.1        版本清单文件

4.1.2        版本json文件

4.1.3        资源索引文件

4.1.4        启动器配置文件

4.2        游戏主文件

4.3        依赖库文件

4.3.1        普通库文件

4.3.2        natives库文件

4.4        资源文件

5        正版验证

5.1        验证账号密码

5.2        检验令牌有效性

5.3        刷新令牌

6        启动游戏

7        支持forge等Mod加载器

7.1        额外的版本json文件

8        优化下载

9        皮肤管理

9.1        获取皮肤及披风

9.2        更换皮肤

9.3        上传皮肤

9.4        重置皮肤

基本原理

因为Minecraft制作时采用了“启动器+游戏文件”的模式:

将游戏文件单独存储,而通过启动器调用JVM(Java Virtual Machine,Java虚拟机)执行游戏主文件并传入一些游戏参数来启动Minecraft。

游戏依赖库文件以及游戏资源文件由启动器补全。

玩家登录认证由启动器完成。

这使得我们能通过编写第三方启动器来接管游戏文件管理和登录认证。

准备

要编写一个启动器,你需要:

一门编程语言其开发环境。

Java运行时环境(Java Runtime Environment,JRE),可于Java官网下载。

并拥有支持下列功能的库:

解析JSON文档(得到启动参数的关键)。

解压文件(解压natives文件,也可使用链接外部程序替代)。

网络库(正版验证、皮肤管理等)。

启动参数

启动参数将传入java.exe或javaw.exe,使JVM通过传入的主类正确地启动游戏。

启动参数分为JVM参数和Minecraft参数两部分。

这对debug很有帮助,另外参考官方启动器的方法能得到更优良的参数。

JVM参数

-X、-XX参数

配置JVM,如GC等:

-Xmx1024m 最大堆大小为1024MB。

-Xmn128m 新生代堆大小为128MB。

-XX:+UseG1GC 开启G1。

-XX:-UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例。

-XX:-OmitStackTraceInFastThrow 省略异常栈信息从而快速抛出。

-D参数

配置JVM系统属性,格式为-D=。

Dos.name=Windows 10 -Dos.version=10.0 当前系统名称及版本。

-Dminecraft.launcher.brand=minecraft-launcher -Dminecraft.launcher.version=2.1.3674 当前启动器名称及版本。

-Dlog4j.configurationFile=\client-1.12.xml 游戏日志配置文件。

-Djava.library.path= 当前系统下游戏运行所需的动态链接库。

-cp参数

全称为-classpath,后为所有当前版本Minecraft的普通库文件路径及游戏主文件,中间在Windows下用;隔开,其它系统下用:隔开。

Minecraft参数

以主类名开头,通常为net.minecraft.client.main.Main,若安装Mod加载器则一般为net.minecraft.launchwrapper.Launch

参数通常有:

--username 后接用户名。

--version 后接游戏版本。

--gameDir 后接游戏路径。

--assetsDir 后接资源文件路径。

--assetIndex 后接资源索引版本。

--uuid 后接用户UUID。

--accessToken 后接登录令牌。

--userType 后接用户类型。

--versionType 后接版本类型,会显示在游戏主界面右下角。

--width 后接窗口宽度。

--height 后接窗口高度。

等等,可能因版本而异,具体应参考当前版本json文件内提供的信息。

获取参数

运行此命令可获取当前运行的Minecraft进程的参数:

wmic process where caption="javaw.exe" get caption,commandline /value>args.txt

wmic process where caption="java.exe" get caption,commandline /value>args_java.txt

此时args.txt或args_java.txt中大致有这样的文件内容:

Caption=javaw.exe

CommandLine="" -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump "-Dos.name=Windows 10" -Dos.version=10.0 -Xss1M -Djava.library.path= -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= net.minecraft.client.main.Main --username --version --gameDir --assetsDir --assetIndex --uuid --accessToken --userType mojang --versionType release --width --height

仅保留CommandLine后的内容,然后将该文件后缀改为.bat,双击即可启动Minecraft。

运行前注意文件编码。并注意官方启动器的解压出的natives库文件存储在临时文件夹下,可能因删除导致无法启动。

游戏文件

列表 []

.minecraft

assets

indexes

version.json

log_configs

client-version.xml

objects

skins

virtual

bin

jinput.jar

lwjgl.jar

lwjgl_util.jar

minecraft.jar(这是1.5.2之前的client.jar。目前不再使用,而是使用“versions”文件夹。)

natives

(.dll文件)

debug

debug-report-年-月-日_时.分.秒.zip

profile-report-年-月-日_时.分.秒.txt

libraries

[按Maven公约包装的各种库(没有POM文件)]

logs

年-月-日-会话编号.log.gz

latest.log

resourcepacks

saves

世界名称

advancements

uuid.json

data

idcounts.dat

map_id.dat

scoreboard.dat

raids.dat

datapacks

DIM1

data

raids_end.dat

poi

r.x.z.mca

region

r.x.z.mca

DIM-1

data

raids_nether.dat

poi

r.x.z.mca

region

r.x.z.mca

generated

(命名空间)

structures

name.nbt

playerdata

uuid.dat

poi

r.x.z.mca

region

r.x.z.mca

stats

uuid.json

icon.png

level.dat

level.dat_mcr

level.dat_old

resources.zip

session.lock

screenshots

年-月-日_时.分.秒.png

stats

stats_player_unsent.dat

stats_player_unsent.old

texturepacks

texturepacks-mp-cache

versions

版本

version.jar

version.json

debug.stitched_items.png

debug.stitched_terrain.png

hotbar.nbt

lastlogin

launcher_log.txt

launcher profiles.json

launcher_skins.json

options.txt

output-client.log

output-server.log

realms_persistence.json

servers.dat

textures_0.png

textures_1.png

textures_2.png

textures_3.png

textures_4.png

usercache.json

JSON文件

Minecraft大多数信息使用JSON文档存储管理,使用这些JSON文件可以获取下载、管理及启动所需的大部分信息。

版本清单文件

主条目:/version_manifest.json

该文件可以在mojang官方服务器下载:

https://launchermeta.mojang.com/mc/game/version_manifest.json

内容通常如下:[]

其中,latest中为当前最新版本,分为发布版和快照版。versions后为所有可下载的游戏版本,url后为该版本的json文件下载地址。

版本json文件

主条目:/version.json

该文件一般下载后存储在.minecraft/versions文件夹下,有如下内容:

内容通常如下:[]

rules

用于可选条目,使用features判断并应用其action。

arguments

1.13后新增键,旧版本为gameArguments,且不提供JVM参数及rules规则。

${****}

字符串模板,替换相应内容来使用。

assetIndex

当前版本的资源文件索引,包含其下载地址等信息。

downloads

游戏主文件,分为客户端及服务端,包含其下载地址等信息。

libraries

游戏所有依赖库,包含其下载地址等信息。

downloads下均含有artifact键,有些含有classifiers键。

只含有artifact键的为-cp参数后所需拼接的路径,注意path键中为不完整路径,请补全为完整路径。

含有classifiers键的为natives库,在游戏启动前将对应平台的含有jar文件解压至natives文件夹。

logging

log4j配置文件,包含其下载地址等信息。

mainClass

主类名。

资源索引文件

一般存储于.minecraft/assets/indexes路径下,用于指示objects文件的信息及其下载地址。

该文件的下载地址等信息存储在版本json文件中,该文件可能需要不定期更新。

内容如下:

{

    "objects": {

        "icons/icon_16x16.png": {

            "hash": "bdf48ef6b5d0d23bbb02e17d04865216179f510a",

            "size": 3665

        },

        ...

    }

}

objects文件的下载地址为:

http://resources.download.minecraft.net//

存储路径为:

.minecraft/assets/objects//

并在.minecraft/assets/virtual/legacy/留下一份拷贝。

启动器配置文件

主条目:launcher_profiles.json

该文件不是必须的,但它是官方启动器的配置文件。所以可用于与官方启动器数据互通,以及Forge安装检验。

最简单的配置文件为:

{

    "profiles": {

        "(Default)": {

            "gameDir": "",

            "lastVersionId": "1.14.1",

            "name": "(Default)"

        }

    },

    "selectedProfileName": "(Default)",

}

profiles为启动器中创建的所有配置文件。

游戏主文件

通常存储于.minecraft/versions//.jar,下载地址等信息存储在版本json文件中,下载时注意将该文件重命名为对应版本号。

依赖库文件

通常存储于.minecraft/libraries/路径下,下载地址等信息存储在版本json文件中。

普通库文件

在启动前需拼接在启动参数的-cp参数后。

natives库文件

在启动前需解压至natives路径下。

资源文件

通常存储在.minecraft/assets/objects/,并在.minecraft/assets/virtual/legacy/有一份拷贝。

下载地址等信息存储在资源索引文件中。

这些文件可能在发布后更新,留意更新资源索引文件来更新他们。

正版验证

Minecraft自1.6后使用了Yggdrasil验证方法,验证服务器为:

https://authserver.mojang.com

验证时需要:

为POST请求

Content-Type设置为application/json

负载以JSON编码

若请求成功则返回状态码200及一个JSON文档。

若失败则返回错误信息:

{

   "error": "错误简要描述",

   "errorMessage": "向用户显示的长描述",

   "cause": "错误原因" // 可选的

}

具体错误信息可参考https://wiki.vg/ZH:Authentication#错误。

验证账号密码

后缀:

/authenticate

负载:

{

   "agent": {

       "name": "Minecraft",                // 默认为Minecraft,可选

       "version": 1                        // 未来可能会改(不会)

   },

   "username": "mojang用户名",              // 可以是邮箱地址或旧版mojang用户名

   "password": "密码",

   "clientToken": "客户端标识符"            // 可选的,用于复用该值

}

响应:

{

   "accessToken": "随机令牌",

   "clientToken": "客户端标识符",

   "availableProfiles": [

       {

           "id": "profile identifier",

           "name": "玩家名"

       }

   ],

   "selectedProfile": {

       "id": "不含-的uuid",

       "name": "玩家名"

   }

}

(有删节,参考https://wiki.vg/ZH:Authentication#Authentication)

你可以存储这个clientToken,用来标识这个客户端。

此处获取的uuid和accessToken即为启动参数中所需的,传入你刚刚获得的值,启动游戏后便能发现已显示正版皮肤,即完成了正版登录。

检验令牌有效性

accessToken具有有效期,可能因为一些原因失效。你可以发送请求,验证当前accessToken是否还是有效的.

后缀:

/validate

负载:

{

   "accessToken": "valid accessToken",

   "clientToken": "associated clientToken" //可选的

}

响应:

如果状态码为204 No Content则有效,而403 Forbidden为已失效。

刷新令牌

刷新一个accessToken,用于保持用户在游戏会话之间登录。

后缀:

/refresh

负载:

{

   "accessToken": "valid accessToken",

   "clientToken": "associated clientToken" //可选的

}

响应:

{

   "accessToken": "随机令牌",

   "clientToken": "客户端标识符",

   "availableProfiles": [

       {

           "id": "profile identifier",

           "name": "玩家名"

       }

   ],

   "selectedProfile": {

       "id": "不含-的uuid",

       "name": "玩家名"

   }

}

(有删节,参考https://wiki.vg/ZH:Authentication#Refresh)

与“验证账号密码”中相同。

启动游戏

首先必须保证启动参数中出现的所有文件及提供的资源索引文件中的object文件都存在且未被损坏。

选定一个natives路径,可以自由选定,也可像官方启动器一样使用临时路径。将natives库文件解压至该路径,并将该路径使用-Djava.library.path=传入游戏。

完成正版验证,得到UUID及accessToken。

拼接启动参数,创建游戏进程。

处理游戏输出及游戏错误。

支持forge等Mod加载器

运行forge等Mod加载器的安装包后,可以发现:

启动器配置文件中添加了一条新安装的配置。

.minecraft/libraries/文件夹中多了一些文件。

.minecraft/versions/文件夹中多了一个版本json文件(也可能会有jar文件)。

额外的版本json文件

该文件相比原版的版本json文件文件多了inheritsFrom和jar键,而且其他键内容明显是不完整的。

inheritsFrom

该参数指定了当前版本所继承的原版版本,意思为除此版本json文件外,同时使用inheritsFrom中指定的版本json文件内容。即,-cp参数后同时包含两个版本json文件指定的普通库文件,且natives库文件也同时包含两个版本json文件指定的,且该版本json文件优先于原版版本json文件。

jar

该参数指定了-cp参数后的游戏主文件。

除此之外,版本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,文件路径及下载路径需要根据一定规则拼接。

name键的格式为:

::

我们将它变形重组一下:

///-.jar

前方接上.minecraft/libraries/即为文件路径,而接上url的内容即为下载地址。

serverreq和clientreq用于区分客户端和服务端的需要。

优化下载

有时,在官方服务器下载文件会很缓慢,这时可以考虑使用第三方镜像下载。

当前常用的第三方镜像有:

BMCLAPI

另外,Minecraft的依赖库文件和资源索引文件很多为小文件,可以考虑使用多线程下载来优化速度。

皮肤管理

皮肤管理需要使用Mojang API:

api.mojang.com

可通过发送GET请求获得Mojang API的状态:

https://status.mojang.com/check

获取皮肤及披风

可通过发送GET请求获得皮肤及披风地址:

https://sessionserver.mojang.com/session/minecraft/profile/

响应:

{

   "id": "",

   "name": "",

   "properties": [

       {

           "name": "textures",

           "value": ""

       }

   ]

}

解码该base64字符串,可获得另一JSON文档:

{

   "timestamp": ,

   "profileId": "",

   "profileName": "",

   "textures": {

       "SKIN": {

           "url": ""

       },

       "CAPE": {

           "url": ""

       }

   }

}

更换皮肤

发送POST请求至:

https://api.mojang.com/user/profile//skin

头:

Authorization: Bearer

负载:

model=&url=

空字符串为Steve模型,“slim”为Alex模型。

上传皮肤

发送PUT请求至:

https://api.mojang.com/user/profile//skin

头:

Authorization: Bearer

负载:

由两部分组成:

model:人物模型,空字符串为Steve模型,“slim”为Alex模型。

file:原始图像文件数据。

重置皮肤

发送DELETE请求至:

https://api.mojang.com/user/profile//skin

头:

Authorization: Bearer



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3