前言

尽管Multilogin实现了正版登录+皮肤站登录+Floodgate接管,但若想实现离线+正版+皮肤站+Floodgate大一统,紧靠Multilogin是不行的,所以诞生了Mixedlogin,通过魔改Multilogin、AuthME和Velocity代理端实现了服务器登录的大一统。本文将详细的介绍Mixedlogin的搭建教程,同时也会介绍一些别的特性

服务器环境:

配置:8272CL 2.5GHz 4C8G

系统:Debian 12

JDK:Zing JDK 23 (Java 21)

软件准备

  1. 魔改Velocity,点击该链接前往项目主页下载
  2. 魔改Multilogin,点击该链接前往项目主页下载
  3. (可选)魔改AuthMeVelocity,点击该链接前往项目主页下载
  4. 正常AuthMe,点击该链接前往项目主页下载
  5. authlib-injector,点击该链接前往项目主页下载
  6. 一个正常的服务端

如果无法正常访问Github的话,可以访问我的网盘下载,访问密码是g6k0

其中魔改版的AuthMeVelocity是可选项,完成注册登录等操作后,再传送到其他子服,不过魔改版跳过了对正版玩家的检查,同时适配了魔改的代理端,如果你的服务器架构较简单,并不需要登录服务器,可以选择不安装魔改版AuthMeVelocity与不搭建NanoLimbo。本教程就不包括登录服务端搭建

关于服务端,选你喜欢的就好,对于不同的端该怎么处理,我后文再讲,我这里演示使用Ppaer 1.21.3

我使用的是Debian系统+MCSM面板,如果你的服务器是Windows,合理迁移就好,如果也是Linux,我建议装个MCSM面板,虽然使用守护线程也很方便,但用面板的话更方便你的运维人员维护服务器

Velocity 搭建

  1. 新建一个文件夹,放入魔改版的Velocity,并使用这个启动命令制成脚本或在终端启动,需要注意的是,服务端的名称可能会根据你下的版本有所不同,请注意,后面内容的启动命令也同理

    1
    java -Xms512M -Xmx1024M -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -jar MixedVelocity-proxy-3.4.0-SNAPSHOT-all.jar nogui
  2. 启动后往plugins文件夹里放魔改版的AuthMeVelocity和Multilogin插件后并重启代理端

  3. plugins/multilogin/services文件夹里新建offline.yml文件,填入以下内容,该文件是支持离线登录玩家的,如果想支持正版登录LitterSkin登录等,可在插件目录下的example文件夹中将litterskin.ymlofficial.yml复制到services文件夹中,并更改id后面的数字,不同service的id不能重复,同时id应大于1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Below, only the most basic configuration is provided.
    # You can refer to the template file to complete all co`nfigurations.

    # Please edit before use.
    id: 1

    name: 'Offline'
    # Don't change it unless you really want to.
    serviceType: BLESSING_SKIN
    yggdrasilAuth:
    blessingSkin:
    apiRoot: 'http://127.0.0.1:26748/api/yggdrasil'
  4. 修改velocity.toml文件,关注以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [servers]
    # Configure your servers here. Each key represents the server's name, and the value
    # represents the IP address of the server to connect to.
    login = "127.0.0.1:25578"
    lobby = "127.0.0.1:30066"
    factions = "127.0.0.1:30067"
    minigames = "127.0.0.1:30068"

    # In what order we should try servers when a player logs in or is kicked from a server.
    try = [
    "lobby"
    ]

    [forced-hosts]
    # Configure your forced hosts here.
    "lobby.example.com" = [
    "lobby"
    ]
    "factions.example.com" = [
    "factions"
    ]
    "minigames.example.com" = [
    "minigames"
    ]

    在这里你可以根据你的需求更改端口,增减子服,设定登录的服务器。而[forced-hosts]下面的内容要与[servers]下面的内容对应,[forced-hosts]里一定要有[servers]里有的,但也不用全部都有,比如登录服务器就没有,如果不这么改,就会报错,这一块的作用我记得是设置子服的域名,然后根据玩家填的域名转发到不同子服

  5. 修改代理端目录下的mixedvc.toml文件

    1
    2
    3
    4
    5
    6
    #登录服务器的名字
    login-server = "login"
    [server-forwarding-mode]
    #设定不同服务器的转发模式
    login = "modern"
    lobby = "none"

    login-server设置为你设置的子服

  6. 重启代理端,然后代理端的搭建就结束了

接下来搭建子服

子服

Paper

  1. 新建文件夹,放入服务端,先正常启动一次,

  2. eula.txt文件,然后在目录下放入authlib-injector文件,在plugins中放入AuthMe插件,并用以下命令启动

    1
    java -Xms512M -Xmx4096M -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -javaagent:authlib-injector-1.2.5.jar=https://littleskin.cn/api/yggdrasil -jar paper-1.21.3-82.jar nogui

    为什么使用authlib-injector,因为现版本的multilogin有bug,如果不在子服套个authlib-injector,非正版玩家就无法登录

  3. 修改server.properties文件,将online-mode修改为false,将server-port设置为你设置的端口,将enforce-secure-profile设置为false

  4. 修改config/paper-global.yml文件,找到这一块

    1
    2
    3
    4
    velocity:
    enabled: false
    online-mode: true
    secret: ''

    打开enabled,然后secret为代理端目录下forwarding.secret 文件里的值

  5. 重启服务器,再登录就有这样的提示了

