配置

MCDR 的配置文件是 config.yml。它位于,也应位于 MCDR 的工作目录中

在启动时,MCDR 将尝试加载配置文件,并将缺失的选项(如果有)添加到你的配置文件末尾。如果配置文件不存在,MCDR 则将生成默认配置文件并退出

配置文件使用 YAML 格式

当 MCDR 运行时,你可以使用 !!MCDR reload config 命令(或其缩写 !!MCDR r cfg)来重载配置文件

参见

热重载 指令章节中更多与热重载相关的指令

配置项列表

基础配置

language

MCDR 用于输出信息的语言

  • 选项类型:string

  • 默认值:en_us

  • 可用选项:en_uszh_cn

working_directory

服务端的工作目录。你应该将所有与服务器相关的文件放入此目录

  • 选项类型:string

  • 默认值:server

start_command

启动服务器的控制台命令

一些例子:

如果你想要启动一个 Minecraft 服务端,你可以

start_command: java -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar nogui

如果 working directory 中已存在启动脚本,你可以:

start_command: start.bat
start_command: ./start.sh

如果指令中存在一些 YAML 不喜欢的字符(如 "\),你可以从以下解决方案中任选一个:

# use "" to wrap the command and escape " and \
start_command: "\"C:\\Program Files\\Java\\jdk-17.0.3.1\\bin\\java.exe\" -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar"

# use '' to wrap the command
start_command: '"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe" -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar'

# use multi-line string
start_command: |-
  "C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe" -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar
# use "" to wrap the command and escape " and \
start_command: "\"/path/to my/java\" -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar"

# use '' to wrap the command
start_command: '"/path/to my/java" -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar'

# use multi-line string
start_command: |-
  "/path/to my/java" -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar

备注

对于 Minecraft 服务器,你可能希望在 -jar 参数前面加一个 -Dfile.encoding=UTF-8 JVM 属性,如上面的例子所示

encoding / decoding 小节以了解更多 Minecraft 服务器中与 UTF-8 编码相关的信息

  • 选项类型:string

  • 默认值:java -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar nogui

handler

不同服务端有着截然不同的输出和指令。服务端处理器是用于在各种服务器之间进行处理的模块,也是 MCDR 控制服务端的接入点

处理器确定解析服务器标准输出文本的特定方法,并使用正确的命令控制服务端

内置的处理器及其适用的服务端如下表所示:

处理器

兼容的服务端类型

vanilla_handler

用于 原版 / Carpet / Fabric 服务端

beta18_handler

用于低版本的原版服务端,如 MC < 1.7 的低版本,甚至到 beta1.8 版本。只在 1.6.4 和 beta 1.8.1 版本中进行了测试

bukkit_handler

用于 1.14 版本以下的 Bukkit / Spigot 服务器,以及所有版本的 Paper / Mohistmc 服务器

bukkit14_handler

用于 1.14 或以上版本的 Bukkit / Spigot 服务端

forge_handler

用于 Forge 服务端

cat_server_handler

适用于 CatServer 服务端

arclight_handler

For Arclight server. Tested with arclight-forge-1.20.1-1.0.1.jar

bungeecord_handler

用于 BungeeCord 服务端。请在启动命令的 -jar 参数之前添加 -Djline.terminal=jline.UnsupportedTerminal 参数以支持 MCDR。详见 此处

waterfall_handler

用于 WaterFall 服务端

velocity_handler

用于 Velocity 服务端

basic_handler

不进行任何分析并返回原始文本的处理器。 除非你想使用 MCDR 启动非 Minecraft 相关的服务器,否则无需使用

  • 选项类型:string

  • 默认值:vanilla_handler

encoding / decoding

用于编码消息至服务端标准输入 / 从服务端标准输出解码消息时,所用的编码 / 解码格式

留空以让 MCDR 使用系统编码。如果它不起作用(例如控制台中出现了乱码),你需要根据服务端的编解码方式手动配置这两个选项

对于 Minecraft 服务端,如果你的操作系统默认的字符集并非 UTF-8,强烈建议确保所有的编码 / 解码都使用 UTF-8 字符集,原因如下:

  1. Python 3 使用 UTF-8 存储字符串

  2. Minecraft 服务端始终使用 UTF-8 读取 stdin

  3. Minecraft 服务器使用操作系统的默认字符集写入 stdout / stderr / 日志文件

  4. 你的操作系统使用的字符集可能不是 UTF-8,比如中文 Windows 可能使用 GBK 作为默认字符集

sequenceDiagram participant MCDR participant pipe participant Minecraft MCDR->>pipe: send "hello" (encoding) pipe->>Minecraft: stdin (UTF-8) Minecraft-->>pipe: stdout/stderr (OS charset) pipe-->>MCDR: receive "world" (decoding)

非 UTF-8 字符集在编解码过程中可能会引起烦人的编解码问题,导致 MCDR 无法与服务端正常通信

为了让与服务端相关的一切编解码都用上 UTF-8,你可以参照如下方法:

  • 让 MCDR 使用 UTF-8 与 Minecraft 服务器通信,即在 MCDR 配置中将 encodingdecoding 设置为 utf8

    encoding: utf8
    decoding: utf8
    
  • 确保启动 Minecraft 的 JVM 也使用 UTF-8 作为默认字符集。你可以通过以下任一操作来实现:

    • (推荐)修改服务器的启动命令。在 -jar 参数之前添加一个 -Dfile.encoding=UTF-8 JVM 属性,就像 start_command 部分中的示例那样

      start_command: java -Xms1G -Xmx2G -Dfile.encoding=UTF-8 -jar minecraft_server.jar
                                        ^^^^^^^^^^^^^^^^^^^^^
      
    • -Dfile.encoding=UTF-8 插入环境变量 JAVA_TOOL_OPTIONS

然后,Minecraft 服务器在运行时就会使用 UTF-8 作为其标准 IO 流的字符集,同时 MCDR 将能完美地与服务器通信

当然,如果你确定你的操作系统使用的默认字符集是 UTF-8,那你什么都不需要做。你甚至可以将这两个 encoding/ decoding 选项留空来使用默认的系统字符集。

  • 选项类型:string 或 null

  • 默认值:

  • Examples: utf8, gbk

plugin_directories

MCDR 搜索将要加载插件的目录列表

  • 选项类型:list[str]

  • 默认值:

plugin_directories:
- plugins
  • 例如:

plugin_directories:
- plugins
- path/to/my/plugin/directory
- another/plugin/directory

rcon

rcon 设置。若启用 rcon,则在 Minecraft rcon 服务端启动后,MCDR将自动连接到 rcon 服务端。这样插件就可以通过 rcon 向服务端发送命令

rcon.enable

rcon 开关

  • 选项类型:boolean

  • 默认值:false

rcon.address

用于 rcon 连接的地址

  • 选项类型:string

  • 默认值:127.0.0.1

rcon.port

用于 rcon 连接的端口

  • 选项类型:integer

  • 默认值:25575

rcon.password

用于 rcon 连接的密码

  • 选项类型:string

  • 默认值:password

check_update

如果设置为 true,MCDR将会每隔24小时执行一次更新检测

  • 选项类型:boolean

  • 默认值:true

advanced_console

高级控制台的开关,基于 prompt-toolkit

如果你需要重定向 MCDR 的标准输入/输出,或者仅仅是不喜欢这个高级控制台,把它设置为 false

  • 选项类型:boolean

  • 默认值:true

高级配置

为进阶用户提供的选项

disable_console_thread

设置为 true 时,MCDR 将不会启动控制台线程来处理控制台命令输入

请保持默认值,除非你清楚地知道这是什么

  • 选项类型:boolean

  • 默认值:false

disable_console_color

设置为 true 时,MCDR 将在所有消息打印到控制台之前删除所有控制台字体格式化程序代码

  • 选项类型:boolean

  • 默认值:false

custom_handlers

自定义 服务端处理器 类所组成的列表。这些类应当是 AbstractServerHandler 的子类

这样你就可以在 handler 选项中通过处理器的名称指派其解析标准输出文本

处理器名称通过 get_name() 方法定义

  • 选项类型:list[str] 或 null

  • 默认值:

custom_handlers:
  • 例如:

custom_handlers:
- handlers.my_handler.MyHandler

下面这个例子中,handlers.my_handler 是包路径,MyHandler 是类名

custom_info_reactors

用于处理 info 对象的自定义 Info 响应器 类所组成的列表。这些类应当是 AbstractInfoReactor 的子类

所有自定义 info 响应器都将注册到反应堆列表中,以处理来自服务器的信息

  • 选项类型:list[str] 或 null

  • 默认值:

custom_info_reactors:
  • 例如:

custom_info_reactors:
- my.customize.reactor.MyInfoReactor

下面这个例子中,my.custom.reactor 是包路径,MyInfoReactor 是类名

watchdog_threshold

使得 看门狗 认为任务执行者 (task executor) 线程已经未响应所需的时间间隔。将其设为 0 以禁用 看门狗

  • 选项类型:int 或 float

  • 默认值:

watchdog_threshold: 10

handler_detection

在默认情况下,MCDR 会在启动时弃用服务端处理器正确性检测,并运行一段时间,用于检测可能出现的 服务端处理器 配置错误

将其设为 false 以禁用服务端处理器检测逻辑,以减少部分 MCDR 开始运行时的性能损耗。这主要在性能分析 MCDR 时使用

  • 选项类型:boolean

  • 默认值:

handler_detection: true

debug

调试日志模式开关。将 all 设置为 true 以启用所有的调试输出。也可以打开部分选项,以启用某些调试输出

  • 默认值:

debug:
  all: false
  mcdr: false
  handler: false
  reactor: false
  plugin: false
  permission: false
  command: false