MCDR介绍/插件开发心得

技术·游戏 · 03-20 · 27 人浏览

1.MCDR是什么?

MCDR,全称MCDReforged,是由TIS服务器成员Fallen-Breath开发的一款纯原版的mc服务端扩展与实现,基于python,使开发难度大大降低,你也可以编写!

2.MCDR能干什么?

虽然它的实现原理十分的简洁,但是衍生出的使用方法与扩展性确实无与伦比的

基于它,你可以实现:

tpa(传送玩家插件)

物品交易

更好的计分板

纯原版的指令(虽然客户端不会提示)

甚至是全自动的存档备份

还有很多......

3.怎么实现的?

MCDR 使用了 Popen 来将服务端作为一个子进程启动,因此它便拥有了控制服务端标准输入/输出流的能力

Minecraft 服务器的控制台输出拥有着稳定的输出格式,并包含着大量与服务器有关的有用信息(如玩家聊天信息)。借此,MCDR 可以解析并分析服务端输出,将他们抽象成不同的事件并派发给插件进行响应

在 Minecraft 内置指令系统的帮助下,MCDR 可以通过向服务端标准输入流发送 Minecraft 指令来与 Minecraft 服务器做出交互

就这样!如果你愿意的话,你可以将 MCDR 视为一个盯着服务端控制台看的,可以根据服务端的输出快速地做出响应并向服务端输入相关指令的,一个机器人

——MCDR Github Readme

4.安装

虽然我很想分享如何安装,但是我认为官网/github已经写个足够清晰

不需要进行重复造轮子的事情

当然有问题留言我也会看看的(逃)

十分建议在开始开发前现在自己的电脑上搭建MCDR,一来方便测试,而来为实际部署打好基础

5.插件开发

PS:以下内容皆以MCDR开发文档为准!

让我们开始吧!

MCDR的插件类型

主要分三类——单文件(example.py)| 文件目录型 | 打包插件(example.mcdr)

首先是单文件,这将是接下来讲述的内容

单文件就是一个单纯的.py文件,无法加入MCDR插件仓库 适合初学者进行简单的插件开发(实际使用时注意目标环境是否拥有需要的库)

文件目录与打包插件本质都是一个文件夹,只不过一个打包了(怎么是废话)

这里就不多赘述了

元数据

首先,创建一个example.py

然后再其中输入这样一段内容(不需要引用任何库):

PLUGIN_METADATA = {
    "id": "example",
    "version": "1.0.0",
    "name": "Example",
    "description": "Block Game Utilities",
    "author": "AlexBlock",
    "link": "https://AlexBlock.org",
}

这里面最重要的是id,这将是MCDR本体识别你的插件的入口,虽然不写的话也能运行,但是这样就失去了元数据填写的意义,自己的作品总要又名字和作者罢qwq

很容易理解的:

id-MCDR眼中你插件的名字

version-插件的版本号

name-你能看到的名字

description-简介

author-作者

link-你的网站(没有可以不填或者填github什么的)

好了,现在你的插件已经可以被MCDR识别到了,为什么不试试呢?

对了,别忘了自己修改作者、链接、简介喔!

让插件和你打声招呼吧!祖传Hello world

在上一部分的example.py的元数据下面输入:

def on_load(server, old):
    server.logger.info('Hello World!')

然后重载(!!MCDR r plg)你应该能看到MCDR的控制台输出了

[TaskExecutor/INFO] [example]: Hello World!

那么恭喜你成功的写出了第一个真正的插件!鼓掌👏

好了,平静下来了吗,让我们回看这两行代码

你可以看到我们def了一个名叫 on_load的函数

这是MCDR的保留字符,用于触发插件中的逻辑,所以在声明一个看起来就很 危 的函数时请务必在文档中搜索其个是不是保留函数!

关于这段代码,MCDR文档是这么说的:

`插件被加载:
插件被加载事件将在插件加载后被触发一次,若你需要注册一些事件监听器/命令/帮助消息,以及初始化参数,那么你应该将它们置于这个函数里`

人话就是:当MCDR正在加载插件时,这个插件就会被触发

而第二行使用了server.logger.info方法向MCDR控制台输出消息

更多有关事件的资料你可以在文档找到

消息交互

仔细想想,插件本质用户的输入做出反应(侠义的,但是本质就是一个你问我答的过程)。

那么我们来看看MCDR使用什么方法来向服务器/玩家发送消息。

server.execute-这个方法向服务器控制台发送消息,也就是命令执行的实现

server.tell-等价于原版 /tellraw 指令,实现向特定玩家发送消息

server.say-相当于全局广播你的消息,等价于/tellraw @a

server.reply-如果消息来自玩家,那么使用 tell 方法来回复玩家;如果消息来自控制台,则使用 server.logger.info 来输出到控制台

不多说了,让我们直接来实践一个看看。

做点什么好呢?

做个进服公告吧!

def on_player_joined(server, player: str, info):
    server.tell(player, '================BlockParty================')
    server.tell(player, f'欢迎 {format(player)} 加入!')
    server.tell(player, '==========================================')

看起来好复杂,让我们慢慢看。

on_player_joined-这个函数回调了“玩家加入游戏”这一事件,当有玩家加入游戏时,这个函数中的内容将被执行

server, player: str, info-都是一些返回的数据

server.tell(player,-这里使用server.tell方法向玩家发送消息,由形参player决定发送给谁

format(player)-获取到目标玩家的名字

其实还挺简单的吧!

注册指令

def on_load(server: PluginServerInterface, old):
    server.register_help_message('!!bp', 'BlockParty    强大的服务器实用工具')
    builder = SimpleCommandBuilder()
    builder.command('!!bp', plugin_help)

首先register_help_message将指令注册到吧帮助列表,你将在!!help

mc 生电 python
  1. 厉害,怎么少了一段,回家补一下

Theme Jasmine by Kent Liao