开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] 附加包教程:33.方块(五)

 发表于 2023-3-26 07:26:19 来自手机|显示全部楼层|阅读模式 IP:天津
本帖最后由 Cat_Anchor 于 2023-3-31 22:11 编辑

坩埚
稀有度常见
创造分类建筑
材料金属
合适挖掘工具
硬度5
爆炸抗性0
亮度0
窒息生物
红石导体
光照透明0.7
可被火破坏
可被熔岩生成火
可再生
最大堆叠64
命名空间IDcrucible               


前言

所有我知道的关于附加包理论的知识几乎已经讲完了,但还有一些遗漏。不管怎样,我们从这一期开始进入教程后期。这一期的题目叫“方块(五)”,因为我要在这一期放出一些制作方块的例子。
目标

今天我闲来无事,想要给我的附加包加一点新东西。思来想去,我觉得添加一口锅还有点意思。我要添加一口能盛水、熔岩、牛奶的锅,每个液体都应该可以有不同高度,而且肯定得反复使用,不能只用一次就歇菜。
除此之外,我添加这个锅和原版的炼药锅的区别是,这个锅可以做饭和混合黑曜石。相当于不用钻石镐就获得黑曜石的一种途径。
最后,我打算叫它“坩埚”。
分析与解决

好的,那么既然是坩埚,第一件事就是给它确定一个命名空间ID。我把坩埚丢进了翻译器里,结果是“crucible”。校对了一下意思,发现没有很大的歧义,于是在本例子中,我就把它的ID定为“supplementary:crucible”吧!
于是我在行为包根目录/blocks/下创建crucible.json。打开它,首先把基本的方块格式写出来。
然后我注意到需要定义两个方块属性,一个用来管液体的类型,一个用来管液体的高度。然后要给两个属性确定类型。液体高度我设置了7层,0层代表没有,6层代表满,而第7层是预留给以后使用的。至于另一个液体类型,当然是设置成字符串,这让代码易懂了很多。虽然也可以设置成数字,然后记住0代表什么1代表什么;但这样写出的代码,时间一久,自己都忘了这些代码到底怎么运作的,更不要提优化或者是修复漏洞了。
至于题目说的“做饭功能”,我暂且用做甜菜根汤代替,因为这个最简单。当然也可以做蘑菇煲和兔肉汤,但那些涉及到添加原料时的一个hasitem选择器问题,这就容易闹出版本问题和一堆历史遗留问题。总之,液体类型就设置成none、water、lava、milk和beetroot吧。
然后需要一个坩埚模型,随便做一个就好了。记得在做液体层数时给对应的立方体命名“layerX”,X代表到底是哪一层。以上用于part_visibility组件,实际上就是用于显示液体高度。我放一个我做的模型示例吧。

