创建一个 AzureFlow 物品

本节将以最主流的 RPG 物品为例,引导用户自己开发一个 RPG 武器

前提条件

  • 已完整阅读前两节的内容

  • 成功安装 AzureFlow 插件并顺利导出默认配置文件夹

  • 熟悉 YAML

AzureFlow 物品库支持多种物品文件的格式及类型,如纯文本型(*.yml*.json等),纯脚本型(*.js*.groovy等)等。

在这里,为了方便初学者理解与使用,我们以yml配置为例。

创建并生成物品文件

首先,输入/af create ElniaSword 命令,在 items 文件夹下会自动创建一个配置文件ElniaSword.yml,(如果没有,那么可以手动创建文件并复制粘贴内容到文件即可)随后输入指令/af reload,就可以把服务器加载到服务器中,同时会发现配置文件如下所示:

ElniaSword.yml
internal:
  # 这是 AzureFlow 自动生成的该物品的唯一标识
  # 请不要修改或删除它,避免出现不必要的问题与未知的错误
  uuid: 48047a9d-34a4-e372-3f19-9f7f958d2699
  alias: [ElniaSword]

此时,该物品就已经被 AzureFlow 加载到了服务器中,输入指令af get ElniaSword就可以获取到该物品,物品如下图所示:

新定义的物品

如图所示,这个物品的名字是 UNKNOWN ,材质是石头,这是 AzureFlow 插件的默认物品样式。

但是,这肯定不是我们想要制作的物品的最终样子,接下来,让我们正式开始配置这个物品。

设置物品样式

我们可以通过 display配置项 设置物品样式。

首先,指定该物品的名字name艾尔尼亚之剑,并且为其添加等级后缀,指定等级为 10。

由于这里要制作的物品是一把”剑“,所以设置其材质material为钻石剑DIAMOND_SWORD(该材质名基于 Bukkit Material,可以通过查阅文档获得)。

基于该物品,大致编写相关描述lore如下:

display:
  # ..
  lore:
    - '  &f物品描述:'
    - ' '
    - '    &7&o传闻挥舞可斩断一切黑暗与邪祟'
    - '    &7&o具有让世间万物&e&o苏醒&7&o的能力..'
    - '  '

基于上述思路,编写相应配置如下:

display:
  name: '  &f艾尔尼亚之剑 &eLv.10' 
  material: DIAMOND_SWORD
  lore:
    - ' '
    - '  &f物品描述:'
    - ' '
    - '    &7&o传闻挥舞可斩断一切黑暗与邪祟'
    - '    &7&o具有让世间万物&e&o苏醒&7&o的能力..'
    - '  '

随后,重载配置文件,重新获取该物品,就可以获取到物品如下图所示:

至此,物品的样式初步设置完成,我们已经完成了静态物品的编写。

但其中还有很多问题以及功能没有实现,例如等级需要随机数值,以及一些交互性操作,在稍后的内容中会介绍到。

引入所需模块

因为我们在本节中制作的物品可能会存在随机或时间的功能,即要制作一个动态的物品,那么就需要引入一些外置的模块来实现这些功能,引入模块使用的是 import配置项

首先,引入随机和时间模块,引用代码如下:

import:
  module:
    random: random
    time: time

至此,就成功引用了随机和时间模块。随后,便可以该物品的配置文件中,使用随机和时间模块,模块的使用方法遵循EL表达式语法,大致语法即${you expression here},当仅使用单变量时,我们可以使用简化的语法,即$variable直接使用,完整内容请查看章节 高级物品配置#表达式

了解了如何使用模块后,我们便可以直接上手。此处,我们指定物品的等级为随机模块生成的范围在1~100的随机数,编写配置如下:

display:
  name: '  &f艾尔尼亚之剑 &eLv.${random.int(1, 100)}'

模块调用成功,此时我们可以多次获取到该物品,看看是否实现效果,获取三次物品如下图所示:

第一个物品

至此,完成了随机模块的调用,但还存在一些问题,在后面的内容中我们会提出并解决。

使用预定义数据

在上文中,我们通过引入随机模块,实现了数据的随机化,即随机等级,但是当我们如果要在其他地方,如lore中引用这个等级的随机数值,就会发现需要编写多次${random.int(1, 100)},而且最为致命的是相当于会执行多次random.int(1, 100),即多个值不一样,例如如下配置文件:

display:
  name: '  &f艾尔尼亚之剑 &eLv.${random.int(1, 100)}'
  material: DIAMOND_SWORD
  lore:
    - ' '
    - '  &f物品属性:'
    - ' '
    - '    &f等级: &e${random.int(1, 100)}'
    - ' '
    - '  &f物品描述:'
    - ' '
    - '    &7&o传闻挥舞可斩断一切黑暗与邪祟'
    - '    &7&o具有让世间万物&e&o苏醒&7&o的能力..'
    - '  '

输入指令af get 48047a9d-34a4-e372-3f19-9f7f958d2699获取该物品,如下图所示:

不难发现,物品名中的等级与lore的等级不一致,原因就如上文所说。

要解决这个问题,就需要使用到data配置项,以下将介绍如何使用数据配置项来保存后面要使用到的一些数据。

首先,声明一个等级数据level,其值与之前的方法一致,通过随机模块产生,配置如下:

data:
  level: 'random.int(1, 100)'

定义完等级数据后,我们就可以直接在样式中使用该数据,由于只需要直接引用这个数据,那就可以使用EL表达式的简写形式,即$level,方法如下:

display:
  name: '  &f艾尔尼亚之剑 &eLv.${level}'
  material: DIAMOND_SWORD
  lore:
    - ' '
    - '  &f物品属性:'
    - ' '
    - '    &f等级: &e${level}'
    - ' '
    - '  &f物品描述:'
    - ' '
    - '    &7&o传闻挥舞可斩断一切黑暗与邪祟'
    - '    &7&o具有让世间万物&e&o苏醒&7&o的能力..'
    - '  '

修改完后保存文件,重载插件并重新获取该物品,得到物品如下:

至此,该物品的配置到此结束。

小结

本章,我们通过尝试制作一个RPG物品,学习了importdatadisplay配置项。

Last updated