0xAA55 发表于 2021-2-5 19:25:48

【C】MCRCOND:给Minecraft服务器实现更方便的命令交互脚本控制

# MCRCOND——给Minecraft服务器实现更方便的命令交互脚本控制

最早设计这个程序的想法是想要让冒险者大陆服务器的后台脚本控制更平滑流畅。众所周知,Minecraft服务器可以开启RCON端口,然后使用RCON协议进行命令的发送和回执接收。 **但RCON客户端的频繁连接和断开过程会导致Minecraft服务端控制台刷屏,会明显增加服务器log的大小** 。于是,我设想一个程序能够向MC服务端建立一个单独的RCON连接,然后它自身作为一个守护进程提供向MC服务器发送命令并转发回执的服务,从而允许在 **只使用一条RCON连接的情况下** 让不同的脚本都可以和服务端进行交互,并 **分别获取各自属于自己的服务端回执** 。

如果不使用RCON做服务器的命令交互,直接通过向Minecraft控制台发送命令的话,当你运行大量的计划任务脚本向服务端发送大量命令, **每个脚本将难以准确获取到针对自己发送的命令得到的回执** ,但使用RCON控制端去控制服务器,则可以使用RCON协议的 `Request ID` 来区分每一条命令和它的回执。

## 使用方法

按照我的设计, **这个程序需要先以Daemon方式启动** 。其会驻留后台,然后尝试按照 **配置文件** 描述的Minecraft服务器地址向其RCON端口发起连接(默认是localhost的25575端口),当连接成功后,就可以 **以client方式启动这个程序** 实现和服务器的交互。

Minecraft服务器 **默认不会开启RCON** ,因此你需要修改 `server.properties` ,设置 `enable-rcon=true` ,并且设置你的RCON密码 `rcon.password` 字段。同样,你需要将本程序的conf配置文件的密码字段 **也设置为相同的内容** ,才可以让Daemon成功登录服务器。

如果Minecraft服务器停止了或者在重启,导致其关闭了RCON端口,这个Daemon会尝试重连MC服务器,直到其重新上线。 **如果你把它丢下不管了,然后忘了开启Minecraft服务器,它就会因为不断尝试重连服务器而生成巨大的log,所以在测试运行的情况下记得关闭它。**

### 下载与编译

使用git命令下载:

    # git clone https://github.com/MickeyMeowMeowHouse/mcrcond.git

下载后,进入 `mcrcond` 目录,运行以下命令即可编译:

    # make

这个程序因为只是一个单独的 `.c` 文件,所以只需要使用 `gcc` 或者 `clang` 直接编译即可。在 `makefile` 里,我使用 `gcc` 作为编译器。经过我的测试,可以在WSL、msys2、Debian、FreeBSD顺利编译运行这个程序。

编译后,你会得到可执行程序 `mcrcond`,这个就是我们需要的程序本身了。

### 启动Daemon

只需要执行以下命令就可以启动Daemon模式:

    # ./mcrcond -d

**初次运行的时候** ,它会自动生成一个默认的配置文件 `mcrcond.conf` 供你修改, **然后它会退出** 。请按照配置文件里的注释,修改其中的字段, **使其符合你的服务器** 使用。

当你设置了配置文件后,再次以Daemon模式启动它,它就会在后台运行,并尝试按照配置文件的内容连接Minecraft服务器的RCON端口。 **如果它遇到错误** ,比如RCON密码错误,则该程序会退出,此时你应当 **检查其log文件** 的内容了解具体的错误理由。

### 发送Minecraft命令

当Daemon启动后,就可以通过client模式进行与服务器的命令交互了,方式十分简单:使用 `-e` 命令开关即可,例如:

    # ./mcrcond -e "list"
    There are 0 of a max of 20 players online:
    # ./mcrcond -e "op 0xAA55"
    Nothing changed. The player already is an operator

参考上面的例子,其中 `#` 开头的(不包含 `#` )是你执行的命令,而没有 `#` 开头的则是服务端返回的回执。服务端的回执被直接输出到 `stdout` ,所以你可以将其重定向到文件或者管道中,方便你的脚本进行分析。

以client模式运行的时候,其 **并不会读取配置文件** ,而是会默认以 `localhost:25585` 为Daemon的地址,向其发出命令请求。可以使用 `-h` 和 `-p` 指定Daemon的地址:

    # ./mcrcond -h localhost -p 25595 -e "list"

### 配置文件相关

配置文件指定Minecraft服务器的地址和RCON端口,以及密码等信息,由Daemon模式读取并使用。

默认的配置文件名为 `mcrcond.conf` ,它指定Daemon模式的运行方式。可以使用 `-c` 命令行参数指定别的配置文件,比如:

    # ./mcrcond -c exmainland.conf -d
    # ./mcrcond -c topologycraft.conf -d
    # ./mcrcond -c mingyueye.conf -d

如果配置文件无法被打开,其会尝试生成一个默认的配置文件用于让你修改,并退出。对于使用 `-c` 参数指定了配置文件路径的情况下,它依然会按照 `-c` 参数指定的位置以默认的配置文件内容写入新的配置文件。

默认配置文件里已经描述了各个字段的内容,所以请自行参考其内容进行修改。

## 反馈

欢迎使用。请在发现问题后,从(https://github.com/MickeyMeowMeowHouse/mcrcond)提出issue。

也欢迎在本贴回帖说明你发现的问题。

请在使用的时候告知我。

陈布衣 发表于 2021-2-11 01:27:33

QWQ ,已经过去六天了

0xAA55 发表于 2021-2-21 19:32:46

竟然有人给我提issue
页: [1]
查看完整版本: 【C】MCRCOND:给Minecraft服务器实现更方便的命令交互脚本控制