游戏配置
本文将带领你进行服务器上的参数配置。
认识服务器文件
如果你尝试查看一下服务器目录里有哪些文件:
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 <玩家名> 来往白名单里添加或删除玩家。