文章

Minecraft服务器配置向客户端发送资源包

Minecraft服务器配置向客户端发送资源包

前言

心系玩家的腐竹发现,用小游戏或者地图存档开服的时候,经常需要安装地图作者指定的资源包(仅安装在客户端的资源包一般是材质包,下文都称之为资源包)。对于部分玩家来说,安装资源包轻而易举,但是有些玩家可能觉得麻烦。

既然资源包可以在游戏启动后甚至是进入世界后加载,如果能实现进入服务器的时候,服务器告诉客户端应该去哪里下载资源包,然后客户端下载好自动安装,那不是很方便吗?

幸运的是,不需要任何模组和插件,你就可以实现这个效果。

了解配置文件

你一定知道Minecraft服务器有个叫做server.properties的文件,仔细观察(别真观察了,直接使用Ctrl+F或者Command+F查找关键字res吧)这个配置文件,你会发现有四个(实际上是五个)跟资源包有关的键,接下来我会讲解如何正确填写这四个键的值。

1
2
3
4
5
require-resource-pack=false
resource-pack=
resource-pack-id=
resource-pack-prompt=
resource-pack-sha1=
  • require-resource-pack的值仅能为布尔类型的,表示是否强制玩家下载这个资源包,其实就算你设置成true,玩家在下载资源包失败的情况下也能进入游戏。
  • resource-pack的值是资源包的 URI ,但是我试过了,不能使用file://之类的链接来指向服务器本地的一个文件,疑似只能使用HTTP和HTTPS。
  • resource-pack-id,一般来说服务器资源包的 UUID 值都是随机的,用于客户端标识资源包,但是你也可以通过这个键指定设置一个资源包的 UUID ,自动生成和指定 UUID 没有多少区别,所以我不建议你修改这个键的值。
  • resource-pack-prompt的值为首次进入服务器向玩家提示的内容,格式为原始JSON文本
  • resource-pack-sha1,资源包的 SHA-1 值,必须为小写的十六进制数字。

让服务器为客户端提供资源包

require-resource-pack设置为true即可。

为资源包指定 URI

resource-pack的值是资源包的 URI ,这个资源包是需要提供在互联网上供人下载的,我们可以通过以下几种方式创建资源包的 URI 。

使用地图作者直接提供的链接

假设地图作者将客户端资源包单独发布,可以把 TA 提供的链接直接用作这个资源包的 URI 。

如果客户端资源包和地图一起打包发布,或者这个作者使用了万恶的百度网盘、夸克网盘之类的东西,那就不能用这个方法了。

使用 Nginx

配置文件如下

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
server {
    # 如果使用 HTTPS ,这里应该监听443端口然后提供 SSL 证书
    listen 80;
    server_name files.example.com;

    location / {
        alias /var/files/;

        # 防止用户以../访问文件
        if ($request_uri ~* (\.\.|%2e%2e|%u002e%u002e)) {
            return 403;
        }
        # 配置黑名单
        location ~ /\. {
            return 403;
        }
        location ~ ^/.*\.(bak|conf|sql)$ {
            return 403;
        }

        # 以下配置内容都跟浏览器相关,不配置也不影响客户端下载资源包
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        location ~* \.(html)$ {
            add_header Content-Disposition "inline";
        }
        location ~* \.(!html)$ {
            # 强制浏览器下载
            add_header Content-Disposition "attachment"; 
        }
    }
}

然后将你要提供的资源包(例如example.zip)放在/var/files下面,使用http://files.example.com/example.zip作为这个资源包的 URI 链接。

/var/files可以改成其它的路径。

使用 Github

先创建一个 Github 仓库,注意将仓库设置为 public ,上传你要提供的资源包文件在这个仓库里,然后点击这个文件,因为zip是一个二进制文件,这里不会预览它的内容,右键内容页右上角的 Raw ,点击复制链接

Raw

你将会得到形如https://github.com/FutabaTachibana/resourcepack/raw/refs/heads/main/example.zip的链接,这就是资源包的URI。

部分网络不好的玩家可能无法直接访问 Github 。

使用网盘

如果某个网盘提供了直链下载功能,那么你可以自己将文件上传到这个网盘上,并将直链用作这个资源包的 URI 。

为资源包设置 SHA-1 值

为了保障安全,应该为resource-pack-sha1提供资源包的 SHA-1 值。尽管该内容留空也没影响,但我还是推荐将这里填上资源包的 SHA-1 值。

计算文件的 SHA-1 值不会占用太多时间,仅仅需要使用sha1sum命令。

1
2
futaba@Tachibana:~$ sha1sum example.zip
68e691bfe6329c9f6f61748b0f17a7e197bc6a51  example.zip

将输出结果的前面这一串十六进制数字(不是我这里的一串数字,不同文件的 SHA-1 值不一样)填入resource-pack-sha1即可。

常见问题

Q: 客户端无法下载资源包

资源包下载是客户端的行为,其内容会记录在客户端的 log 中,请让玩家发送客户端日志以解决问题。

Q: 使用 Nginx 解析 URI 始终无法访问

如果你的服务器位于中国大陆,请先进行备案,否则无法使用服务器的 80 和 443 端口。

你也可以不通过 80 端口使用 HTTP 传输资源包(但是无法使用 HTTPS 协议)。

在中国大陆提供网络服务必须严格遵守相关法律法规。

禁止使用该技术在互联网上提供非法内容。

相关网站

Minecraft Wiki: 服务端配置文件格式

Minecraft Wiki: 文本组件

Nginx

Github

本文由作者按照 CC BY 4.0 进行授权