测试过,离线,正版,皮肤站玩家都是可以正常登录服务器的

Fabric等模组端

这些模组端都差不多,不过不用使用authlib-injector了,使用NCR模组就可以了,然后代理端要用模组

Leaves端

这个端自带authlib-injector,在配置文件里打开就好了,不过我没有测试过

Multilogin设置

这里是讲一下Multilogin配置文件的一些进价设置

用户名正则约束

1
nameAllowedRegular: '^[0-9a-zA-Z_]{3,16}$'

这个值在插件目录下的config.yml文件里,你可以设置为'',不限制玩家名

如果你想不限制玩家名的话,经依靠这个是不够的,还要看这一节

皮肤修复

往插件目录services里的服务文件末行添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
skinRestorer:

# 皮肤修复模式。
#
# 此功能仅将不含有 Mojang 签名的皮肤使用第三方服务尝试合成含有 Mojang 签名的皮肤来使用。
# 请使用以下值:
# OFF - 关闭这个功能
# LOGIN - 占用登录时间进行皮肤修复操作(修复时间过长可能会导致登录超时)
# ASYNC - 登录后修复(修复成功后需要重新连接服务器)
#
# 皮肤修复服务器来自 ‘mineskin.org’
# 默认值 ‘OFF’
restorer: 'ASYNC'

# 皮肤修复方式。
#
# 请使用以下值:
# URL - 皮肤修复服务器将会主动获取验证返回的皮肤数据,请确保它能被皮肤修复服务器正确访问。(推荐使用)
# UPLOAD - 尝试直接上传至皮肤修复服务器,适用于皮肤修复服务器访问皮肤材质受阻的情况。
#
# 默认值 ‘URL’
method: 'URL'

# 设置请求超时时间。
# 默认值 ‘10000’
timeout: 10000

# 皮肤修复网络错误时的重试次数。
#
# 默认值 ‘2’
retry: 2

# 皮肤修复重试请求延迟。
# 过小的值会被皮肤修复服务器拒绝访问;
# 过大的值可能会导致登录超时。
#
# 默认值 ‘5000’
retryDelay: 5000

# 请求代理设置
proxy:
# 设置代理类型
#
# 请使用以下值:
# DIRECT - 直接连接、或没有代理
# HTTP - Represents proxy for high level protocols such as HTTP or FTP.
# SOCKS - Represents a SOCKS (V4 or V5) proxy.
#
# 默认值 ‘DIRECT’
type: "DIRECT"

# 代理服务器地址
#
# 默认值 ‘127.0.0.1’
hostname: "127.0.0.1"

# 代理服务器端口
#
# 默认值 ‘1080’
port: 1080

# 代理鉴权用户名。
# 留空则不进行鉴权
#
# 默认值 ‘’
username: ""

# 代理鉴权密码。
#
# 默认值 ‘’
password: ""

为什么要修复皮肤呢,因为不同登录途径的玩家是看不见对方的皮肤的,设置这个后就可以看见了

离线玩家应该还是不行的,不过可以用Skin Restorer插件解决少部分离线玩家的皮肤问题

UUID生成设置

如果你的子服使用了MCDRGUGUBot之类的,要通过游戏内查询玩家的UUID添加白名单,但Multilogin是按照登录服务查询UUID的,那么就会造成游戏查询不到玩家的UUID,那么就可以添加以下设置UUID生成规则,改为离线的生成算法

往插件目录services里的服务文件末行添加以下内容

1
initUUID: 'OFFLINE'

设置后可以曲线救国解决部分问题,不过会增大管理难度

AuthMe设置

这里讲一下登录插件的设置,更加人性化,配置文件在插件的文件夹里,叫config.conf

语言

1
messagesLanguage: en

en改为zhcn,设置为中文

同一IP可注册账号数

1
maxRegPerIp: 1

在某些环境下,比如超级内网,一个IP可能有很多玩家,所以要适度调大,或者干脆设置为0,不限制账号数

用户名限制

1
2
3
minNicknameLength: 3
maxNicknameLength: 16
allowedNicknameCharacters: '[a-zA-Z0-9_]*'

前两个值限制了玩家长度的最小值和最大值,而第三个值是玩家名的正则表达式,原版是大小写字母和数字与下划线等,你可以设置为''不限制玩家名或自己写正则表达式

如果在Multilogin和这里都取消了用户名限制,同时配置了CnUsername,然后在paper-globel.yml中将unsupported-settings/perform-username-validation修改为false,那么理论来说就可以以各种抽象的名字进入服务器,但是,我测试过,这个插件应该是与authlib-injector不兼容的,所以实际上达不到说了一大段废话

不过模组端的可以尝试一下

超时时间

1
timeout: 30

这个值是超时的时间,诺没在时间内完成登录操作,则踢出服务器,单位是,我建议设大一点,比如90秒,或设为0不限制时间,因为如果你的服务器有基岩版玩家,他们输入要慢一点

后话

教程到这里就结束了,虽然没测试过,但这个魔改的代理端应该是兼容代理端的插件的,那么就可以实现基岩离线皮肤站正版以及各种版本玩家的大一统了,虽然这没什么用,因为你服务器不可能有那么多玩家,但好歹有,也说明了MC的玩家社区是何等的强大,做出了ViaVersion那样的版本兼容插件,做出了Geyser那样的基岩互通插件,做出了优化极好的Paper端,做出了各种各样的模组加载器……强行升华

总之,也希望Minecraft这款游戏能再陪我十年