1.MCDR是什么?
MCDR,全称MCDReforged,是由TIS服务器成员Fallen-Breath开发的一款纯原版的mc服务端扩展与实现,基于python,使开发难度大大降低,你也可以编写!
2.MCDR能干什么?
虽然它的实现原理十分的简洁,但是衍生出的使用方法与扩展性确实无与伦比的
基于它,你可以实现:
tpa(传送玩家插件)
物品交易
更好的计分板
纯原版的指令(虽然客户端不会提示)
甚至是全自动的存档备份
还有很多......
3.怎么实现的?
MCDR 使用了 Popen 来将服务端作为一个子进程启动,因此它便拥有了控制服务端标准输入/输出流的能力
Minecraft 服务器的控制台输出拥有着稳定的输出格式,并包含着大量与服务器有关的有用信息(如玩家聊天信息)。借此,MCDR 可以解析并分析服务端输出,将他们抽象成不同的事件并派发给插件进行响应
在 Minecraft 内置指令系统的帮助下,MCDR 可以通过向服务端标准输入流发送 Minecraft 指令来与 Minecraft 服务器做出交互
就这样!如果你愿意的话,你可以将 MCDR 视为一个盯着服务端控制台看的,可以根据服务端的输出快速地做出响应并向服务端输入相关指令的,一个机器人
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
厉害,怎么少了一段,回家补一下