跳到主要内容

创建物品

信息

在 Ratziel 底层中,对于 物品、脚本对象 等等的处理紧紧围绕着 元素 这一核心概念。 但在 1.X 版本中,Ratziel 并不强调这一概念,在特色模块和核心功能相对不完善的情况下,过于注重这一概念反而会增加用户的困惑。

Ratziel 支持多种配置文件格式,如 YAML、JSON、HOCON、TOML 等。

由于 YAML 格式在各类插件配置文件中被广泛使用,故此文档的大部分案例都将使用 YAML 格式实现。

创建物品

信息

工作空间 是存放元素集的地方。

支持深层读取(你可以自由安排元素文件的位置)。

可在配置文件中过滤掉不需要被加载的文件。

在 Ratziel 的工作空间目录下创建后缀为 .yml 或者 .yaml 的文件。

如下我们创建了一个文件,并在其中添加了以下内容:

plugins/Ratziel/workspace/example.yml
ExampleItem: # 物品ID
item: # 告诉插件这是一个物品,而不是其他什么东西
...

那么,你就创建了一个名为 ExampleItem 的物品。

配置物品

信息

完整的物品包括 物品源物品组件物品动作物品属性 等等。 然而对于 物品源物品组件 的区分,其实并不需要太大注意,混为一谈也没关系(下面也是这么干的)。 你只是要知道,他们都是用来描述物品的信息的就可以了。

基础物品配置

让我们来看看一个简单的物品配置:

ExampleItem:
item:
material: DIAMOND_SWORD # 物品类型
name: '示例物品' # 物品显示名称
lore: # 物品描述
- '这是一个示例物品。'
- '它可以用来演示 Ratziel 的功能。'

在这个例子中,material 属于 原版物品源,填写原版的物品ID即可。namelore 则属于 ItemDisplay组件 (ItemDisplay组件全面支持 MiniMessage)。

插件所有的物品组件可在 物品组件 中找到。

物品动作配置

信息

当一个触发器被触发时,绑定此触发器的动作就会被触发。

按照惯例,先看例子:

ExampleItem:
item:
...
actions:
onAttack: # 物品触发器
- 'player.sendMessage("你攻击了!")'

其中 onAttack 声明了一个 物品触发器,此触发器会在玩家手持该物品进行攻击时触发。

物品触发器的完整列表可参见 触发器

而下面的 player.sendMessage("你攻击了!") 会被解析为 动作块。按照插件设置里的默认脚本语言项,编译脚本并上面触发器触发时执行。

至于为什么是 ,动作块又是怎么解析的,请看 动作语句

物品属性配置

显然,仅仅根据上面的内容,Ratziel 是无法实现 高级、现代 的功能的。

此时就需要更高级的特性来支撑。

信息

换句话说,上面的 物品组件 相当于 决定物品长什么样,物品动作 则是决定物品的交互行为。

标签解析

首先要介绍的就是它了。

插件内置大量的标签解析器,而标签的一般形式是:{标签名:参数1:参数2:...}

标签 被使用在 物品组件 部分节点下的内容,如:

ExampleItem:
item:
lore:
- '随机数测试: {script: Math.random()}'
- 'PAPI变量测试1: {papi:player_name}'
- 'PAPI变量测试2: {papi:player:name}'
- 'PAPI变量测试3: %player_name%'
- '内联脚本测试: {{ js: 1*22 }}'

如上配置我们定义了 script 脚本标签 和 papi PAPI变量标签,它们都会在物品生成的过程中解析。

标签的详细内容可参见 标签解析器

片段解析

我们注意到,上面的例子中 %player_name%{{ js: 1*22 }} 并不符合标签的一般形式,严格上它们属于 片段 (Section)

具体内容不在此展开,详见 片段解析器

物品属性

信息

物品属性分为三层:常量层 (Properties)数据层 (Data)计算层 (Computation)。 三层数据的每一对数据都是并行生成的,所以不存在同一层的上下调用。

设计参考 AzureFlow 的数据层设计。

常量层

常量层的数据在物品生成之前就已经确定。

可以用来存放一些 计算层 或者 数据层 需要用到的信息。

数据层

数据层的数据会实打实存储在物品 NBT 中,因此数据层的的数据类型是被限定的,只允许 intdoubleString 等基本数据类型和 MapList 两种复杂数据类型。

其 NBT 结构表如下:

{
"Ratziel": {
...
"data": {
"Key1": "Value1",
"Key2": "Value2",
...
}
}
}

计算层

计算层在三层数据中最后进行。

其主要意义在于通过计算来确定物品信息

我们可以使用标签来直接调用计算层数据,如:

ExampleItem:
item:
# 常量层
properties:
number: 1
# 数据层
data:
hello: "Hello" # String 基本类型
# 计算层
compute:
world: |-
print("Hello World!")
"World"
helloWorld: 'hello + "World"' # hello 调用数据层数据
lore:
- '{compute:world}' # 调用计算层数据
- '{data:hello} {define:helloWorld}' # 和上面一样
- '{prop:number}' # 调用数据层
- '{data:hello}' # 同样也可以调用数据层数据