方块代码如下。
  1. {
  2.   "format_version": "1.18.0",
  3.   "minecraft:block": {
  4.     "description": {
  5.       "identifier": "supplementary:crucible", //方块的命名空间ID,简称方块ID。
  6.       "properties": {
  7.         "supplementary:material_type": [ //液体类型
  8.           "none", //没有液体
  9.           "water", //水
  10.           "lava", //熔岩
  11.           "milk", //牛奶
  12.           "beetroot" //甜菜根汤
  13.         ],
  14.         "supplementary:height": [ //液体高度
  15.           0,
  16.           1,
  17.           2,
  18.           3,
  19.           4,
  20.           5,
  21.           6,
  22.           7
  23.         ]
  24.       }
  25.     },
  26.     "components": {
  27.       "tag:metal": {}, //暂时认为锅是金属的,添加一个金属标签
  28.       "minecraft:on_interact": {
  29.         "event": "fill_material" //交互时触发事件,事件名是fill_material,下文会讲
  30.       },
  31.       "minecraft:geometry": "geometry.crucible", //一口锅总得有个模型吧
  32.       "minecraft:material_instances": {
  33.         "*": {
  34.           "texture": "crucible_empty", //有了模型,就可以用minecraft:material_instances组件直接定义纹理短名了。
  35.           "render_method": "blend" //允许半透明,同时有防止它上面刷怪等效果
  36.         }
  37.       },
  38.       "minecraft:destroy_time": 5, //设定破坏时间
  39.       "minecraft:block_light_filter": 0.7,
  40.       "minecraft:part_visibility": { //这个组件用于在对应的层数显示对应的高度。在1.19.80及以后,它被合并到了minecraft:geometry的bone_visibility中。
  41.         "rules": {
  42.           "layer0": "q.block_property('supplementary:height')==0",
  43.           "layer1": "q.block_property('supplementary:height')==1",
  44.           "layer2": "q.block_property('supplementary:height')==2",
  45.           "layer3": "q.block_property('supplementary:height')==3",
  46.           "layer4": "q.block_property('supplementary:height')==4",
  47.           "layer5": "q.block_property('supplementary:height')==5",
  48.           "layer6": "q.block_property('supplementary:height')==6",
  49.           "layer7": "q.block_property('supplementary:height')==7"
  50.         }
  51.       }
  52.     }, ...
  53.   }
  54. }
复制代码

然后,要让我们拿着水桶时点击坩埚,坩埚里得出现液体才行。所以在组件那里有minecraft:on_interact触发器组件,触发fill_material事件。这个事件会运用sequence来确定顺序,还有condition判定到底玩家手持的是什么。这个事件的代码如下。
  1. ...   "fill_material": {
  2.         "sequence": [
  3.           {
  4.             "condition": "q.get_equipped_item_name=='water_bucket'", //如果玩家手里拿着水桶,那么...
  5.             "set_block_property": { //设置方块属性。没错,可以像下面这样一次设置两个。
  6.               "supplementary:material_type": "'water'", //液体类型设置为水。
  7.               "supplementary:height": 6 //高度设置为满(6层高)
  8.             },
  9.             "run_command": { //运行命令
  10.               "command": [
  11.                 "clear @p water_bucket 0 1",
  12.                 "give @p bucket"
  13.               ] //清除水桶,给予空桶。记得限定只清除一个水桶。
  14.             }
  15.           },
  16.           { //这部分用于熔岩
  17.             "condition": "q.get_equipped_item_name=='lava_bucket'",
  18.             "set_block_property": {
  19.               "supplementary:material_type": "'lava'",
  20.               "supplementary:height": 6
  21.             },
  22.             "run_command": {
  23.               "command": [
  24.                 "clear @p lava_bucket 0 1",
  25.                 "give @p bucket"
  26.               ]
  27.             }
  28.           },
  29.           { //这部分用于牛奶
  30.             "condition": "q.get_equipped_item_name=='milk_bucket'",
  31.             "set_block_property": {
  32.               "supplementary:material_type": "'milk'",
  33.               "supplementary:height": 6
  34.             },
  35.             "run_command": {
  36.               "command": [
  37.                 "clear @p milk_bucket 0 1",
  38.                 "give @p bucket"
  39.               ]
  40.             }
  41.           }
  42.         ]
  43.       } ...
复制代码


