跳到主要内容

游戏配置

本文将带领你进行服务器上的参数配置。

认识服务器文件

如果你尝试查看一下服务器目录里有哪些文件:

root@localhost:~# cd /home/minecraft
root@localhost:/home/minecraft# ls
bedrock_server behavior_packs release-notes.txt
structures definitions resource_packs
whitelist.json bedrock_server_how_to.html permissions.json
server.properties

这是刚解压缩后服务器文件的目录状态,里面有个 bedrock_server_how_to.html 文件,这是官方的服务器使用教程。你可以 点击此处 浏览这个文件。同时,这里面有三个重要的配置文件:

  • server.properties 服务器属性文件

  • permissions.json 玩家权限文件

  • whitelist.json 玩家白名单文件

当你启动服务器之后,服务器会根据 server.properties 生成一些新的文件:

root@localhost:/home/minecraft# ls
bedrock_server definitions minecraftpe
resource_packs valid_known_packs.json bedrock_server_how_to.html
development_behavior_packs permissions.json server.properties
whitelist.json behavior_packs development_resource_packs
premium_cache structures worlds
Dedicated_Server.txt development_skin_packs release-notes.txt
treatments world_templates

其中 worlds 是放地图存档的目录。

设置服务器属性

我们可以用 vim server.properties 查看 server.properties 服务器属性文件。在文件里可以看到许许多多的属性,这里我列出一些可能会用到的属性:

属性名默认值描述
server-nameDedicated Server服务器名
(即服务器列表中显示的名称)
名称里不能带有分号
gamemodesurvival游戏模式,合法值有:
survival(生存)
creative(创造)
adventure(冒险)
difficultyeasy游戏难度,合法值有:
peaceful(和平)
easy(简单)
normal(普通)
hard(困难)
allow-cheatsfalse启用作弊
合法值为 truefalse
max-player10玩家数量上限
值必须为正整数
white-listfalse启用白名单
如果为 true 将只允许
whitelist.json 文件里的
玩家连接服务器
server-port19132服务器端口号
view-distance32视距
允许玩家游戏加载的最大区块数
值应当大于等于 5
player-idle-timeout30自动踢出玩家时间
值必须为非负整数
(单位:分钟)
level-nameBedrock level地图名称
名称里不能带有分号
且应当可以作为合法的文件名
level-seed地图种子
用来随机生成地图
值可以为任意字符串
default-player
-permission-level
member默认玩家权限
新玩家加入服务器的权限
合法值有:visitor(访客)
member(成员)
operator(管理员)

地图管理

上面提到 worlds 是放地图存档的目录。如果你启动过服务器,你可以在 worlds 里看到一个 Bedrock level 目录,这是因为在 server.properties 文件里设定了 level-name (地图名称)默认值为 Bedrock level

root@localhost:/home/minecraft# ls worlds
'Bedrock level'

当你修改 server.properties 文件中 level-name 为别的名称(比如 steve )后,重启服务器程序( LD_LIBRARY_PATH=. ./bedrock_server ),你会看到 worlds 目录里多了个 steve 目录:

root@localhost:/home/minecraft# ls worlds
'Bedrock level' steve

这表示我们服务器里有 Bedrock levelsteve 两个地图存档。启动服务器的时候,服务器会运行名称为 level-name 属性值的地图存档,如果地图存档在 worlds 目录里不存在,则会新生成一个名为 level-name 属性值地图存档。

更改存档名称或删除地图存档(须先终止服务器)也很简单:

# 将地图存档名称由 steve 改为 alex
mv steve alex

# 删除地图存档 steve
rm -r steve
# 如果地图名里含有空格,请在空格前加个 `\` 进行转义
rm -r Bedrock\ level

如果你想切换地图存档,先终止服务器,然后去 server.properties 文件里更改 level-name 属性,最后开启服务器。

server.properties 中有两个属性是与新地图生成有关的:

  • level-type 地图类型,合法值有:

    • DEFAULT 默认(无限)

    • FLAT 平坦

    • LEGACY 传统(有限)

  • level-seed 地图种子,合法值为任意字符串

level-type 并非 server.properties 文件里原本就有的属性,你可以在任意行处添加这个属性。如果属性值为 DEFAULT 则无需添加。

你需要在创建新世界(启动服务器)之前设置好这两个属性,两个属性无法作用于已经生成好的地图存档。

服务器程序

在前一个教程中,我们在虚拟窗口里开启了服务器:

root@localhost:/home/minecraft# LD_LIBRARY_PATH=. ./bedrock_server
NO LOG FILE! - setting up server logging...
[2021-06-12 15:31:07 INFO] Starting Server
[2021-06-12 15:31:07 INFO] Version 1.17.0.03
[2021-06-12 15:31:07 INFO] Session ID 16645b68-3e8b-4d8d-b53d-4fbfb658e557
[2021-06-12 15:31:07 INFO] Level Name: steve
[2021-06-12 15:31:07 INFO] Game mode: 0 Survival
[2021-06-12 15:31:07 INFO] Difficulty: 1 EASY
[INFO] opening worlds/steve/db
[INFO] IPv4 supported, port: 19132
[INFO] IPv6 not supported
[INFO] IPv4 supported, port: 45428
[INFO] IPv6 not supported
[INFO] Server started.

这个时候如果有玩家连接进来或者退出了服务器,你可以看到类似的消息通知:

[INFO] Player connected: MoonstoneTalaxy, xuid: 25354361236725
[INFO] Player disconnected: MoonstoneTalaxy, xuid: 25354361236725

这里 connected 后对应的是玩家的 Xbox 账号名,而 xuid 后为账号对应的唯一 ID 。这两个数据对后面的 "权限控制" 会有所帮助。

