BE教程

附加包教程:15.方块(四)

Cat_A***Lv.4 高级会员 发表于 2023-1-15 · 最后回复 2024-6-7 IP:山西省 2,777 1
AI 速览2026-10-09 08:27 生成

附加包教程第15期讲解方块状态与决定组件排列的写法

这是附加包系列教程的第十五期,主题是方块文档中的高级写法:通过 description 下的 states 定义方块状态,并用与 description 同级的 permutations 让状态决定组件,也就是方块排列。帖子先给出基本结构与代码示例,随后补充 Molang 表达式的基础知识,包括 query、variable、math、context 等常见前缀和基础运算符,方便读者看懂官方查询函数列表。适合已经学过方块事件、准备深入编写方块行为的数据包与附加包创作者。

本卡片由 AI 阅读本帖后生成,可能存在疏漏,请以帖子正文为准。
本帖最后由 Cat_Anchor 于 2024-6-6 19:50 编辑

前言

上期,我们学习了所有我已知的方块事件方法。但我们还没有学习方块文档的高级写法——定义方块状态和方块状态决定的组件(方块排列)。这期,我们就来学习它们。
基本结构

它们分别使用description下states和与description同级的permutations决定。请看代码示例。

  1. {
  2.   "format_version": "1.21.0",
  3.   "minecraft:block": {
  4.     "description": {
  5.       "identifier": "test_pack:test_block",
  6.       "states": {
  7.         "test_pack:state_a": [ //这里的test_pack:state_a就是状态名称。状态有3种,这是第一种,布尔值,就是单纯的真或假。
  8.           true, //真
  9.           false //假
  10.         ],
  11.         "test_pack:state_b": [ //这是第二种,指定文本。
  12.           "option_a", //选项1
  13.           "option_b", //选项2
  14.           "option_c" //选项3
  15.         ],
  16.         "test_pack:state_c": [ //这是第三种,指定数字。这时数字要介于0-15之间。
  17.           0,
  18.           1,
  19.           2,
  20.           3
  21.         ]
  22.       }
  23.     },
  24.     "components": {不要在意这些细节},
  25.     "events": {不要在意这些细节},
  26.     "permutations": [ //在意这里就对了!这里用于存放在哪个状态下方块该拥有哪个组件。
  27.       { //一个项目
  28.         "condition": "q.block_state('test_pack:state_a') == true", //条件,使用了Molang表达式,这个的意思是查询方块状态test_pack:state_a是否为真,如果是,就应用下面的这些组件来代替原本的组件。
  29.         "components": {...} //这里写在这个情形下的组件,用来代替原本的组件。如果原本有一个组件,这里有一个相同的组件,则后者覆盖前者。如果这里有一个原本没有的组件,会直接加上这个组件。如果原本有一个这里没有的组件,原本的组件继续生效。简而言之,这里只能替换和增加组件,不能删除原本的组件。
  30.       },
  31.       { //又一个项目
  32.         "condition": "q.block_state('test_pack:state_b') == 'option_a'", //意思是,查询方块状态test_pack:state_b是否是“option_a”,如果是,就应用下面的这些组件来代替原本的组件。
  33.         "components": {...}
  34.       },
  35.       { //又是一个项目
  36.         "condition": "q.block_state('test_pack:state_c') == 0", //意思是,查询方块状态test_pack:state_c是否为0,如果是,就应用下面的这些组件来代替原本的组件。
  37.         "components": {...}
  38.       }
  39.     ]
  40.   }
  41. }
复制代码

以上就是状态和状态决定组件的用法了。
高级内容

states和permutations只是固定的用法,这一段我们来说说Molang表达式。
所谓Molang,就是一种简单的基于表达式的语言,旨在运行时快速、数据驱动地计算值,并与游戏中的值和系统直接相连。它的重点是使像动画这样的低级系统支持内部和外部创作者的灵活的数据驱动行为,同时保持高性能。抄官网ing...
嗯,既然官网都说了Molang“是一种简单的基于表达式的语言”了,其实它还真的不怎么难。我们使用Molang时,大部分情况都是用“query.吧啦吧啦(吧啦吧啦a,吧啦吧啦b)”这种形式的查询函数,至于剩下的,那就是“variable.吧啦吧啦”在地物和实体动画文档里比较常见,还有“math.吧啦吧啦(吧啦吧啦a,吧啦吧啦b)”在动画文档里比较常见,“context.吧啦吧啦”在物品文档和动画文档里有点用,其他的似乎就没啥了。
其实重点只需要掌握a==b是a等于b,a!=b是a不等于b,还有什么+-*/这类的基础运算符就好了。然后就是疯狂翻官方文档。那里有一个超级长的查询函数的列表,从查询时间和天数,到查询物品耐久度,甚至是查询月相都有对应的函数,主要看看那里就好。不过那全是英文,还得找个好用的翻译器,有点不方便。
总结

这一期,我们学习了方块状态和它衍生出来的控制方块组件的功能。关于方块的学习即将结束,至于方块的实战运用,与物品大同小异,都是拼命地复制粘贴那些状态、组件和事件,我就不多说了。
从一开始以来,我们学习了配方、函数、功能域、迷雾、物品、方块、模型和战利品表,这么多内容。是时候了,我们下期就来学习子包。


回复 1 最早 最新 只看楼主
您需要登录后才可以回帖 登录 | 立即注册
本版积分规则