到现在为止,一切都还好办。然后要定义方块排列(Permutations)。我也不知道为啥Permutations叫排列,可能是用翻译器翻译的吧。感觉好怪啊。
  1. ...
  2.     "permutations": [
  3.       {
  4.         "condition": "q.block_property('supplementary:material_type')=='water'", //如果液体材料是水,那么用以下组件替换原来的组件。
  5.         "components": {
  6.           "minecraft:material_instances": {
  7.             "*": {
  8.               "texture": "crucible_water",
  9.               "render_method": "blend"
  10.             }
  11.           }, //定义一个水的纹理。
  12.           "minecraft:on_interact": {
  13.             "event": "empty_water"
  14.           } //玩家点击时触发事件empty_water。详情见下文。
  15.         }
  16.       },
  17.       { //这个管熔岩
  18.         "condition": "q.block_property('supplementary:material_type')=='lava'",
  19.         "components": {
  20.           "minecraft:material_instances": {
  21.             "*": {
  22.               "texture": "crucible_lava",
  23.               "render_method": "blend"
  24.             }
  25.           },
  26.           "minecraft:on_interact": {
  27.             "event": "empty_lava"
  28.           }
  29.         }
  30.       },
  31.       { //牛奶
  32.         "condition": "q.block_property('supplementary:material_type')=='milk'",
  33.         "components": {
  34.           "minecraft:material_instances": {
  35.             "*": {
  36.               "texture": "crucible_milk",
  37.               "render_method": "blend"
  38.             }
  39.           },
  40.           "minecraft:on_interact": {
  41.             "event": "empty_milk"
  42.           }
  43.         }
  44.       },
  45.       { //甜菜根汤
  46.         "condition": "q.block_property('supplementary:material_type')=='beetroot'",
  47.         "components": {
  48.           "minecraft:material_instances": {
  49.             "*": {
  50.               "texture": "crucible_beetroot",
  51.               "render_method": "blend"
  52.             }
  53.           },
  54.           "minecraft:on_interact": {
  55.             "event": "empty_beetroot"
  56.           }
  57.         }
  58.       }
  59.     ]
  60. ...
复制代码

我们已经完成了一大半,接下来就是定义如何清除坩埚里的液体了。刚才有empty_water等事件,以下是empty_water的代码。注:千万不要在清除液体时仅仅把液体高度设置为0,那样,这个坩埚还保持着水的液体类型,那这锅看起来是空了,实际上真就歇菜了,不能倒熔岩等其他液体了。这是因为锅还保持着水的液体类型,这个排列下,点击方块会触发empty_water事件而不是fill_material事件。
清除熔岩和牛奶比较简单,只需要把高度设为0,类型设为none,然后用命令把桶换成熔岩桶或牛奶桶就好了。但清除水时,有很多操作:加甜菜根可以变成甜菜汤,加熔岩可以变成黑曜石,用水瓶可以舀3瓶,用桶可以直接舀一锅。下面我放了我写的empty_water事件的示例。太长了,我折叠一下。

一番操作猛如虎,经过好几次T&E之后,我终于做好了坩埚。以下代码就是我的crucible.json里写的内容,供大家参考。

模型文件在教程开头已经给出了,我会把我制作的方块纹理打包放在下方,有需要的可以参考。
 坩埚纹理.zip(14.83 KB, 下载次数: 4)
总结

这一期,我们制作了一个坩埚方块,可以盛装液体,也可以制作黑曜石和甜菜根汤。下期我们继续示范方块制作。
同时,这也是到目前为止我写的最长的一篇教程,大小达到了25KB,这个大小可能还会被超越。


评分

参与人数 1铁粒 +6收起理由
 嗷呜*** + 6很给力!

查看全部评分

苦力怕论坛,感谢有您~
 楼主|  发表于 2023-3-26 10:38:40 来自手机|显示全部楼层 IP:天津
嗷呜不生电 发表于 2023-3-26 07:34
一开始那个图片是啥

就是坩埚在游戏内的样子(去除了背景)
4#2023-3-26 10:38:40回复收起回复
苦力怕论坛,感谢有您~
 发表于 2023-3-26 07:41:35 来自手机|显示全部楼层 IP:江西省
苦力怕论坛感谢有你!
3#2023-3-26 07:41:35回复收起回复
苦力怕论坛,感谢有您~
 发表于 2023-3-26 07:34:19|显示全部楼层 IP:福建省
一开始那个图片是啥
2#2023-3-26 07:34:19回复收起回复
苦力怕论坛,感谢有您~

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-12-14 08:05

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3