同时,你是可以在这个服务器里输入命令的,比如你输入个 gamerule 指令:

[INFO] Player connected: MoonstoneTalaxy, xuid: 25354361236725
[INFO] Player disconnected: MoonstoneTalaxy, xuid: 25354361236725
gamerule
commandblockoutput = true, dodaylightcycle = true,
doentitydrops = true, dofiretick = true,
domobloot = true, domobspawning = true,
dotiledrops = true, doweathercycle = true,
drowningdamage = true, falldamage = true,
firedamage = true, keepinventory = false,
mobgriefing = true, pvp = true, showcoordinates = false,
naturalregeneration = true, tntexplodes = true,
...

你可以看到一些比如 showcoordinates(显示坐标)、keepinventory (死亡不掉落)等游戏属性。(你可以在 命令 - Minecraft Wiki 查看具体属性的含义)如果你想更改某个属性,可以使用:

gamerule <属性名> <属性值>

# 比如开启死亡不掉落:
gamerule keepinventory true

如果你曾经在游戏里使用过命令,那么你也可以尝试在服务器程序里执行命令,比如最熟悉的 op 命令。如果你对命令还不熟悉,或者在查找某个命令,Minecraft Wiki 上的 这篇文章 一定会对你有所帮助。如果你有一定的英语基础,你也可以直接在服务器程序里使用 help 命令:

# help <命令名>
help gamerule
§egamerule:
§eSets or queries a game rule value.
Usage:
- /gamerule
- /gamerule <rule: BoolGameRule> [value: Boolean]
- /gamerule <rule: IntGameRule> [value: int]
# help <页号>
help 3
§2--- Showing help page 3 of 3 (/help <page>) ---
/tell <target: target> <message: message>
/tellraw <target: target> <raw json message: json>
/w <target: target> <message: message>
§2Tip: Use the <tab> key while typing a command to auto-complete ...

这里我必须提一嘴的是,以上 ophelp 命令是在服务器程序里执行,而非在 Ubuntu 命令行里执行。

权限控制

你可以能过更改 server.properties 里的 online-mode 属性为 false ,来取消玩家的 Xbox 账号认证,但是这里还是非常建议不更改这一属性。

你可以设置 server.properties 里的 default-player-permission-level 属性(前面表格里有介绍)来确定新加入服务器的玩家的权限。该属性不会对已经加入服务器的玩家发生作用。

如果你想指定玩家的权限,你可以在服务器程序上执行 op <玩家名>deop <玩家名> 来赋予或撤销指定玩家的管理员权限,所指定的玩家必须在线。我建议用这个方法来控制玩家权限。

但其实我们还可以设置 permissions.json 文件来管理玩家权限。如果你还没执行过 op 指令,这个文件的内容会是一个空的数组:

[]

如果你想添加一些权限信息,可以遵循这样的格式:

多加注意一下以下样例中的逗号,逗号的缺失会导致文件内容的非法。

[
{
"permission": "operator",
"xuid": "451298348"
},
{
"permission": "member",
"xuid": "52819329"
},
{
"permission": "visitor",
"xuid": "234114123"
}
]

这里面每个权限信息都有两个必填的属性:

  • permission 玩家权限,合法值有:

    • visitor(访客)

    • member(成员)

    • operator(管理员)

  • xuid 玩家的 Xbox 账号 ID

实际上我们没有简单的方法去获取玩家的 xuid 。前文 "服务器程序" 我们提到,可以在服务器程序的连接信息里查看玩家的 xuid 。在编辑完 permissions.json 后,我们需要在服务器程序里执行 permission reload 命令来让更改生效,或者直接重启服务器。

但我还是很建议在服务器程序里使用 op 命令来设置玩家权限。回到前面的空数组,我们假设玩家 Alex 连接到了我们的服务器,然后我们使用 op Alex 给 Alex 管理员权限,此时,permissions.json 里会多出这么一条信息:

[
{
"permission" : "operator",
"xuid" : "25354361236725"
}
]

如果在 Alex 仍然在线的情况下我们用 deop Alex 撤销管理员权限,此时,permissions.json 里会变成这样:

[
{
"permission" : "member",
"xuid" : "25354361236725"
}
]

所以你可以通过 op 命令来避开对 permissions.json 的设置。也许你会问 "如何简单的去设置玩家权限为 visitor 呢?" 。实际上如果你在游戏里是个管理员,那么你可以在游戏里(玩家列表界面)设置别的玩家的权限信息。对于一个服务器,你最好安排上至少一个管理员。

玩家白名单

如果你不希望任何的玩家能直接加入你的服务器,那么可以考虑启用服务器的 "白名单模式" :

  1. 更改 server.propertieswhite-list 的属性值为 true

  2. 重启服务器

你可以在服务器程序里使用 whitelist add <玩家名>whitelist remove <玩家名> 来往白名单里添加或删除玩家。

或者编辑服务器目录里的 whitelist.json 文件,格式如下:

[
{
"name":"MoonstoneTalaxy"
},
{
"name":"RainbowTalaxy"
}
]

同样,需要重启服务器才能让更改生效。重启完之后你可能会发现 whitelist.json 变成这样:

[{"ignoresPlayerLimit":false,"name":"MoonstoneTalaxy","xuid":"25354361236725"},{"ignoresPlayerLimit":false,"name":"RainbowTalaxy"}]

可以看到数据全被服务器写在了一行里,同时每个玩家信息还多了 ignoresPlayerLimitxuid 两个属性。如果你想更多了解 ignoresPlayerLimit ,可以查看 官方教程Whitelist 章节。如果在这样的信息里去编辑文本你一定的感觉痛苦的,所以这里我还是建议在服务器程序里使用 whitelist add <玩家名>whitelist remove <玩家名> 来往白名单里添加或删除玩家。