游戏配置
本文将带领你进行服务器上的参数配置。
认识服务器文件
如果你尝试查看一下服务器目录里有哪些文件:
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-name | Dedicated Server | 服务器名 (即服务器列表中显示的名称) 名称里不能带有分号 |
gamemode | survival | 游戏模式,合法值有:survival (生存)creative (创造)adventure (冒险) |
difficulty | easy | 游戏难度,合法值有:peaceful (和平)easy (简单)normal (普通)hard (困难) |
allow-cheats | false | 启用作弊 合法值为 true 或 false |
max-player | 10 | 玩家数量上限 值必须为正整数 |
white-list | false | 启用白名单 如果为 true 将只允许whitelist.json 文件里的玩家连接服务器 |
server-port | 19132 | 服务器端口号 |
view-distance | 32 | 视距 允许玩家游戏加载的最大区块数 值应当大于等于 5 |
player-idle-timeout | 30 | 自动踢出玩家时间 值必须为非负整数 (单位:分钟) |
level-name | Bedrock 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 level
和 steve
两个地图存档。启动服务器的时候,服务器会运行名称为 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 ...
这里我必须提一嘴的是,以上
op
和help
命令是在服务器程序里执行,而非在 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
呢?" 。实际上如果你在游戏里是个管理员,那么你可以在游戏里(玩家列表界面)设置别的玩家的权限信息。对于一个服务器,你最好安排上至少一个管理员。
玩家白名单
如果你不希望任何的玩家能直接加入你的服务器,那么可以考虑启用服务器的 "白名单模式" :
更改
server.properties
中white-list
的属性值为true
重启服务器
你可以在服务器程序里使用 whitelist add <玩家名>
或 whitelist remove <玩家名>
来往白名单里添加或删除玩家。
或者编辑服务器目录里的 whitelist.json
文件,格式如下:
[
{
"name":"MoonstoneTalaxy"
},
{
"name":"RainbowTalaxy"
}
]
同样,需要重启服务器才能让更改生效。重启完之后你可能会发现 whitelist.json
变成这样:
[{"ignoresPlayerLimit":false,"name":"MoonstoneTalaxy","xuid":"25354361236725"},{"ignoresPlayerLimit":false,"name":"RainbowTalaxy"}]
可以看到数据全被服务器写在了一行里,同时每个玩家信息还多了 ignoresPlayerLimit
和 xuid
两个属性。如果你想更多了解 ignoresPlayerLimit
,可以查看 官方教程 的 Whitelist 章节。如果在这样的信息里去编辑文本你一定的感觉痛苦的,所以这里我还是建议在服务器程序里使用 whitelist add <玩家名>
或 whitelist remove <玩家名>
来往白名单里添加或删除玩家。