服务端处理器

服务端处理器是分析服务器输出并提供命令接口来控制服务器的对象

MCDR 本身已经包含许多广泛使用的 Minecraft 服务端的处理器,但如果你有需要自定义输出格式的服务端,你可以编写自己的服务端处理器,并让 MCDR 使用它

要设计服务端处理器,你需要从现有的服务端处理器类或 AbstractMinecraftHandler 基类继承

建议首先查看 MCDR 中服务端处理器的实现,并尝试理解它们

示例

假设我们有一个原版服务器,但某些玩家的用户名加有前缀,这将导致玩家聊天消息的消息格式发生一些更改。例如,具有 ID Steve 和前缀 [Builder] 的玩家可能有以下聊天消息:

<[Builder]Steve> Hello
<[Builder]Steve> !!MCDR status

对于默认的原版服务端处理器,[Builder]Steve 是一个非法的玩家名称。幸运的是,服务器中所有可能的玩家前缀都遵循相同的格式,即 [前缀]玩家名称。因此,可以为之创建专用的处理器

例如,上面的以下代码创建一个处理器,以在此服务器中处理玩家名:

from parse import parse

from mcdreforged.handler.impl import VanillaHandler


class MyHandler(VanillaHandler):
    def get_name(self) -> str:
        return 'the_handler_for_my_server'

    def parse_server_stdout(self, text: str):
        result = super().parse_server_stdout(text)
        if result.player is None:
            parsed = parse('<[{prefix}]{name}> {message}', result.content)
            if parsed is not None and self._verify_player_name(parsed['name']):
                result.player, result.content = parsed['name'], parsed['message']
        return result

于是,你可以使用此处理器来处理服务端。你需要在配置文件中执行以下操作:

  1. 将配置文件中的 handler 选项设置为 the_handler_for_my_server

  2. 在MCDR 工作路径中将你的 my_handler.py 放进一个合法的 python 包中,如

    my_mcdr_server/
     ├─ handlers/
     │   ├─ __init__.py
     │   └─ my_handler.py           <-----------
     │
     ├─ server/
     ├─ config.yml
     └─ permission.yml
    

    现在,你的处理器类已可以用如下的 python 代码获取:

    from handlers.my_handler import MyHandler
    
  3. custom_handlers 选项中添加自定义处理器的路径,然后把 handler 选项设置为自定义处理器 get_name() 方法的返回值,如:

    handler: the_handler_for_my_server
    
    custom_handlers:
    - handlers.my_handler.MyHandler
    

这样就行了